--- /dev/null
+package net.sourceforge.phpeclipse.wiki.actions.mediawiki.connect;
+//Parts of this sources are copied and modified from the jEdit Wikipedia plugin:
+//http://www.djini.de/software/wikipedia/index.html
+//
+//The modified sources are available under the "Common Public License"
+//with permission from the original author: Daniel Wunsch
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.net.InetAddress;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.SocketException;
+import java.net.UnknownHostException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import net.sourceforge.phpeclipse.wiki.actions.OpenWikiLinkEditorAction;
+
+public class BookmarkletServer implements Runnable {
+ // configuration
+ private InetAddress ADDRESS;
+
+ int PORT = 8009;
+
+ ServerSocket serverSocket = null;
+
+ Thread thread = null;
+
+ public BookmarkletServer() {
+ try {
+ ADDRESS = InetAddress.getByName("127.0.0.1");
+ } catch (UnknownHostException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /** set the port the server listens on - must be called before start() */
+ public void setPort(int port) {
+ PORT = port;
+ }
+
+ /** starts the server Thread */
+ public void start() {
+ // Log.log(Log.NOTICE, plugin, "BookmarkletServer: " + "listening on " + ADDRESS.CanonicalHostName + ":" + PORT);
+ thread = new Thread(this);
+ thread.start();
+ }
+
+ /** stops the server Thread */
+ public void stop() throws IOException {
+ thread.interrupt();
+ serverSocket.close();
+ // Log.log(Log.NOTICE, plugin, "BookmarkletServer: " + "stopped");
+ }
+
+ /** the server loop */
+ public void run() {
+ try {
+ serverSocket = new ServerSocket(PORT, 2, ADDRESS);
+ for (;;) {
+ Socket clientSocket = null;
+ try {
+ if (thread.isInterrupted())
+ break;
+ clientSocket = serverSocket.accept();
+ clientSocket.setSoTimeout(1000);
+ if (thread.isInterrupted())
+ break;
+ handleClient(clientSocket);
+ } catch (SocketException e) {
+ //Log.Log(Log.NOTICE, plugin, "BookmarkletServerSocket closed");
+ System.err.println("WikipediaPlugin: BookmarkletServer: Socket closed");
+ } catch (Exception e) {
+ // Log.log(Log.ERROR, plugin, BshUtil.extractDescription(e));
+ } finally {
+ if (clientSocket != null)
+ clientSocket.close();
+ }
+ }
+ serverSocket.close();
+ } catch (IOException e) {
+
+ }
+ }
+
+ /** called when an incoming Connection is accepted */
+ private void handleClient(Socket clientSocket) throws IOException {
+ if (!clientSocket.getInetAddress().equals(ADDRESS)) {
+ // Log.log(Log.NOTICE, plugin, "BookmarkletServer: " + "illegal remote address: " + clientSocket.InetAddress);
+ return;
+ }
+
+ BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(), "UTF-8"));
+ String line = reader.readLine();
+ if (line == null) {
+ // Log.log(Log.NOTICE, plugin, "BookmarkletServer: " + "illegal request: " + line);
+ return;
+ }
+
+ /*
+ * javascript:window.location.href='http://127.0.0.1:8009/open' Pattern pattern = Pattern.compile("^GET /(.*?) HTTP/1.[0-9]$",
+ * Pattern.DOTALL);
+ */
+
+ Pattern pattern = Pattern.compile("^GET /(.*?)/\\?(.*) HTTP/1.[0-9]$", Pattern.DOTALL);
+ Matcher matcher = pattern.matcher(line);
+ if (!matcher.matches()) {
+ // Log.log(Log.NOTICE, plugin, "BookmarkletServer: " + "illegal request: " + line);
+ return;
+ }
+ String action = matcher.group(1);
+ String url = matcher.group(2);
+
+ /*
+ * BookmarkletServer.bsh: Host: 127.0.0.1:8009 User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.2) Gecko/20040810
+ * Debian/1.7.2-2 User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90) Referer:
+ * http://kamelopedia.mormo.org/index.php/V%F6geln
+ */
+ boolean respond = true;
+ for (;;) {
+ line = reader.readLine();
+ if (line == null)
+ break;
+ if (line.length() == 0)
+ break;
+ String lower = line.toLowerCase();
+
+ /*
+ * // find out referer if (lower.startsWith("referer: ")) { url = line.substring("referer: ".length()); Log.log(Log.NOTICE,
+ * plugin, "BookmarkletServer: " + "got URL: " + url); }
+ */
+
+ // find out user-agent
+ if (lower.startsWith("user-agent: ") && lower.indexOf("mozilla") >= 0 && lower.indexOf("gecko") >= 0
+ && lower.indexOf("msie") < 0 && lower.indexOf("opera") < 0 && lower.indexOf("safari") < 0) {
+ respond = false;
+ // Log.log(Log.DEBUG, plugin, "BookmarkletServer: " + "mozilla detected: skipping response");
+ }
+ }
+
+ /*
+ * if (url == null) { Log.log(Log.NOTICE, plugin, "BookmarkletServer: " + "missing referer header"); return; }
+ */
+
+ handleAction(action, url);
+
+ if (respond) {
+ Writer writer = new OutputStreamWriter(clientSocket.getOutputStream(), "UTF-8");
+
+ writer.write("HTTP/1.0 301 Moved Permanently\r\n");
+ writer.write("Cache-Control: no-cache\r\n");
+ writer.write("Pragma: no-cache\r\n");
+ writer.write("Expires: -1\r\n");
+ writer.write("Location: " + url + "\r\n");
+ writer.write("\r\n");
+
+ writer.write("<html><body>");
+ writer.write("goto <a href=\"" + url + "\">" + url + "</a>");
+ writer.write("</body></html>");
+ writer.write("\r\n");
+
+ writer.flush();
+ writer.close();
+ }
+
+ reader.close();
+ }
+
+ /** called when the Connection sent a Command */
+ private void handleAction(String action, String url) {
+ if (!"open".equals(action)) {
+ // Log.log(Log.NOTICE, plugin, "BookmarkletServer: " + "unknown action: " + action);
+ return;
+ }
+ // TODO determine the global project and open editor for URL
+ OpenWikiLinkEditorAction.openWikiUrl(null, url);
+ // wikipedia.openURL(jEdit.getActiveView(), new URL(url), true);
+ }
+
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.actions.mediawiki.connect;
+//Parts of this sources are copied and modified from the jEdit Wikipedia plugin:
+//http://www.djini.de/software/wikipedia/index.html
+//
+//The modified sources are available under the "Common Public License"
+//with permission from the original author: Daniel Wunsch
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import net.sourceforge.phpeclipse.wiki.actions.mediawiki.config.IWikipedia;
+import net.sourceforge.phpeclipse.wiki.actions.mediawiki.exceptions.MethodException;
+import net.sourceforge.phpeclipse.wiki.actions.mediawiki.exceptions.PageNotEditableException;
+import net.sourceforge.phpeclipse.wiki.actions.mediawiki.exceptions.UnexpectedAnswerException;
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+
+import org.apache.commons.httpclient.ConnectMethod;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpConnection;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.HttpState;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
+import org.apache.commons.httpclient.NameValuePair;
+import org.apache.commons.httpclient.URI;
+import org.apache.commons.httpclient.UsernamePasswordCredentials;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.protocol.Protocol;
+import org.apache.commons.httpclient.util.EncodingUtil;
+
+/**
+ * This class gets the wikitext from a wikipedia edit page
+ *
+ * The basic coding was copied from the commons-httpclient example <code>MediaWikiConnector.java</code>
+ */
+public class MediaWikiConnector {
+ //pattern used to scarp an edit page
+ private static final Pattern BODY_PATTERN = Pattern.compile(
+ /*
+ * action=".*?title=(.*?)(&|\") <form id="editform" name="editform" method="post"
+ * action="/w/wiki.phtml?title=Ammersee&action=submit" locked pages: <textarea cols='80' rows='25' readonly>
+ */
+ ".*<form[^>]*\\sid=\"editform\"[^>]*title=(.*?)&[^>]*>" + ".*<textarea[^>]*\\sname=\"wpTextbox1\"[^>]*>(.*?)</textarea>"
+ + ".*<input[^>]*\\svalue=\"(\\d*)\"[^>]*\\sname=\"wpEdittime\"[^>]*>" + ".*", Pattern.DOTALL);
+
+ //setup default user agent
+ final static public String userAgent = "PHPeclipse.de/0.0";
+
+ // create a ConnectionManager
+ private MultiThreadedHttpConnectionManager manager;
+
+ private HttpClient client;
+
+ /**
+ * Delay a new store to 1 second
+ */
+ private Throttle storeThrottle = new Throttle(1000);
+
+ class Throttle {
+ private long nextTime = 0;
+
+ private final long minimumDelay;
+
+ public Throttle(long minimumDelay) {
+ this.minimumDelay = minimumDelay;
+ }
+
+ /** this is called from the client */
+ public synchronized void delay() throws InterruptedException {
+ long delay = nextTime - System.currentTimeMillis();
+ if (delay > 0)
+ Thread.sleep(delay);
+ nextTime = System.currentTimeMillis() + minimumDelay;
+ }
+ }
+
+ public MediaWikiConnector() {
+ // <a href="javascript:window.location.href='http://127.0.0.1:8009/open/?' + window.location.href">bookmarklet</a>
+ manager = new MultiThreadedHttpConnectionManager();
+ manager.setMaxConnectionsPerHost(6);
+ manager.setMaxTotalConnections(18);
+ manager.setConnectionStaleCheckingEnabled(true);
+ // open the conversation
+ client = new HttpClient(manager);
+ //client.State.CookiePolicy = CookiePolicy.COMPATIBILITY;
+ //client.HostConfiguration.setHost(LOGON_SITE, LOGON_PORT, "http");
+ }
+
+ /** destructor freeing all resources. the Connection is not usable any more after calling this method */
+ public void destroy() {
+ manager.shutdown();
+ }
+
+ /** log in - returns success */
+ public boolean login(IWikipedia config, String actionUrl, String user, String password, boolean remember)
+ throws UnexpectedAnswerException, MethodException {
+ PostMethod method = new PostMethod(actionUrl);
+ method.setFollowRedirects(false);
+ method.addRequestHeader("User-Agent", userAgent);
+ NameValuePair[] params = new NameValuePair[] { new NameValuePair("title", config.getLoginTitle()), new NameValuePair("action", "submit"),
+ new NameValuePair("wpName", user), new NameValuePair("wpPassword", password),
+ new NameValuePair("wpRemember", remember ? "1" : "0"), new NameValuePair("wpLoginattempt", "submit") };
+ method.addParameters(params);
+
+ boolean result;
+ try {
+ int responseCode = client.executeMethod(method);
+ String responseBody = method.getResponseBodyAsString();
+
+ //### debugging
+ //log(responseBody);
+ // log(method);
+
+ if (responseCode == 302 && responseBody.length() == 0 || responseCode == 200
+ && responseBody.matches(config.getLoginSuccess())) {
+ result = true;
+ } else if (responseCode == 200 && responseBody.matches(config.getLoginWrongPw()) || responseCode == 200
+ && responseBody.matches(config.getLoginNoUser())) {
+ result = false;
+ } else {
+ throw new UnexpectedAnswerException("login not successful: " + method.getStatusLine());
+ }
+ } catch (HttpException e) {
+ throw new MethodException("method failed", e);
+ } catch (IOException e) {
+ throw new MethodException("method failed", e);
+ } finally {
+ method.releaseConnection();
+ }
+ /*
+ * // display cookies System.err.println("login: " + result); for (var cookie : client.State.Cookies) {
+ * System.err.println("cookie: " + cookie); }
+ */
+
+ // remember state
+ SiteState state = SiteState.siteState(config);
+ state.loggedIn = result;
+ state.userName = user;
+
+ return result;
+ }
+
+ /** log out - return success */
+ public boolean logout(IWikipedia config,String actionUrl) throws UnexpectedAnswerException, MethodException {
+ GetMethod method = new GetMethod(actionUrl);
+ method.setFollowRedirects(false);
+ method.addRequestHeader("User-Agent", userAgent);
+ NameValuePair[] params = new NameValuePair[] { new NameValuePair("title", config.getLogoutTitle()),
+ new NameValuePair("action", "submit") };
+ method.setQueryString(EncodingUtil.formUrlEncode(params, config.getCharSet()));
+
+ boolean result;
+ try {
+ int responseCode = client.executeMethod(method);
+ String responseBody = method.getResponseBodyAsString();
+ // log(method);
+
+ if (responseCode == 302 && responseBody.length() == 0 || responseCode == 200
+ && responseBody.matches(config.getLoginSuccess())) {
+ // config.getloggedIn = false;
+ result = true;
+ } else if (responseCode == 200) {
+ //### should check for a failure message
+ result = false;
+ } else {
+ throw new UnexpectedAnswerException("logout not successful: " + method.getStatusLine());
+ }
+ } catch (HttpException e) {
+ throw new MethodException("method failed", e);
+ } catch (IOException e) {
+ throw new MethodException("method failed", e);
+ } finally {
+ method.releaseConnection();
+ }
+
+ // remember state
+ SiteState state = SiteState.siteState(config);
+ state.loggedIn = false;
+
+ return result;
+ }
+
+ /** parses a returned editform into a Content object with UNIX-EOLs ("\n") */
+ private Parsed parseBody(String charSet, String responseBody) throws PageNotEditableException, UnsupportedEncodingException {
+ Matcher matcher = BODY_PATTERN.matcher(responseBody);
+ if (!matcher.matches())
+ throw new PageNotEditableException("cannot find editform form");
+
+ String title = matcher.group(1);
+ String body = matcher.group(2);
+ String timestamp = matcher.group(3);
+
+ title = URLDecoder.decode(title, charSet);
+ body = body.replaceAll(""", "\"").replaceAll("'", "'").replaceAll("<", "<").replaceAll(">", ">").replaceAll(
+ "&", "&").replaceAll("\r\n", "\n").replace('\r', '\n');
+
+ return new Parsed(timestamp, title, body);
+ }
+
+ /** load a Page Version - returns a Loaded Object */
+ public Loaded load(String actionURL, String charSet, String title) throws UnexpectedAnswerException, MethodException,
+ PageNotEditableException {
+ GetMethod method = new GetMethod(actionURL);
+ method.setFollowRedirects(false);
+ method.addRequestHeader("User-Agent", userAgent);
+ NameValuePair[] params = new NameValuePair[] { new NameValuePair("title", title), new NameValuePair("action", "edit") };
+ method.setQueryString(EncodingUtil.formUrlEncode(params, charSet));
+
+ Loaded result;
+ try {
+ int responseCode = client.executeMethod(method);
+ String responseBody = method.getResponseBodyAsString();
+ // log(method);
+
+ if (responseCode == 200) {
+ Parsed parsed = parseBody(charSet, responseBody);
+ Content content = new Content(parsed.timestamp, parsed.body);
+ result = new Loaded(actionURL, charSet, parsed.title, content);
+ } else {
+ throw new UnexpectedAnswerException("load not successful: expected 200 OK, got " + method.getStatusLine());
+ }
+ } catch (HttpException e) {
+ throw new MethodException("method failed", e);
+ } catch (IOException e) {
+ throw new MethodException("method failed", e);
+ } finally {
+ method.releaseConnection();
+ }
+ return result;
+ }
+
+ /**
+ * store a Page Version - returns a Stored object
+ *
+ * @param config - WiKipedia predefined properties
+ * @param actionURL
+ * @param title
+ * @param content
+ * @param summary
+ * @param minorEdit
+ * @param watchThis
+ * @return
+ * @throws UnexpectedAnswerException
+ * @throws MethodException
+ * @throws PageNotEditableException
+ * @throws InterruptedException
+ */
+ public Stored store(IWikipedia config, String actionUrl, String title, Content content, String summary, boolean minorEdit,
+ boolean watchThis) throws UnexpectedAnswerException, MethodException, PageNotEditableException, InterruptedException {
+ //### workaround: prevent too many stores at a time
+ storeThrottle.delay();
+
+ PostMethod method = new PostMethod(actionUrl);
+ method.setFollowRedirects(false);
+ method.addRequestHeader("User-Agent", userAgent);
+ method.addRequestHeader("Content-Type", PostMethod.FORM_URL_ENCODED_CONTENT_TYPE + "; charset=" + config.getCharSet());
+ NameValuePair[] params = new NameValuePair[] {
+ // new NameValuePair("wpSection", ""),
+ // new NameValuePair("wpPreview", "Vorschau zeigen"),
+ // new NameValuePair("wpSave", "Artikel speichern"),
+ new NameValuePair("title", title), new NameValuePair("wpTextbox1", content.body),
+ new NameValuePair("wpEdittime", content.timestamp), new NameValuePair("wpSummary", summary),
+ new NameValuePair("wpSave", "yes"), new NameValuePair("action", "submit") };
+ method.addParameters(params);
+ if (minorEdit)
+ method.addParameter("wpMinoredit", "1");
+ if (watchThis)
+ method.addParameter("wpWatchthis", "1");
+
+ Stored result;
+ try {
+ int responseCode = client.executeMethod(method);
+ String responseBody = method.getResponseBodyAsString();
+ // log(method);
+
+ // since 11dec04 there is a single linefeed instead of an empty page.. trim() helps.
+ if (responseCode == 302 && responseBody.trim().length() == 0) {
+ // log("store successful, reloading");
+ Loaded loaded = load(actionUrl, config.getCharSet(), title);
+ result = new Stored(actionUrl, config.getCharSet(), loaded.title, loaded.content, false);
+ } else if (responseCode == 200) {
+ // log("store not successful, conflict detected");
+ Parsed parsed = parseBody(config.getCharSet(), responseBody);
+ Content cont = new Content(parsed.timestamp, parsed.body);
+ result = new Stored(actionUrl, config.getCharSet(), parsed.title, cont, true);
+ } else {
+ throw new UnexpectedAnswerException("store not successful: expected 200 OK, got " + method.getStatusLine());
+ }
+ } catch (HttpException e) {
+ throw new MethodException("method failed", e);
+ } catch (IOException e) {
+ throw new MethodException("method failed", e);
+ } finally {
+ method.releaseConnection();
+ }
+ return result;
+ }
+
+ /**
+ * Get the text of a wikimedia article
+ *
+ */
+ public static String getWikiRawText(String wikiname, String urlStr) {
+ // examples
+ // http://en.wikipedia.org/w/wiki.phtml?title=Main_Page&action=raw
+ // http://en.wikibooks.org/w/index.php?title=Programming:PHP:SQL_Injection&action=raw
+ // http://en.wikipedia.org/w/wiki.phtml?title=Talk:Division_by_zero&action=raw
+ HttpMethod method = null;
+ try {
+ if (urlStr == null) {
+ WikiEditorPlugin.getDefault().reportError("No Wikipedia URL configured", "URL-String == null");
+ // urlStr = "http://en.wikipedia.org/w/wiki.phtml?title=" + wikiname + "&action=raw";
+ }
+ URI uri = new URI(urlStr.toCharArray());
+
+ String schema = uri.getScheme();
+ if ((schema == null) || (schema.equals(""))) {
+ schema = "http";
+ }
+ Protocol protocol = Protocol.getProtocol(schema);
+
+ HttpState state = new HttpState();
+
+ method = new GetMethod(uri.toString());
+ String host = uri.getHost();
+ int port = uri.getPort();
+
+ HttpConnection connection = new HttpConnection(host, port, protocol);
+ // timeout after 30 seconds
+ connection.setConnectionTimeout(30000);
+ connection.setProxyHost(System.getProperty("http.proxyHost"));
+ connection.setProxyPort(Integer.parseInt(System.getProperty("http.proxyPort", "80")));
+
+ if (System.getProperty("http.proxyUserName") != null) {
+ state.setProxyCredentials(null, null, new UsernamePasswordCredentials(System.getProperty("http.proxyUserName"), System
+ .getProperty("http.proxyPassword")));
+ }
+
+ if (connection.isProxied() && connection.isSecure()) {
+ method = new ConnectMethod(method);
+ }
+
+ method.execute(state, connection);
+
+ if (method.getStatusCode() == HttpStatus.SC_OK) {
+ // get the wiki text now:
+ String wikiText = method.getResponseBodyAsString();
+ return wikiText;
+ // wrong text not always complete
+ // InputStream stream = method.getResponseBodyAsStream();
+ // int byteLen = stream.available();
+ // int count = 1;
+ // byte[] buffer = new byte[byteLen];
+ // int len = 0;
+ // stream.read(buffer, 0, byteLen);
+ // String wikiText = new String(buffer);
+ // return wikiText;
+ // System.out.println(wikiText);
+ }
+ } catch (Throwable e) {
+ WikiEditorPlugin.log(e);
+ WikiEditorPlugin.getDefault().reportError("Exception occured", e.getMessage() + "\nSee stacktrace in /.metadata/.log file.");
+ } finally {
+ if (method != null) {
+ method.releaseConnection();
+ }
+ }
+ return null; // no success in getting wiki text
+ }
+
+ public static String getWikiEditTextarea(String wikiname, String urlStr) {
+ // examples
+ // http://en.wikipedia.org/w/wiki.phtml?title=Main_Page&action=edit
+ // http://en.wikibooks.org/w/wiki.phtml?title=Programming:PHP:SQL_Injection&action=edit
+ // http://en.wikipedia.org/w/wiki.phtml?title=Talk:Division_by_zero&action=edit
+ HttpMethod method = null;
+ try {
+ if (urlStr == null) {
+ urlStr = "http://en.wikipedia.org/w/wiki.phtml?title=" + wikiname + "&action=edit";
+ }
+ // else {
+ // urlStr = urlStr + "?title=" + wikiname + "&action=edit";
+ // }
+ URI uri = new URI(urlStr.toCharArray());
+
+ String schema = uri.getScheme();
+ if ((schema == null) || (schema.equals(""))) {
+ schema = "http";
+ }
+ Protocol protocol = Protocol.getProtocol(schema);
+
+ HttpState state = new HttpState();
+
+ method = new GetMethod(uri.toString());
+ String host = uri.getHost();
+ int port = uri.getPort();
+
+ HttpConnection connection = new HttpConnection(host, port, protocol);
+
+ connection.setProxyHost(System.getProperty("http.proxyHost"));
+ connection.setProxyPort(Integer.parseInt(System.getProperty("http.proxyPort", "80")));
+
+ if (System.getProperty("http.proxyUserName") != null) {
+ state.setProxyCredentials(null, null, new UsernamePasswordCredentials(System.getProperty("http.proxyUserName"), System
+ .getProperty("http.proxyPassword")));
+ }
+
+ if (connection.isProxied() && connection.isSecure()) {
+ method = new ConnectMethod(method);
+ }
+
+ method.execute(state, connection);
+
+ if (method.getStatusCode() == HttpStatus.SC_OK) {
+ // get the textareas wiki text now:
+ InputStream stream = method.getResponseBodyAsStream();
+ int byteLen = stream.available();
+ int count = 1;
+ byte[] buffer = new byte[byteLen];
+ stream.read(buffer, 0, byteLen);
+ String wikiText = new String(buffer);
+ // String wikiText = method.getResponseBodyAsString();
+ int start = wikiText.indexOf("<textarea");
+ if (start != (-1)) {
+ start = wikiText.indexOf(">", start + 1);
+ if (start != (-1)) {
+ int end = wikiText.indexOf("</textarea>");
+ wikiText = wikiText.substring(start + 1, end);
+ }
+ }
+ return wikiText;
+ // System.out.println(wikiText);
+
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (method != null) {
+ method.releaseConnection();
+ }
+ }
+ return null; // no success in getting wiki text
+ }
+}
+