@@ -5,6 +5,13 @@ import cssSelector = require("ui/styling/css-selector");
55import cssParser = require( "js-libs/reworkcss" ) ;
66import VisualState = visualState . VisualState ;
77import application = require( "application" ) ;
8+ import utils = require( "utils/utils" ) ;
9+ import types = require( "utils/types" ) ;
10+ import fs = require( "file-system" ) ;
11+ import file_access_module = require( "file-system/file-system-access" ) ;
12+
13+ var fileAccess = new file_access_module . FileSystemAccess ( ) ;
14+ var pattern : RegExp = / u r l \( ( ' | " ) ( .* ?) \1\) / ;
815
916export class StyleScope {
1017 // caches all the visual states by the key of the visual state selectors
@@ -36,33 +43,69 @@ export class StyleScope {
3643 this . _reset ( ) ;
3744 if ( this . _cssSelectors ) {
3845 var addedSelectors = StyleScope . createSelectorsFromCss ( cssString , cssFileName ) ;
39- this . _cssSelectors = this . _joinCssSelectorsArrays ( [ this . _cssSelectors , addedSelectors ] ) ;
46+ this . _cssSelectors = StyleScope . _joinCssSelectorsArrays ( [ this . _cssSelectors , addedSelectors ] ) ;
4047 }
4148 }
4249
4350 public static createSelectorsFromCss ( css : string , cssFileName : string ) : cssSelector . CssSelector [ ] {
4451 try {
4552 var pageCssSyntaxTree = css ? cssParser . parse ( css , { source : cssFileName } ) : null ;
46- var pageCssSelectors ;
53+
54+ var pageCssSelectors = new Array < cssSelector . CssSelector > ( ) ;
55+
4756 if ( pageCssSyntaxTree ) {
48- pageCssSelectors = StyleScope . createSelectorsFromSyntaxTree ( pageCssSyntaxTree ) ;
57+ pageCssSelectors = StyleScope . _joinCssSelectorsArrays ( [ pageCssSelectors , StyleScope . createSelectorsFromImports ( pageCssSyntaxTree ) ] ) ;
58+ pageCssSelectors = StyleScope . _joinCssSelectorsArrays ( [ pageCssSelectors , StyleScope . createSelectorsFromSyntaxTree ( pageCssSyntaxTree ) ] ) ;
4959 }
60+
5061 return pageCssSelectors ;
5162 }
5263 catch ( e ) {
5364 trace . write ( "Css styling failed: " + e , trace . categories . Error , trace . messageType . error ) ;
5465 }
5566 }
5667
68+ public static createSelectorsFromImports ( tree : cssParser . SyntaxTree ) : cssSelector . CssSelector [ ] {
69+ var selectors = new Array < cssSelector . CssSelector > ( ) ;
70+
71+ if ( ! types . isNullOrUndefined ( tree ) ) {
72+ var imports = tree [ "stylesheet" ] [ "rules" ] . filter ( r => r . type === "import" ) ;
73+
74+ for ( var i = 0 ; i < imports . length ; i ++ ) {
75+ var importItem = imports [ i ] [ "import" ] ;
76+
77+ var match = importItem && ( < string > importItem ) . match ( pattern ) ;
78+ var url = match && match [ 2 ] ;
79+
80+ if ( ! types . isNullOrUndefined ( url ) ) {
81+ if ( utils . isFileOrResourcePath ( url ) ) {
82+
83+ var fileName = types . isString ( url ) ? url . trim ( ) : "" ;
84+ if ( fileName . indexOf ( "~/" ) === 0 ) {
85+ fileName = fs . path . join ( fs . knownFolders . currentApp ( ) . path , fileName . replace ( "~/" , "" ) ) ;
86+ }
87+
88+ fileAccess . readText ( fileName , result => {
89+ selectors = StyleScope . _joinCssSelectorsArrays ( [ selectors , StyleScope . createSelectorsFromCss ( result , fileName ) ] ) ;
90+ } ) ;
91+ }
92+ }
93+ }
94+ }
95+
96+ return selectors ;
97+ }
98+
5799 public ensureSelectors ( ) {
58100 if ( ! this . _cssSelectors && ( this . _css || application . cssSelectorsCache ) ) {
59101 var applicationCssSelectors = application . cssSelectorsCache ? application . cssSelectorsCache : null ;
60102 var pageCssSelectors = StyleScope . createSelectorsFromCss ( this . _css , this . _cssFileName ) ;
61- this . _cssSelectors = this . _joinCssSelectorsArrays ( [ applicationCssSelectors , pageCssSelectors ] ) ;
103+
104+ this . _cssSelectors = StyleScope . _joinCssSelectorsArrays ( [ applicationCssSelectors , pageCssSelectors ] ) ;
62105 }
63106 }
64107
65- private _joinCssSelectorsArrays ( arrays : Array < Array < cssSelector . CssSelector > > ) : Array < cssSelector . CssSelector > {
108+ private static _joinCssSelectorsArrays ( arrays : Array < Array < cssSelector . CssSelector > > ) : Array < cssSelector . CssSelector > {
66109 var mergedResult = [ ] ;
67110 var i ;
68111 for ( i = 0 ; i < arrays . length ; i ++ ) {
0 commit comments