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(); } }