openfl
Version:
A fast, productive library for 2D cross-platform development.
265 lines (248 loc) • 10.6 kB
JavaScript
// Class: openfl.text._internal.HTMLParser
var $global = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : this
$global.Object.defineProperty(exports, "__esModule", {value: true});
var __map_reserved = {};
// Imports
var $hxClasses = require("./../../../hxClasses_stub").default;
var $hxEnums = require("./../../../hxEnums_stub").default;
var $import = require("./../../../import_stub").default;
function EReg() {return require("./../../../EReg");}
function Std() {return require("./../../../Std");}
function openfl_VectorData() {return require("./../../../openfl/VectorData");}
function HxOverrides() {return require("./../../../HxOverrides");}
function openfl__$Vector_Vector_$Impl_$() {return require("./../../../openfl/_Vector/Vector_Impl_");}
function openfl_text__$internal_TextFormatRange() {return require("./../../../openfl/text/_internal/TextFormatRange");}
function StringTools() {return require("./../../../StringTools");}
// Constructor
var HTMLParser = function(){}
// Meta
HTMLParser.__name__ = "openfl.text._internal.HTMLParser";
HTMLParser.__isInterface__ = false;
HTMLParser.prototype = {
};
HTMLParser.prototype.__class__ = HTMLParser.prototype.constructor = $hxClasses["openfl.text._internal.HTMLParser"] = HTMLParser;
// Init
// Statics
HTMLParser.parse = function(value,multiline,styleSheet,textFormat,textFormatRanges) {
if(multiline) {
value = HTMLParser.__regexBreakTag.replace(value,"\n");
} else {
value = HTMLParser.__regexBreakTag.replace(value,"");
}
value = HTMLParser.__regexEntityNbsp.replace(value," ");
value = HTMLParser.__regexCharEntity.map(value,function(ereg) {
var decimalStr = ereg.matched(1);
var hexStr = ereg.matched(2);
if(decimalStr != null) {
var decimal = (Std().default).parseInt(decimalStr);
if(decimal != null) {
return String.fromCodePoint(decimal);
}
}
if(hexStr != null) {
var hex = (Std().default).parseInt("0" + hexStr);
if(hex != null) {
return String.fromCodePoint(hex);
}
}
return ereg.matched(0);
});
var segments = value.split("<");
if(segments.length == 1) {
value = HTMLParser.__htmlUnescape(HTMLParser.__regexHTMLTag.replace(value,""));
if(textFormatRanges.get_length() > 1) {
var len = textFormatRanges.get_length() - 1;
(openfl_VectorData().default).ofArray((Array.prototype.splice.call)(textFormatRanges,1,len));
}
var range = textFormatRanges[0];
range.format = textFormat;
range.start = 0;
range.end = value.length;
return value;
} else {
var len1 = textFormatRanges.get_length();
(openfl_VectorData().default).ofArray((Array.prototype.splice.call)(textFormatRanges,0,len1));
value = "";
var formatStack = [textFormat.clone()];
var tagStack = [];
var sub;
var noLineBreak = false;
var _g = 0;
while(_g < segments.length) {
var segment = segments[_g];
++_g;
if(segment == "") {
continue;
}
var isClosingTag = (HxOverrides().default).substr(segment,0,1) == "/";
var tagEndIndex = segment.indexOf(">");
var start = tagEndIndex + 1;
var spaceIndex = segment.indexOf(" ");
var tagName = segment.substring(isClosingTag ? 1 : 0,spaceIndex > -1 && spaceIndex < tagEndIndex ? spaceIndex : tagEndIndex).toLowerCase();
var format;
if(isClosingTag) {
if(tagStack.length == 0 || tagName != tagStack[tagStack.length - 1]) {
continue;
}
tagStack.pop();
formatStack.pop();
format = formatStack[formatStack.length - 1].clone();
if((tagName == "p" || tagName == "li") && textFormatRanges.get_length() > 0) {
if(multiline) {
value += "\n";
}
noLineBreak = true;
}
if(start < segment.length) {
sub = HTMLParser.__htmlUnescape((HxOverrides().default).substr(segment,start,null));
(openfl__$Vector_Vector_$Impl_$().default).push(textFormatRanges,new (openfl_text__$internal_TextFormatRange().default)(format,value.length,value.length + sub.length));
value += sub;
noLineBreak = false;
}
} else {
format = formatStack[formatStack.length - 1].clone();
if(tagEndIndex > -1) {
if(styleSheet != null) {
styleSheet.__applyStyle(tagName,format);
if(HTMLParser.__regexClass.match(segment)) {
styleSheet.__applyStyle("." + HTMLParser.__getAttributeMatch(HTMLParser.__regexClass),format);
styleSheet.__applyStyle(tagName + "." + HTMLParser.__getAttributeMatch(HTMLParser.__regexClass),format);
}
}
switch(tagName) {
case "a":
if(styleSheet != null) {
styleSheet.__applyStyle("a:link",format);
}
if(HTMLParser.__regexHref.match(segment)) {
format.url = HTMLParser.__getAttributeMatch(HTMLParser.__regexHref);
}
break;
case "b":
format.bold = true;
break;
case "em":case "i":
format.italic = true;
break;
case "font":
if(HTMLParser.__regexFace.match(segment)) {
format.font = HTMLParser.__getAttributeMatch(HTMLParser.__regexFace);
}
if(HTMLParser.__regexColor.match(segment)) {
format.color = (Std().default).parseInt("0x" + HTMLParser.__getAttributeMatch(HTMLParser.__regexColor));
}
if(HTMLParser.__regexSize.match(segment)) {
var sizeAttr = HTMLParser.__getAttributeMatch(HTMLParser.__regexSize);
var firstChar = (HxOverrides().default).cca(sizeAttr,0);
if(firstChar == 43 || firstChar == 45) {
var parentFormat = formatStack.length >= 2 ? formatStack[formatStack.length - 2] : textFormat;
format.size = parentFormat.size + (Std().default).parseInt(sizeAttr);
} else {
format.size = (Std().default).parseInt(sizeAttr);
}
}
break;
case "li":
if(textFormatRanges.get_length() > 0 && !noLineBreak) {
value += "\n";
}
var bullet = "• ";
var bulletFormat = format.clone();
bulletFormat.underline = false;
(openfl__$Vector_Vector_$Impl_$().default).push(textFormatRanges,new (openfl_text__$internal_TextFormatRange().default)(bulletFormat,value.length,value.length + bullet.length));
value += bullet;
break;
case "p":
if(textFormatRanges.get_length() > 0 && !noLineBreak) {
value += "\n";
}
if(HTMLParser.__regexAlign.match(segment)) {
var align = HTMLParser.__getAttributeMatch(HTMLParser.__regexAlign).toLowerCase();
format.align = align;
}
break;
case "textformat":
if(HTMLParser.__regexBlockIndent.match(segment)) {
format.blockIndent = (Std().default).parseInt(HTMLParser.__getAttributeMatch(HTMLParser.__regexBlockIndent));
}
if(HTMLParser.__regexIndent.match(segment)) {
format.indent = (Std().default).parseInt(HTMLParser.__getAttributeMatch(HTMLParser.__regexIndent));
}
if(HTMLParser.__regexLeading.match(segment)) {
format.leading = (Std().default).parseInt(HTMLParser.__getAttributeMatch(HTMLParser.__regexLeading));
}
if(HTMLParser.__regexLeftMargin.match(segment)) {
format.leftMargin = (Std().default).parseInt(HTMLParser.__getAttributeMatch(HTMLParser.__regexLeftMargin));
}
if(HTMLParser.__regexRightMargin.match(segment)) {
format.rightMargin = (Std().default).parseInt(HTMLParser.__getAttributeMatch(HTMLParser.__regexRightMargin));
}
if(HTMLParser.__regexTabStops.match(segment)) {
var values = HTMLParser.__getAttributeMatch(HTMLParser.__regexTabStops).split(" ");
var tabStops = [];
var _g1 = 0;
while(_g1 < values.length) {
var stop = values[_g1];
++_g1;
tabStops.push((Std().default).parseInt(stop));
}
format.tabStops = tabStops;
}
break;
case "u":
format.underline = true;
break;
}
formatStack.push(format);
tagStack.push(tagName);
if(start < segment.length) {
sub = HTMLParser.__htmlUnescape(segment.substring(start));
(openfl__$Vector_Vector_$Impl_$().default).push(textFormatRanges,new (openfl_text__$internal_TextFormatRange().default)(format,value.length,value.length + sub.length));
value += sub;
noLineBreak = false;
}
} else {
sub = HTMLParser.__htmlUnescape(segment);
(openfl__$Vector_Vector_$Impl_$().default).push(textFormatRanges,new (openfl_text__$internal_TextFormatRange().default)(format,value.length,value.length + sub.length));
value += sub;
noLineBreak = false;
}
}
}
if(textFormatRanges.get_length() == 0) {
(openfl__$Vector_Vector_$Impl_$().default).push(textFormatRanges,new (openfl_text__$internal_TextFormatRange().default)(formatStack[0],0,0));
}
}
return value;
}
HTMLParser.__getAttributeMatch = function(regex) {
if(regex.matched(2) != null) {
return regex.matched(2);
} else {
return regex.matched(3);
}
}
HTMLParser.__htmlUnescape = function(s) {
s = HTMLParser.__regexEntityApos.replace(s,"'");
return (StringTools().default).htmlUnescape(s);
}
HTMLParser.__meta__ = { obj : { SuppressWarnings : ["checkstyle:FieldDocComment"]}}
HTMLParser.__regexAlign = new (EReg().default)("align\\s?=\\s?(\"([^\"]+)\"|'([^']+)')","i")
HTMLParser.__regexBreakTag = new (EReg().default)("<br\\s*/?>","gi")
HTMLParser.__regexBlockIndent = new (EReg().default)("blockindent\\s?=\\s?(\"([^\"]+)\"|'([^']+)')","i")
HTMLParser.__regexClass = new (EReg().default)("class\\s?=\\s?(\"([^\"]+)\"|'([^']+)')","i")
HTMLParser.__regexColor = new (EReg().default)("color\\s?=\\s?(\"#([^\"]+)\"|'#([^']+)')","i")
HTMLParser.__regexEntityApos = new (EReg().default)("'","g")
HTMLParser.__regexEntityNbsp = new (EReg().default)(" ","g")
HTMLParser.__regexCharEntity = new (EReg().default)("&#(?:([0-9]+)|(x[0-9a-fA-F]+));","g")
HTMLParser.__regexFace = new (EReg().default)("face\\s?=\\s?(\"([^\"]+)\"|'([^']+)')","i")
HTMLParser.__regexHTMLTag = new (EReg().default)("<.*?>","g")
HTMLParser.__regexHref = new (EReg().default)("href\\s?=\\s?(\"([^\"]+)\"|'([^']+)')","i")
HTMLParser.__regexIndent = new (EReg().default)(" indent\\s?=\\s?(\"([^\"]+)\"|'([^']+)')","i")
HTMLParser.__regexLeading = new (EReg().default)("leading\\s?=\\s?(\"([^\"]+)\"|'([^']+)')","i")
HTMLParser.__regexLeftMargin = new (EReg().default)("leftmargin\\s?=\\s?(\"([^\"]+)\"|'([^']+)')","i")
HTMLParser.__regexRightMargin = new (EReg().default)("rightmargin\\s?=\\s?(\"([^\"]+)\"|'([^']+)')","i")
HTMLParser.__regexSize = new (EReg().default)("size\\s?=\\s?(\"([^\"]+)\"|'([^']+)')","i")
HTMLParser.__regexTabStops = new (EReg().default)("tabstops\\s?=\\s?(\"([^\"]+)\"|'([^']+)')","i")
// Export
exports.default = HTMLParser;