Ищу парсер CSS написанный на AS3 - PullRequest
4 голосов
/ 23 сентября 2011

Мне нужно загрузить и применить CSS во время выполнения в моем приложении Flex . Я знаю, что документы Adobe говорят, что вам нужно скомпилировать 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, но я не смог найти способ использовать это. (Есть ли способ получить этот исходный код?)

Ответы [ 2 ]

2 голосов
/ 24 сентября 2011

Редактировать: Это решение не работает.Все селекторы, извлеченные из анализатора, преобразуются в нижний регистр.Это может работать для вашего приложения, но, вероятно, не будет ...

Я оставляю этот ответ здесь, потому что это может помочь некоторым людям в поиске решения и предупредить других об ограничениях этогоmethod.


Хотя это не было предназначено для этого, можно использовать класс 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 голосов
/ 16 декабря 2011

У меня была похожая проблема, но точнее я хочу полностью избежать компиляции, потому что мое приложение является оберткой 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 и применить объявление, как в вашем примере.

Меньше или больше, как я пытался решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...