1 package net.systemeD.halcyon.styleparser {
3 /** A class permitting you to load CSS files containing '@import' rules, which will be
4 * automatically replaced with the contents of the file.
8 * cssLoader=new NestedCSSLoader();
9 * cssLoader.addEventListener(Event.COMPLETE, doParseCSS);
10 * cssLoader.load("potlatch.css");
12 * doParseCSS can then access the CSS via event.target.css.
15 import flash.events.*;
16 import flash.net.URLLoader;
17 import flash.net.URLLoaderDataFormat;
18 import flash.net.URLRequest;
20 public class NestedCSSLoader extends EventDispatcher {
21 private var sourceCSS:String;
22 public var css:String;
23 private var url:String;
24 private var count:int;
26 private static const IMPORT:RegExp=/@import\s*[^'"]*['"]([^'"]+)['"][^;]*;/g; // '
28 public function NestedCSSLoader() {
31 public function load(url:String):void {
33 var request:URLRequest=new URLRequest(url+"?d="+Math.random());
34 var loader:URLLoader = new URLLoader();
35 loader.dataFormat = URLLoaderDataFormat.TEXT;
36 loader.addEventListener(Event.COMPLETE, fileLoaded);
37 loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, fileError);
38 loader.addEventListener(IOErrorEvent.IO_ERROR, fileError);
42 private function fileLoaded(event:Event):void {
43 sourceCSS=URLLoader(event.target).data;
47 var result:Object=IMPORT.exec(sourceCSS);
48 while (result!=null) {
50 replaceCSS(result[1],result[0]);
51 result=IMPORT.exec(sourceCSS);
53 if (count==0) { fireComplete(); }
56 private function replaceCSS(filename:String, toReplace:String):void {
57 var cssLoader:NestedCSSLoader=new NestedCSSLoader();
58 var replaceText:String=toReplace;
59 cssLoader.addEventListener(Event.COMPLETE, function(event:Event):void {
60 css=css.replace(replaceText,event.target.css);
63 cssLoader.load(filename+"?d="+Math.random());
66 private function fileError(event:Event):void {
67 // just fire a complete event so we don't get an error dialogue
68 trace("Error while trying to load "+url);
72 private function decreaseCount():void {
73 count--; if (count>0) return;
77 private function fireComplete():void {
78 var event:Event=new Event(Event.COMPLETE);