Archive

Archive for the ‘flex’ Category

Hash anchors (using “#”) in a SWF URL will break preloaders due to a player bug

May 18th, 2010 markledford 1 comment

It’s pretty frustrating when you attempt to do something as commonplace as add a custom preloader to a Flex App and and you end up debugging for hours because something went pear shaped for no apparent reason at all. No matter what I did the preloader would not show up until the app was loaded and it moved to the initialization sequence of the preload. During times like this Adobe’s public bug database is a godsend.

[SDK-14162] [Flash Player] Preloader not showing up when we add deeplinking urls
[FP-2332] Named Anchors in URL prevent SWF from being streamed in

Turns out there is a pretty significant Flash Player feature (read bug) that will foobar preloaders for Flex apps (and probably even regular Actionscript projects) if they contain an anchor tag. As described and as I’ve reproduced, this issue would effect most major Flex apps and Flash sites as most use deep linking techniques with hash tags like with SWFAddress.

Alex Harui explains the issue in the latter Jira like so:

This problem is due to a feature in the Flash Player that allows deep-linking in Flash Authoring SWFs. If you label frames on the timeline in the SWF, you can jump to them by putting hash fragments on the URL.

This feature is, of course, completely useless for Flex deep-linking as Flex apps only have two frames and there’s no way to compute what label to use on the frame.

This bug will remain NAB for now. We have made a request for a way to opt out of this feature in future players but it may not happen any time soon.

Technically it seams what happens in the swf will try to skip ahead to a non existent frame label causing it to prevent your swf from properly streaming.  The current fix is to use BrowserManagerShim.as a class provided in the first Jira that just loads your swf and takes the hash tag issue itself. 

Categories: flex Tags:

Steve Jobs’ Thoughts on Flash

April 29th, 2010 markledford 4 comments

Updated 06/04/10

As a consumer and lover of Apple products and a full-time Flash developer it was interesting to see Job’s RDF used against Flash (Oh no! Daddy hit mommy!). But seriously, its about time that Apple replied to the hoopla regarding its blocking of Flash on its Iphone platform. I may have my biases being a Flash developer but I also have my expertise in the field and I couldn’t help but note that most of the reasonings outlined in his article were pretty poor at best and completely meritless at worse.

No Flash site i know of “depends on rollovers” and would have to be “completely re-written” to support touch. Navigation is almost always based on mouse clicks which get triggered regardless of whether its touch or not.

Its silly not calling Flash a modern technology, it drastically updates every year, sometimes completely re-written, and its really the only technology in the world that does that and gets adopted near 98% year after year regardless–html certainly doesn’t do that. Even today with html 5 there isn’t an agreed upon video format. Some browsers require the Ogg Theora format which no one would otherwise transcode for right now, and the other mp4 which has its own can-of-worms with potential licensing costs as the patents are owned in part by, ding, Apple. Even with that hurdle quashed there are technical and logistical issues with supporting ad networks in html 5 video, but Apple is there again to take a bigger cut of the pie with its recent purchase of mobile ad network Quattro Wireless and new iAds advertising platform. Steve Jobs is creating an artificial hole in web media under the pretenses of open standards–something Apple is normally a foreigner to, to monetize and control it when restarting it from the ground floor.

I think I could provide significant arguments for practically every point (like that whole transition layer debacle) but I’m sure there’ll be plenty of that gong on on the internets.

What it comes down to is that there’ll always be the right tool for the right job and Flash still does certain things best right now. It continues to innovate with a refresh cycle that html with its design-by-committee is not close to catching up with. It really isn’t the complete web without supporting it and Adobe continues to update Flash Player to keep it relevant to modern needs. Adobe has been working on some hard core mobile optimizations with its Open Screen Project and Flash Player 10.1 which is in RC2 and continues to partner with the big names to make it happen.

My two cents,
Mark

Some good rebuttals are popping up btw:
http://www.businessinsider.com/steve-jobs-is-lying-about-flash-2010-4
http://jessewarden.com/2010/04/steve-jobs-on-flash-correcting-the-lies.html

Great summary in the first article:
Steve needs to stop trying to make this into a “technology” issue when this is all about money. If you came out and said you’re not supporting Flash because you can make more money without it, fine by me, I won’t argue with that. But to try and disguise it as something else, that only makes Apple look bad, not Adobe.

Categories: flex Tags:

Cannot pass JSON string as String to ExternalInterface.call. It gets converted to an object

January 26th, 2010 markledford No comments

Note to self. This scenario isn’t mentioned here: http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000343.html

Categories: flex Tags:

cannot call ANY methods of XML or XMLList instances via bracket notation

January 18th, 2010 markledford No comments

Every single method, unique to XML and XMLList or inherited will be return as an empty XMLList instead of the intended method as a Function when its retrieved as a property of that instance. Note that this not calling XMLList methods but retrieving the actual methods as properties of the objects themselves.

For example:
myXML.contains is XMLList //true
myXML.toString is XMLList //true

This makes it impossible to call a method of an XML or XMLList programmatically via bracket notation like:
myXML['toXMLString']() //returns TypeError: Error #1006: value is not a function.

It feels like a Proxy is involved internally and these methods were not set to returning properly in getProperty. Anyone have any feedback or work arounds?

Categories: flex Tags:

major Flash Player GC bug converting string to XML

December 20th, 2009 markledford 2 comments

When converting a string to XML the memory used by the XML will never free up no matter the references or garbage collection tricks you have up your sleeve.  This is really excruciating when needing to parse large XML files from a Flex or AIR app.

http://bugs.adobe.com/jira/browse/SDK-11982

http://bugs.adobe.com/jira/browse/SDK-11244

http://bugs.adobe.com/jira/browse/FP-599 <- Looks like this issue has been open for well over a year and may be fixed for the next release of Flash Player (apparently not 10.0.42.34 released a few days ago, just checked, perhaps they mean the next full release :/)

UPDATE: Luca in the comments pointed me to an apparent fix they’ve added to AIR 1.5.2 via System.disposeXML(xml) found in the release notes here.

I’ve verified that this new method works like a charm. It seams like a bit of a strange one-off hack that they’ve put it in under System for AIR only but I’m guessing that they wanted to address it quickly for the SDK that needed it most. Hopefully the regular Flash Player fix is coming in the next major update and won’t require this unusual method.

Categories: actionscript, bugs, flex Tags:

Using [Embed] with fonts in Flex / Flash Builder Actionscript projects includes SDK specific core Flex classes

September 3rd, 2009 markledford 1 comment

Have you gotten this error when upgrading a Flex project to Flex 4?

1044: Interface method allowDomain in namespace mx.core:IFlexModuleFactory not implemented by class _Main_mx_managers_SystemManager.
1044: Interface method get preloadedRSLs in namespace mx.core:IFlexModuleFactory not implemented by class _Main_mx_managers_SystemManager.

Looking at the error its clear that Flex 3.4′s IFlexModuleFactory got compiled in and referenced by Flex 4′s SystemManager (which no longer has these methods) but how?

If you’re in my boat you have a central Actionscript-only Flex Library Project repository where you keep all your reusable Actionscript classes. This project is compiled with an older Flex SDK (3.4 in this instance) as it targets Flash Player 9 and other Flash 9 / Actionscript Only projects reference it. Your library  may also includes metatags even though the compiler adds some basic mx.core classes to do the embedding. This normally wouldn’t be an issue but you’ll find your boat will capsize if you’ve included any fonts embedded this way as the compiler includes some SDK specific classes, namely IFlexModuleFactory via FontAsset. You can verify this by including “-link-report linkreport.xml” compiler argument to this project.

Solution: Export the fonts separately, perhaps in a separate swc that isn’t referenced directly in your updated Flex 4 projects.

Categories: flex Tags:

flash player 10 security change can break focus logic with cross domain swfs

August 28th, 2009 markledford 1 comment

With the barrage of player updates and security changes to the Flash Player staying on top of the issues and incompatibilities from player to player is sometimes as troublesome as cross browser compatibility for regular web development. This is especially true for the upgrade from Flash Player 9 to 10.

There were some well publicized major security changes for policy files and the filereference class included with the Flash Player 10 security updates but a seemingly less significant new restriction regarding cross domain swf focus can wreak havoc on an existing flash project . The new restriction is outlined here:
Related-object properties in events may not be available

Starting in Flash Player 10.0.2, if an object that would be referred to by any of these properties [MouseEvent.relatedObject, FocusEvent.relatedObject, ContextMenuEVent.mouseTarget] resides in a different security sandbox (for example, because it is part of a different SWF that was served from a different domain), and the two sandboxes do not both trust each other (by means of the Security.allowDomain method), then the value of this property is changed to null.

I’ve found this is a significant change for cross domain swfs that utilize any of Flash’s V3 Components. Some 3rd party crossdomain swfs that once worked fine will no longer focus properly when clicking on textfields. Digging into this component architecture’s FocusManger you can find the culprit:

fl.managers.FocusManager::mouseFocusChangeHandler(event:FocusEvent)

/**
*  @private
*  This gets called when mouse clicks on a focusable object.
*  We block Flash Player behavior.
*
* @langversion 3.0
* @playerversion Flash 9.0.28.0
*/

private function mouseFocusChangeHandler(event:FocusEvent):void {
   if (event.relatedObject is TextField) { //<- related object will always be null
      return; // pass it on
   }
   event.preventDefault();
}

The solution is to add a Security.allowDomain(“YourDomain”) if you have access to republish, otherwise you’d have to use a proxy server.

Categories: flex Tags: ,

swfObject javascript error in Internet Explorer

April 15th, 2009 markledford 3 comments

We’ve had this IE error reported 3 times this week:

Line: 130
Character: 4
Code: 0
Error Message: ‘script.parentNode’ is null or not an object

The issue:
The SWFObject library is included multiple times on a page causing the IE DOM ready check hack it uses internally to be triggered multiple times. This hack inserts and removes a test node. Since the first instance removes this node, additional tries cause the error.

Solution:
Remove multiple imports of <script src=”swfobject.js” type=”text/javascript”></script> from your page.

Categories: flex Tags:

embed parameter “menu” = false and ContextMenuEvent.MENU_SELECT

March 11th, 2009 markledford No comments

In the Adobe LiveDocs it states:

  • menu- Possible values: true, false.
    • true: isplays the full menu, allowing the user a variety of options to enhance or control playback.
    • false: displays a menu that contains only the Settings option and the About Flash option.

Naturally not wanting the clutter in my context menus I had menu set to false in its embed code. Today I noticed new Context Menu support I had added to my app was not showing up in Flash 9 Player though it was appearing in Flash 10. Apparently setting this option to false will also keep the ContextMenuEvent.MENU_SELECT option from being dispatched in Flash Player 9 :-x

Categories: flex Tags:

AS3 htmlDecode htmlEncode xml hack

February 25th, 2009 markledford 5 comments

You’d think there would be a straight forward way to htmlEncode and htmlDecode strings in flash but there doesn’t seam to be any sort of built-in utility class that supports this. Oddly enough there isn’t one in Javascript either. Like this Javascript hack, here is a handy hack to pimp AS3′s native XML object instance to do the htmlEncoding/decoding for you.

Unfortunately this doesn’t work for  many encoded characters like “&iacute;”, “&oacute;”,  “&aacute;”, and “&ntilde;”. It seams the best route to robust html html encoding/decoding is to roll your own utility function like this.

Here is an AS3 Version:

//modified from http://www.cnblogs.com/laudy/articles/1186810.html
public static function htmlDecode(s:String):String {
    var out:String = "";
    if (s==null) return "";
    //regex convert all numeric character references to regular chars
        var matches:Array = s.match(/&#\d+;?/g);
    for(var i:Number = 0; i < matches.length; i++){
        var replacement:Object = String.fromCharCode((matches[i]).replace(/\D/g,""));
        s = s.replace(/&#\d+;?/, replacement);
    }
    //convert all character entity references / HTML entities
    var l:Number = s.length;
    for (i=0; i<l; i++){
        var ch:String = s.charAt(i);
        if (ch == '&'){
            var semicolonIndex:Number = s.indexOf(';', i+1);
            if (semicolonIndex > 0) {
                var entity:String = s.substring(i + 1, semicolonIndex);
                switch (entity){
                    case 'quot': ch = String.fromCharCode(0x0022); break;
                    case 'amp': ch = String.fromCharCode(0x0026); break;
                    case 'lt': ch = String.fromCharCode(0x003c); break;
                    case 'gt': ch = String.fromCharCode(0x003e); break;
                    case 'nbsp': ch = String.fromCharCode(0x00a0); break;
                    case 'iexcl': ch = String.fromCharCode(0x00a1); break;
                    case 'cent': ch = String.fromCharCode(0x00a2); break;
                    case 'pound': ch = String.fromCharCode(0x00a3); break;
                    case 'curren': ch = String.fromCharCode(0x00a4); break;
                    case 'yen': ch = String.fromCharCode(0x00a5); break;
                    case 'brvbar': ch = String.fromCharCode(0x00a6); break;
                    case 'sect': ch = String.fromCharCode(0x00a7); break;
                    case 'uml': ch = String.fromCharCode(0x00a8); break;
                    case 'copy': ch = String.fromCharCode(0x00a9); break;
                    case 'ordf': ch = String.fromCharCode(0x00aa); break;
                    case 'laquo': ch = String.fromCharCode(0x00ab); break;
                    case 'not': ch = String.fromCharCode(0x00ac); break;
                    case 'shy': ch = String.fromCharCode(0x00ad); break;
                    case 'reg': ch = String.fromCharCode(0x00ae); break;
                    case 'macr': ch = String.fromCharCode(0x00af); break;
                    case 'deg': ch = String.fromCharCode(0x00b0); break;
                    case 'plusmn': ch = String.fromCharCode(0x00b1); break;
                    case 'sup2': ch = String.fromCharCode(0x00b2); break;
                    case 'sup3': ch = String.fromCharCode(0x00b3); break;
                    case 'acute': ch = String.fromCharCode(0x00b4); break;
                    case 'micro': ch = String.fromCharCode(0x00b5); break;
                    case 'para': ch = String.fromCharCode(0x00b6); break;
                    case 'middot': ch = String.fromCharCode(0x00b7); break;
                    case 'cedil': ch = String.fromCharCode(0x00b8); break;
                    case 'sup1': ch = String.fromCharCode(0x00b9); break;
                    case 'ordm': ch = String.fromCharCode(0x00ba); break;
                    case 'raquo': ch = String.fromCharCode(0x00bb); break;
                    case 'frac14': ch = String.fromCharCode(0x00bc); break;
                    case 'frac12': ch = String.fromCharCode(0x00bd); break;
                    case 'frac34': ch = String.fromCharCode(0x00be); break;
                    case 'iquest': ch = String.fromCharCode(0x00bf); break;
                    case 'Agrave': ch = String.fromCharCode(0x00c0); break;
                    case 'Aacute': ch = String.fromCharCode(0x00c1); break;
                    case 'Acirc': ch = String.fromCharCode(0x00c2); break;
                    case 'Atilde': ch = String.fromCharCode(0x00c3); break;
                    case 'Auml': ch = String.fromCharCode(0x00c4); break;
                    case 'Aring': ch = String.fromCharCode(0x00c5); break;
                    case 'AElig': ch = String.fromCharCode(0x00c6); break;
                    case 'Ccedil': ch = String.fromCharCode(0x00c7); break;
                    case 'Egrave': ch = String.fromCharCode(0x00c8); break;
                    case 'Eacute': ch = String.fromCharCode(0x00c9); break;
                    case 'Ecirc': ch = String.fromCharCode(0x00ca); break;
                    case 'Euml': ch = String.fromCharCode(0x00cb); break;
                    case 'Igrave': ch = String.fromCharCode(0x00cc); break;
                    case 'Iacute': ch = String.fromCharCode(0x00cd); break;
                    case 'Icirc': ch = String.fromCharCode(0x00ce ); break;
                    case 'Iuml': ch = String.fromCharCode(0x00cf); break;
                    case 'ETH': ch = String.fromCharCode(0x00d0); break;
                        case 'Ntilde': ch = String.fromCharCode(0x00d1); break;
                    case 'Ograve': ch = String.fromCharCode(0x00d2); break;
                    case 'Oacute': ch = String.fromCharCode(0x00d3); break;
                    case 'Ocirc': ch = String.fromCharCode(0x00d4); break;
                    case 'Otilde': ch = String.fromCharCode(0x00d5); break;
                    case 'Ouml': ch = String.fromCharCode(0x00d6); break;
                    case 'times': ch = String.fromCharCode(0x00d7); break;
                    case 'Oslash': ch = String.fromCharCode(0x00d8); break;
                    case 'Ugrave': ch = String.fromCharCode(0x00d9); break;
                    case 'Uacute': ch = String.fromCharCode(0x00da); break;
                    case 'Ucirc': ch = String.fromCharCode(0x00db); break;
                    case 'Uuml': ch = String.fromCharCode(0x00dc); break;
                    case 'Yacute': ch = String.fromCharCode(0x00dd); break;
                    case 'THORN': ch = String.fromCharCode(0x00de); break;
                    case 'szlig': ch = String.fromCharCode(0x00df); break;
                    case 'agrave': ch = String.fromCharCode(0x00e0); break;
                    case 'aacute': ch = String.fromCharCode(0x00e1); break;
                    case 'acirc': ch = String.fromCharCode(0x00e2); break;
                    case 'atilde': ch = String.fromCharCode(0x00e3); break;
                    case 'auml': ch = String.fromCharCode(0x00e4); break;
                    case 'aring': ch = String.fromCharCode(0x00e5); break;
                    case 'aelig': ch = String.fromCharCode(0x00e6); break;
                    case 'ccedil': ch = String.fromCharCode(0x00e7); break;
                    case 'egrave': ch = String.fromCharCode(0x00e8); break;
                    case 'eacute': ch = String.fromCharCode(0x00e9); break;
                    case 'ecirc': ch = String.fromCharCode(0x00ea); break;
                    case 'euml': ch = String.fromCharCode(0x00eb); break;
                    case 'igrave': ch = String.fromCharCode(0x00ec); break;
                    case 'iacute': ch = String.fromCharCode(0x00ed); break;
                    case 'icirc': ch = String.fromCharCode(0x00ee); break;
                    case 'iuml': ch = String.fromCharCode(0x00ef); break;
                    case 'eth': ch = String.fromCharCode(0x00f0); break;
                    case 'ntilde': ch = String.fromCharCode(0x00f1); break;
                    case 'ograve': ch = String.fromCharCode(0x00f2); break;
                    case 'oacute': ch = String.fromCharCode(0x00f3); break;
                    case 'ocirc': ch = String.fromCharCode(0x00f4); break;
                    case 'otilde': ch = String.fromCharCode(0x00f5); break;
                    case 'ouml': ch = String.fromCharCode(0x00f6); break;
                    case 'divide': ch = String.fromCharCode(0x00f7); break;
                    case 'oslash': ch = String.fromCharCode(0x00f8); break;
                    case 'ugrave': ch = String.fromCharCode(0x00f9); break;
                    case 'uacute': ch = String.fromCharCode(0x00fa); break;
                    case 'ucirc': ch = String.fromCharCode(0x00fb); break;
                    case 'uuml': ch = String.fromCharCode(0x00fc); break;
                    case 'yacute': ch = String.fromCharCode(0x00fd); break;
                    case 'thorn': ch = String.fromCharCode(0x00fe); break;
                    case 'yuml': ch = String.fromCharCode(0x00ff); break;
                    case 'OElig': ch = String.fromCharCode(0x0152); break;
                    case 'oelig': ch = String.fromCharCode(0x0153); break;
                    case 'Scaron': ch = String.fromCharCode(0x0160); break;
                    case 'scaron': ch = String.fromCharCode(0x0161); break;
                    case 'Yuml': ch = String.fromCharCode(0x0178); break;
                    case 'fnof': ch = String.fromCharCode(0x0192); break;
                    case 'circ': ch = String.fromCharCode(0x02c6); break;
                    case 'tilde': ch = String.fromCharCode(0x02dc); break;
                    case 'Alpha': ch = String.fromCharCode(0x0391); break;
                    case 'Beta': ch = String.fromCharCode(0x0392); break;
                    case 'Gamma': ch = String.fromCharCode(0x0393); break;
                    case 'Delta': ch = String.fromCharCode(0x0394); break;
                    case 'Epsilon': ch = String.fromCharCode(0x0395); break;
                    case 'Zeta': ch = String.fromCharCode(0x0396); break;
                    case 'Eta': ch = String.fromCharCode(0x0397); break;
                    case 'Theta': ch = String.fromCharCode(0x0398); break;
                    case 'Iota': ch = String.fromCharCode(0x0399); break;
                    case 'Kappa': ch = String.fromCharCode(0x039a); break;
                    case 'Lambda': ch = String.fromCharCode(0x039b); break;
                    case 'Mu': ch = String.fromCharCode(0x039c); break;
                    case 'Nu': ch = String.fromCharCode(0x039d); break;
                    case 'Xi': ch = String.fromCharCode(0x039e); break;
                    case 'Omicron': ch = String.fromCharCode(0x039f); break;
                    case 'Pi': ch = String.fromCharCode(0x03a0); break;
                    case ' Rho ': ch = String.fromCharCode(0x03a1); break;
                    case 'Sigma': ch = String.fromCharCode(0x03a3); break;
                    case 'Tau': ch = String.fromCharCode(0x03a4); break;
                    case 'Upsilon': ch = String.fromCharCode(0x03a5); break;
                    case 'Phi': ch = String.fromCharCode(0x03a6); break;
                    case 'Chi': ch = String.fromCharCode(0x03a7); break;
                    case 'Psi': ch = String.fromCharCode(0x03a8); break;
                    case 'Omega': ch = String.fromCharCode(0x03a9); break;
                    case 'alpha': ch = String.fromCharCode(0x03b1); break;
                    case 'beta': ch = String.fromCharCode(0x03b2); break;
                    case 'gamma': ch = String.fromCharCode(0x03b3); break;
                    case 'delta': ch = String.fromCharCode(0x03b4); break;
                    case 'epsilon': ch = String.fromCharCode(0x03b5); break;
                    case 'zeta': ch = String.fromCharCode(0x03b6); break;
                    case 'eta': ch = String.fromCharCode(0x03b7); break;
                    case 'theta': ch = String.fromCharCode(0x03b8); break;
                    case 'iota': ch = String.fromCharCode(0x03b9); break;
                    case 'kappa': ch = String.fromCharCode(0x03ba); break;
                    case 'lambda': ch = String.fromCharCode(0x03bb); break;
                    case 'mu': ch = String.fromCharCode(0x03bc); break;
                    case 'nu': ch = String.fromCharCode(0x03bd); break;
                    case 'xi': ch = String.fromCharCode(0x03be); break;
                    case 'omicron': ch = String.fromCharCode(0x03bf); break;
                    case 'pi': ch = String.fromCharCode(0x03c0); break;
                    case 'rho': ch = String.fromCharCode(0x03c1); break;
                    case 'sigmaf': ch = String.fromCharCode(0x03c2); break;
                    case 'sigma': ch = String.fromCharCode(0x03c3); break;
                    case 'tau': ch = String.fromCharCode(0x03c4); break;
                    case 'upsilon': ch = String.fromCharCode(0x03c5); break;
                    case 'phi': ch = String.fromCharCode(0x03c6); break;
                    case 'chi': ch = String.fromCharCode(0x03c7); break;
                    case 'psi': ch = String.fromCharCode(0x03c8); break;
                    case 'omega': ch = String.fromCharCode(0x03c9); break;
                    case 'thetasym': ch = String.fromCharCode(0x03d1); break;
                    case 'upsih': ch = String.fromCharCode(0x03d2); break;
                    case 'piv': ch = String.fromCharCode(0x03d6); break;
                    case 'ensp': ch = String.fromCharCode(0x2002); break;
                    case 'emsp': ch = String.fromCharCode(0x2003); break;
                    case 'thinsp': ch = String.fromCharCode(0x2009); break;
                    case 'zwnj': ch = String.fromCharCode(0x200c); break;
                    case 'zwj': ch = String.fromCharCode(0x200d); break;
                    case 'lrm': ch = String.fromCharCode(0x200e); break;
                    case 'rlm': ch = String.fromCharCode(0x200f); break;
                    case 'ndash': ch = String.fromCharCode(0x2013); break;
                    case 'mdash': ch = String.fromCharCode(0x2014); break;
                    case 'lsquo': ch = String.fromCharCode(0x2018); break;
                    case 'rsquo': ch = String.fromCharCode(0x2019); break;
                    case 'sbquo': ch = String.fromCharCode(0x201a); break;
                    case 'ldquo': ch = String.fromCharCode(0x201c); break;
                    case 'rdquo': ch = String.fromCharCode(0x201d); break;
                    case 'bdquo': ch = String.fromCharCode(0x201e); break;
                    case 'dagger': ch = String.fromCharCode(0x2020); break;
                    case 'Dagger': ch = String.fromCharCode(0x2021); break;
                    case 'bull': ch = String.fromCharCode(0x2022); break;
                    case 'hellip': ch = String.fromCharCode(0x2026); break;
                    case 'permil': ch = String.fromCharCode(0x2030); break;
                    case 'prime': ch = String.fromCharCode(0x2032); break;
                    case 'Prime': ch = String.fromCharCode(0x2033); break;
                    case 'lsaquo': ch = String.fromCharCode(0x2039); break;
                    case 'rsaquo': ch = String.fromCharCode(0x203a); break;
                    case 'oline': ch = String.fromCharCode(0x203e); break;
                    case 'frasl': ch = String.fromCharCode(0x2044); break;
                    case 'euro': ch = String.fromCharCode(0x20ac); break;
                    case 'image': ch = String.fromCharCode(0x2111); break;
                    case 'weierp': ch = String.fromCharCode(0x2118); break;
                        case 'real': ch = String.fromCharCode(0x211c); break;
                    case 'trade': ch = String.fromCharCode(0x2122); break;
                    case 'alefsym': ch = String.fromCharCode(0x2135); break;
                    case 'larr': ch = String.fromCharCode(0x2190); break;
                    case 'uarr': ch = String.fromCharCode(0x2191); break;
                    case 'rarr': ch = String.fromCharCode(0x2192); break;
                    case 'darr': ch = String.fromCharCode(0x2193); break;
                    case 'harr': ch = String.fromCharCode(0x2194); break;
                    case 'crarr': ch = String.fromCharCode(0x21b5); break;
                    case 'lArr': ch = String.fromCharCode(0x21d0); break;
                    case 'uArr': ch = String.fromCharCode(0x21d1); break;
                    case 'rArr': ch = String.fromCharCode(0x21d2); break;
                    case 'dArr': ch = String.fromCharCode(0x21d3); break;
                    case 'hArr': ch = String.fromCharCode(0x21d4); break;
                    case 'forall': ch = String.fromCharCode(0x2200); break;
                    case 'part': ch = String.fromCharCode(0x2202); break;
                    case 'exist': ch = String.fromCharCode(0x2203); break;
                    case 'empty': ch = String.fromCharCode(0x2205); break;
                    case 'nabla': ch = String.fromCharCode(0x2207); break;
                    case 'isin': ch = String.fromCharCode(0x2208); break;
                    case 'notin': ch = String.fromCharCode(0x2209); break;
                    case 'ni': ch = String.fromCharCode(0x220b); break;
                    case 'prod': ch = String.fromCharCode(0x220f); break;
                    case 'sum': ch = String.fromCharCode(0x2211); break;
                    case 'minus': ch = String.fromCharCode(0x2212); break;
                    case 'lowast': ch = String.fromCharCode(0x2217); break;
                    case 'radic': ch = String.fromCharCode(0x221a); break;
                    case 'prop': ch = String.fromCharCode(0x221d); break;
                    case 'infin': ch = String.fromCharCode(0x221e); break;
                    case 'ang': ch = String.fromCharCode(0x2220); break;
                    case 'and': ch = String.fromCharCode(0x2227); break;
                    case 'or': ch = String.fromCharCode(0x2228); break;
                    case 'cap': ch = String.fromCharCode(0x2229); break;
                    case 'cup': ch = String.fromCharCode(0x222a); break;
                    case 'int': ch = String.fromCharCode(0x222b); break;
                    case 'there4': ch = String.fromCharCode(0x2234); break;
                    case 'sim': ch = String.fromCharCode(0x223c); break;
                    case 'cong': ch = String.fromCharCode(0x2245); break;
                    case 'asymp': ch = String.fromCharCode(0x2248); break;
                    case 'ne': ch = String.fromCharCode(0x2260); break;
                    case 'equiv': ch = String.fromCharCode(0x2261); break;
                    case 'le': ch = String.fromCharCode(0x2264); break;
                    case 'ge': ch = String.fromCharCode(0x2265); break;
                    case 'sub': ch = String.fromCharCode(0x2282); break;
                    case 'sup': ch = String.fromCharCode(0x2283); break;
                    case 'nsub': ch = String.fromCharCode(0x2284); break;
                    case 'sube': ch = String.fromCharCode(0x2286); break;
                    case 'supe': ch = String.fromCharCode(0x2287); break;
                    case 'oplus': ch = String.fromCharCode(0x2295); break;
                    case 'otimes': ch = String.fromCharCode(0x2297); break;
                    case 'perp': ch = String.fromCharCode(0x22a5); break;
                    case 'sdot': ch = String.fromCharCode(0x22c5); break;
                    case 'lceil': ch = String.fromCharCode(0x2308); break;
                    case 'rceil': ch = String.fromCharCode(0x2309); break;
                    case 'lfloor': ch = String.fromCharCode(0x230a); break;
                    case 'rfloor': ch = String.fromCharCode(0x230b); break;
                    case 'lang': ch = String.fromCharCode(0x2329); break;
                    case 'rang': ch = String.fromCharCode(0x232a); break;
                    case 'loz': ch = String.fromCharCode(0x25ca); break;
                    case 'spades': ch = String.fromCharCode(0x2660); break;
                    case 'clubs': ch = String.fromCharCode(0x2663); break;
                    case 'hearts': ch = String.fromCharCode(0x2665); break;
                    case 'diams': ch = String.fromCharCode(0x2666); break;
                    default: ch = ''; break;
                }
                i = semicolonIndex;
            }
        }
        out += ch;
    }
    return out;
}
Categories: flex Tags: