Парсинг css в ActionScript 3 проектах в runtime. Проблемы: 1. Нет рантайм парсинга css в принципе 2. В ActionScript проектах по неведомой причине запрещена работа с mx.style Парсит простейший css вида | Код | .someClass { test:test1; test2:test2; }
/** some comment **/ .someElseClass { bla:bla; asd:dsa; }
|
Собсно код парсера: | Код | package com.z3labs.style { import mx.utils.StringUtil; /** * Класс для обработки css * @version 0.1 * @author Alex S Batsuev (AlDev) * @copyright by Z3Labs */ public class CSSParser { /** * Обработать css из строки * @param String source */ public static function parse(source:String):void { //уберем пробелы source = StringUtil.trim(removeComments(source)); //получим блоки var blocks:Array = source.split('}'); //убъем последний по понятным причинам :) blocks.pop();
//обойдем блоки и выдерем из них стили for (var i:uint = 0;i<blocks.length;i++) { //отделим селектор от основной части var definition_block:Array = blocks[i].split('{'); //получим селектор var selector:String = definition_block[0]; //создадим определение стиля с этим селектором var style:CSSStyleDeclaration = new CSSStyleDeclaration(selector); //получим все аттрибуты var attributesDefinitions:Array = definition_block[1].split(';'); for (var j:uint = 0;j<attributesDefinitions.length;j++) { //занесем аттрибуты в стиль var definition:Array = attributesDefinitions[j].split(':'); style.setStyle(definition[0],definition[1]); } //запомним стиль StyleManager.setStyleDeclaration(selector,style); } } /** * Метод для удаления комментов из строки * @param String str * @return String * @private */ private static function removeComments(str:String):String { return str.replace(/\/\*(\r|\n|.)*\*\//g,""); } } }
|
И классы as3 для non-flex проектов (кто-то же думает о размерах swf =)) ) | Код | package com.z3labs.style { public class CSSStyleDeclaration { public var selector:String; private var props:Object; public function CSSStyleDeclaration(selector:String) { this.selector = selector; } public function setStyle(property:String, value:Object):void { props[property] = value; } public function getStyle(property:String):Object { return props[property]; } } }
|
| Код | package com.z3labs.style { public class StyleManager { private static var styles:Object = {}; public static function setStyleDeclaration(selector:String, declaration:CSSStyleDeclaration):void { styles[selector] = declaration; } public static function getStyleDeclaration(selector:String):CSSStyleDeclaration { return styles[selector]; } } }
|
Собственно остальные прелести, как парсинг имени цвета, #RRGGBB его записи и прочее можно добавить без проблем, но мну лень писать.
|