// License: GPL. Copyright 2007 by Immanuel Scholz and others
package org.openstreetmap.josm.tools;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import org.openstreetmap.josm.Main;
/**
* Read a trac-wiki page.
*
* @author imi
*/
public class WikiReader {
private final String baseurl;
public WikiReader(String baseurl) {
this.baseurl = baseurl;
}
public WikiReader() {
this.baseurl = Main.pref.get("help.baseurl", "http://josm.openstreetmap.de");
}
/**
* Read the page specified by the url and return the content.
*
* If the url is within the baseurl path, parse it as an trac wikipage and replace relative
* pathes etc..
*
* @return
* @throws IOException Throws, if the page could not be loaded.
*/
public String read(String url) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(new URL(url).openStream(), "utf-8"));
if (url.startsWith(baseurl) && !url.endsWith("?format=txt"))
return readFromTrac(in);
return readNormal(in);
}
public String readLang(String text) {
String languageCode = LanguageInfo.getWikiLanguagePrefix();
String url = baseurl + "/wiki/" + languageCode + text;
String res = "";
InputStream in = null;
try {
in = new URL(url).openStream();
res = readFromTrac(new BufferedReader(new InputStreamReader(in, "utf-8")));
} catch (IOException ioe) {
System.out.println(tr("Warning: failed to read MOTD from ''{0}''. Exception was: {1}", url, ioe
.toString()));
} catch(SecurityException e) {
System.out.println(tr(
"Warning: failed to read MOTD from ''{0}'' for security reasons. Exception was: {1}", url, e
.toString()));
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
}
if (res.length() == 0 && languageCode.length() != 0) {
url = baseurl + "/wiki/" + text;
try {
in = new URL(url).openStream();
} catch (IOException e) {
System.out.println(tr("Warning: failed to read MOTD from ''{0}''. Exception was: {1}", url, e
.toString()));
return res;
} catch (SecurityException e) {
System.out.println(tr(
"Warning: failed to read MOTD from ''{0}'' for security reasons. Exception was: {1}", url, e
.toString()));
return res;
}
try {
res = readFromTrac(new BufferedReader(new InputStreamReader(in, "utf-8")));
} catch (IOException ioe) {
System.out.println(tr("Warning: failed to read MOTD from ''{0}''. Exception was: {1}", url, ioe
.toString()));
return res;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
}
}
return res;
}
private String readNormal(BufferedReader in) throws IOException {
String b = "";
for (String line = in.readLine(); line != null; line = in.readLine()) {
if (!line.contains("[[TranslatedPages]]")) {
b += line.replaceAll(" />", ">") + "\n";
}
}
return "<html>" + b + "</html>";
}
private String readFromTrac(BufferedReader in) throws IOException {
boolean inside = false;
boolean transl = false;
String b = "";
for (String line = in.readLine(); line != null; line = in.readLine()) {
if (line.contains("<div id=\"searchable\">")) {
inside = true;
} else if (line.contains("<div class=\"wiki-toc trac-nav\"")) {
transl = true;
} else if (line.contains("<div class=\"wikipage searchable\">")) {
inside = true;
} else if (line.contains("<div class=\"buttons\">")) {
inside = false;
} else if (line.contains("<h3>Attachments</h3>")) {
inside = false;
}
if (inside && !transl) {
// add a border="0" attribute to images, otherwise the internal help browser
// will render a thick border around images inside an <a> element
//
b += line.replaceAll("<img src=\"/", "<img border=\"0\" src=\"" + baseurl + "/").replaceAll("href=\"/",
"href=\"" + baseurl + "/").replaceAll(" />", ">")
+ "\n";
} else if (transl && line.contains("</div>")) {
transl = false;
}
}
if (b.indexOf(" Describe ") >= 0)
return "";
return "<html>" + b + "</html>";
}
}