141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. 241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// 341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// TagSoup is licensed under the Apache License, 441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// Version 2.0. You may obtain a copy of this license at 541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// http://www.apache.org/licenses/LICENSE-2.0 . You may also have 641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// additional legal rights not granted by this license. 741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// 841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// TagSoup is distributed in the hope that it will be useful, but 941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// unless required by applicable law or agreed to in writing, TagSoup 1041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 1141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// OF ANY KIND, either express or implied; not even the implied warranty 1241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 1341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// 1441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// 1541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// This file is part of TagSoup. 1641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// 1741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// This program is free software; you can redistribute it and/or modify 1841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// it under the terms of the GNU General Public License as published by 1941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// the Free Software Foundation; either version 2 of the License, or 2041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// (at your option) any later version. You may also distribute 2141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// and/or modify it under version 2.1 of the Academic Free License. 2241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// 2341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// This program is distributed in the hope that it will be useful, 2441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// but WITHOUT ANY WARRANTY; without even the implied warranty of 2541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 2641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// 2741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// 2841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// PYX Scanner 2941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 3041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectpackage org.ccil.cowan.tagsoup; 3141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport java.io.*; 3241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport org.xml.sax.SAXException; 3341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 3441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project/** 3541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source ProjectA Scanner that accepts PYX format instead of HTML. 3641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source ProjectUseful primarily for debugging. 3741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project**/ 3841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectpublic class PYXScanner implements Scanner { 3941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 4041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void resetDocumentLocator(String publicid, String systemid) { 4141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project // Need this method for interface compatibility, but note 4241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project // that PyxScanner does not implement Locator. 4341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 4441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 4541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void scan(Reader r, ScanHandler h) throws IOException, SAXException { 4641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project BufferedReader br = new BufferedReader(r); 4741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project String s; 4841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project char[] buff = null; 4941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project boolean instag = false; 5041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project while ((s = br.readLine()) != null) { 5141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project int size = s.length(); 5241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (buff == null || buff.length < size) { 5341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project buff = new char[size]; 5441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 5541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project s.getChars(0, size, buff, 0); 5641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project switch (buff[0]) { 5741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project case '(': 5841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (instag) { 5941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project h.stagc(buff, 0, 0); 6041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project instag = false; 6141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 6241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project h.gi(buff, 1, size - 1); 6341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project instag = true; 6441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project break; 6541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project case ')': 6641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (instag) { 6741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project h.stagc(buff, 0, 0); 6841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project instag = false; 6941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 7041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project h.etag(buff, 1, size - 1); 7141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project break; 7241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project case '?': 7341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (instag) { 7441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project h.stagc(buff, 0, 0); 7541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project instag = false; 7641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 7741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project h.pi(buff, 1, size - 1); 7841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project break; 7941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project case 'A': 8041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project int sp = s.indexOf(' '); 8141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project h.aname(buff, 1, sp - 1); 8241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project h.aval(buff, sp + 1, size - sp - 1); 8341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project break; 8441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project case '-': 8541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (instag) { 8641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project h.stagc(buff, 0, 0); 8741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project instag = false; 8841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 8941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (s.equals("-\\n")) { 9041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project buff[0] = '\n'; 9141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project h.pcdata(buff, 0, 1); 9241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 9341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project else { 9441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project // FIXME: 9541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project // Does not decode \t and \\ in input 9641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project h.pcdata(buff, 1, size - 1); 9741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 9841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project break; 9941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project case 'E': 10041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (instag) { 10141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project h.stagc(buff, 0, 0); 10241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project instag = false; 10341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 10441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project h.entity(buff, 1, size - 1); 10541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project break; 10641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project default: 10741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// System.err.print("Gotcha "); 10841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// System.err.print(s); 10941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// System.err.print('\n'); 11041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project break; 11141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 11241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 11341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project h.eof(buff, 0, 0); 11441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 11541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 11641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void startCDATA() { } 11741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 11841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public static void main(String[] argv) throws IOException, SAXException { 11941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project Scanner s = new PYXScanner(); 12041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project Reader r = new InputStreamReader(System.in, "UTF-8"); 12141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project Writer w = new BufferedWriter(new OutputStreamWriter(System.out, "UTF-8")); 12241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project s.scan(r, new PYXWriter(w)); 12341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 12441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 125