У меня была похожая проблема, но точнее я хочу полностью избежать компиляции, потому что мое приложение является оберткой ActiveX, используемой пользовательским exe-файлом, и я позволяю распространителю программного обеспечения настраивать их скин.
На практике мы помещаем вне приложения. Чтобы избежать низкоуровневого анализа строки, мы преобразовали таблицу стилей в 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 и создать декларацию CSSSty.
Разделение и разбор только селектора позволяет вам создать серию 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);
Затем вы можете проанализировать свойства CSS с помощью parseCSS () с функцией, созданной @sixtyfootersdude, но с использованием поддельного селектора:
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 и применить объявление, как в вашем примере.
Меньше или больше, как я пытался решить эту проблему.