Enable word wrapping with preference key editor.wrap.words (false by default)
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.wiki / src / net / sourceforge / phpeclipse / wiki / actions / mediawiki / connect / XMLReader.java
1 package net.sourceforge.phpeclipse.wiki.actions.mediawiki.connect;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.io.InputStreamReader;
8 import java.io.Reader;
9 import java.io.StringReader;
10 import java.util.ArrayList;
11
12 import javax.xml.parsers.DocumentBuilder;
13 import javax.xml.parsers.DocumentBuilderFactory;
14 import javax.xml.parsers.ParserConfigurationException;
15
16 import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
17
18 import org.apache.crimson.tree.ElementNode;
19 import org.eclipse.core.runtime.CoreException;
20 import org.w3c.dom.Document;
21 import org.w3c.dom.NamedNodeMap;
22 import org.w3c.dom.Node;
23 import org.w3c.dom.NodeList;
24 import org.xml.sax.InputSource;
25 import org.xml.sax.SAXException;
26 import org.xml.sax.SAXParseException;
27
28 /**
29  * <code>XMLReader</code> reads Wikipedia XML export pages
30  */
31 public class XMLReader {
32   private static final String TITLE_TAG = "title"; //$NON-NLS-1$
33
34   private static final String TIMESTAMP_TAG = "timestamp"; //$NON-NLS-1$
35
36   private static final String TEXT_TAG = "text"; //$NON-NLS-1$
37
38   private static final String PAGE_TAG = "page"; //$NON-NLS-1$
39
40   public XMLReader() {
41   }
42
43   //  public static void readInSyntax() {
44   //    try {
45   //      hasXMLFileBeenRead = true;
46   //      /*
47   //       * Attempt to read the syntax file from the metadata if this does not work, create metadata from default
48   //       */
49   //      File syntaxFile = getSyntaxFile();
50   //      if (syntaxFile.exists()) {
51   //        readFromFile(syntaxFile);
52   //      } else {
53   //        readFromStream(PHPSyntaxRdr.class.getResourceAsStream(PHPSYNTAX_FILE));
54   //        saveToFile(syntaxFile);
55   //      }
56   //
57   //    } catch (CoreException ce) {
58   //      ce.printStackTrace();
59   //    }
60   //  }
61
62   public static void readFromFile(String filename) {
63     try {
64       readFromFile(new File(filename));
65     } catch (CoreException e) {
66     }
67   }
68
69   public static void readFromFile(File file) throws CoreException {
70     InputStream stream = null;
71
72     if (file.exists()) {
73       try {
74         stream = new FileInputStream(file);
75         readFromStream(new InputStreamReader(stream));
76       } catch (IOException e) {
77         throwReadException(e);
78       } finally {
79         try {
80           if (stream != null) {
81             stream.close();
82           }
83         } catch (IOException e) {
84         }
85       }
86     }
87   }
88
89   private static void traverse(String eleName, Node cNode, Parsed parsed) {
90     switch (cNode.getNodeType()) {
91     case Node.DOCUMENT_NODE:
92       //      System.out.println("DOCUMENT_NODE " + cNode.getNodeName());
93       processChildren(eleName, cNode.getChildNodes(), parsed);
94       break;
95
96     case Node.ELEMENT_NODE:
97       eleName = cNode.getNodeName();
98       //      System.out.println("ELEMENT_NODE " + eleName);
99       //      NamedNodeMap attributeMap = cNode.getAttributes();
100       //      int numAttrs = attributeMap.getLength();
101       //      for (int i = 0; i < attributeMap.getLength(); i++) {
102       //        Attr attribute = (Attr) attributeMap.item(i);
103       //        String attrName = attribute.getNodeName();
104       //        String attrValue = attribute.getNodeValue();
105       //      }
106       processChildren(eleName, cNode.getChildNodes(), parsed);
107       break;
108     case Node.CDATA_SECTION_NODE:
109     case Node.TEXT_NODE:
110       if (eleName.equals(TITLE_TAG)) { // element name from the corresp tag
111         parsed.title = cNode.getNodeValue();
112       } else if (eleName.equals(TIMESTAMP_TAG)) {
113         parsed.timestamp = cNode.getNodeValue();
114       } else if (eleName.equals(TEXT_TAG)) {
115         parsed.body = cNode.getNodeValue();
116       }
117       break;
118     }
119   }
120
121   private static void processChildren(String eleName, NodeList nList, Parsed parsed) {
122     if (nList.getLength() != 0) {
123       for (int i = 0; i < nList.getLength(); i++) {
124         traverse(eleName, nList.item(i), parsed);
125         if (eleName.equals(TEXT_TAG)) {
126           break;
127         }
128       }
129     }
130   }
131
132   /**
133    * Read the first timestamp found in the Wikipedia xml stream
134    * 
135    * @param stream
136    * @return
137    * @throws Exception
138    */
139   public static String getTimestamp(InputStream stream) throws Exception {
140     //  Create a factory object for creating DOM parsers
141     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
142     //  Now use the factory to create a DOM parser (a.k.a. a DocumentBuilder)
143     DocumentBuilder parser = factory.newDocumentBuilder();
144     //  Parse the file and build a Document tree to represent its content
145     Document document = parser.parse(stream);
146     //  Ask the document for a list of all <page> tags it contains
147     NodeList timestamps = document.getElementsByTagName(TIMESTAMP_TAG);
148     //  Loop through those <mediawiki> elements one at a time, and extract the
149     //  content of their <page> tags.
150     int numPages = timestamps.getLength();
151     for (int i = 0; i < numPages; i++) {
152       ElementNode page = (ElementNode) timestamps.item(i); // A <timestamp>
153       return page.getChildNodes().item(0).getNodeValue();
154     }
155     return null;
156   }
157   
158   /**
159    * Get the timestamp as java Date Format String
160    * 
161    * @param stream
162    * @return
163    * @throws Exception
164    */
165   public static String getDateTimestamp(InputStream stream) throws Exception {
166     String timestamp = getTimestamp(stream);
167     if (timestamp!=null) {
168       StringBuffer buffer = new StringBuffer();
169       // 2004-11-22T12:41:10Z
170       buffer.append(timestamp.substring(0,4));  //year
171       buffer.append(timestamp.substring(5,7));  //month
172       buffer.append(timestamp.substring(8,10)); //day
173       buffer.append(timestamp.substring(11,13));//hour
174       buffer.append(timestamp.substring(14,16));//minute
175       buffer.append(timestamp.substring(17,19));//second
176       return buffer.toString();
177     } 
178     return null;
179   }
180
181   /**
182    * Reads the wikipedia xml data from the given stream
183    * 
184    * @param stream
185    * @return
186    * @throws CoreException
187    */
188   public static ArrayList readFromStream(Reader stream) throws CoreException {
189     ArrayList list = new ArrayList();
190     try {
191       //  Create a factory object for creating DOM parsers
192       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
193       //  Now use the factory to create a DOM parser (a.k.a. a DocumentBuilder)
194       DocumentBuilder parser = factory.newDocumentBuilder();
195       //  Parse the file and build a Document tree to represent its content
196       Document document = parser.parse(new InputSource(stream));
197       //  Ask the document for a list of all <page> tags it contains
198       NodeList pages = document.getElementsByTagName(PAGE_TAG);
199       //  Loop through those <page> elements one at a time
200       int numPages = pages.getLength();
201
202       for (int i = 0; i < numPages; i++) {
203         ElementNode page = (ElementNode) pages.item(i); // A <page>
204         Parsed parsed = new Parsed();
205         // set raw xml data:
206         parsed.xmlData = page.toString();
207         traverse("", page, parsed);
208         list.add(parsed);
209       }
210       return list;
211     } catch (ParserConfigurationException e) {
212       throwReadException(e);
213     } catch (IOException e) {
214       throwReadException(e);
215     } catch (SAXParseException e) {
216       //      System.out.println("SAXParseException in line:" + e.getLineNumber() + " column:" + e.getColumnNumber());
217       throwReadException(e);
218     } catch (SAXException e) {
219       throwReadException(e);
220     }
221     return list;
222   }
223
224   private static String getAttributeValue(NamedNodeMap attributes, String name) {
225     Node node = attributes.getNamedItem(name);
226     return node == null ? null : node.getNodeValue();
227   }
228
229   //  public static void saveToFile(File file) throws CoreException {
230   //    OutputStream stream = null;
231   //    try {
232   //      stream = new FileOutputStream(file);
233   //      saveToStream(stream);
234   //    } catch (IOException e) {
235   //      throwWriteException(e);
236   //    } finally {
237   //      try {
238   //        if (stream != null)
239   //          stream.close();
240   //      } catch (IOException e) {
241   //      }
242   //    }
243   //  }
244
245   //  public static void saveToStream(OutputStream stream) throws CoreException {
246   //    try {
247   //      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
248   //      DocumentBuilder builder = factory.newDocumentBuilder();
249   //      Document document = builder.newDocument();
250   //      Node root = document.createElement("PHPStandardSyntax"); // $NON-NLS-1$ //$NON-NLS-1$
251   //      document.appendChild(root);
252   //      for (int i = 0; i != syntaxdata.size(); i++) {
253   //        Object bufferobj = (Object) syntaxdata.get(i);
254   //        Attr name = null;
255   //        Node node = document.createElement(REVISION_TAG); // $NON-NLS-1$ //$NON-NLS-1$
256   //        root.appendChild(node);
257   //        NamedNodeMap attributes = node.getAttributes();
258   //        // if (bufferobj instanceof PHPType)
259   //        // name = document.createAttribute(TYPE_ATTR);
260   //        // if (bufferobj instanceof PHPKeyword)
261   //        // name = document.createAttribute(KEYWORD_ATTR);
262   //        // if (bufferobj instanceof PHPFunction)
263   //        // name = document.createAttribute(FN_ATTR);
264   //        // if (bufferobj instanceof PHPConstant)
265   //        // name = document.createAttribute(CONSTANT_ATTR);
266   //        // name.setValue(((PHPElement) bufferobj).getName());
267   //        // attributes.setNamedItem(name);
268   //        // Attr description = document.createAttribute(USAGE_ATTR);
269   //        // description.setValue(((PHPElement) bufferobj).getUsage());
270   //        // attributes.setNamedItem(description);
271   //        // if (bufferobj instanceof PHPKeyword) {
272   //        // Attr tokenval = document.createAttribute(TOKENVAL_ATTR);
273   //        // tokenval.setValue((new Integer(((PHPKeyword) bufferobj).gettokenval())).toString());
274   //        // attributes.setNamedItem(tokenval);
275   //        // }
276   //        // if (bufferobj instanceof PHPFunction) {
277   //        // // Attr usage = document.createAttribute(USAGE_ATTR);
278   //        // Text usage = document.createTextNode(((PHPFunction) bufferobj).getDescription());
279   //        // node.appendChild(usage);
280   //        // }
281   //        // if (bufferobj instanceof PHPConstant) {
282   //        // // Attr usage = document.createAttribute(USAGE_ATTR);
283   //        // Text usage = document.createTextNode(((PHPConstant) bufferobj).getDescription());
284   //        // node.appendChild(usage);
285   //        // }
286   //      }
287   //      Transformer transformer = TransformerFactory.newInstance().newTransformer();
288   //      transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
289   //      transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$
290   //      DOMSource source = new DOMSource(document);
291   //      StreamResult result = new StreamResult(stream);
292   //
293   //      transformer.transform(source, result);
294   //
295   //    } catch (ParserConfigurationException e) {
296   //      throwWriteException(e);
297   //    } catch (TransformerException e) {
298   //      throwWriteException(e);
299   //    }
300   //
301   //  }
302
303   private static void throwReadException(Throwable t) throws CoreException {
304     WikiEditorPlugin.log(t);
305   }
306
307   private static void throwWriteException(Throwable t) throws CoreException {
308     WikiEditorPlugin.log(t);
309   }
310
311   public static void main(String[] args) {
312     try {
313       String test = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n"
314           + "<mediawiki version=\"0.1\" xml:lang=\"de\">\r\n"
315           + "  <page>\r\n"
316           + "    <title>Mechanisches Fernsehen</title>\r\n"
317           + "    <revision>\r\n"
318           + "      <timestamp>2004-11-22T12:41:10Z</timestamp>\r\n"
319           + "      <contributor><category>Electrocat</category></contributor>\r\n"
320           + "      <text>Als \'\'\'mechanisches Fernsehen\'\'\' bezeichnet man [[Fernsehen]], bei dem die Bildzerlegung und -zusammensetzung im Gegensatz zum [[elektronisches Fernsehen|elektronischen Fernsehen]] mechanisch erfolgt. Die eigentliche Übertragung findet natürlich auf elektrischem Wege statt.\r\n"
321           + "\r\n"
322           + "Das mechanische Fernsehen war die erste Form des Fernsehens. Die erste  brauchbare Realisierung erfolgte mit Hilfe der nach ihrem Erfinder [[Paul Nipkow]] benannten [[Nipkow-Scheibe]]. Hierbei ist insbesondere die Pionierarbeit des ungarischen Ingenieurs [[D. von Mihaly]] und des schottischen Erfinders [[John Logie Baird]] zu erwähnen. [[D. von Mihaly]] entwickelte ebenfalls ein vollkommen anderes Verfahren, bei dem ein Spiegel zwischen einem Hufeisenmagneten schnell oszillierte. In einem verbesserten Verfahren wurde ein Spiegel auf Drahtsaiten befestigt, welche nach Stromdurchleitung in eine schnelle Schwingung versetzt wurden. Ein wieder anderes Verfahren entwickelte [[Dr. Carolus]] bei [[Telefunken]], wo mit schnell rotierenden Spiegeln gearbeitet wurde. Durch Carolus wurden auch beide Systeme miteinander kombiniert (Spiegelrad für horizontale Abtastung, oszillierende Spiegel für vertikale Abtastung. \r\n"
323           + "\r\n"
324           + "Dennoch sollte beim mechanischen Fernsehen insbesondere die Nipkow-Scheibe Verwendung finden, welche auf der Senderseite bis in die 1940er Jahre zur Bildzerlegung von Filmen Verwendung fand.   \r\n"
325           + "\r\n"
326           + "Auch heute ist das mechanische Fernsehen nicht vollkommen bedeutungslos. Insbesondere Spiegelsysteme finden heute wieder Verwendung beim Bau von [[Videoprojektoren]]. \r\n"
327           + "\r\n"
328           + "===Hinweis:===\r\n"
329           + "Die Begriffsbildung &quot;Mechanisches Fernsehen&quot; beruht auf der laienhaften Anschauung, die sichtbar drehende Nipkow-Lochscheibe als wesentlichstes Funktionselement oder anders ausgedrückt, den Vorgang der Bildpunkt-Zerlegung als Hauptteil des Fernseh-Gesamtsystems wahrzunehmen\r\n"
330           + "\r\n"
331           + "Demgegenüber besteht die nipkowsche Vorrichtung größtenteils aus elektrisch betriebenen Bauteilen, von denen mindestens eines - die [[Selen]]zelle - bereits ein elektronisches Bauelement darstellt. Desweiteren erfolgt die Übertragung vom Sender zum Empfänger elektrisch. &lt;br /&gt;\r\n"
332           + "\r\n"
333           + "Auf der Empfänger-Seite wird bei der nipkowschen Ausführung raffinierterweise ein [[Polarisation|polarisierter]] Lichstrahl von dem Magnetfeld einer Spule in Abhängigkeit von dem Signal der Sender-Selenzelle soweit gedreht und durch nachfolgende Linsen gefiltert, dass für das Auge der gleiche Helligkeits-Eindruck hervorgerufen wird, wie er auf der Sender-Seite besteht.&lt;br /&gt;\r\n"
334           + "Dieser polarisierte Lichtstrahl wurde mit Hilfe entweder eines speziellen optischen Glases oder einer mit Schwefelkohlenstoff gefüllten Röhre erzeugt(sog. &quot;Glimmlampe&quot;)  und   ersetzte damals die noch nicht erfundene Braunsche Elektronenstrahlröhre. \r\n"
335           + "\r\n"
336           + "Damit wird sichtbar, dass der Begriff des &quot;mechanischen Fernsehens&quot; weitgehend irreführend ist. Nipkow selbst nannte seinen Apparat in der Patentschrift etwas treffender ein &quot;Elektrisches Teleskop&quot;. \r\n"
337           + "Allenfalls korrekt wäre noch die Begriffsbildung &quot;mechanische Bildzerlegung&quot;. \r\n" + "\r\n"
338           + "== Weblinks ==\r\n" + "*http://www.kefk.net/Research/Funk/HA-Funk/ha_2-3.html\r\n" + "\r\n"
339           + "[[Kategorie:Fernsehtechnik]]</text>\r\n" + "    </revision>\r\n" + "  </page>\r\n" + "\r\n" + "</mediawiki>";
340       String test2 = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n"
341           + "<mediawiki version=\"0.1\" xml:lang=\"de\">\r\n"
342           + "  <page>\r\n"
343           + "    <title>Anrechenbare Kosten</title>\r\n"
344           + "    <revision>\r\n"
345           + "      <timestamp>2004-09-22T17:18:23Z</timestamp>\r\n"
346           + "      <contributor><category>Fenice</category></contributor>\r\n"
347           + "      <comment>cat</comment>\r\n"
348           + "\r\n"
349           + "      <text>Die \'\'\'anrechenbaren Kosten\'\'\' sind eines der Regelkriterien bei der Ermittlung des [[Honorar]]s von Architekten und Ingenieuren nach der [[HOAI]]. Sie werden aus einem fachspezifischen Kostenanteil auf Basis der Kostenermittlungen nach [[DIN 276]] errechnet und können daher innerhalb eines Projektes je nach [[Leistungsphasen|Leistungsphase]] unterschiedlich hoch sein.\r\n"
350           + "\r\n"
351           + "[[Kategorie:Rechnungswesen]]</text>\r\n"
352           + "    </revision>\r\n"
353           + "  </page>\r\n"
354           + "  <page>\r\n"
355           + "    <title>Synästhesie</title>\r\n"
356           + "    <revision>\r\n"
357           + "      <timestamp>2004-12-01T12:19:53Z</timestamp>\r\n"
358           + "\r\n"
359           + "      <contributor><ip>145.253.155.135</ip></contributor>\r\n"
360           + "      <comment>vorübergehender statt verübergehender</comment>\r\n"
361           + "      <text>\'\'\'Synästhesie\'\'\' (griech. \'\'Mitempfindung\'\') ist die Kopplung zweier physikalisch getrennter Domänen der [[Wahrnehmung]] , etwa [[Farbe]] und [[Temperatur]] (\'\'&quot;warmes Grün&quot;\'\'), im engeren Sinne die [[Wahrnehmung]] von Sinnesreizen eines [[Sinnesorgan]]s als die eines anderen. Menschen, bei denen derart verknüpfte Wahrnehmungen auftreten, werden als [[Synästhetiker]] bezeichnet. Synästhesie kann auch als vorübergehender Effekt nach der Einnahme von [[Halluzinogen]]en auftreten.\r\n"
362           + "\r\n"
363           + "Synästhetiker haben also häufig zu einem Sinnesreiz zwei oder mehrere [[Wahrnehmung]]en. Sie können beispielsweise Geräusche nicht nur hören, sondern auch [[Form]]en und Farben dazu sehen. Das Geräusch bekommt zusätzlich zu den üblichen Eigenschaften diese weiteren Eigenschaften. Das Bild, das dabei entsteht, überlagert sich jedoch nur bei den wenigsten Synästhetikern mit dem Gesehenen, sondern wird vor einem &quot;inneren Auge&quot; sichtbar. Diese Synästhesie ist als \'\'Farbenhören\'\' bekannt.\r\n"
364           + "\r\n"
365           + "Viel häufiger als das Farbenhören ist jedoch das Sehen von farbigen Buchstaben, Wörtern oder Zahlen, unabhängig von der eigentlichen Schriftfarbe. \r\n"
366           + "\r\n"
367           + "Synästhesien müssen nicht notwendigerweise mit den 5 Hauptsinnen zu tun haben. Bei Gefühlssynästhetikern erzeugen beispielsweise Sinnesreize Gefühle, oder umgekehrt. Auch abstrakte Begriffe wie eine Jahreszahl oder der Charakter einer Person können bei einem Synästhetiker als Form, als Farbe oder sonstige Sinnesqualität wahrgenommen werden.\r\n"
368           + "\r\n"
369           + "Synästhesien sind z. B.\r\n"
370           + "*individuell verschieden\r\n"
371           + "*nicht umkehrbar (z. B. ruft ein bestimmtes Grün eine Fünf hervor, aber nicht umgekehrt)\r\n"
372           + "*identitätsstiftend\r\n"
373           + "*für den Betroffenen &quot;schon immer da gewesen&quot;, d. h., so lange dieser sich erinnern kann\r\n"
374           + "*unwillkürlich, d. h., ohne Willensanstrengung des Betroffenen\r\n"
375           + "*ohne Einfluss von Alkohol, Drogen oder Medikamenten entstanden\r\n"
376           + "*nicht an eine bestimmte Situation, Erinnerung oder einen Eindruck gebunden\r\n"
377           + "\r\n"
378           + "Alkohol verstärkt Synästhesien, Amphetamine verringern sie.\r\n"
379           + "\r\n"
380           + "\r\n"
381           + "Über die Häufigkeit synästhetischer Wahrnehmung gibt es widersprüchliche Angaben. In der Fachliteratur wird eine Häufigkeit zwischen 1:2000 und 1:500 bei Erwachsenen genannt. 95% der Betroffenen sind Frauen. Viele Synästhetiker sind sich der Besonderheit ihrer Wahrnehmung selbst nicht bewusst und werden erst durch Medienberichte darauf aufmerksam.\r\n"
382           + "\r\n"
383           + "&lt;!-- auskommentiert wegen siehe Diskussion\r\n"
384           + "Synästhesie tritt teilweise auch zusammen mit anderen Eigenschaften, wie beispielsweise starke Empfindsamkeit, ein überdurchschnittliches Gedächtnis und Linkshändigkeit auf.\r\n"
385           + "--&gt;\r\n"
386           + "\r\n"
387           + "Synästhesie ist im deutschsprachigen Raum derzeit ein populärer Forschungsgegenstand, da sie Rückschlüsse auf die Funktionsweise der menschlichen Wahrnehmung zulässt. Auch das Medienecho hat in den letzten Jahren stark zugenommen.\r\n"
388           + "\r\n"
389           + "== Siehe auch ==\r\n"
390           + "* [[Synästhetiker]]\r\n"
391           + "* [[Musikpsychologie]]\r\n"
392           + "* [[Geruchsorgel]]\r\n"
393           + "\r\n"
394           + "== Weblinks ==\r\n"
395           + "* [http://www.mhh-synaesthesie.de/synaesthesie.htm Synästhesieforschung an der medizinischen Hochschule in Hannover]\r\n"
396           + "* [http://www.ch-forschung.ch/alt/fs/0110/S1-1_synest.rtf Synästhesieforschung am neuropsychologischen Institut des Unispitals Zürich]\r\n"
397           + "* [http://www.synaesthesieforum.de Deutschsprachiges Forum von und für Synästhetiker mit ausführlicher Linksammlung zum Thema]\r\n"
398           + "\r\n" + "[[Kategorie:Rhetorischer Begriff]]\r\n"
399           + "[[en:Synaesthesia]] [[es:Sinestesia]] [[sv:Synestesi]] [[tr:Sinestezi]]</text>\r\n" + "    </revision>\r\n"
400           + "  </page>\r\n" + "</mediawiki>";
401       StringReader st = new StringReader(test);
402
403       System.out.println(readFromStream(st));
404     } catch (CoreException e) {
405       // TODO Auto-generated catch block
406       e.printStackTrace();
407     }
408   }
409 }