import "sax.jsx";
class _HTMLHandler extends SAXHandler
{
var text : string[];
var styles : Map.;
var escape : boolean;
static function escapeHTML (str : string) : string
{
return str.replace(/\n/g, "
").replace(/&/g, "&").replace(/"/g, """).replace(//g, ">");
}
function constructor (styles : Map., escape : boolean)
{
this.text = [] : string[];
this.escape = escape;
this.styles = styles;
}
override function onopentag (tagname : string, attributes : Map.) : void
{
this.text.push(this.styles[tagname][0]);
}
override function onclosetag (tagname : string) : void
{
this.text.push(this.styles[tagname][1]);
}
override function ontext (text : string) : void
{
if (this.escape)
{
this.text.push(_HTMLHandler.escapeHTML(text));
}
else
{
this.text.push(text);
}
}
function result () : string
{
return this.text.join('');
}
}
class Style
{
var styles : Map.;
var escapeHTML : boolean;
static const console = {
'title' : ['\x1B[32m\x1b[4m', '\x1B[39m\x1b[0m'],
'url' : ['\x1B[34m', '\x1B[39m'],
'hit' : ['\x1B[4m', '\x1B[0m'],
'del' : ['\x1B[9m', '\x1B[0m'],
'summary' : ['\x1B[90m', '\x1B[39m']
};
static const html = {
'title' : ['', ''],
'url' : ['', ''],
'hit' : ['', ''],
'del' : ['', ''],
'summary' : ['', '']
};
static const ignore = {
'tilte' : ['', ''],
'url' : ['', ''],
'hit' : ['', ''],
'del' : ['', ''],
'summary' : ['', '']
};
function constructor (mode : string)
{
switch (mode)
{
case 'console':
this.styles = Style.console;
break;
case 'html':
this.styles = Style.html;
break;
case 'ignore':
this.styles = Style.ignore;
break;
default:
this.styles = Style.ignore;
break;
}
this.escapeHTML = (mode == 'html');
}
function convert (source : string) : string
{
var handler = new _HTMLHandler(this.styles, this.escapeHTML);
var parser = new SAXParser(handler);
parser.parse(source);
return handler.result();
}
}