package { import flash.display.*; import flash.text.*; import css.*; import cssdom.*; public class SelectTest extends Sprite { private var mTextOut:TextField; private static var theInstance:SelectTest; private var mDefaultFmt:TextFormat = new TextFormat(); private var mOKFmt:TextFormat = new TextFormat(); private var mNGFmt:TextFormat = new TextFormat(); public static const TestCSS:String = '.index em[title~="foobar"] {\n'+ ' color: #940;\n'+ '}\n\n'+ 'body>.em1 {\n'+ ' background-color: #ffe;\n'+ '}\n\n'+ '.index em[title~="fooba"] {\n'+ ' background-color: #f7e;\n'+ '}\n\n'+ '.index {\n'+ ' background-color: #fff;\n'+ '}'; public static const TestDoc:XML = foobar ; function SelectTest() { mDefaultFmt.color = 0xffffff; mDefaultFmt.font = "Arial"; mOKFmt.color = 0x55ff22; mNGFmt.color = 0xff6622; mTextOut = new TextField(); mTextOut.defaultTextFormat = mDefaultFmt; addChild(mTextOut); mTextOut.width = 480; mTextOut.height = 640; theInstance = this; start(); } private function start():void { puts("--------------"); puts(TestCSS); puts("--------------"); puts(TestDoc); puts("--------------"); var ascss:ASCSS = new ASCSS(TestCSS); var wrp:XMLElementWrapper = XMLElementWrapper.createFor(TestDoc); ascss.setDocument(wrp); ascss.parse(); var sheet:css.StyleSheet = ascss.sheet as css.StyleSheet; wrp.appendStyleSheet(sheet); // dumpSheet(sheet, 0); // puts("--------------"); /* putsAssert(" has class", wrp.hasClass); putsAssert(" DOES NOT have id", !wrp.hasId); putsAssert(" has firstChild", wrp.firstChild != null); putsAssert("Parent of 's firstChild is ", wrp.firstChild.parentNode == wrp); putsAssert("Local name of 's firstChild is 'em'", wrp.firstChild.localName == 'em'); putsAssert(" contains 2 class names", wrp.classNames.size == 2); putsAssert(" contains class name 'index'", wrp.classNames.contains('index')); putsAssert(" DOES NOT contains class name 'foobar'", !wrp.classNames.contains('foobar')); */ puts("--------------"); puts("initializing CSSStyleSelector for "); var computeTarget:IASCSSElement = wrp.firstChild; var sel:CSSStyleSelector = wrp.createStyleSelector(); sel.DOUT = SelectTest; sel.initElementAndPseudoState(computeTarget); sel.initForStyleResolve(computeTarget, null); sel.style = new RenderStyle(); puts("--------------"); var authorStyle:CSSRuleSet = sel.authorStyle; putsAssert("sel.authorStyle != null; Our CSS is set correctly", authorStyle != null); putsAssert("ruleset.getTagRules('em') != null; 'em' is set to the map", authorStyle.getTagRules('em') != null); putsAssert("ruleset.getClassRules('index') != null; 'index' is set to the map", authorStyle.getClassRules('index') != null); var indexes:Array = [-1, -1]; sel.matchRules(authorStyle, indexes); puts("-- selector specificity order --"); sel.dumpMatchedRules(); puts("-- apply decls --"); // first pass // normal decls sel.applyDeclarations(true, false); // override important decls sel.applyDeclarations(true, true); // second pass // normal decls sel.applyDeclarations(false, false); // override important decls sel.applyDeclarations(false, true); } private static const INDENT_S:String = " "; public function dumpSheet(s:Object, indent:int):void { var idt:String = INDENT_S.substring(0, indent*2); puts(idt+"obj "+s); if (s is CSSSelector) { if (s.next) dumpSheet(s.next, indent+1); if (s.m_tagHistory) dumpSheet(s.m_tagHistory, indent+1); return; } else if (!(s is StyleBase)) return; if ((s is StyleList) || (s is CSSStyleDeclaration)) { var len:int = s.length; for (var i:int = 0;i < len;i++) dumpSheet(s.item(i), indent+1); } else if (s is CSSStyleRule) { var r:CSSStyleRule = CSSStyleRule(s); dumpSheet(r.selector, indent+1); dumpSheet(r.declaration, indent+1); } } public static function putsAssert(name:String, res:Boolean):void { theInstance.mTextOut.defaultTextFormat = res ? theInstance.mOKFmt : theInstance.mNGFmt; puts(name+": "+(res ? "[ O K ]" : "[ N G ]")); theInstance.mTextOut.defaultTextFormat = theInstance.mDefaultFmt; } public static function puts(s:*):void { theInstance.mTextOut.appendText(s+"\n"); } } }