Skip to content

Commit c70a84e

Browse files
committed
Init
0 parents  commit c70a84e

File tree

6 files changed

+131
-0
lines changed

6 files changed

+131
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
node_modules
2+
npm-debug.log

.travis.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
language: node_js
2+
node_js:
3+
- "0.12"
4+
- "0.11"
5+
- "0.10"
6+
- "iojs"
7+
- "iojs-v1.0.4"

index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
var parseCssUrls = require('./lib/css-parser');
2+
module.exports = parseCssUrls;

lib/css-parser.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
var _ = require('lodash');
2+
3+
var embeddedRegexp = /data:(.*?);base64,/;
4+
var commentRegexp = /\/\*([\s\S]*?)\*\//g;
5+
var urlsRegexp = /((?:@import\s+)?url\s*\(['"]?)(\S*?)(['"]?\s*\))|(@import\s+['"]?)([^;'"]+)/ig;
6+
7+
function isEmbedded (src) {
8+
return embeddedRegexp.test(src);
9+
}
10+
11+
function getUrls (text) {
12+
var urls = [];
13+
var urlMatch;
14+
15+
text = text.replace(commentRegexp, '');
16+
17+
while (urlMatch = urlsRegexp.exec(text)) {
18+
// Match 2 group if '[@import] url(path)', match 5 group if '@import path'
19+
urls.push(urlMatch[2]||urlMatch[5]);
20+
}
21+
22+
return _.chain(urls)
23+
.compact()
24+
.reject(isEmbedded)
25+
.uniq()
26+
.value();
27+
}
28+
29+
module.exports = getUrls;

package.json

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{
2+
"name": "css-url-parser",
3+
"version": "0.1.0",
4+
"description": "Parses urls from css file",
5+
"main": "index.js",
6+
"directories": {
7+
"test": "test"
8+
},
9+
"scripts": {
10+
"test": "istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage"
11+
},
12+
"keywords": [
13+
"parser",
14+
"css",
15+
"url"
16+
],
17+
"repository": {
18+
"type": "git",
19+
"url": "git://github.com/s0ph1e/node-css-url-parser.git"
20+
},
21+
"bugs": {
22+
"url": "https://github.com/s0ph1e/node-css-url-parser/issues"
23+
},
24+
"homepage": "https://github.com/s0ph1e/node-css-url-parser",
25+
"author": "s0ph1e",
26+
"license": "MIT",
27+
"dependencies": {
28+
"lodash": "^3.7.0"
29+
},
30+
"devDependencies": {
31+
"should": "^6.0.1",
32+
"mocha": "^2.2.4",
33+
"coveralls": "^2.11.2",
34+
"istanbul": "^0.3.7"
35+
}
36+
}

test/css-parser-test.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
var parseCssUrls = require('../index');
2+
3+
var should = require('should')
4+
describe('Parse css urls', function(){
5+
it('should return array of entries from url(...), @import url(...) and @import ...', function(){
6+
var text = '\
7+
@import url("a.css"); \
8+
@import url(\'b.css\') tv; \
9+
@import url(c.css); \
10+
@import "d.css" screen; \
11+
@import \'e.css\'; \
12+
@import f.css; \
13+
.image { \
14+
background-image: url ("g.css"); \
15+
background-image: url (\'h.css\'); \
16+
background-image: url (i.css); \
17+
} \
18+
';
19+
20+
var urls = parseCssUrls(text);
21+
urls.should.be.instanceof(Array).and.have.lengthOf(9);
22+
urls.should.containEql('a.css');
23+
urls.should.containEql('b.css');
24+
urls.should.containEql('c.css');
25+
urls.should.containEql('d.css');
26+
urls.should.containEql('e.css');
27+
urls.should.containEql('f.css');
28+
urls.should.containEql('g.css');
29+
urls.should.containEql('h.css');
30+
urls.should.containEql('i.css');
31+
});
32+
33+
it('should exclude duplicated urls', function(){
34+
var text = '\
35+
@import url("a.css"); \
36+
@import a.css; \
37+
.image { background: url("a.css"); } \
38+
';
39+
40+
var urls = parseCssUrls(text);
41+
urls.should.be.instanceof(Array).and.have.lengthOf(1);
42+
urls.should.containEql('a.css');
43+
});
44+
45+
it('should ignore base64 encoded urls', function(){
46+
var text = '\
47+
div.image { \
48+
background-image: url(\'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACXklEQVQ4T82TX0hTYRjGZ8Oryp2j5f5l/iHKdVOjZabzSm1MnNuB0sSI1BiNLqoLt93UVTejSJ1L19of0Qs1aNG6CELmhcacZRmZkIUWhUZBF92EFc/pe7/IdEbXffDy8j7P7zy8nPMdheK/Obn7Tur1Vl9/kaMnWSIFkrubQklDczS5tyXGO82kk6+z+gYFY1vhuuXzzJ7hgqYhuahxQN7VMiwbWuOyoT0hF564yzvNpJNPXF6VN742QJlb5X2kl8LYKQVR0hhFyfEBHHLFcTE6zTvNpJNPHPEsQPk7JFusdE+uDdhmC+NSdAp0qNO8NoB49nD2nwCzJ6WTbqLA0Yfio2FopQjGnrzHnfFFPHy+DK0jguJjYe4TJzI+I6AjpbOHsMPeC40tiCMX4ph78xnG9hG8/fAFNedvQ9MQ5D5xorkjI6CiI6VlgL4hgC013egamcbQ6EsoyjuRmFhAJ5tJJ584kfHrN2CC2tYHbb0fuRY/nr3+iHNdY1DbbsAbnMDswieIlm7uaxi3MYCtpK7vhar6Ciqdg/i68h3pF0uYnF3C1NwyVr79QIVzgPlXQdxfA/Lrr0N5+DIi92bwIL2I7VY/SpvDyK/rwfjMO0QST7lP3MZ3YHY/zmfJQrUPDvcIytpiEGqvQV3n5738dD/Tb3H/V4CH7sHqZ8xSmVz3NVJM1th65c3VXbJgCcg6R0jW2kO8qyw9XCdfI/XLQtnZURawafU2KnMKanP2n0qpDrpeqQ4453mZnPOC6Qzvqxrztxpb00qx0Jr5I2cxQcuqlNWef5SBeTpWxCt+AlBhYa97xG2bAAAAAElFTkSuQmCC\'); \
49+
} \
50+
';
51+
52+
var urls = parseCssUrls(text);
53+
urls.should.be.empty;
54+
});
55+
});

0 commit comments

Comments
 (0)