UNPKG

openfl

Version:

A fast, productive library for 2D cross-platform development.

265 lines (248 loc) 10.6 kB
// 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)("&apos;","g") HTMLParser.__regexEntityNbsp = new (EReg().default)("&nbsp;","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;