2011-09-23 54 views
4

我需要load and apply CSS at runtime in my Flex app。我知道adobe文档说你需要compile the CSS before loading it,但我想找一个解决方法。寻找用AS3编写的CSS解析器

我知道,你可以设置个人风格是这样的:

cssStyle = new CSSStyleDeclaration(); 
cssStyle.setStyle("color", "<valid color>); 
FlexGlobals.topLevelApplication.styleManager.setStyleDeclaration("Button", cssStyle, true); 

我打算解析CSS文件,底肥如上每个属性。

我在想,如果:

  • 的Adobe有,我可以用
  • 别人有,我可以用
  • 如果我写我自己的CSS解析器CSS解析器CSS解析库我应该注意的

我知道adobe flex.text.StyleSheet类有一个CSS解析器,但我找不到解决方法。 (有没有办法获得该源代码?)

+1

请参阅:http://stackoverflow.com/questions/204924/how-do-you-dynamically-load-a-css-file-into-a-flex-application –

+1

@托德:我已经引用该链接我的问题(第一个链接)。这个问题涉及另一个问题。我的问题更具体。 – sixtyfootersdude

回答

2

编辑:此解决方案不起作用。从解析器中取出的所有选择器都将转换为小写形式。这可能适用于你的应用程序,但它可能不会...

我在这里留下这个答案,因为它可能会帮助一些人寻找解决方案,并警告其他人的这种方法的局限性。


虽然它并不打算为此,可以使用StyleSheet类来解析CSS。我目前正在调查这是多么强大,但大多数情况下它似乎正在工作。

public function extractFromStyleSheet(css:String):void { 

    // Create a StyleSheet Object 
    var styleSheet:StyleSheet = new StyleSheet(); 
    styleSheet.parseCSS(css); 

    // Iterate through the selector objects 
    var selectorNames:Array = styleSheet.styleNames; 
    for(var i:int=0; i<selectorNames.length; i++){ 

     // Do something with each selector 
     trace("Selector: "+selelectorNames[i]; 

     var properties:Object = styleSheet.getStyle(selectorNames[i]); 
     for (var property:String in properties){ 

      // Do something with each property in the selector 
      trace("\t"+property+" -> "+properties[property]+"\n"); 
     } 
    } 
} 
0

我有类似的问题,但更确切地说,我想完全避免了编译,因为我的应用程序是ActiveX包装由一个自定义的EXE文件用,我让软件分销商来定制自己的皮肤。

实际上我们把< fx:Style >放在应用程序之外。为了避免我们已经转换为XML样式表中的字符串低水平解析:

<styles> 
    <namespace name="myNs" value="com.myComponent"> 

    <declaration selector="myNS|Button#myselector:over #mysubselector"> 
     color:#ffffff; 
     font-size:bold 
    </declaration> 

    ... other styles 

</styles> 

除了关于让用户知道你的组件,你可以加载XML,并创建一个CSSStydeclaration的安全考虑。

只拆分和解析选择器让您创建一系列CSSCondition和CSSSelector添加到您的CSSStyleDeclaration。为了解析选择器,我们使用一个搜索“#”,“:”和“。”的小循环。并分割字符串以保持找到的CSS条件的顺序。

var selectors:Array = []; 

// first selector 
var conditions:Array = [ 
    new CSSCondition(CSSConditionKind.ID, 'myselector'); 
    new CSSCondition(CSSConditionKind.PSEUDO, 'over'); 
]; 

// here you have to find and expand the namespace 
ancestor:CSSSelector = new CSSSelector('com.myComponent.Button', conditions); 
selectors.push(selector); 

// second selector 
var conditions:Array = [ 
    new CSSCondition(CSSConditionKind.ID, 'mysubselector'); 
]; 

selector:CSSSelector = new CSSSelector('', conditions, ancestor); 
selectors.push(selector); 

// Empty style declaration 
new CSSStyleDeclaration(selectors, styleManager, false); 

然后,你可以通过创建@sixtyfootersdude功能解析由parseCSS()CSS属性,但使用的是假选择:

var myCSS:String = "#fake " + "{" + cssTextReadedFromXML + "}"; 
var style:StyleSheet = new StyleSheet(); 
sheet.parseCSS(myCSS); 

// here you have your parsed properties 
var list:Object = sheet.getStyle('#fake'); 

然后你可以将属性添加到的CSSStyleDeclaration,并将其应用通过setStyle方法并在你的例子中应用声明。

更少或更多是我试图解决这个问题。