summaryrefslogtreecommitdiff
path: root/swext/mediawiki/src/com/sun/star/wiki/WikiArticle.java
diff options
context:
space:
mode:
Diffstat (limited to 'swext/mediawiki/src/com/sun/star/wiki/WikiArticle.java')
-rw-r--r--swext/mediawiki/src/com/sun/star/wiki/WikiArticle.java295
1 files changed, 295 insertions, 0 deletions
diff --git a/swext/mediawiki/src/com/sun/star/wiki/WikiArticle.java b/swext/mediawiki/src/com/sun/star/wiki/WikiArticle.java
new file mode 100644
index 000000000000..89025ed84513
--- /dev/null
+++ b/swext/mediawiki/src/com/sun/star/wiki/WikiArticle.java
@@ -0,0 +1,295 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package com.sun.star.wiki;
+
+import com.sun.star.task.UrlRecord;
+import java.io.*;
+import java.util.Hashtable;
+import javax.swing.text.html.*;
+import com.sun.star.uno.XComponentContext;
+
+import org.apache.commons.httpclient.*;
+import org.apache.commons.httpclient.methods.*;
+
+
+public class WikiArticle
+{
+ private XComponentContext m_xContext;
+
+ private String m_sEditTime = "";
+ private String m_sEditToken = "";
+
+ protected String m_sHTMLCode;
+ private boolean m_bNoArticle = true;
+
+ protected String m_sWikiUser;
+ protected String m_sWikiPass;
+
+ protected String m_sTitle = "";
+
+ private URI m_aMainURI;
+ private HostConfiguration m_aHostConfig;
+
+
+ /** Creates a new instance of WikiArticle */
+ public WikiArticle( XComponentContext xContext, String sTitle, Hashtable wikiSettings, boolean bLogin, WikiPropDialog aPropDialog )
+ throws java.net.MalformedURLException, com.sun.star.uno.Exception, java.io.IOException, WikiCancelException
+ {
+ m_xContext = xContext;
+
+ String sMainUrl = (String) wikiSettings.get("Url");
+ m_sWikiUser = (String) wikiSettings.get("Username");
+ m_sWikiPass = (String) wikiSettings.get("Password");
+ m_sTitle = sTitle;
+
+ m_aMainURI = new URI( sMainUrl );
+
+// viewURL = sMainUrl + "index.php?title=" + m_sTitle;
+// editURL = sMainUrl + "index.php?title=" + m_sTitle + "&action=edit";
+// submitURL = sMainUrl + "index.php?title=" + m_sTitle + "&action=submit";
+// loginURL = sMainUrl + "index.php?title=Special:Userlogin";
+// loginSubmitURL = sMainUrl + "index.php?title=Special:Userlogin&action=submitlogin";
+
+ if ( bLogin )
+ {
+ WikiEditSettingDialog aDialog = new WikiEditSettingDialog(m_xContext, "vnd.sun.star.script:WikiEditor.EditSetting?location=application", wikiSettings, false );
+ try
+ {
+ while( !Login() )
+ {
+ if ( aPropDialog != null )
+ aPropDialog.SetThrobberActive( false );
+
+ if ( MainThreadDialogExecutor.Show( xContext, aDialog ) )
+ {
+ m_sWikiUser = (String) wikiSettings.get("Username");
+ m_sWikiPass = (String) wikiSettings.get("Password");
+ }
+ else
+ throw new WikiCancelException();
+
+ if ( aPropDialog != null )
+ {
+ aPropDialog.SetThrobberActive( true );
+ Thread.yield();
+ }
+ }
+ }
+ finally
+ {
+ aDialog.DisposeDialog();
+ }
+ }
+
+ // in case of loading the html contents are used
+ // in case of saving the contents should be checked whether they are empty
+ InitArticleHTML();
+
+ // getArticleWiki();
+ }
+
+ public String GetMainURL()
+ {
+ return m_aMainURI.toString();
+ }
+
+ public String GetTitle()
+ {
+ return m_sTitle;
+ }
+
+ public String GetViewURL()
+ {
+ return m_aMainURI.toString() + "index.php?title=" + m_sTitle;
+ }
+
+ private String getArticleWiki()
+ throws com.sun.star.uno.Exception, java.io.IOException, WikiCancelException
+ {
+ String sWikiCode = null;
+
+ if ( m_aHostConfig != null )
+ {
+ URI aURI = new URI( m_aMainURI.toString() + "index.php?title=" + m_sTitle + "&action=edit" );
+ GetMethod aRequest = new GetMethod( aURI.getEscapedPathQuery() );
+
+ Helper.ExecuteMethod( aRequest, m_aHostConfig, aURI, m_xContext, false );
+
+ int nResultCode = aRequest.getStatusCode();
+ String sWebPage = null;
+ if ( nResultCode == 200 )
+ sWebPage = aRequest.getResponseBodyAsString();
+
+ aRequest.releaseConnection();
+
+ if ( sWebPage != null )
+ {
+ StringReader r = new StringReader(sWebPage);
+ HTMLEditorKit.Parser parse = Helper.GetHTMLParser();
+ EditPageParser callback = new EditPageParser();
+
+ parse.parse(r,callback,true);
+ m_sEditTime = callback.m_sEditTime;
+ m_sEditToken = callback.m_sEditToken;
+
+ int iPosStart = callback.m_nWikiArticleStart;
+ int iPosEnd = callback.m_nWikiArticleEnd;
+
+ if ( iPosStart >= 0 && iPosEnd > 0 )
+ {
+ String sArticle = sWebPage.substring(iPosStart, iPosEnd);
+ iPosStart = sArticle.indexOf(">") + 1;
+ sWikiCode = sArticle.substring( iPosStart, sArticle.length() );
+ }
+ }
+ }
+
+ return sWikiCode;
+ }
+
+ private void InitArticleHTML()
+ throws com.sun.star.uno.Exception, java.io.IOException, WikiCancelException
+ {
+ if ( m_aHostConfig != null )
+ {
+ URI aURI = new URI( m_aMainURI.toString() + "index.php?title=" + m_sTitle );
+ GetMethod aRequest = new GetMethod( aURI.getEscapedPathQuery() );
+
+ Helper.ExecuteMethod( aRequest, m_aHostConfig, aURI, m_xContext, false );
+
+ int nResultCode = aRequest.getStatusCode();
+ String sWebPage = null;
+ if ( nResultCode == 200 )
+ sWebPage = aRequest.getResponseBodyAsString();
+
+ if ( sWebPage != null )
+ {
+ StringReader r = new StringReader(sWebPage);
+ HTMLEditorKit.Parser parse = Helper.GetHTMLParser();
+ EditPageParser callback = new EditPageParser();
+
+ parse.parse(r,callback,true);
+
+ int iPosStart = callback.m_nHTMLArticleStart;
+ int iPosEnd = callback.m_nHTMLArticleEnd;
+ int nPosNoArt = callback.m_nNoArticleInd;
+
+ if ( iPosStart >= 0 && iPosEnd > 0 )
+ {
+ m_sHTMLCode = sWebPage.substring(iPosStart, iPosEnd);
+ m_bNoArticle = ( nPosNoArt >= 0 && nPosNoArt >= iPosStart && nPosNoArt <= iPosEnd );
+ }
+ }
+ }
+ }
+
+ protected boolean setArticle( String sWikiCode, String sWikiComment, boolean bMinorEdit )
+ throws com.sun.star.uno.Exception, java.io.IOException, WikiCancelException
+ {
+ boolean bResult = false;
+
+ if ( m_aHostConfig != null && sWikiCode != null && sWikiComment != null )
+ {
+ // get the edit time and token
+ getArticleWiki();
+
+ URI aURI = new URI( m_aMainURI.getPath() + "index.php?title=" + m_sTitle + "&action=submit" );
+ PostMethod aPost = new PostMethod();
+ aPost.setPath( aURI.getEscapedPathQuery() );
+
+ // aPost.addParameter( "title", m_sTitle );
+ // aPost.addParameter( "action", "submit" );
+ aPost.addParameter( "wpTextbox1", sWikiCode );
+ aPost.addParameter( "wpSummary", sWikiComment );
+ aPost.addParameter( "wpSection", "" );
+ aPost.addParameter( "wpEdittime", m_sEditTime );
+ aPost.addParameter( "wpSave", "Save page" );
+ aPost.addParameter( "wpEditToken", m_sEditToken );
+
+ if ( bMinorEdit )
+ aPost.addParameter( "wpMinoredit", "1" );
+
+ Helper.ExecuteMethod( aPost, m_aHostConfig, aURI, m_xContext, false );
+
+ int nResultCode = aPost.getStatusCode();
+ if ( nResultCode < 400 )
+ bResult = true;
+
+ String aResult = aPost.getResponseBodyAsString();
+
+ // TODO: remove the debug printing, try to detect the error
+ System.out.print( "nSubmitCode = " + nResultCode + "\n===\n" + aResult );
+ }
+
+ return bResult;
+ }
+
+ protected boolean Login()
+ throws com.sun.star.uno.Exception, java.io.IOException, WikiCancelException
+ {
+ m_aHostConfig = Helper.Login( m_aMainURI, m_sWikiUser, m_sWikiPass, m_xContext );
+ return ( m_aHostConfig != null );
+ }
+
+ protected void cleanHTML()
+ {
+ if ( m_sHTMLCode != null )
+ {
+ //Welcome to regex hell ;)
+
+ //strip comments
+ m_sHTMLCode = m_sHTMLCode.replaceAll("\\<![ \\r\\n\\t]*(--([^\\-]|[\\r\\n]|-[^\\-])*--[ \\r\\n\\t]*)\\>","");
+
+ //strip edit section links
+ m_sHTMLCode = m_sHTMLCode.replaceAll("\\<div class=\"editsection\".*?\\</div\\>","");
+
+ //strip huge spaces
+ m_sHTMLCode = m_sHTMLCode.replaceAll("\\<p\\>\\<br /\\>[ \r\n\t]*?\\</p\\>","");
+
+ //strip toc
+ m_sHTMLCode = m_sHTMLCode.replaceAll("\\<table.*id=\"toc\"(.|[\r\n])*?\\</table\\>","");
+
+ //strip jump-to-nav
+ m_sHTMLCode = m_sHTMLCode.replaceAll("\\<div id=\"jump-to-nav\".*?\\</div\\>","");
+
+ //strip Javascript
+ m_sHTMLCode = m_sHTMLCode.replaceAll("\\<script(.|[\r\n])*?\\</script\\>","");
+ }
+ }
+
+
+ protected boolean NotExist()
+ {
+ boolean bResult = true;
+ if ( m_sHTMLCode != null )
+ bResult = m_bNoArticle;
+
+ return bResult;
+ }
+
+}