diff options
-rw-r--r-- | blaconvert.java | 250 |
1 files changed, 249 insertions, 1 deletions
diff --git a/blaconvert.java b/blaconvert.java index 19e3e99..7a1d087 100644 --- a/blaconvert.java +++ b/blaconvert.java @@ -1 +1,249 @@ -/*
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
blaconvert - Java program for converting units of measurement and currency using Google APIs
by blatech
Copyright 2011 Joe Robinson <joe@lc8n.com>
based on code by Jamie Walters <jagw@jagw.co.uk>
based on code by Joe Robinson <joe@lc8n.com>
Version 1.31
CHANGELOG
1.0 - First version
1.1 - Allow units with more than one word eg "light year"
- Added "same unit" error
- Ensure standard imperial measurements are used for some units - google defaults to US
1.2 - Replace crazy non unicode spaces with commas
1.21 - Added quart to imperial measurements
1.3 - Added support for currency symbols
1.31 - Trying to add euro (probably won't work)
TODO
- Raw output option - result only with no spaces/commas/units
*/
import java.net.URL;
import java.net.URLConnection;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class blaconvert {
public static void main(String[] args) throws IOException
{
String sourceUnit = "";
String targetUnit = "";
String amount = "";
String version = "1.31";
/* Build query from query or arguments, depending on whether
arguments were given. */
if (args.length == 0) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] split = br.readLine().split(" ");
int start = 0;
int to = 0;
int output = 0;
if (split[0].startsWith("-"))
{
if (split[0].equals("-v") || split[0].equals("--version"))
{
System.out.println("v"+version);
System.exit(0);
} else if (split[0].charAt(1) == 'r')
{
//reserved for raw output option
output = 1;
start = 1;
}
}
for(int i = 0; i < split.length; i++)
{
if (split[i].toLowerCase().equals("to") || split[i].toLowerCase().equals("in"))
{
to = i;
}
}
amount = split[start];
for (int i = start+1; i < to; i++)
{
sourceUnit += split[i]+"%20";
}
for (int i = to+1; i < split.length; i++)
{
targetUnit += split[i]+"%20";
}
} catch (Exception e) {
System.err.println("Error:" + e.getMessage());
System.exit(1);
}
} else {
if (args[0].equals("-v") || args[0].equals("--version"))
{
System.out.println("v"+version);
System.exit(0);
}
amount = args[0];
sourceUnit = args[1];
targetUnit = args[2];
}
String[] imperial = {"pint", "gallon", "gal", "cup", "teaspoon", "tablespoon", "fl oz", "fluid ounce", "quart"};
for(int i = 0; i < imperial.length; i++)
{
if (sourceUnit.startsWith(imperial[i]))
{
sourceUnit = "Imperial%20"+sourceUnit;
}
if (targetUnit.startsWith(imperial[i]))
{
targetUnit = "Imperial%20"+targetUnit;
}
}
boolean currency = false;
if(amount.startsWith("£") || amount.startsWith("$") || amount.startsWith("¥"))
{
amount.replaceAll("£","%A3");
amount.replaceAll("$","%24");
amount.replaceAll("€","%8010");
amount.replaceAll("\u20AC","%8010");
amount.replaceAll("¥","%A5");
currency = true;
}
//URL which provides XML response
URL url = new URL("http://www.google.com/ig/calculator?hl=en&q="+amount+sourceUnit+"=?"+targetUnit);
//System.out.println("http://www.google.com/ig/calculator?hl=en&q="+amount+sourceUnit+"=?"+targetUnit);
URLConnection urlc = url.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(urlc.getInputStream()));
String line;
String[] lines;
String tempString = "";
String lhs = "";
String rhs = "";
String error = "";
//Read every line
while ((line = br.readLine()) != null)
{
// Splits the google output by the commas
lines = line.split(",");
for(int i=0; i<lines.length; i++){
//System.out.println(lines[i]);
// Get the useful information (the urls!)
if(lines[i].trim().startsWith("{lhs")){
tempString = lines[i];
// Blat the non-url information
lhs = tempString.substring(7, tempString.length()-1);
}
else if(lines[i].trim().startsWith("rhs")){
tempString = lines[i];
// Blat the non-url information
rhs = tempString.substring(6, tempString.length()-1);
}
else if(lines[i].trim().startsWith("error")){
tempString = lines[i];
// Blat the non-url information
error = tempString.substring(8, tempString.length()-1);
}
}
}
String[] parts = rhs.split(" ");
String result = fixCrazySpaces(parts[0]) + " ";
//Convert weird output into something that makes sense
for (int i = 1; i < parts.length; i++)
{
//System.out.println(parts[i]);
if (parts[i].equals("\\x26#215;"))
{
parts[i] = "*";
} else if (parts[i].startsWith("10\\"))
{
String[] exp = parts[i].split("\\\\");
parts[i] = "10^"+exp[2].substring(3, exp[2].length());
}
result += parts[i] + " ";
}
parts = lhs.split(" ");
lhs = "";
if(!currency) {
parts[0] = fixCrazySpaces(parts[0]);
} else {
parts[1] = fixCrazySpaces(parts[1]);
}
for (int i = 0; i < parts.length; i ++)
{
lhs += parts[i]+" ";
}
// Print results
if(error.isEmpty()) {
System.out.println(lhs+"= "+result);
System.exit(0);
} else {
if(error.equals("4"))
{
error = "Unknown unit";
} else if (error.equals("0"))
{
error = "Both units are the same";
}
System.out.print("Error: "+error);
System.out.println("\n");
System.exit(1);
}
}
private static String fixCrazySpaces(String string)
{
char[] chars = string.toCharArray();
String fixed = "";
for (int i = 0; i < chars.length; i++)
{
if (Character.getNumericValue(chars[i]) < 0 && chars[i] != '.')
{
fixed += ",";
} else {
fixed += chars[i];
}
}
return fixed;
}
}
\ No newline at end of file +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +/* + blaconvert - Java program for converting units of measurement and currency using Google APIs + by blatech + + Copyright 2011 Joe Robinson <joe@lc8n.com> + based on code by Jamie Walters <jagw@jagw.co.uk> + based on code by Joe Robinson <joe@lc8n.com> + + Version 1.31 + + CHANGELOG + 1.0 - First version + 1.1 - Allow units with more than one word eg "light year" + - Added "same unit" error + - Ensure standard imperial measurements are used for some units - google defaults to US + 1.2 - Replace crazy non unicode spaces with commas + 1.21 - Added quart to imperial measurements + 1.3 - Added support for currency symbols + 1.31 - Trying to add euro (probably won't work) + TODO + - Raw output option - result only with no spaces/commas/units +*/ + + +import java.net.URL; +import java.net.URLConnection; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; + +public class blaconvert { + + public static void main(String[] args) throws IOException + { + String sourceUnit = ""; + String targetUnit = ""; + String amount = ""; + String version = "1.31"; + + /* Build query from query or arguments, depending on whether + arguments were given. */ + if (args.length == 0) { + try { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String[] split = br.readLine().split(" "); + int start = 0; + int to = 0; + int output = 0; + if (split[0].startsWith("-")) + { + if (split[0].equals("-v") || split[0].equals("--version")) + { + System.out.println("v"+version); + System.exit(0); + } else if (split[0].charAt(1) == 'r') + { + //reserved for raw output option + output = 1; + start = 1; + } + } + + for(int i = 0; i < split.length; i++) + { + if (split[i].toLowerCase().equals("to") || split[i].toLowerCase().equals("in")) + { + to = i; + } + } + amount = split[start]; + + for (int i = start+1; i < to; i++) + { + sourceUnit += split[i]+"%20"; + } + for (int i = to+1; i < split.length; i++) + { + targetUnit += split[i]+"%20"; + } + } catch (Exception e) { + System.err.println("Error:" + e.getMessage()); + System.exit(1); + } + } else { + + if (args[0].equals("-v") || args[0].equals("--version")) + { + System.out.println("v"+version); + System.exit(0); + } + amount = args[0]; + sourceUnit = args[1]; + targetUnit = args[2]; + } + + String[] imperial = {"pint", "gallon", "gal", "cup", "teaspoon", "tablespoon", "fl oz", "fluid ounce", "quart"}; + + for(int i = 0; i < imperial.length; i++) + { + if (sourceUnit.startsWith(imperial[i])) + { + sourceUnit = "Imperial%20"+sourceUnit; + } + + if (targetUnit.startsWith(imperial[i])) + { + targetUnit = "Imperial%20"+targetUnit; + } + } + boolean currency = false; + if(amount.startsWith("£") || amount.startsWith("$") || amount.startsWith("¥")) + { + amount.replaceAll("£","%A3"); + amount.replaceAll("$","%24"); + amount.replaceAll("€","%8010"); + amount.replaceAll("\u20AC","%8010"); + amount.replaceAll("¥","%A5"); + + currency = true; + } + + + //URL which provides XML response + URL url = new URL("http://www.google.com/ig/calculator?hl=en&q="+amount+sourceUnit+"=?"+targetUnit); + //System.out.println("http://www.google.com/ig/calculator?hl=en&q="+amount+sourceUnit+"=?"+targetUnit); + URLConnection urlc = url.openConnection(); + + BufferedReader br = new BufferedReader(new InputStreamReader(urlc.getInputStream())); + String line; + String[] lines; + String tempString = ""; + String lhs = ""; + String rhs = ""; + String error = ""; + //Read every line + while ((line = br.readLine()) != null) + { + // Splits the google output by the commas + lines = line.split(","); + + for(int i=0; i<lines.length; i++){ + //System.out.println(lines[i]); + // Get the useful information (the urls!) + if(lines[i].trim().startsWith("{lhs")){ + tempString = lines[i]; + // Blat the non-url information + lhs = tempString.substring(7, tempString.length()-1); + } + else if(lines[i].trim().startsWith("rhs")){ + tempString = lines[i]; + // Blat the non-url information + rhs = tempString.substring(6, tempString.length()-1); + } + else if(lines[i].trim().startsWith("error")){ + tempString = lines[i]; + // Blat the non-url information + error = tempString.substring(8, tempString.length()-1); + } + + } + + } + + String[] parts = rhs.split(" "); + String result = fixCrazySpaces(parts[0]) + " "; + //Convert weird output into something that makes sense + for (int i = 1; i < parts.length; i++) + { + //System.out.println(parts[i]); + if (parts[i].equals("\\x26#215;")) + { + parts[i] = "*"; + } else if (parts[i].startsWith("10\\")) + { + String[] exp = parts[i].split("\\\\"); + parts[i] = "10^"+exp[2].substring(3, exp[2].length()); + } + + result += parts[i] + " "; + } + + parts = lhs.split(" "); + lhs = ""; + if(!currency) { + parts[0] = fixCrazySpaces(parts[0]); + } else { + parts[1] = fixCrazySpaces(parts[1]); + } + for (int i = 0; i < parts.length; i ++) + { + lhs += parts[i]+" "; + } + + // Print results + if(error.isEmpty()) { + System.out.println(lhs+"= "+result); + + System.exit(0); + + } else { + if(error.equals("4")) + { + error = "Unknown unit"; + } else if (error.equals("0")) + { + error = "Both units are the same"; + } + System.out.print("Error: "+error); + System.out.println("\n"); + System.exit(1); + } + + } + + private static String fixCrazySpaces(String string) + { + char[] chars = string.toCharArray(); + String fixed = ""; + for (int i = 0; i < chars.length; i++) + { + if (Character.getNumericValue(chars[i]) < 0 && chars[i] != '.') + { + fixed += ","; + } else { + fixed += chars[i]; + } + } + + return fixed; + } + + +} |