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