@@ -16,146 +16,143 @@ var getLinkContents = require("./utils/get-link-contents");
1616var createLink = require ( "./utils/create-link" ) ;
1717
1818module . exports = function ( url , options , html ) {
19- var deferred = q . defer ( ) ;
20- var options = options || { } ;
21- options . headers = options . headers || { } ;
22- options . headers [ "User-Agent" ] = options . headers [ "User-Agent" ] || ua ;
23- options . timeout = options . timeout || 5000 ;
24- options . gzip = true ;
25-
26- if ( typeof url !== "string" || isBlank ( url ) || ! isUrl ( url ) ) {
27- throw new TypeError ( "get-css expected a url as a string" ) ;
28- }
29-
30- url = normalizeUrl ( url , { stripWWW : false } ) ;
31- options . url = url ;
32-
33- if ( options . ignoreCerts ) {
34- process . env . NODE_TLS_REJECT_UNAUTHORIZED = "0" ;
35- }
36-
37- var status = {
38- parsed : 0 ,
39- total : 0
40- } ;
41-
42- var result = {
43- links : [ ] ,
44- styles : [ ] ,
45- css : ""
46- } ;
47-
48- function handleResolve ( ) {
49- if ( status . parsed >= status . total ) {
50- deferred . resolve ( result ) ;
51- }
52- }
53-
54- function parseHtml ( html ) {
55- var $ = cheerio . load ( html ) ;
56- result . pageTitle = $ ( "head > title" ) . text ( ) ;
57-
58- $ ( "[rel=stylesheet]" ) . each ( function ( ) {
59- var link = $ ( this ) . attr ( "href" ) ;
60- if ( isPresent ( link ) ) {
61- result . links . push ( createLink ( link , url ) ) ;
62- } else {
63- result . styles . push ( stripHtmlComments ( $ ( this ) . text ( ) ) ) ;
64- }
65- } ) ;
66-
67- $ ( "style" ) . each ( function ( ) {
68- result . styles . push ( stripHtmlComments ( $ ( this ) . text ( ) ) ) ;
69- } ) ;
70-
71- status . total = result . links . length + result . styles . length ;
72- if ( ! status . total ) {
73- deferred . resolve ( false ) ;
74- }
75-
76- result . links . forEach ( function ( link ) {
77- getLinkContents ( link . url , options )
78- . then ( function ( css ) {
79- handleCssFromLink ( link , css ) ;
80- } )
81- . catch ( function ( error ) {
82- link . error = error ;
83- status . parsed ++ ;
84- handleResolve ( ) ;
85- } ) ;
86- } ) ;
87-
88- result . styles . forEach ( function ( css ) {
89- result . css += css ;
90- status . parsed ++ ;
91- handleResolve ( ) ;
92- } ) ;
93- }
94-
95- function handleCssFromLink ( link , css ) {
96- link . css += css ;
97-
98- parseCssForImports ( link , css ) ;
99-
100- status . parsed ++ ;
101- handleResolve ( ) ;
102- }
103-
104- // Handle potential @import url(foo.css) statements in the CSS.
105- function parseCssForImports ( link , css ) {
106- link . imports = resolveCssImportUrls ( link . url , css ) ;
107- status . total += link . imports . length ;
108- result . css += css ;
109-
110- link . imports . forEach ( function ( importUrl ) {
111- var importLink = createLink ( importUrl , importUrl ) ;
112- result . links . push ( importLink ) ;
113-
114- getLinkContents ( importLink . url , options )
115- . then ( function ( css ) {
116- handleCssFromLink ( importLink , css ) ;
117- } )
118- . catch ( function ( error ) {
119- link . error = error ;
120- status . parsed ++ ;
121- handleResolve ( ) ;
122- } ) ;
123- } ) ;
124- }
125-
126- function handleBody ( body ) {
127- if ( isCss ( url ) ) {
128- var link = createLink ( url , url ) ;
129- result . links . push ( link ) ;
130- handleCssFromLink ( link , body ) ;
131- } else {
132- parseHtml ( body ) ;
133- }
134- }
135-
136- if ( html ) {
137- handleBody ( html ) ;
138- } else {
139- request ( options , function ( error , response , body ) {
140- if ( error ) {
141- if ( options . verbose )
142- console . log ( "Error from " + url + " " + error ) ;
143- deferred . reject ( error ) ;
144- return ;
145- }
146-
147- if ( response && response . statusCode != 200 ) {
148- if ( options . verbose )
149- console . log (
150- "Received a " + response . statusCode + " from: " + url
151- ) ;
152- deferred . reject ( { url : url , statusCode : response . code } ) ;
153- return ;
154- }
155-
156- handleBody ( body ) ;
157- } ) ;
158- }
159-
160- return deferred . promise ;
19+ var deferred = q . defer ( ) ;
20+ var options = options || { } ;
21+ options . headers = options . headers || { } ;
22+ options . headers [ "User-Agent" ] = options . headers [ "User-Agent" ] || ua ;
23+ options . timeout = options . timeout || 5000 ;
24+ options . gzip = true ;
25+
26+ if ( typeof url !== "string" || isBlank ( url ) || ! isUrl ( url ) ) {
27+ throw new TypeError ( "get-css expected a url as a string" ) ;
28+ }
29+
30+ url = normalizeUrl ( url , { stripWWW : false } ) ;
31+ options . url = url ;
32+
33+ if ( options . ignoreCerts ) {
34+ process . env . NODE_TLS_REJECT_UNAUTHORIZED = "0" ;
35+ }
36+
37+ var status = {
38+ parsed : 0 ,
39+ total : 0
40+ } ;
41+
42+ var result = {
43+ links : [ ] ,
44+ styles : [ ] ,
45+ css : ""
46+ } ;
47+
48+ function handleResolve ( ) {
49+ if ( status . parsed >= status . total ) {
50+ deferred . resolve ( result ) ;
51+ }
52+ }
53+
54+ function parseHtml ( html ) {
55+ var $ = cheerio . load ( html ) ;
56+ result . pageTitle = $ ( "head > title" ) . text ( ) ;
57+
58+ $ ( "[rel=stylesheet]" ) . each ( function ( ) {
59+ var link = $ ( this ) . attr ( "href" ) ;
60+ if ( isPresent ( link ) ) {
61+ result . links . push ( createLink ( link , url ) ) ;
62+ } else {
63+ result . styles . push ( stripHtmlComments ( $ ( this ) . text ( ) ) ) ;
64+ }
65+ } ) ;
66+
67+ $ ( "style" ) . each ( function ( ) {
68+ result . styles . push ( stripHtmlComments ( $ ( this ) . text ( ) ) ) ;
69+ } ) ;
70+
71+ status . total = result . links . length + result . styles . length ;
72+ if ( ! status . total ) {
73+ deferred . resolve ( false ) ;
74+ }
75+
76+ result . links . forEach ( function ( link ) {
77+ getLinkContents ( link . url , options )
78+ . then ( function ( css ) {
79+ handleCssFromLink ( link , css ) ;
80+ } )
81+ . catch ( function ( error ) {
82+ link . error = error ;
83+ status . parsed ++ ;
84+ handleResolve ( ) ;
85+ } ) ;
86+ } ) ;
87+
88+ result . styles . forEach ( function ( css ) {
89+ result . css += css ;
90+ status . parsed ++ ;
91+ handleResolve ( ) ;
92+ } ) ;
93+ }
94+
95+ function handleCssFromLink ( link , css ) {
96+ link . css += css ;
97+
98+ parseCssForImports ( link , css ) ;
99+
100+ status . parsed ++ ;
101+ handleResolve ( ) ;
102+ }
103+
104+ // Handle potential @import url(foo.css) statements in the CSS.
105+ function parseCssForImports ( link , css ) {
106+ link . imports = resolveCssImportUrls ( link . url , css ) ;
107+ status . total += link . imports . length ;
108+ result . css += css ;
109+
110+ link . imports . forEach ( function ( importUrl ) {
111+ var importLink = createLink ( importUrl , importUrl ) ;
112+ result . links . push ( importLink ) ;
113+
114+ getLinkContents ( importLink . url , options )
115+ . then ( function ( css ) {
116+ handleCssFromLink ( importLink , css ) ;
117+ } )
118+ . catch ( function ( error ) {
119+ link . error = error ;
120+ status . parsed ++ ;
121+ handleResolve ( ) ;
122+ } ) ;
123+ } ) ;
124+ }
125+
126+ function handleBody ( body ) {
127+ if ( isCss ( url ) ) {
128+ var link = createLink ( url , url ) ;
129+ result . links . push ( link ) ;
130+ handleCssFromLink ( link , body ) ;
131+ } else {
132+ parseHtml ( body ) ;
133+ }
134+ }
135+
136+ if ( html ) {
137+ handleBody ( html ) ;
138+ } else {
139+ request ( options , function ( error , response , body ) {
140+ if ( error ) {
141+ if ( options . verbose ) console . log ( "Error from " + url + " " + error ) ;
142+ deferred . reject ( error ) ;
143+ return ;
144+ }
145+
146+ if ( response && response . statusCode != 200 ) {
147+ if ( options . verbose )
148+ console . log ( "Received a " + response . statusCode + " from: " + url ) ;
149+ deferred . reject ( { url : url , statusCode : response . code } ) ;
150+ return ;
151+ }
152+
153+ handleBody ( body ) ;
154+ } ) ;
155+ }
156+
157+ return deferred . promise ;
161158} ;
0 commit comments