blob: 801324aa073f67a1420aafe55bd66f7108700d68 [file] [log] [blame]
// This file is part of TagSoup and is Copyright 2002-2008 by John Cowan.
//
// TagSoup is licensed under the Apache License,
// Version 2.0. You may obtain a copy of this license at
// http://www.apache.org/licenses/LICENSE-2.0 . You may also have
// additional legal rights not granted by this license.
//
// TagSoup is distributed in the hope that it will be useful, but
// unless required by applicable law or agreed to in writing, TagSoup
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
// OF ANY KIND, either express or implied; not even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//
//
// This file is part of TagSoup.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version. You may also distribute
// and/or modify it under version 2.1 of the Academic Free License.
//
// This program 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.
//
//
// PYX Scanner
using System;
using System.IO;
namespace TagSoup
{
/// <summary>
/// A <see cref="IScanner"/> that accepts PYX format instead of HTML.
/// Useful primarily for debugging.
/// </summary>
public class PYXScanner : IScanner
{
public virtual void ResetDocumentLocator(string publicid, string systemid)
{
// Need this method for interface compatibility, but note
// that PyxScanner does not implement Locator.
}
public virtual void Scan(TextReader br, IScanHandler h)
{
string s;
char[] buff = null;
bool instag = false;
while ((s = br.ReadLine()) != null)
{
int size = s.Length;
buff = s.ToCharArray(0, size);
if (buff.Length < size)
{
buff = new char[size];
}
switch (buff[0])
{
case '(':
if (instag)
{
h.STagC(buff, 0, 0);
//instag = false; // LUCENENET: IDE0059: Remove unnecessary value assignment
}
h.GI(buff, 1, size - 1);
instag = true;
break;
case ')':
if (instag)
{
h.STagC(buff, 0, 0);
instag = false;
}
h.ETag(buff, 1, size - 1);
break;
case '?':
if (instag)
{
h.STagC(buff, 0, 0);
instag = false;
}
h.PI(buff, 1, size - 1);
break;
case 'A':
int sp = s.IndexOf(' ');
h.Aname(buff, 1, sp - 1);
h.Aval(buff, sp + 1, size - sp - 1);
break;
case '-':
if (instag)
{
h.STagC(buff, 0, 0);
instag = false;
}
if (s.Equals("-\\n", StringComparison.Ordinal))
{
buff[0] = '\n';
h.PCDATA(buff, 0, 1);
}
else
{
// FIXME:
// Does not decode \t and \\ in input
h.PCDATA(buff, 1, size - 1);
}
break;
case 'E':
if (instag)
{
h.STagC(buff, 0, 0);
instag = false;
}
h.Entity(buff, 1, size - 1);
break;
default:
// System.err.print("Gotcha ");
// System.err.print(s);
// System.err.print('\n');
break;
}
}
h.EOF(buff, 0, 0);
}
public void StartCDATA()
{
}
//public static void main(string[] argv) {
// IScanner s = new PYXScanner();
// TextReader r = new StreamReader(System.Console.OpenStandardInput(), Encoding.UTF8);
// TextWriter w = new StreamWriter(System.Console.OpenStandardOutput(), Encoding.UTF8));
// s.Scan(r, new PYXWriter(w));
// }
}
}