import mx.data.binding.ObjectDumper; /** * @author Jim Cheng jim.cheng@effectiveui.com * * A static class for encoding and decoding XML and HTML character entities. * */ class com.effectiveui.xml.CharacterEntity { //@---------------------------------------------------------- REQUIRED INFO //@exclude public var version:String = "1.0.0.0"; //@exclude static var symbolName:String = "CharacterEntity"; //@exclude static var symbolOwner:Object = com.effectiveui.xml.CharacterEntity; //@exclude public var className = "CharacterEntity"; //@---------------------------------------------------------- CONSTRUCTOR private function CharacterEntity() { } //@---------------------------------------------------------- PRIVATE VARS private static var initialized:Boolean = false; private static var xmlEntities:Object; private static var entities:Object; //@---------------------------------------------------------- PUBLIC VARS // Specified by XML 1.0 public static var quot:Number = 0x0022; // " quotation mark public static var amp:Number = 0x0026; // & ampersand public static var apos:Number = 0x0027; // ' apostrophe // public static var lt:Number = 0x003C; // < less-than sign // public static var gt:Number = 0x003E; // > greater-than sign // Specified by HTML and XHTML DTDs public static var nbsp:Number = 0x00A0; // no-break space public static var iexcl:Number = 0x00A1; // ¡ inverted exclamation mark public static var cent:Number = 0x00A2; // ¢ cent sign public static var pound:Number = 0x00A3; // £ pound sign public static var curren:Number = 0x00A4; // ¤ currency sign public static var yen:Number = 0x00A5; // ¥ yen sign public static var brvbar:Number = 0x00A6; // ¦ broken bar public static var sect:Number = 0x00A7; // § section sign public static var uml:Number = 0x00A8; // ¨ diaeresis public static var copy:Number = 0x00A9; // © copyright sign public static var ordf:Number = 0x00AA; // ª feminine ordinal indicator public static var laquo:Number = 0x00AB; // « left-pointing double angle quotation mark // public static var not:Number = 0x00AC; // ¬ not sign public static var shy:Number = 0x00AD; // ­ soft hyphen public static var reg:Number = 0x00AE; // ® registered sign public static var macr:Number = 0x00AF; // ¯ macron public static var deg:Number = 0x00B0; // ° degree sign public static var plusmn:Number = 0x00B1; // ± plus-minus sign public static var sup2:Number = 0x00B2; // ² superscript two public static var sup3:Number = 0x00B3; // ³ superscript three public static var acute:Number = 0x00B4; // ´ acute accent public static var micro:Number = 0x00B5; // µ micro sign public static var para:Number = 0x00B6; // ¶ pilcrow sign public static var middot:Number = 0x00B7; // · middle dot public static var cedil:Number = 0x00B8; // ¸ cedilla public static var sup1:Number = 0x00B9; // ¹ superscript one public static var ordm:Number = 0x00BA; // º masculine ordinal indicator public static var raquo:Number = 0x00BB; // » right-pointing double angle quotation mark public static var frac14:Number = 0x00BC; // ¼ vulgar fraction one quarter public static var frac12:Number = 0x00BD; // ½ vulgar fraction one half public static var frac34:Number = 0x00BE; // ¾ vulgar fraction three quarters public static var iquest:Number = 0x00BF; // ¿ inverted question mark public static var Agrave:Number = 0x00C0; // À latin capital letter a with grave public static var Aacute:Number = 0x00C1; // Á latin capital letter a with acute public static var Acirc:Number = 0x00C2; //  latin capital letter a with circumflex public static var Atilde:Number = 0x00C3; // à latin capital letter a with tilde public static var Auml:Number = 0x00C4; // Ä latin capital letter a with diaeresis public static var Aring:Number = 0x00C5; // Å latin capital letter a with ring above public static var AElig:Number = 0x00C6; // Æ latin capital letter ae public static var Ccedil:Number = 0x00C7; // Ç latin capital letter c with cedilla public static var Egrave:Number = 0x00C8; // È latin capital letter e with grave public static var Eacute:Number = 0x00C9; // É latin capital letter e with acute public static var Ecirc:Number = 0x00CA; // Ê latin capital letter e with circumflex public static var Euml:Number = 0x00CB; // Ë latin capital letter e with diaeresis public static var Igrave:Number = 0x00CC; // Ì latin capital letter i with grave public static var Iacute:Number = 0x00CD; // Í latin capital letter i with acute public static var Icirc:Number = 0x00CE; // Î latin capital letter i with circumflex public static var Iuml:Number = 0x00CF; // Ï latin capital letter i with diaeresis public static var ETH:Number = 0x00D0; // Ð latin capital letter eth public static var Ntilde:Number = 0x00D1; // Ñ latin capital letter n with tilde public static var Ograve:Number = 0x00D2; // Ò latin capital letter o with grave public static var Oacute:Number = 0x00D3; // Ó latin capital letter o with acute public static var Ocirc:Number = 0x00D4; // Ô latin capital letter o with circumflex public static var Otilde:Number = 0x00D5; // Õ latin capital letter o with tilde public static var Ouml:Number = 0x00D6; // Ö latin capital letter o with diaeresis public static var times:Number = 0x00D7; // × multiplication sign public static var Oslash:Number = 0x00D8; // Ø latin capital letter o with stroke public static var Ugrave:Number = 0x00D9; // Ù latin capital letter u with grave public static var Uacute:Number = 0x00DA; // Ú latin capital letter u with acute public static var Ucirc:Number = 0x00DB; // Û latin capital letter u with circumflex public static var Uuml:Number = 0x00DC; // Ü latin capital letter u with diaeresis public static var Yacute:Number = 0x00DD; // Ý latin capital letter y with acute public static var THORN:Number = 0x00DE; // Þ latin capital letter thorn public static var szlig:Number = 0x00DF; // ß latin capital letter sharp s public static var agrave:Number = 0x00E0; // à latin small letter a with grave public static var aacute:Number = 0x00E1; // á latin small letter a with acute public static var acirc:Number = 0x00E2; // â latin small letter a with circumflex public static var atilde:Number = 0x00E3; // ã latin small letter a with tilde public static var auml:Number = 0x00E4; // ä latin small letter a with diaeresis public static var aring:Number = 0x00E5; // å latin small letter a with ring public static var aelig:Number = 0x00E6; // æ latin small letter ae public static var ccedil:Number = 0x00E7; // ç latin small letter c with cedilla public static var egrave:Number = 0x00E8; // è latin small letter e with grave public static var eacute:Number = 0x00E9; // é latin small letter e with acute public static var ecirc:Number = 0x00EA; // ê latin small letter e with circumflex public static var euml:Number = 0x00EB; // ë latin small letter e with diaeresis public static var igrave:Number = 0x00EC; // ì latin small letter i with grave public static var iacute:Number = 0x00ED; // í latin small letter i with acute public static var icirc:Number = 0x00EE; // î latin small letter i with circumflex public static var iuml:Number = 0x00EF; // ï latin small letter i with diaeresis public static var eth:Number = 0x00F0; // ð latin small letter eth public static var ntilde:Number = 0x00F1; // ñ latin small letter n with tilde public static var ograve:Number = 0x00F2; // ò latin small letter o with grave public static var oacute:Number = 0x00F3; // ó latin small letter o with acute public static var ocirc:Number = 0x00F4; // ô latin small letter o with circumflex public static var otilde:Number = 0x00F5; // õ latin small letter o with tilde public static var ouml:Number = 0x00F6; // ö latin small letter o with diaeresis public static var divide:Number = 0x00F7; // ÷ division sign public static var oslash:Number = 0x00F8; // ø latin small letter o with stroke public static var ugrave:Number = 0x00F9; // ù latin small letter u with grave public static var uacute:Number = 0x00FA; // ú latin small letter u with acute public static var ucirc:Number = 0x00FB; // û latin small letter u with circumflex public static var uuml:Number = 0x00FC; // ü latin small letter u with diaeresis public static var yacute:Number = 0x00FD; // ý latin small letter y with acute public static var thorn:Number = 0x00FE; // þ latin small letter thorn public static var yuml:Number = 0x00FF; // ÿ latin small letter y with diaeresis public static var OElig:Number = 0x0152; // Œ latin capital ligature oe public static var oelig:Number = 0x0153; // œ latin small ligature oe public static var Scaron:Number = 0x0160; // Š latin capital letter s with caron public static var scaron:Number = 0x0161; // š latin small letter s with caron public static var Yuml:Number = 0x0178; // Ÿ latin cpital letter y with diaeresis public static var fnof:Number = 0x0192; // ƒ latin small letter f with hook public static var circ:Number = 0x02C6; // ˆ modifier letter circumflex accent public static var tilde:Number = 0x02DC; // ˜ small tilde public static var Alpha:Number = 0x0391; // Α greek capital letter alpha public static var Beta:Number = 0x0392; // Β greek capital letter beta public static var Gamma:Number = 0x0393; // Γ greek capital letter gamma public static var Delta:Number = 0x0394; // Δ greek capital letter delta public static var Epsilon:Number = 0x0395; // Ε greek capital letter epsilon public static var Zeta:Number = 0x0396; // Ζ greek capital letter zeta public static var Eta:Number = 0x0397; // Η greek capital letter eta public static var Theta:Number = 0x0398; // Θ greek capital letter theta public static var Iota:Number = 0x0399; // Ι greek capital letter iota public static var Kappa:Number = 0x039A; // Κ greek capital letter kappa public static var Lambda:Number = 0x039B; // Λ greek capital letter lambda public static var Mu:Number = 0x039C; // Μ greek capital letter mu public static var Nu:Number = 0x039D; // Ν greek capital letter nu public static var Xi:Number = 0x039E; // Ξ greek capital letter xi public static var Omicron:Number = 0x039F; // Ο greek capital letter omicron public static var Pi:Number = 0x03A0; // Π greek capital letter pi public static var Rho:Number = 0x03A1; // Ρ greek capital letter rho public static var Sigma:Number = 0x03A3; // Σ greek capital letter sigma public static var Tau:Number = 0x03A4; // Τ greek capital letter tau public static var Upsilon:Number = 0x03A5; // Υ greek capital letter upsilon public static var Phi:Number = 0x03A6; // Φ greek capital letter phi public static var Chi:Number = 0x03A7; // Χ greek capital letter chi public static var Psi:Number = 0x03A8; // Ψ greek capital letter psi public static var Omega:Number = 0x03A9; // Ω greek capital letter omega public static var alpha:Number = 0x03B1; // α greek small letter alpha public static var beta:Number = 0x03B2; // β greek small letter beta public static var gamma:Number = 0x03B3; // γ greek small letter gamma public static var delta:Number = 0x03B4; // δ greek small letter delta public static var epsilon:Number = 0x03B5; // ε greek small letter epsilon public static var zeta:Number = 0x03B6; // ζ greek small letter zeta public static var eta:Number = 0x03B7; // η greek small letter eta public static var theta:Number = 0x03B8; // θ greek small letter theta public static var iota:Number = 0x03B9; // ι greek small letter iota public static var kappa:Number = 0x03BA; // κ greek small letter kappa public static var lambda:Number = 0x03BB; // λ greek small letter lambda public static var mu:Number = 0x03BC; // μ greek small letter mu public static var nu:Number = 0x03BD; // ν greek small letter nu public static var xi:Number = 0x03BE; // ξ greek small letter xi public static var omicron:Number = 0x03BF; // ο greek small letter omicron public static var pi:Number = 0x03C0; // π greek small letter pi public static var rho:Number = 0x03C1; // ρ greek small letter rho public static var sigmaf:Number = 0x03C2; // ς greek small letter final sigma public static var sigma:Number = 0x03C3; // σ greek small letter sigma public static var tau:Number = 0x03C4; // τ greek small letter tau public static var upsilon:Number = 0x03C5; // υ greek small letter upsilon public static var phi:Number = 0x03C6; // φ greek small letter phi public static var chi:Number = 0x03C7; // χ greek small letter chi public static var psi:Number = 0x03C8; // ψ greek small letter psi public static var omega:Number = 0x03C9; // ω greek small symbol omega public static var thetasym:Number = 0x03D1; // ϑ greek theta symbol public static var upsih:Number = 0x03D2; // ϒ greek upsilon with hook symbol public static var piv:Number = 0x03D6; // ϖ greek pi symbol public static var ensp:Number = 0x2002; //   en space public static var emsp:Number = 0x2003; //   em space public static var thinsp:Number = 0x2009; //   thin space public static var zwnj:Number = 0x200C; // zero width non-joiner public static var zwj:Number = 0x200D; // zero width joiner public static var lrm:Number = 0x200E; // left-to-right mark public static var rlm:Number = 0x200F; // right-to-left mark public static var ndash:Number = 0x2013; // – en dash public static var mdash:Number = 0x2014; // — em dash public static var lsquo:Number = 0x2018; // ‘ left single quotation mark public static var rsquo:Number = 0x2019; // ’ right single quotation mark public static var sbquo:Number = 0x201A; // ‚ single low-9 quotation mark public static var ldquo:Number = 0x201C; // “ left double quotation mark public static var rdquo:Number = 0x201D; // ” right double quotation mark public static var bdquo:Number = 0x201E; // „ double low-9 quotation mark public static var dagger:Number = 0x2020; // † dagger public static var Dagger:Number = 0x2021; // ‡ double dagger public static var bull:Number = 0x2022; // • bullet public static var hellip:Number = 0x2026; // … horizontal ellipsis public static var permil:Number = 0x2030; // ‰ per mille sign public static var prime:Number = 0x2032; // ′ prime public static var Prime:Number = 0x2033; // ″ double prime public static var lsaquo:Number = 0x2039; // ‹ single left-pointing angle quotation mark public static var rsaquo:Number = 0x203A; // › single right-pointing angle quotation mark public static var oline:Number = 0x203E; // ‾ overline public static var frasl:Number = 0x2044; // ⁄ fraction slash public static var euro:Number = 0x20AC; // € euro sign public static var image:Number = 0x2111; // ℑ black-letter capital i public static var weierp:Number = 0x2118; // ℘ script capital p public static var real:Number = 0x211C; // ℜ black-letter capital r public static var trade:Number = 0x2122; // ™ trade mark sign public static var alefsym:Number = 0x2135; // ℵ alef symbol public static var larr:Number = 0x2190; // ← leftwards arrow public static var uarr:Number = 0x2191; // ↑ upwards arrow public static var rarr:Number = 0x2192; // → rightwards arrow public static var darr:Number = 0x2193; // ↓ downwards arrow public static var harr:Number = 0x2194; // ↔ left right arrow public static var crarr:Number = 0x21B5; // ↵ downwards arrow with corner leftwards public static var lArr:Number = 0x21D0; // ⇐ leftwards double arrow public static var uArr:Number = 0x21D1; // ⇑ upwards double arrow public static var rArr:Number = 0x21D2; // ⇒ rightwards double arrow public static var dArr:Number = 0x21D3; // ⇓ downwards double arrow public static var hArr:Number = 0x21D4; // ⇔⇔ left right double arrow public static var forall:Number = 0x2200; // ∀ for all public static var part:Number = 0x2202; // ∂ partial differential public static var exist:Number = 0x2203; // ∃ there exists public static var empty:Number = 0x2205; // ∅ empty set public static var nabla:Number = 0x2207; // ∇ nabla public static var isin:Number = 0x2208; // ∈ element of public static var notin:Number = 0x2209; // ∉ not an element of public static var ni:Number = 0x220B; // ∋ contains as member public static var prod:Number = 0x220F; // ∏ n-ary product public static var sum:Number = 0x2211; // ∑ n-ary summation public static var minus:Number = 0x2212; // − minus sign public static var lowast:Number = 0x2217; // ∗ asterisk operator public static var radic:Number = 0x221A; // √ square root public static var prop:Number = 0x221D; // ∝ proportional to public static var infin:Number = 0x221E; // ∞ infinity public static var ang:Number = 0x2220; // ∠ angle // public static var and:Number = 0x2227; // ∧ logical and // public static var or:Number = 0x2228; // ∨ logical or public static var cap:Number = 0x2229; // ∩ intersection public static var cup:Number = 0x222A; // ∪ union public static var int:Number = 0x222B; // ∫ integral public static var there4:Number = 0x2234; // ∴ therefore public static var sim:Number = 0x223C; // ∼ tilde operator public static var cong:Number = 0x2245; // ≅ congruent to public static var asymp:Number = 0x2248; // ≈ almost equal to // public static var ne:Number = 0x2260; // ≠ not equal to public static var equiv:Number = 0x2261; // ≡ identical to // public static var le:Number = 0x2264; // ≤ less-than or equal to // public static var ge:Number = 0x2265; // ≥ greater-than or equal to public static var sub:Number = 0x2282; // ⊂ subset of public static var sup:Number = 0x2283; // ⊃ superset of public static var nsub:Number = 0x2284; // ⊄ not a subset of public static var sube:Number = 0x2286; // ⊆ subset of or equal to public static var supe:Number = 0x2287; // ⊇ superset of or equal to public static var oplus:Number = 0x2295; // ⊕ circled plus public static var otimes:Number = 0x2297; // ⊗ circled times public static var perp:Number = 0x22A5; // ⊥ up tack public static var sdot:Number = 0x22C5; // ⋅ dot operator public static var lceil:Number = 0x2308; // ⌈ left ceiling public static var rceil:Number = 0x2309; // ⌉ right ceiling public static var lfloor:Number = 0x230A; // ⌊ left floor public static var rfloor:Number = 0x230B; // ⌋ right floor public static var lang:Number = 0x2329; // ⌋ left-pointing angle bracket public static var rang:Number = 0x232A; // 〉⌋ right-pointing angle bracket public static var loz:Number = 0x25CA; // ◊ lozenge public static var spades:Number = 0x2660; // ♠ black spade suit public static var clubs:Number = 0x2663; // ♣ black club suit public static var hearts:Number = 0x2665; // ♥ black heart suit public static var diams:Number = 0x2666; // ♦ black diamond suit // Disallowed by Flash 4 backwards-compatibility, hacked using all caps // here, though the lower-case version also works via __resolve(). public static var LT:Number = 0x003C; // < less-than sign public static var GT:Number = 0x003E; // > greater-than sign public static var NOT:Number = 0x00AC; // ¬ not sign public static var AND:Number = 0x2227; // ∧ logical and public static var OR:Number = 0x2228; // ∨ logical or public static var NE:Number = 0x2260; // ≠ not equal to public static var LE:Number = 0x2264; // ≤ less-than or equal to public static var GE:Number = 0x2265; // ≥ greater-than or equal to private static var _temp = initialize(); //@---------------------------------------------------------- DEFAULT STYLE //@---------------------------------------------------------- GETTERS/SETTERS //@---------------------------------------------------------- ASSETS //@---------------------------------------------------------- CORE METHODS //@---------------------------------------------------------- MOUSE EVENTS //@---------------------------------------------------------- PUBLIC METHODS /** * Decodes character entities in a given string to UTF-8 Unicode equivalents. * * @param The character entities encoded text to decode. * @param Whether to only use the XML character entity set or * the full 252 character HTML entity set. * * @usage decode('Mý string', true); */ public static function decode(text:String, xmlOnly:Boolean):String { if (typeof text != 'string') { return text; } var i:String; var translationTable:Object = xmlOnly ? xmlEntities : entities; // var start:Number = getTimer(); // Simple check to avoid decoding if its obvious that there // aren't any XML/HTML character entities to be found. if (text.indexOf('&') == -1) { return text; } for (i in translationTable) { text = text.split(i).join(translationTable[i]); } text = decodeNumericReferences(text); // trace('time: ' + (getTimer() - start)); return text; } /** * Decodes numeric entity references in a given string to UTF-8 Unicode equivalents. * * @param The string to decode. * * @usage decodeNumericReferences('Ý'); */ public static function decodeNumericReferences(text:String):String { if (typeof text != 'string') { return text; } var output = ''; var lastPosition:Number = 0; var cursor:Number = 0; var semi:Number; var code:String; cursor = text.indexOf('&#', 0); while (cursor != -1) { semi = text.indexOf(';', cursor); code = text.substring(cursor + 2, semi); output += text.substring(lastPosition, cursor); if (code.charAt(0) == 'x') { output += String.fromCharCode(parseInt('0' + code, 16)); } else { output += String.fromCharCode(parseInt(code, 10)); } lastPosition = semi + 1; cursor = text.indexOf('&#', lastPosition); } output += text.substr(lastPosition); return output; } /** * Encodes a Unicode string, transforming characters with character entity * equivalents from their Unicode bytecode to the character entity representation. * * @param The Unicode text (e.g. Actionscript string) to encode. * @param Whether to only use the XML character entity set or * the full 252 character HTML entity set. * * @usage encode(' Unicode string', true); */ public static function encode(text:String, xmlOnly:Boolean):String { if (typeof text != 'string') { return text; } var i:String; var translationTable:Object = xmlOnly ? xmlEntities : entities; for (i in translationTable) { text = text.split(translationTable[i]).join(i); } return text; } //@---------------------------------------------------------- PRIVATE METHODS /** * Initialization method -- do not call, it is invoked on class initialzation. */ private static function initialize() : Void { if (initialized) return; var i:String; var hacked:Object = { LT: true, GT: true, NOT: true, AND: true, OR:true, NE:true, LE:true, GE:true }; var str:String; xmlEntities = new Object(); xmlEntities['"'] = String.fromCharCode(CharacterEntity.quot); xmlEntities['&'] = String.fromCharCode(CharacterEntity.amp); xmlEntities['''] = String.fromCharCode(CharacterEntity.apos); xmlEntities['<'] = String.fromCharCode(CharacterEntity.LT); xmlEntities['>'] = String.fromCharCode(CharacterEntity.GT); entities = new Object(); for (i in CharacterEntity) { if (typeof CharacterEntity[i] == 'number') { str = '&' + (hacked[i] ? i.toLowerCase() : i) + ';'; entities[str] = String.fromCharCode(CharacterEntity[i]); } } } /** * Low-level resolution of entity names conflicting with Flash 4 reserved keywords */ private static function __resolve(o:Object):Object { if (typeof o == 'string') { switch (o) { case 'lt': return CharacterEntity.LT; case 'gt': return CharacterEntity.GT; case 'not': return CharacterEntity.NOT; case 'and': return CharacterEntity.AND; case 'or': return CharacterEntity.OR; case 'ne': return CharacterEntity.NE; case 'le': return CharacterEntity.LE; case 'ge': return CharacterEntity.GE; } } } //@---------------------------------------------------------- EVENT LISTENERS }