1 package net.sourceforge.phpeclipse.wiki.actions.mediawiki.connect;
4 import java.io.FileInputStream;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.io.InputStreamReader;
9 import java.io.StringReader;
10 import java.util.ArrayList;
12 import javax.xml.parsers.DocumentBuilder;
13 import javax.xml.parsers.DocumentBuilderFactory;
14 import javax.xml.parsers.ParserConfigurationException;
16 import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
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;
29 * <code>XMLReader</code> reads Wikipedia XML export pages
31 public class XMLReader {
32 private static final String TITLE_TAG = "title"; //$NON-NLS-1$
34 private static final String TIMESTAMP_TAG = "timestamp"; //$NON-NLS-1$
36 private static final String TEXT_TAG = "text"; //$NON-NLS-1$
38 private static final String PAGE_TAG = "page"; //$NON-NLS-1$
43 // public static void readInSyntax() {
45 // hasXMLFileBeenRead = true;
47 // * Attempt to read the syntax file from the metadata if this does not work, create metadata from default
49 // File syntaxFile = getSyntaxFile();
50 // if (syntaxFile.exists()) {
51 // readFromFile(syntaxFile);
53 // readFromStream(PHPSyntaxRdr.class.getResourceAsStream(PHPSYNTAX_FILE));
54 // saveToFile(syntaxFile);
57 // } catch (CoreException ce) {
58 // ce.printStackTrace();
62 public static void readFromFile(String filename) {
64 readFromFile(new File(filename));
65 } catch (CoreException e) {
69 public static void readFromFile(File file) throws CoreException {
70 InputStream stream = null;
74 stream = new FileInputStream(file);
75 readFromStream(new InputStreamReader(stream));
76 } catch (IOException e) {
77 throwReadException(e);
83 } catch (IOException e) {
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);
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();
106 processChildren(eleName, cNode.getChildNodes(), parsed);
108 case Node.CDATA_SECTION_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();
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)) {
133 * Read the first timestamp found in the Wikipedia xml stream
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();
159 * Get the timestamp as java Date Format String
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();
182 * Reads the wikipedia xml data from the given stream
186 * @throws CoreException
188 public static ArrayList readFromStream(Reader stream) throws CoreException {
189 ArrayList list = new ArrayList();
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();
202 for (int i = 0; i < numPages; i++) {
203 ElementNode page = (ElementNode) pages.item(i); // A <page>
204 Parsed parsed = new Parsed();
206 parsed.xmlData = page.toString();
207 traverse("", page, parsed);
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);
224 private static String getAttributeValue(NamedNodeMap attributes, String name) {
225 Node node = attributes.getNamedItem(name);
226 return node == null ? null : node.getNodeValue();
229 // public static void saveToFile(File file) throws CoreException {
230 // OutputStream stream = null;
232 // stream = new FileOutputStream(file);
233 // saveToStream(stream);
234 // } catch (IOException e) {
235 // throwWriteException(e);
238 // if (stream != null)
240 // } catch (IOException e) {
245 // public static void saveToStream(OutputStream stream) throws CoreException {
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);
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);
276 // // if (bufferobj instanceof PHPFunction) {
277 // // // Attr usage = document.createAttribute(USAGE_ATTR);
278 // // Text usage = document.createTextNode(((PHPFunction) bufferobj).getDescription());
279 // // node.appendChild(usage);
281 // // if (bufferobj instanceof PHPConstant) {
282 // // // Attr usage = document.createAttribute(USAGE_ATTR);
283 // // Text usage = document.createTextNode(((PHPConstant) bufferobj).getDescription());
284 // // node.appendChild(usage);
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);
293 // transformer.transform(source, result);
295 // } catch (ParserConfigurationException e) {
296 // throwWriteException(e);
297 // } catch (TransformerException e) {
298 // throwWriteException(e);
303 private static void throwReadException(Throwable t) throws CoreException {
304 WikiEditorPlugin.log(t);
307 private static void throwWriteException(Throwable t) throws CoreException {
308 WikiEditorPlugin.log(t);
311 public static void main(String[] args) {
313 String test = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n"
314 + "<mediawiki version=\"0.1\" xml:lang=\"de\">\r\n"
316 + " <title>Mechanisches Fernsehen</title>\r\n"
318 + " <timestamp>2004-11-22T12:41:10Z</timestamp>\r\n"
319 + " <contributor><username>Electrocat</username></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"
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"
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"
326 + "Auch heute ist das mechanische Fernsehen nicht vollkommen bedeutungslos. Insbesondere Spiegelsysteme finden heute wieder Verwendung beim Bau von [[Videoprojektoren]]. \r\n"
328 + "===Hinweis:===\r\n"
329 + "Die Begriffsbildung "Mechanisches Fernsehen" 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"
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. <br />\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.<br />\r\n"
334 + "Dieser polarisierte Lichtstrahl wurde mit Hilfe entweder eines speziellen optischen Glases oder einer mit Schwefelkohlenstoff gefüllten Röhre erzeugt(sog. "Glimmlampe") und ersetzte damals die noch nicht erfundene Braunsche Elektronenstrahlröhre. \r\n"
336 + "Damit wird sichtbar, dass der Begriff des "mechanischen Fernsehens" weitgehend irreführend ist. Nipkow selbst nannte seinen Apparat in der Patentschrift etwas treffender ein "Elektrisches Teleskop". \r\n"
337 + "Allenfalls korrekt wäre noch die Begriffsbildung "mechanische Bildzerlegung". \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"
343 + " <title>Anrechenbare Kosten</title>\r\n"
345 + " <timestamp>2004-09-22T17:18:23Z</timestamp>\r\n"
346 + " <contributor><username>Fenice</username></contributor>\r\n"
347 + " <comment>cat</comment>\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"
351 + "[[Kategorie:Rechnungswesen]]</text>\r\n"
355 + " <title>Synästhesie</title>\r\n"
357 + " <timestamp>2004-12-01T12:19:53Z</timestamp>\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]] (\'\'"warmes Grün"\'\'), 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"
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 "inneren Auge" sichtbar. Diese Synästhesie ist als \'\'Farbenhören\'\' bekannt.\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"
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"
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 "schon immer da gewesen", 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"
378 + "Alkohol verstärkt Synästhesien, Amphetamine verringern sie.\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"
383 + "<!-- 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"
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"
389 + "== Siehe auch ==\r\n"
390 + "* [[Synästhetiker]]\r\n"
391 + "* [[Musikpsychologie]]\r\n"
392 + "* [[Geruchsorgel]]\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);
403 System.out.println(readFromStream(st));
404 } catch (CoreException e) {
405 // TODO Auto-generated catch block