Compare commits
458 Commits
update_to_
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
85881d99dd | ||
|
d3a5c97143 | ||
|
8ed3ad15c1 | ||
|
72f79efbdd | ||
|
161516b721 | ||
|
e48d5ff993 | ||
|
31abb8bee0 | ||
|
e2177cf443 | ||
|
664b45cdde | ||
|
368dad0d11 | ||
|
4dfe5361b3 | ||
|
3596991362 | ||
|
bf4c67034a | ||
|
ad5d919139 | ||
|
9fb894181d | ||
|
ffdf2d3c9b | ||
|
cbe66020f9 | ||
|
056081ace6 | ||
|
a48ba58cae | ||
|
9f67f1bdde | ||
|
55c0786130 | ||
|
fef8cb369f | ||
|
d35e54859a | ||
|
daafa9fbf2 | ||
|
34799db0cc | ||
|
41133a65ad | ||
|
1016f6870c | ||
|
72f93abf16 | ||
|
a3538d9007 | ||
|
66cc146a02 | ||
|
aab27e6be8 | ||
|
cea1e7c620 | ||
|
f8a9995050 | ||
|
0de8b82ff9 | ||
|
7d00bfdf23 | ||
|
3db2fa322b | ||
|
f4a2605a23 | ||
|
d95967247d | ||
|
da8707a17f | ||
|
3f9f6ef40d | ||
|
b051ae284e | ||
|
ea880ccf7b | ||
|
ab412165b2 | ||
|
7974fb0a05 | ||
|
59c0208caa | ||
|
9b5fb6a408 | ||
|
945f5efb74 | ||
|
decdcc5d46 | ||
|
34bd0a045d | ||
|
ed819c3b51 | ||
|
a42afef5a8 | ||
|
410ecfd3c7 | ||
|
8c75b4b0c6 | ||
|
fd94fbd2e6 | ||
|
5c4bed9593 | ||
|
2c092f6b39 | ||
|
cc2104eb49 | ||
|
c780998dc8 | ||
|
0063ddba7f | ||
|
510847a3b2 | ||
|
0c1990f655 | ||
|
7315428079 | ||
|
515fbd0991 | ||
|
975abe9b5c | ||
|
b6186d884c | ||
|
e6ba32bc07 | ||
|
fd4caf7595 | ||
|
45e59f6a5b | ||
|
dfecbbb976 | ||
|
50fa97564e | ||
|
8f9982c313 | ||
|
01c6f0c6e5 | ||
|
7e02aac641 | ||
|
4f792fbead | ||
|
9e12a3b0d8 | ||
|
09d6384b1f | ||
|
11ffba0a8e | ||
|
199d41f20d | ||
|
e931f91475 | ||
|
11d597e733 | ||
|
1960aca276 | ||
|
f17aea8657 | ||
|
dfaed546e0 | ||
|
803f0c0a49 | ||
|
0d6f9d4634 | ||
|
c042733845 | ||
|
1fc486b1b9 | ||
|
b50ee48386 | ||
|
cf5886579f | ||
|
72d005a082 | ||
|
9e8c90b6f9 | ||
|
d3e23dcb5d | ||
|
176886f1ad | ||
|
673cf38121 | ||
|
860bc0adeb | ||
|
be56e24d9a | ||
|
27850ed122 | ||
|
0d2dddf978 | ||
|
fba91a0633 | ||
|
1612b5a8b7 | ||
|
4f13aabb6c | ||
|
8050ec843f | ||
|
885849fe82 | ||
|
14c0d3f550 | ||
|
0f46b57020 | ||
|
152954ee70 | ||
|
2631c928b7 | ||
|
9e3ae6e6fd | ||
|
eae8886b95 | ||
|
00c7a631b1 | ||
|
bd03e0c454 | ||
|
981e117731 | ||
|
d2a557acd9 | ||
|
f91ac22bfc | ||
|
db1cf0a8aa | ||
|
46b3f4857f | ||
|
b5b03cc8d7 | ||
|
8f86216fe0 | ||
|
bbfe3b3084 | ||
|
56d69ab68a | ||
|
e491c64ceb | ||
|
26c30d2fb5 | ||
|
6ae21b3ee0 | ||
|
12d1b1a4fe | ||
|
8a5f75546f | ||
|
74d807a3ae | ||
|
bf6537071a | ||
|
1cb891ef92 | ||
|
79a770f0af | ||
|
44610ab1c4 | ||
|
7c35dda115 | ||
|
146976c8a3 | ||
|
ae111041dd | ||
|
2e00705b64 | ||
|
b19ade3850 | ||
|
fe770630bb | ||
|
8df31b4fe6 | ||
|
e29b900342 | ||
|
150e7166f6 | ||
|
1d6e4a6f5d | ||
|
52343ff833 | ||
|
544491b91d | ||
|
7d3ba895f5 | ||
|
d5bf19a64f | ||
|
5890802d6d | ||
|
26a918d2e6 | ||
|
1ba5e0035e | ||
|
1e0657ee1e | ||
|
2a5c85a9d5 | ||
|
cbd4c0250d | ||
|
08ca40d3f7 | ||
|
9386a56464 | ||
|
d24998705d | ||
|
4de08ce68d | ||
|
9f65589279 | ||
|
6f2ec7b335 | ||
|
89a282be82 | ||
|
51baca34ae | ||
|
481a0fc406 | ||
|
60e33e609b | ||
|
339d781ca6 | ||
|
b7819be42d | ||
|
c570c2cd0e | ||
|
30b4fe1fc6 | ||
|
57ddf46813 | ||
|
ba720bcb84 | ||
|
d608fa93b8 | ||
|
bb81e5c785 | ||
|
bde0d0e2ab | ||
|
145f1cc0b1 | ||
|
2273e0174f | ||
|
b9a00ed68b | ||
|
b675a648c0 | ||
|
e0fe7bce17 | ||
|
eb2623d677 | ||
|
302d409fab | ||
|
c5d8f4510e | ||
|
cd18bea7ba | ||
|
55b70b86c8 | ||
|
d9f97d3202 | ||
|
a52412c41e | ||
|
be4e687aa3 | ||
|
4b386326c7 | ||
|
4f771ed2a5 | ||
|
580e946cc0 | ||
|
5dc4610785 | ||
|
9d44691111 | ||
|
bb2c045325 | ||
|
9f18e9cc2c | ||
|
c6f787f761 | ||
|
cfab4f6369 | ||
|
fb06bb4bb1 | ||
|
87f57bdb38 | ||
|
b9309a7f80 | ||
|
96886c73c6 | ||
|
443b81012e | ||
|
f691a47306 | ||
|
02a657f373 | ||
|
a5e5c045c9 | ||
|
12a3d6cad2 | ||
|
bbdb6e5988 | ||
|
f6a76ec666 | ||
|
84618be5df | ||
|
f333705cc2 | ||
|
0b584a84e7 | ||
|
65a7d6589e | ||
|
ce4c61cc7f | ||
|
5a7429d30d | ||
|
cb177b7a24 | ||
|
15140e49ee | ||
|
c4f02e4681 | ||
|
60030b1e69 | ||
|
21f03b3f9e | ||
|
922740da5a | ||
|
c1d750a246 | ||
|
72a79ab073 | ||
|
f6dea7fcb3 | ||
|
4b5e217107 | ||
|
6b51cd370b | ||
|
1c5c84587e | ||
|
2c9692b029 | ||
|
3a6cae7836 | ||
|
ba51c74771 | ||
|
bd454b4b6b | ||
|
b63fe0a9af | ||
|
525bdc5bef | ||
|
5938ebb609 | ||
|
2ead8dafa2 | ||
|
b18f162d87 | ||
|
8497bd36f7 | ||
|
2729aefd6e | ||
|
7a3b659d4e | ||
|
50a27c213c | ||
|
d1af35763a | ||
|
92b67a0a73 | ||
|
d170825685 | ||
|
d788fb8f07 | ||
|
60396cbeef | ||
|
f88711db72 | ||
|
4f0e998dab | ||
|
fd3338ccb5 | ||
|
1d637717d5 | ||
|
45fae55ac0 | ||
|
bbeff81a16 | ||
|
afac483b35 | ||
|
66b0c1ff7a | ||
|
93264c6e41 | ||
|
45b5c107af | ||
|
84e0628a8e | ||
|
15ab78a3a8 | ||
|
bb153521e2 | ||
|
ff0fc2b1c8 | ||
|
4cc262b563 | ||
|
4203578093 | ||
|
cfc90da91e | ||
|
8786bf51c7 | ||
|
ae95aa7575 | ||
|
b113bfea99 | ||
|
0f65b869fd | ||
|
c21a763dc7 | ||
|
207b120dee | ||
|
49b2324ea1 | ||
|
314cef0c75 | ||
|
04b1602310 | ||
|
2f76fec686 | ||
|
435452ba50 | ||
|
5d626d3c10 | ||
|
49c81edd3a | ||
|
05797dd711 | ||
|
86abdcd700 | ||
|
d6585d3691 | ||
|
acf94e5fab | ||
|
60661b68c3 | ||
|
5e2ea67df9 | ||
|
26dbcf3ca3 | ||
|
3382bfa29f | ||
|
7ac2d81062 | ||
|
caa639beb8 | ||
|
039031b68d | ||
|
19bf87cf3a | ||
|
8efc1c5d5e | ||
|
e8566e817e | ||
|
7deb1b86e0 | ||
|
c5a67fa938 | ||
|
be78202e0b | ||
|
0e0bac0e5c | ||
|
6ca0c705c8 | ||
|
4c044f93fe | ||
|
48d89889fe | ||
|
47464fc18d | ||
|
74fa914c8c | ||
|
55fbafe0d0 | ||
|
5fa4478d40 | ||
|
633754306e | ||
|
3f70b8a36c | ||
|
16f60edc50 | ||
|
76b271ebc5 | ||
|
3fd91ccb6b | ||
|
e2764d12f1 | ||
|
8c51c59fe9 | ||
|
cf8c11f038 | ||
|
31504baabe | ||
|
8f8c1ad39b | ||
|
494c07d383 | ||
|
de40fd4e42 | ||
|
6a5309e22e | ||
|
56ac678c0a | ||
|
1769cb4a59 | ||
|
9deb60cd08 | ||
|
a687bec9b6 | ||
|
c9d88add12 | ||
|
6ce476d2a2 | ||
|
0d686bb8d8 | ||
|
f3bde1fde3 | ||
|
bfc9d40f43 | ||
|
f0e245183a | ||
|
4d4abb27b5 | ||
|
6eda91a541 | ||
|
87d4f9627b | ||
|
29b641c72d | ||
|
6f687ff9e3 | ||
|
ece3eb3b0e | ||
|
d97286de57 | ||
|
c1e8c3b8f3 | ||
|
3cefa968a0 | ||
|
b7773c6452 | ||
|
9ed9c2b028 | ||
|
fc500db69b | ||
|
0233c523ea | ||
|
4b8256e0f8 | ||
|
551571fc17 | ||
|
43073fa1e8 | ||
|
baab7dd0ec | ||
|
f87e8adc95 | ||
|
3f31bcbe5f | ||
|
9f00195100 | ||
|
6fed91d728 | ||
|
a8133e0d77 | ||
|
06b147323f | ||
|
47882ccb00 | ||
|
73e5178f1f | ||
|
8846bfbbcd | ||
|
16db1c5b03 | ||
|
800122e1af | ||
|
3ac86f5fd3 | ||
|
bd17eed9f5 | ||
|
c707188ed5 | ||
|
539d293388 | ||
|
12cd05764b | ||
|
92d239b7f8 | ||
|
a7c1e0bc49 | ||
|
a55b4ca0e9 | ||
|
958b61c343 | ||
|
0a9cb6afe7 | ||
|
67b66b5568 | ||
|
9967393820 | ||
|
75f55f8d04 | ||
|
2aba917e3d | ||
|
f2a6922586 | ||
|
f6c07afee6 | ||
|
22f5d0cc45 | ||
|
f4722f516e | ||
|
607c4dba5a | ||
|
b3b7fec337 | ||
|
5145655c46 | ||
|
a106e2768f | ||
|
04cf9013a8 | ||
|
3c4baaf8cb | ||
|
667fd483cc | ||
|
f693f062ec | ||
|
89f8edbddc | ||
|
73f544333a | ||
|
d4fe84a7cf | ||
|
84a34be10a | ||
|
180cd0cc6e | ||
|
78ea179c46 | ||
|
9eee907467 | ||
|
8603799fa7 | ||
|
78b3a5a5d4 | ||
|
71547d059f | ||
|
0ebfa5f258 | ||
|
4ef52a82af | ||
|
ec0699dd45 | ||
|
e7ba697fc4 | ||
|
0d294c1075 | ||
|
23d11fedc6 | ||
|
e3e2b42277 | ||
|
675158cba9 | ||
|
1e6ede278f | ||
|
75875e2781 | ||
|
cd948535a5 | ||
|
33d325b0fc | ||
|
4825f9aee8 | ||
|
7d7cc2653c | ||
|
0c04ad07b6 | ||
|
1c569ce39d | ||
|
f41312597c | ||
|
4181df378f | ||
|
13bc8c3488 | ||
|
4c7af7f492 | ||
|
19ac7b2fb0 | ||
|
217498a207 | ||
|
25a2940ebc | ||
|
2fcbdaacfd | ||
|
8ef4efbe39 | ||
|
a21a195f1b | ||
|
dc798c0e07 | ||
|
410f47b5ce | ||
|
1eaf7e4fbf | ||
|
e1a484018f | ||
|
8fc2c06b45 | ||
|
5cbe78457c | ||
|
840e16a3f2 | ||
|
f9fcffeeba | ||
|
5978135bb6 | ||
|
dde52e43aa | ||
|
1efa60757b | ||
|
13448ee297 | ||
|
cce8440755 | ||
|
00e797dc2d | ||
|
e7658c618e | ||
|
45657268f9 | ||
|
1d9b5d93ca | ||
|
4b7fc5fb57 | ||
|
67f007064a | ||
|
896b247fe9 | ||
|
3d216f6295 | ||
|
afdac4b94f | ||
|
e055301fa8 | ||
|
25343589ab | ||
|
0560ae9f86 | ||
|
4a9b5b5939 | ||
|
101026fe3c | ||
|
912988e174 | ||
|
033a5cd5a5 | ||
|
6a794cd610 | ||
|
63152ef4e3 | ||
|
31ea5ff6c6 | ||
|
03867bf61b | ||
|
829fe84baf | ||
|
f4132221d6 | ||
|
5e5de824de | ||
|
02b8cae3c7 | ||
|
0a10327fb1 | ||
|
bd3073bbed | ||
|
73a7c6b87a | ||
|
788aa03e80 | ||
|
874f51870a | ||
|
26e690dc0d | ||
|
5b024a1465 | ||
|
0c4de0dc38 | ||
|
0377e809ea | ||
|
b24288b7ef | ||
|
42e9c476f5 | ||
|
dd8169ea84 | ||
|
6d8c963af2 | ||
|
53e7ece4cc | ||
|
3710517fdc |
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,6 +1,6 @@
|
||||
/node_modules
|
||||
*.swp
|
||||
.DS_Store
|
||||
test/rendering/layers/
|
||||
test/rendering/cache/
|
||||
test/rendering-mss/npm-debug.log
|
||||
.idea/
|
||||
|
@ -1,6 +1,9 @@
|
||||
language: node_js
|
||||
|
||||
node_js:
|
||||
- "0.11"
|
||||
- "0.10"
|
||||
- "0.8"
|
||||
- '6'
|
||||
- '8'
|
||||
- '10'
|
||||
|
||||
script:
|
||||
- npm test
|
||||
|
9
CHANGELOG.carto.md
Normal file
9
CHANGELOG.carto.md
Normal file
@ -0,0 +1,9 @@
|
||||
## CARTO's Changelog
|
||||
|
||||
## 0.15.1-cdb5
|
||||
2018-11-20
|
||||
|
||||
* Support Node.js 6, 8 and, 10
|
||||
* Drop support for Node.js 0.10 and 0.11
|
||||
* Add package-lock.json
|
||||
* Add CHANGELOG.carto.md
|
15
CHANGELOG.md
15
CHANGELOG.md
@ -1,7 +1,18 @@
|
||||
## Changelog
|
||||
|
||||
## 0.11.1-dev-browser
|
||||
* added rectangle option for marker-type
|
||||
## 0.14.0
|
||||
|
||||
* Support for Mapnik 3.x
|
||||
* Bump `mapnik-reference` dependency to ~6.0.1.
|
||||
|
||||
## 0.13.0
|
||||
|
||||
* Allows optional args in transforms.
|
||||
* Bump `mapnik-reference` dependency to 5.1.x.
|
||||
|
||||
## 0.12.0
|
||||
|
||||
* Drop mml2json and xml2js dependency.
|
||||
|
||||
## 0.11.0
|
||||
|
||||
|
18
Makefile
18
Makefile
@ -3,12 +3,15 @@
|
||||
#
|
||||
|
||||
expresso = ./node_modules/.bin/mocha
|
||||
docco = ./node_modules/.bin/docco
|
||||
uglify = ./node_modules/.bin/uglify
|
||||
UGLIFYJS=./node_modules/.bin/uglifyjs
|
||||
BROWSERIFY = ./node_modules/.bin/browserify
|
||||
|
||||
JS_CLIENT_FILES=browser/*.js lib/carto/parser.js lib/carto/tree.js lib/carto/tree/*.js lib/carto/functions.js lib/carto/renderer_js.js
|
||||
dist/carto.js: dist/carto.uncompressed.js $(shell $(BROWSERIFY) --list lib/carto/index.js)
|
||||
$(UGLIFYJS) dist/carto.uncompressed.js > $@
|
||||
|
||||
dist/carto.uncompressed.js: dist $(shell $(BROWSERIFY) --list lib/carto/index.js)
|
||||
$(BROWSERIFY) lib/carto/index.js --exclude node_modules/underscore/underscore.js --standalone carto > $@
|
||||
|
||||
all: dist
|
||||
|
||||
lint:
|
||||
./node_modules/.bin/jshint lib/carto/*.js lib/carto/tree/*.js
|
||||
@ -23,13 +26,10 @@ endif
|
||||
|
||||
check: test
|
||||
|
||||
doc:
|
||||
$(docco) lib/carto/*.js lib/carto/tree/*.js
|
||||
dist:
|
||||
mkdir -p dist
|
||||
|
||||
dist/carto.js: $(JS_CLIENT_FILES)
|
||||
cat $(JS_CLIENT_FILES) > dist/carto.js
|
||||
|
||||
dist: dist/carto.js
|
||||
|
||||
|
||||
.PHONY: test
|
||||
|
@ -1,6 +1,6 @@
|
||||
# CartoCSS
|
||||
|
||||
[![Build Status](https://secure.travis-ci.org/mapbox/carto.png)](http://travis-ci.org/mapbox/carto)
|
||||
[![Build Status](https://travis-ci.org/CartoDB/carto.png?branch=master)](https://travis-ci.org/CartoDB/carto)
|
||||
|
||||
Is as stylesheet renderer for javascript, It's an evolution of the Mapnik renderer from Mapbox.
|
||||
Please, see original [Mapbox repo](http://github.com/mapbox/carto) for more information and credits
|
||||
|
@ -1,69 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
var xml2js = require('xml2js'),
|
||||
fs = require('fs');
|
||||
|
||||
if (!process.argv[2]) {
|
||||
console.log('Please specify a XML file.');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
fs.readFile(process.argv[2], 'utf-8', function(err, data) {
|
||||
if (err) throw err;
|
||||
|
||||
// Replace entities.
|
||||
var entities = {};
|
||||
var match = data.match(/<!ENTITY([^>]|"([^"]|\\")*")+>/g)
|
||||
if (match != null) {
|
||||
match.forEach(function(entity) {
|
||||
var parts = entity.match(/^<!ENTITY\s+(\w+)\s+"(.+)">$/);
|
||||
entities['&' + parts[1] + ';'] = parts[2];
|
||||
});
|
||||
}
|
||||
data = data.replace(/&\w+;/g, function(entity) {
|
||||
return entities[entity];
|
||||
});
|
||||
|
||||
function addAttributes(obj) {
|
||||
if (obj['$']) for (var key in obj['$']) obj[key] = obj['$'][key];
|
||||
delete obj['$'];
|
||||
return obj;
|
||||
}
|
||||
|
||||
function simplifyExternal(obj) {
|
||||
if (obj.src) return obj.src;
|
||||
else return obj;
|
||||
}
|
||||
|
||||
var parser = new xml2js.Parser({
|
||||
explicitRoot: false,
|
||||
explicitArray: false
|
||||
});
|
||||
parser.addListener('end', function(json) {
|
||||
console.log(JSON.stringify(json, function(key, value) {
|
||||
if (!key) {
|
||||
return addAttributes(value);
|
||||
}
|
||||
else if (key === 'Stylesheet') {
|
||||
if (Array.isArray(value)) return value.map(addAttributes).map(simplifyExternal);
|
||||
else return [ simplifyExternal(addAttributes(value)) ];
|
||||
}
|
||||
else if (key === 'Layer' || key === 'Stylesheet') {
|
||||
if (Array.isArray(value)) return value.map(addAttributes);
|
||||
else return [ addAttributes(value) ];
|
||||
}
|
||||
else if (key === 'Datasource') {
|
||||
value = addAttributes(value);
|
||||
value.Parameter.forEach(function(parameter) {
|
||||
value[parameter['$'].name] = parameter['_'];
|
||||
});
|
||||
delete value.Parameter;
|
||||
return value;
|
||||
}
|
||||
else {
|
||||
return value;
|
||||
}
|
||||
}, 4));
|
||||
});
|
||||
parser.parseString(data);
|
||||
});
|
@ -1,13 +0,0 @@
|
||||
|
||||
var assert = {
|
||||
ok: function(value, message) {
|
||||
message = message || '';
|
||||
if(!value) throw new Error("assertion failed", message);
|
||||
}
|
||||
};
|
||||
|
||||
if (navigator.userAgent.indexOf('MSIE 8.0') !== -1 || navigator.userAgent.indexOf('MSIE 7.0') !== -1) {
|
||||
Object.defineProperty = function(o, p, fn) { o[p] = fn.value; };
|
||||
}
|
||||
|
||||
|
@ -1,4 +0,0 @@
|
||||
|
||||
var carto_initialize = function(carto, uri, callback) {
|
||||
callback();
|
||||
};
|
@ -1,23 +0,0 @@
|
||||
//
|
||||
// Stub out `require` in the browser
|
||||
//
|
||||
window.carto = window.carto || {};
|
||||
window.carto.underscore = window._;
|
||||
|
||||
function require(arg) {
|
||||
var mod = window.carto[arg];
|
||||
if(!mod) {
|
||||
mod = window.carto[arg.split('/')[1]];
|
||||
}
|
||||
if(!mod) {
|
||||
mod = window.carto[arg]
|
||||
}
|
||||
if(!mod) {
|
||||
mod = window[arg.split('/')[1]];
|
||||
}
|
||||
// try global scope
|
||||
if(!mod) {
|
||||
mod = window[arg]
|
||||
}
|
||||
return mod;
|
||||
}
|
5255
dist/carto.js
vendored
5255
dist/carto.js
vendored
File diff suppressed because one or more lines are too long
7375
dist/carto.uncompressed.js
vendored
Normal file
7375
dist/carto.uncompressed.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
15
docs-generator/README.md
Normal file
15
docs-generator/README.md
Normal file
@ -0,0 +1,15 @@
|
||||
# Generating CartoCSS docs
|
||||
|
||||
From the `docs-generator/` directory:
|
||||
|
||||
```
|
||||
$ npm install
|
||||
```
|
||||
|
||||
Then:
|
||||
|
||||
```
|
||||
$ node generate.js
|
||||
```
|
||||
|
||||
Will save docs to `docs/`.
|
23
docs-generator/generate.js
Normal file
23
docs-generator/generate.js
Normal file
@ -0,0 +1,23 @@
|
||||
var fs = require('fs'),
|
||||
path = require('path'),
|
||||
refs = require('mapnik-reference'),
|
||||
_ = require('underscore');
|
||||
|
||||
function tmpl(x) {
|
||||
return _.template(fs.readFileSync(path.join(__dirname, x), 'utf-8'));
|
||||
}
|
||||
|
||||
var index = tmpl('index._');
|
||||
var table = tmpl('symbolizers._');
|
||||
var versions = Object.keys(refs.version);
|
||||
|
||||
for (var v in refs.version) {
|
||||
var ref = refs.version[v];
|
||||
fs.writeFileSync(path.join(__dirname, '../docs/' + v + '.md'), index({
|
||||
symbolizers: ref.symbolizers,
|
||||
table: table,
|
||||
version: v,
|
||||
versions: versions,
|
||||
_: _
|
||||
}));
|
||||
}
|
144
docs-generator/index._
Normal file
144
docs-generator/index._
Normal file
@ -0,0 +1,144 @@
|
||||
# Carto documentation
|
||||
|
||||
The following is a list of properties provided in CartoCSS that you can apply to map elements.
|
||||
<%= table({symbolizers:symbolizers}) %>
|
||||
|
||||
### Values
|
||||
|
||||
Below is a list of values and an explanation of any expression that can be applied to properties in CartCSS.
|
||||
|
||||
### Color
|
||||
|
||||
CartoCSS accepts a variety of syntaxes for colors - HTML-style hex values, rgb, rgba, hsl, and hsla. It also supports the predefined HTML colors names, like `yellow` and `blue`.
|
||||
|
||||
``` css
|
||||
#line {
|
||||
line-color: #ff0;
|
||||
line-color: #ffff00;
|
||||
line-color: rgb(255, 255, 0);
|
||||
line-color: rgba(255, 255, 0, 1);
|
||||
line-color: hsl(100, 50%, 50%);
|
||||
line-color: hsla(100, 50%, 50%, 1);
|
||||
line-color: yellow;
|
||||
}
|
||||
```
|
||||
|
||||
Especially of note is the support for hsl, which can be [easier to reason about than rgb()](http://mothereffinghsl.com/). Carto also includes several color operation functions [borrowed from less](http://lesscss.org/functions/#color-operations):
|
||||
|
||||
``` css
|
||||
// lighten and darken colors
|
||||
lighten(#ace, 10%);
|
||||
darken(#ace, 10%);
|
||||
|
||||
// saturate and desaturate
|
||||
saturate(#550000, 10%);
|
||||
desaturate(#00ff00, 10%);
|
||||
|
||||
// increase or decrease the opacity of a color
|
||||
fadein(#fafafa, 10%);
|
||||
fadeout(#fefefe, 14%);
|
||||
|
||||
// spin rotates a color around the color wheel by degrees
|
||||
spin(#ff00ff, 10);
|
||||
|
||||
// mix generates a color in between two other colors.
|
||||
mix(#fff, #000, 50%);
|
||||
```
|
||||
|
||||
These functions all take arguments which can be color variables, literal colors, or the results of other functions operating on colors.
|
||||
|
||||
### Float
|
||||
|
||||
Float is a fancy way of saying 'number'. In CartoCSS, you specify _just a number_ - unlike CSS, there are no units, but everything is specified in pixels.
|
||||
|
||||
``` css
|
||||
#line {
|
||||
line-width: 2;
|
||||
}
|
||||
```
|
||||
|
||||
It's also possible to do simple math with number values:
|
||||
|
||||
``` css
|
||||
#line {
|
||||
line-width: 4 / 2; // division
|
||||
line-width: 4 + 2; // addition
|
||||
line-width: 4 - 2; // subtraction
|
||||
line-width: 4 * 2; // multiplication
|
||||
line-width: 4 % 2; // modulus
|
||||
}
|
||||
```
|
||||
|
||||
### URI
|
||||
|
||||
URI is a fancy way of saying URL. When an argument is a URI, you use the same kind of `url('place.png')` notation that you would with HTML. Quotes around the URL aren't required, but are highly recommended. URIs can be paths to places on your computer, or on the internet.
|
||||
|
||||
```css
|
||||
#markers {
|
||||
marker-file: url('marker.png');
|
||||
}
|
||||
```
|
||||
|
||||
### String
|
||||
|
||||
A string is basically just text. In the case of CartoCSS, you're going to put it in quotes. Strings can be anything, though pay attention to the cases of `text-name` and `shield-name` - they actually will refer to features, which you refer to by putting them in brackets, as seen in the example below.
|
||||
|
||||
```css
|
||||
#labels {
|
||||
text-name: "[MY_FIELD]";
|
||||
}
|
||||
```
|
||||
|
||||
### Boolean
|
||||
|
||||
Boolean means yes or no, so it accepts the values `true` or `false`.
|
||||
|
||||
```css
|
||||
#markers {
|
||||
marker-allow-overlap:true;
|
||||
}
|
||||
```
|
||||
|
||||
### Expressions
|
||||
|
||||
Expressions are statements that can include fields, numbers, and other types in a really flexible way. You have run into expressions before, in the realm of 'fields', where you'd specify `"[FIELD]"`, but expressions allow you to drop the quotes and also do quick addition, division, multiplication, and concatenation from within Carto syntax.
|
||||
|
||||
```css
|
||||
#buildings {
|
||||
building-height: [HEIGHT_FIELD] * 10;
|
||||
}
|
||||
```
|
||||
|
||||
### Numbers
|
||||
Numbers are comma-separated lists of one or more number in a specific order. They're used in line dash arrays, in which the numbers specify intervals of line, break, and line again.
|
||||
|
||||
```css
|
||||
#disputedboundary {
|
||||
line-dasharray: 1, 4, 2;
|
||||
}
|
||||
```
|
||||
|
||||
### Percentages
|
||||
In Carto, the percentage symbol, `%` universally means `value/100`. It's meant to be used with ratio-related properties, like opacity rules.
|
||||
|
||||
_You should not use percentages as widths, heights, or other properties - unlike CSS, percentages are not relative to cascaded classes or page size, they're, as stated, simply the value divided by one hundred._
|
||||
|
||||
```css
|
||||
#world {
|
||||
// this syntax
|
||||
polygon-opacity: 50%;
|
||||
|
||||
// is equivalent to
|
||||
polygon-opacity: 0.5;
|
||||
}
|
||||
```
|
||||
|
||||
### Functions
|
||||
|
||||
Functions are comma-separated lists of one or more functions. For instance, transforms use the `functions` type to allow for transforms within Carto, which are optionally chainable.
|
||||
|
||||
```css
|
||||
#point {
|
||||
point-transform: scale(2, 2);
|
||||
}
|
||||
```
|
20
docs-generator/package.json
Normal file
20
docs-generator/package.json
Normal file
@ -0,0 +1,20 @@
|
||||
{
|
||||
"name": "carto-site",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"description": "Mapnik Stylesheet Compiler",
|
||||
"url": "https://github.com/mapbox/carto",
|
||||
"repositories": [{
|
||||
"type": "git",
|
||||
"url": "http://github.com/mapbox/carto.git"
|
||||
}],
|
||||
"author": {
|
||||
"name": "MapBox",
|
||||
"url": "http://mapbox.com/",
|
||||
"email": "info@mapbox.com"
|
||||
},
|
||||
"dependencies": {
|
||||
"mapnik-reference": "5.0.x",
|
||||
"underscore": "~1.3.3"
|
||||
}
|
||||
}
|
13
docs-generator/symbolizers._
Normal file
13
docs-generator/symbolizers._
Normal file
@ -0,0 +1,13 @@
|
||||
<% _(symbolizers).each(function(symbolizer, name) { %>
|
||||
<% if (name == '*') { %>## All elements<% } else { %>## <%= name %><% } %>
|
||||
<% _(symbolizer).chain().filter(function(p) { return p.css; }).each(function(p) { %>
|
||||
##### <%= p.css.replace(/\s/g, '') %> <% if (_.isArray(p.type)) { %>`keyword`<% } else { %>`<%= p.type %>`<% } %>
|
||||
<% if (_.isArray(p.type)) { %><% _(p.type).each(function(type) { %>`<%= type %>`<% }); %><% } %>
|
||||
|
||||
<% if (typeof p['default-value'] !== '') { %>Default Value: <%= p['default-value'] %><% } %>
|
||||
<% if (p['default-meaning']) { %>_(<%- p['default-meaning'] %>)_<% } %>
|
||||
<% if (typeof p['range'] !== 'undefined') { %>Range: <%= '' + p['range'] %><% } %>
|
||||
<% if (p.doc) { %><%- p.doc%><% } %>
|
||||
* * *
|
||||
<% }); %>
|
||||
<% }); %>
|
1159
docs/2.0.0.md
Normal file
1159
docs/2.0.0.md
Normal file
File diff suppressed because it is too large
Load Diff
1159
docs/2.0.1.md
Normal file
1159
docs/2.0.1.md
Normal file
File diff suppressed because it is too large
Load Diff
1159
docs/2.0.2.md
Normal file
1159
docs/2.0.2.md
Normal file
File diff suppressed because it is too large
Load Diff
1486
docs/2.1.0.md
Normal file
1486
docs/2.1.0.md
Normal file
File diff suppressed because it is too large
Load Diff
1495
docs/2.1.1.md
Normal file
1495
docs/2.1.1.md
Normal file
File diff suppressed because it is too large
Load Diff
1687
docs/latest.md
Normal file
1687
docs/latest.md
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,17 +1,18 @@
|
||||
var util = require('util');
|
||||
|
||||
[ 'call', 'color', 'comment', 'definition', 'dimension',
|
||||
'element', 'expression', 'filterset', 'filter', 'field',
|
||||
'keyword', 'layer', 'literal', 'operation', 'quoted', 'imagefilter',
|
||||
'reference', 'rule', 'ruleset', 'selector', 'style', 'url', 'value',
|
||||
'variable', 'zoom', 'invalid', 'fontset', 'frame_offset'
|
||||
].forEach(function(n) {
|
||||
require('./tree/' + n);
|
||||
});
|
||||
var util = require('util'),
|
||||
fs = require('fs'),
|
||||
path = require('path');
|
||||
|
||||
|
||||
function getVersion() {
|
||||
return '0.0.1-browser';
|
||||
if (process.browser) {
|
||||
return require('../../package.json').version.split('.');
|
||||
} else if (parseInt(process.version.split('.')[1], 10) > 4) {
|
||||
return require('../../package.json').version.split('.');
|
||||
} else {
|
||||
// older node
|
||||
var package_json = JSON.parse(fs.readFileSync(path.join(__dirname,'../../package.json')));
|
||||
return package_json.version.split('.');
|
||||
}
|
||||
}
|
||||
|
||||
var carto = {
|
||||
@ -20,6 +21,7 @@ var carto = {
|
||||
Renderer: require('./renderer').Renderer,
|
||||
tree: require('./tree'),
|
||||
RendererJS: require('./renderer_js'),
|
||||
default_reference: require('./torque-reference'),
|
||||
|
||||
// @TODO
|
||||
writeError: function(ctx, options) {
|
||||
@ -51,7 +53,7 @@ var carto = {
|
||||
if (typeof(extract[2]) === 'string') {
|
||||
error.push(stylize((ctx.line + 1) + ' ' + extract[2], 'grey'));
|
||||
}
|
||||
error = options.indent + error.join('\n' + options.indent) + '\033[0m\n';
|
||||
error = options.indent + error.join('\n' + options.indent) + '\x1B[0m\n';
|
||||
|
||||
message = options.indent + message + stylize(ctx.message, 'red');
|
||||
if (ctx.filename) (message += stylize(' in ', 'red') + ctx.filename);
|
||||
@ -66,7 +68,34 @@ var carto = {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
require('./tree/call');
|
||||
require('./tree/color');
|
||||
require('./tree/comment');
|
||||
require('./tree/definition');
|
||||
require('./tree/dimension');
|
||||
require('./tree/element');
|
||||
require('./tree/expression');
|
||||
require('./tree/filterset');
|
||||
require('./tree/filter');
|
||||
require('./tree/field');
|
||||
require('./tree/keyword');
|
||||
require('./tree/layer');
|
||||
require('./tree/literal');
|
||||
require('./tree/operation');
|
||||
require('./tree/quoted');
|
||||
require('./tree/imagefilter');
|
||||
require('./tree/reference');
|
||||
require('./tree/rule');
|
||||
require('./tree/ruleset');
|
||||
require('./tree/selector');
|
||||
require('./tree/style');
|
||||
require('./tree/url');
|
||||
require('./tree/value');
|
||||
require('./tree/variable');
|
||||
require('./tree/zoom');
|
||||
require('./tree/invalid');
|
||||
require('./tree/fontset');
|
||||
require('./tree/frame_offset');
|
||||
require('./functions');
|
||||
|
||||
for (var k in carto) { exports[k] = carto[k]; }
|
||||
@ -82,6 +111,6 @@ function stylize(str, style) {
|
||||
'red' : [31, 39],
|
||||
'grey' : [90, 39]
|
||||
};
|
||||
return '\033[' + styles[style][0] + 'm' + str +
|
||||
'\033[' + styles[style][1] + 'm';
|
||||
return '\x1B[' + styles[style][0] + 'm' + str +
|
||||
'\x1B[' + styles[style][1] + 'm';
|
||||
}
|
||||
|
@ -1,42 +1,7 @@
|
||||
var carto = exports,
|
||||
tree = require('./tree'),
|
||||
_ = global._ || require('underscore');
|
||||
|
||||
if (typeof(exports) !== 'undefined') {
|
||||
carto = exports;
|
||||
tree = require('./tree');
|
||||
_ = require('underscore');
|
||||
} else {
|
||||
if (typeof(window.carto) === 'undefined') { window.carto = {}; }
|
||||
carto = window.carto;
|
||||
tree = window.carto.tree = {};
|
||||
_ = window._;
|
||||
}
|
||||
|
||||
// carto.js - parser
|
||||
//
|
||||
// A relatively straight-forward predictive parser.
|
||||
// There is no tokenization/lexing stage, the input is parsed
|
||||
// in one sweep.
|
||||
//
|
||||
// To make the parser fast enough to run in the browser, several
|
||||
// optimization had to be made:
|
||||
//
|
||||
// - Matching and slicing on a huge input is often cause of slowdowns.
|
||||
// The solution is to chunkify the input into smaller strings.
|
||||
// The chunks are stored in the `chunks` var,
|
||||
// `j` holds the current chunk index, and `current` holds
|
||||
// the index of the current chunk in relation to `input`.
|
||||
// This gives us an almost 4x speed-up.
|
||||
//
|
||||
// - In many cases, we don't need to match individual tokens;
|
||||
// for example, if a value doesn't hold any variables, operations
|
||||
// or dynamic references, the parser can effectively 'skip' it,
|
||||
// treating it as a literal.
|
||||
// An example would be '1px solid #000' - which evaluates to itself,
|
||||
// we don't need to know what the individual components are.
|
||||
// The drawback, of course is that you don't get the benefits of
|
||||
// syntax-checking on the CSS. This gives us a 50% speed-up in the parser,
|
||||
// and a smaller speed-up in the code-gen.
|
||||
//
|
||||
//
|
||||
// Token matching is done with the `$` function, which either takes
|
||||
// a terminal string or regexp, or a non-terminal function to call.
|
||||
// It also takes care of moving all the indices forwards.
|
||||
@ -149,8 +114,9 @@ carto.Parser = function Parser(env) {
|
||||
// - `index`: Char. index where the error occurred.
|
||||
function makeError(err) {
|
||||
var einput;
|
||||
var errorTemplate;
|
||||
|
||||
_(err).defaults({
|
||||
_.defaults(err, {
|
||||
index: furthest,
|
||||
filename: env.filename,
|
||||
message: 'Parse error.',
|
||||
@ -168,8 +134,8 @@ carto.Parser = function Parser(env) {
|
||||
for (var n = err.index; n >= 0 && einput.charAt(n) !== '\n'; n--) {
|
||||
err.column++;
|
||||
}
|
||||
|
||||
return new Error(_('<%=filename%>:<%=line%>:<%=column%> <%=message%>').template(err));
|
||||
errorTemplate = _.template('<%=filename%>:<%=line%>:<%=column%> <%=message%>');
|
||||
return new Error(errorTemplate(err));
|
||||
}
|
||||
|
||||
this.env = env = env || {};
|
||||
@ -511,6 +477,7 @@ carto.Parser = function Parser(env) {
|
||||
return new tree.Dimension(value[1], value[2], memo);
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// The variable part of a variable definition.
|
||||
@ -759,10 +726,22 @@ carto.Parser = function Parser(env) {
|
||||
},
|
||||
// A sub-expression, contained by parenthensis
|
||||
sub: function() {
|
||||
var e;
|
||||
var e, expressions = [];
|
||||
|
||||
if ($('(') && (e = $(this.expression)) && $(')')) {
|
||||
return e;
|
||||
if ($('(')) {
|
||||
while (e = $(this.expression)) {
|
||||
expressions.push(e);
|
||||
if (! $(',')) { break; }
|
||||
}
|
||||
$(')');
|
||||
}
|
||||
|
||||
if (expressions.length > 1) {
|
||||
return new tree.Value(expressions.map(function(e) {
|
||||
return e.value[0];
|
||||
}));
|
||||
} else if (expressions.length === 1) {
|
||||
return new tree.Value(expressions);
|
||||
}
|
||||
},
|
||||
// This is a misnomer because it actually handles multiplication
|
||||
|
@ -1,10 +1,10 @@
|
||||
var _ = require('underscore');
|
||||
var _ = global._ || require('underscore');
|
||||
var carto = require('./index');
|
||||
|
||||
carto.Renderer = function Renderer(env, options) {
|
||||
this.env = env || {};
|
||||
this.options = options || {};
|
||||
this.options.mapnik_version = this.options.mapnik_version || 'latest';
|
||||
this.options.mapnik_version = this.options.mapnik_version || '3.0.0';
|
||||
};
|
||||
|
||||
/**
|
||||
@ -16,7 +16,7 @@ carto.Renderer = function Renderer(env, options) {
|
||||
carto.Renderer.prototype.renderMSS = function render(data) {
|
||||
// effects is a container for side-effects, which currently
|
||||
// are limited to FontSets.
|
||||
var env = _(this.env).defaults({
|
||||
var env = _.defaults(this.env, {
|
||||
benchmark: false,
|
||||
validation_data: false,
|
||||
effects: []
|
||||
@ -70,7 +70,7 @@ carto.Renderer.prototype.renderMSS = function render(data) {
|
||||
carto.Renderer.prototype.render = function render(m) {
|
||||
// effects is a container for side-effects, which currently
|
||||
// are limited to FontSets.
|
||||
var env = _(this.env).defaults({
|
||||
var env = _.defaults(this.env, {
|
||||
benchmark: false,
|
||||
validation_data: false,
|
||||
effects: [],
|
||||
@ -84,14 +84,14 @@ carto.Renderer.prototype.render = function render(m) {
|
||||
var output = [];
|
||||
|
||||
// Transform stylesheets into definitions.
|
||||
var definitions = _(m.Stylesheet).chain()
|
||||
var definitions = _.chain(m.Stylesheet)
|
||||
.map(function(s) {
|
||||
if (typeof s == 'string') {
|
||||
throw new Error("Stylesheet object is expected not a string: '" + s + "'");
|
||||
}
|
||||
// Passing the environment from stylesheet to stylesheet,
|
||||
// allows frames and effects to be maintained.
|
||||
env = _(env).extend({filename:s.id});
|
||||
env = _.extend(env, {filename:s.id});
|
||||
|
||||
var time = +new Date(),
|
||||
root = (carto.Parser(env)).parse(s.data);
|
||||
@ -152,7 +152,7 @@ carto.Renderer.prototype.render = function render(m) {
|
||||
if (env.errors) throw env.errors;
|
||||
|
||||
// Pass TileJSON and other custom parameters through to Mapnik XML.
|
||||
var parameters = _(m).reduce(function(memo, v, k) {
|
||||
var parameters = _.reduce(m, function(memo, v, k) {
|
||||
if (!v && v !== 0) return memo;
|
||||
|
||||
switch (k) {
|
||||
@ -205,7 +205,7 @@ carto.Renderer.prototype.render = function render(m) {
|
||||
'\n</Parameters>\n'
|
||||
);
|
||||
|
||||
var properties = _(map_properties).map(function(v) { return ' ' + v; }).join('');
|
||||
var properties = _.map(map_properties, function(v) { return ' ' + v; }).join('');
|
||||
|
||||
output.unshift(
|
||||
'<?xml version="1.0" ' +
|
||||
|
@ -1,10 +1,11 @@
|
||||
(function(carto) {
|
||||
var tree = require('./tree');
|
||||
var _ = require('underscore');
|
||||
var _ = global._ || require('underscore');
|
||||
|
||||
|
||||
function CartoCSS(style, options) {
|
||||
this.options = options || {};
|
||||
this.imageURLs = [];
|
||||
if(style) {
|
||||
this.setStyle(style);
|
||||
}
|
||||
@ -37,12 +38,11 @@ CartoCSS.Layer.prototype = {
|
||||
|
||||
eval: function(prop) {
|
||||
var p = this.shader[prop];
|
||||
if (!p) return;
|
||||
return p({}, { zoom: 0, 'frame-offset': 0 });
|
||||
if (!p || !p.style) return;
|
||||
return p.style({}, { zoom: 0, 'frame-offset': 0 });
|
||||
},
|
||||
|
||||
/*
|
||||
* `target`: style, 'svg', 'canvas-2d'...
|
||||
* `props`: feature properties
|
||||
* `context`: rendering properties, i.e zoom
|
||||
*/
|
||||
@ -57,7 +57,7 @@ CartoCSS.Layer.prototype = {
|
||||
},
|
||||
|
||||
/**
|
||||
* return the symbolizers that need to be rendered with
|
||||
* return the symbolizers that need to be rendered with
|
||||
* this style. The order is the rendering order.
|
||||
* @returns a list with 3 possible values 'line', 'marker', 'polygon'
|
||||
*/
|
||||
@ -99,7 +99,7 @@ CartoCSS.Layer.prototype = {
|
||||
|
||||
//
|
||||
// given a geoemtry type returns the transformed one acording the CartoCSS
|
||||
// For points there are two kind of types: point and sprite, the first one
|
||||
// For points there are two kind of types: point and sprite, the first one
|
||||
// is a circle, second one is an image sprite
|
||||
//
|
||||
// the other geometry types are the same than geojson (polygon, linestring...)
|
||||
@ -165,6 +165,9 @@ CartoCSS.prototype = {
|
||||
}
|
||||
}
|
||||
},
|
||||
getImageURLs: function(){
|
||||
return this.imageURLs;
|
||||
},
|
||||
|
||||
parse: function(cartocss) {
|
||||
var parse_env = {
|
||||
@ -199,10 +202,19 @@ CartoCSS.prototype = {
|
||||
var layer = layers[key] = (layers[key] || {
|
||||
symbolizers: []
|
||||
});
|
||||
|
||||
for(var u = 0; u<def.rules.length; u++){
|
||||
var rule = def.rules[u];
|
||||
if(rule.name === "marker-file" || rule.name === "point-file"){
|
||||
var value = rule.value.value[0].value[0].value.value;
|
||||
this.imageURLs.push(value);
|
||||
}
|
||||
}
|
||||
|
||||
layer.frames = [];
|
||||
layer.zoom = tree.Zoom.all;
|
||||
var props = def.toJS(parse_env);
|
||||
console.log("props", props);
|
||||
if (this.options.debug) console.log("props", props);
|
||||
for(var v in props) {
|
||||
var lyr = layer[v] = layer[v] || {
|
||||
constant: false,
|
||||
@ -217,15 +229,25 @@ CartoCSS.prototype = {
|
||||
// serach the max index to know rendering order
|
||||
lyr.index = _.max(props[v].map(function(a) { return a.index; }).concat(lyr.index));
|
||||
lyr.constant = !_.any(props[v].map(function(a) { return !a.constant; }));
|
||||
// True when the property is filtered.
|
||||
lyr.filtered = props[v][0].filtered;
|
||||
}
|
||||
}
|
||||
|
||||
var ordered_layers = [];
|
||||
console.log(layers);
|
||||
if (this.options.debug) console.log(layers);
|
||||
|
||||
var done = {};
|
||||
for(var i = 0; i < defs.length; ++i) {
|
||||
var def = defs[i];
|
||||
|
||||
if (this.options.strict) {
|
||||
def.toXML(parse_env, {});
|
||||
if (parse_env.errors.message) {
|
||||
throw new Error(parse_env.errors.message);
|
||||
}
|
||||
}
|
||||
|
||||
var k = defKey(def);
|
||||
var layer = layers[k];
|
||||
if(!done[k]) {
|
||||
@ -262,11 +284,13 @@ CartoCSS.prototype = {
|
||||
carto.RendererJS = function (options) {
|
||||
this.options = options || {};
|
||||
this.options.mapnik_version = this.options.mapnik_version || 'latest';
|
||||
this.reference = this.options.reference || require('./torque-reference').version.latest;
|
||||
this.options.strict = this.options.hasOwnProperty('strict') ? this.options.strict : false;
|
||||
};
|
||||
|
||||
// Prepare a javascript object which contains the layers
|
||||
carto.RendererJS.prototype.render = function render(cartocss, callback) {
|
||||
tree.Reference.setVersion(this.options.mapnik_version);
|
||||
tree.Reference.setData(this.reference);
|
||||
return new CartoCSS(cartocss, this.options);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,3 @@
|
||||
window.carto = window.carto || {};
|
||||
|
||||
var _mapnik_reference_latest = {
|
||||
"version": "2.1.1",
|
||||
"style": {
|
||||
@ -27,7 +25,10 @@ var _mapnik_reference_latest = {
|
||||
["x-gradient", 0],
|
||||
["y-gradient", 0],
|
||||
["invert", 0],
|
||||
["sharpen", 0]
|
||||
["sharpen", 0],
|
||||
["colorize-alpha", -1],
|
||||
["color-to-alpha", 1],
|
||||
["scale-hsla", 8]
|
||||
],
|
||||
"doc": "A list of image filters."
|
||||
},
|
||||
@ -162,7 +163,20 @@ var _mapnik_reference_latest = {
|
||||
["x-gradient", 0],
|
||||
["y-gradient", 0],
|
||||
["invert", 0],
|
||||
["sharpen", 0]
|
||||
["sharpen", 0],
|
||||
["colorize-alpha", -1],
|
||||
["color-to-alpha", 1],
|
||||
["scale-hsla", 8],
|
||||
["buckets", -1],
|
||||
["category", -1],
|
||||
["equal", -1],
|
||||
["headtails", -1],
|
||||
["jenks", -1],
|
||||
["quantiles", -1],
|
||||
["cartocolor", -1],
|
||||
["colorbrewer", -1],
|
||||
["range", -1],
|
||||
["ramp", -1]
|
||||
],
|
||||
"doc": "A list of image filters."
|
||||
},
|
||||
@ -289,14 +303,16 @@ var _mapnik_reference_latest = {
|
||||
"type": "color",
|
||||
"default-value": "rgba(128,128,128,1)",
|
||||
"default-meaning": "gray and fully opaque (alpha = 1), same as rgb(128,128,128)",
|
||||
"doc": "Fill color to assign to a polygon"
|
||||
"doc": "Fill color to assign to a polygon",
|
||||
"expression": true
|
||||
},
|
||||
"fill-opacity": {
|
||||
"css": "polygon-opacity",
|
||||
"type": "float",
|
||||
"doc": "The opacity of the polygon",
|
||||
"default-value": 1,
|
||||
"default-meaning": "opaque"
|
||||
"default-meaning": "opaque",
|
||||
"expression": true
|
||||
},
|
||||
"gamma": {
|
||||
"css": "polygon-gamma",
|
||||
@ -397,13 +413,15 @@ var _mapnik_reference_latest = {
|
||||
"default-value": "rgba(0,0,0,1)",
|
||||
"type": "color",
|
||||
"default-meaning": "black and fully opaque (alpha = 1), same as rgb(0,0,0)",
|
||||
"doc": "The color of a drawn line"
|
||||
"doc": "The color of a drawn line",
|
||||
"expression": true
|
||||
},
|
||||
"stroke-width": {
|
||||
"css": "line-width",
|
||||
"default-value": 1,
|
||||
"type": "float",
|
||||
"doc": "The width of a line in pixels"
|
||||
"doc": "The width of a line in pixels",
|
||||
"expression": true
|
||||
},
|
||||
"stroke-opacity": {
|
||||
"css": "line-opacity",
|
||||
@ -568,7 +586,8 @@ var _mapnik_reference_latest = {
|
||||
"doc": "An SVG file that this marker shows at each placement. If no file is given, the marker will show an ellipse.",
|
||||
"default-value": "",
|
||||
"default-meaning": "An ellipse or circle, if width equals height",
|
||||
"type": "uri"
|
||||
"type": "uri",
|
||||
"expression": true
|
||||
},
|
||||
"opacity": {
|
||||
"css": "marker-opacity",
|
||||
@ -638,19 +657,22 @@ var _mapnik_reference_latest = {
|
||||
"css": "marker-width",
|
||||
"default-value": 10,
|
||||
"doc": "The width of the marker, if using one of the default types.",
|
||||
"type": "expression"
|
||||
"type": "float",
|
||||
"expression": true
|
||||
},
|
||||
"height": {
|
||||
"css": "marker-height",
|
||||
"default-value": 10,
|
||||
"doc": "The height of the marker, if using one of the default types.",
|
||||
"type": "expression"
|
||||
"type": "float",
|
||||
"expression": true
|
||||
},
|
||||
"fill": {
|
||||
"css": "marker-fill",
|
||||
"default-value": "blue",
|
||||
"doc": "The color of the area of the marker.",
|
||||
"type": "color"
|
||||
"type": "color",
|
||||
"expression": true
|
||||
},
|
||||
"allow-overlap": {
|
||||
"css": "marker-allow-overlap",
|
||||
@ -768,7 +790,8 @@ var _mapnik_reference_latest = {
|
||||
"shield": {
|
||||
"name": {
|
||||
"css": "shield-name",
|
||||
"type": "expression",
|
||||
"type": "string",
|
||||
"expression": true,
|
||||
"serialization": "content",
|
||||
"doc": "Value to use for a shield\"s text label. Data columns are specified using brackets like [column_name]"
|
||||
},
|
||||
@ -815,6 +838,18 @@ var _mapnik_reference_latest = {
|
||||
"default-value": "point",
|
||||
"doc": "How this shield should be placed. Point placement attempts to place it on top of points, line places along lines multiple times per feature, vertex places on the vertexes of polygons, and interior attempts to place inside of polygons."
|
||||
},
|
||||
"placement-type": {
|
||||
"css": "shield-placement-type",
|
||||
"doc": "Re-position and/or re-size shield to avoid overlaps. \"simple\" for basic algorithm (using shield-placements string,) \"dummy\" to turn this feature off.",
|
||||
"type": [
|
||||
"dummy",
|
||||
"simple",
|
||||
"list"
|
||||
],
|
||||
"expression":true,
|
||||
"default-meaning": "Alternative placements will not be enabled.",
|
||||
"default-value": "dummy"
|
||||
},
|
||||
"avoid-edges": {
|
||||
"css": "shield-avoid-edges",
|
||||
"doc": "Tell positioning algorithm to avoid labeling near intersection edges.",
|
||||
@ -1024,7 +1059,8 @@ var _mapnik_reference_latest = {
|
||||
"type": "uri",
|
||||
"default-value": "none",
|
||||
"required": true,
|
||||
"doc": "An image file to be repeated and warped along a line"
|
||||
"doc": "An image file to be repeated and warped along a line",
|
||||
"expression": true
|
||||
},
|
||||
"clip": {
|
||||
"css": "line-pattern-clip",
|
||||
@ -1104,7 +1140,8 @@ var _mapnik_reference_latest = {
|
||||
"type": "uri",
|
||||
"default-value": "none",
|
||||
"required": true,
|
||||
"doc": "Image to use as a repeated pattern fill within a polygon"
|
||||
"doc": "Image to use as a repeated pattern fill within a polygon",
|
||||
"expression": true
|
||||
},
|
||||
"alignment": {
|
||||
"css": "polygon-pattern-alignment",
|
||||
@ -1390,7 +1427,8 @@ var _mapnik_reference_latest = {
|
||||
"text": {
|
||||
"name": {
|
||||
"css": "text-name",
|
||||
"type": "expression",
|
||||
"type": "string",
|
||||
"expression": true,
|
||||
"required": true,
|
||||
"default-value": "",
|
||||
"serialization": "content",
|
||||
@ -1545,7 +1583,8 @@ var _mapnik_reference_latest = {
|
||||
},
|
||||
"orientation": {
|
||||
"css": "text-orientation",
|
||||
"type": "expression",
|
||||
"type": "float",
|
||||
"expression": true,
|
||||
"doc": "Rotate the text."
|
||||
},
|
||||
"placement": {
|
||||
@ -1673,11 +1712,19 @@ var _mapnik_reference_latest = {
|
||||
"height": {
|
||||
"css": "building-height",
|
||||
"doc": "The height of the building in pixels.",
|
||||
"type": "expression",
|
||||
"type": "float",
|
||||
"expression": true,
|
||||
"default-value": "0"
|
||||
}
|
||||
},
|
||||
"torque": {
|
||||
"-torque-clear-color": {
|
||||
"css": "-torque-clear-color",
|
||||
"type": "color",
|
||||
"default-value": "rgba(255, 255, 255, 0)",
|
||||
"default-meaning": "full clear",
|
||||
"doc": "color used to clear canvas on each frame"
|
||||
},
|
||||
"-torque-frame-count": {
|
||||
"css": "-torque-frame-count",
|
||||
"default-value": "128",
|
||||
@ -1887,9 +1934,9 @@ var _mapnik_reference_latest = {
|
||||
}
|
||||
}
|
||||
|
||||
window.carto['mapnik-reference'] = {
|
||||
module.exports = {
|
||||
version: {
|
||||
latest: _mapnik_reference_latest,
|
||||
'2.1.1': _mapnik_reference_latest
|
||||
}
|
||||
}
|
||||
};
|
@ -1,5 +1,5 @@
|
||||
(function(tree) {
|
||||
var _ = require('underscore');
|
||||
var _ = global._ || require('underscore');
|
||||
tree.Call = function Call(name, args, index) {
|
||||
this.name = name;
|
||||
this.args = args;
|
||||
@ -78,6 +78,7 @@ tree.Call.prototype = {
|
||||
};
|
||||
}
|
||||
if (fn !== args.length &&
|
||||
!(Array.isArray(fn) && _.include(fn, args.length)) &&
|
||||
// support variable-arg functions like `colorize-alpha`
|
||||
fn !== -1) {
|
||||
env.error({
|
||||
|
@ -1,6 +1,6 @@
|
||||
(function(tree) {
|
||||
var assert = require('assert'),
|
||||
_ = require('underscore');
|
||||
_ = global._ || require('underscore');
|
||||
|
||||
// A definition is the combination of a selector and rules, like
|
||||
// #foo {
|
||||
@ -210,48 +210,37 @@ tree.Definition.prototype.toXML = function(env, existing) {
|
||||
|
||||
tree.Definition.prototype.toJS = function(env) {
|
||||
var shaderAttrs = {};
|
||||
|
||||
// merge conditions from filters with zoom condition of the
|
||||
// definition
|
||||
var zoom = "(" + this.zoom + " & (1 << ctx.zoom))";
|
||||
var frame_offset = this.frame_offset;
|
||||
var _if = this.filters.toJS(env);
|
||||
var filters = [zoom];
|
||||
if(_if) filters.push(_if);
|
||||
if(frame_offset) filters.push('ctx["frame-offset"] === ' + frame_offset);
|
||||
_if = filters.join(" && ");
|
||||
_.each(this.rules, function(rule) {
|
||||
if(rule instanceof tree.Rule) {
|
||||
shaderAttrs[rule.name] = shaderAttrs[rule.name] || [];
|
||||
var zoomFilter = "(" + this.zoom + " & (1 << ctx.zoom))";
|
||||
var filters = [zoomFilter];
|
||||
var originalFilters = this.filters.toJS(env);
|
||||
// Ignore default zoom for filtering (https://github.com/CartoDB/carto/issues/40)
|
||||
var zoomFiltered = this.zoom !== tree.Zoom.all;
|
||||
|
||||
if (originalFilters) {
|
||||
filters.push(originalFilters);
|
||||
}
|
||||
|
||||
var r = {
|
||||
index: rule.index,
|
||||
symbolizer: rule.symbolizer
|
||||
};
|
||||
if (frame_offset) {
|
||||
filters.push('ctx["frame-offset"] === ' + frame_offset);
|
||||
}
|
||||
|
||||
if (_if) {
|
||||
r.js = "if(" + _if + "){" + rule.value.toJS(env) + "}"
|
||||
} else {
|
||||
r.js = rule.value.toJS(env);
|
||||
}
|
||||
_.each(this.rules, function (rule) {
|
||||
var exportedRule = {};
|
||||
|
||||
r.constant = rule.value.ev(env).is !== 'field';
|
||||
r.filtered = !!_if;
|
||||
|
||||
shaderAttrs[rule.name].push(r);
|
||||
} else {
|
||||
throw new Error("Ruleset not supported");
|
||||
//if (rule instanceof tree.Ruleset) {
|
||||
//var sh = rule.toJS(env);
|
||||
//for(var v in sh) {
|
||||
//shaderAttrs[v] = shaderAttrs[v] || [];
|
||||
//for(var attr in sh[v]) {
|
||||
//shaderAttrs[v].push(sh[v][attr]);
|
||||
//}
|
||||
//}
|
||||
//}
|
||||
if (!rule instanceof tree.Rule) {
|
||||
throw new Error("Ruleset not supported");
|
||||
}
|
||||
|
||||
exportedRule.index = rule.index;
|
||||
exportedRule.symbolizer = rule.symbolizer;
|
||||
exportedRule.js = "if(" + filters.join(" && ") + "){" + rule.value.toJS(env) + "}";
|
||||
exportedRule.constant = rule.value.ev(env).is !== 'field';
|
||||
exportedRule.filtered = zoomFiltered || (originalFilters !== '');
|
||||
shaderAttrs[rule.name] = shaderAttrs[rule.name] || [];
|
||||
shaderAttrs[rule.name].push(exportedRule);
|
||||
});
|
||||
|
||||
return shaderAttrs;
|
||||
};
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
(function(tree) {
|
||||
var _ = require('underscore');
|
||||
var _ = global._ || require('underscore');
|
||||
//
|
||||
// A number with a unit
|
||||
//
|
||||
|
@ -1,4 +1,5 @@
|
||||
var tree = require('../tree');
|
||||
var _ = global._ || require('underscore');
|
||||
|
||||
tree.Filterset = function Filterset() {
|
||||
this.filters = {};
|
||||
@ -91,7 +92,10 @@ tree.Filterset.prototype.toJS = function(env) {
|
||||
val = filter._val.toString(true);
|
||||
}
|
||||
var attrs = "data";
|
||||
return attrs + "." + filter.key.value + " " + op + " " + (val.is === 'string' ? "'"+ val +"'" : val);
|
||||
if (op === '=~') {
|
||||
return "(" + attrs + "['" + filter.key.value + "'] + '').match(" + (val.is === 'string' ? "'" + val.toString().replace(/'/g, "\\'").replace(/&/g, '&') + "'" : val) + ")";
|
||||
}
|
||||
return attrs + "['" + filter.key.value + "'] " + op + " " + (val.is === 'string' ? "'" + val.toString().replace(/'/g, "\\'").replace(/&/g, '&') + "'" : val);
|
||||
}).join(' && ');
|
||||
};
|
||||
|
||||
|
@ -4,46 +4,34 @@
|
||||
// combinations.
|
||||
(function(tree) {
|
||||
|
||||
var _ = require('underscore'),
|
||||
reference = require('mapnik-reference'),
|
||||
var _ = global._ || require('underscore'),
|
||||
ref = {};
|
||||
|
||||
tree.Reference = {
|
||||
data: reference.version.latest
|
||||
};
|
||||
|
||||
tree.Reference.set = function(ref, version) {
|
||||
reference = ref;
|
||||
tree.Reference.setVersion(version || 'latest');
|
||||
};
|
||||
|
||||
ref.setData = function(data) {
|
||||
ref.data = data;
|
||||
ref.selector_cache = generateSelectorCache(data);
|
||||
ref.mapnikFunctions = generateMapnikFunctions(data);
|
||||
|
||||
ref.mapnikFunctions.matrix = [6];
|
||||
ref.mapnikFunctions.translate = [1, 2];
|
||||
ref.mapnikFunctions.scale = [1, 2];
|
||||
ref.mapnikFunctions.rotate = [1, 3];
|
||||
ref.mapnikFunctions.skewX = [1];
|
||||
ref.mapnikFunctions.skewY = [1];
|
||||
|
||||
ref.required_cache = generateRequiredProperties(data);
|
||||
};
|
||||
|
||||
ref.setVersion = function(version) {
|
||||
if (reference.version.hasOwnProperty(version)) {
|
||||
ref.setData(reference.version[version]);
|
||||
var mapnik_reference = require('mapnik-reference');
|
||||
if (mapnik_reference.version.hasOwnProperty(version)) {
|
||||
ref.setData(mapnik_reference.version[version]);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
tree.Reference.selectors = tree.Reference.selectors || (function() {
|
||||
var list = [];
|
||||
for (var i in tree.Reference.data.symbolizers) {
|
||||
for (var j in tree.Reference.data.symbolizers[i]) {
|
||||
if (tree.Reference.data.symbolizers[i][j].hasOwnProperty('css')) {
|
||||
list.push(tree.Reference.data.symbolizers[i][j].css);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
ref.selectorData = function(selector, i) {
|
||||
if (ref.selector_cache[selector]) return ref.selector_cache[selector][i];
|
||||
};
|
||||
@ -198,8 +186,6 @@ ref.validValue = function(env, selector, value) {
|
||||
// For backwards compatibility, you can specify a string for `functions`-compatible
|
||||
// values, though they will not be validated.
|
||||
return validateFunctions(value, selector);
|
||||
} else if (ref.selector(selector).type === 'expression') {
|
||||
return true;
|
||||
} else if (ref.selector(selector).type === 'unsigned') {
|
||||
if (value.value[0].is === 'float') {
|
||||
value.value[0].round();
|
||||
@ -207,15 +193,8 @@ ref.validValue = function(env, selector, value) {
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else if (tree.Reference.selector(selector).type == 'expression') {
|
||||
} else if ((ref.selector(selector).expression)) {
|
||||
return true;
|
||||
} else if (tree.Reference.selector(selector).type === 'unsigned') {
|
||||
if (value.value[0].is === 'float') {
|
||||
value.value[0].round();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (ref.selector(selector).validate) {
|
||||
var valid = false;
|
||||
@ -235,8 +214,6 @@ ref.validValue = function(env, selector, value) {
|
||||
}
|
||||
};
|
||||
|
||||
ref.setVersion('latest');
|
||||
|
||||
tree.Reference = ref;
|
||||
|
||||
})(require('../tree'));
|
||||
|
@ -1,5 +1,5 @@
|
||||
(function(tree) {
|
||||
var _ = require('underscore');
|
||||
var _ = global._ || require('underscore');
|
||||
|
||||
// Given a style's name, attachment, definitions, and an environment object,
|
||||
// return a stringified style for Mapnik
|
||||
|
@ -33,10 +33,23 @@ tree.Value.prototype = {
|
||||
var val = this.ev(env);
|
||||
var v = val.toString();
|
||||
if(val.is === "color" || val.is === 'uri' || val.is === 'string' || val.is === 'keyword') {
|
||||
v = "'" + v + "'";
|
||||
v = "'" + v.replace(/&/g, '&') + "'";
|
||||
} else if (Array.isArray(this.value) && this.value.length > 1) {
|
||||
// This covers something like `line-dasharray: 5, 10;`
|
||||
// where the return _value has more than one element.
|
||||
// Without this the generated code will look like:
|
||||
// _value = 5, 10; which will ignore the 10.
|
||||
v = '[' + this.value.join(',') + ']';
|
||||
} else if (val.is === 'field') {
|
||||
// replace [variable] by ctx['variable']
|
||||
v = v.replace(/\[(.*)\]/g, "data['$1']");
|
||||
v = v.replace(/\[([^\]]*)\]/g, function(matched) {
|
||||
return matched.replace(/\[(.*)\]/g, "data['$1']");
|
||||
});
|
||||
}else if (val.is === 'call') {
|
||||
v = JSON.stringify({
|
||||
name: val.name,
|
||||
args: val.args
|
||||
})
|
||||
}
|
||||
return "_value = " + v + ";";
|
||||
}
|
||||
|
35
makefile
35
makefile
@ -1,35 +0,0 @@
|
||||
#
|
||||
# Run all tests
|
||||
#
|
||||
|
||||
expresso = ./node_modules/.bin/mocha
|
||||
docco = ./node_modules/.bin/docco
|
||||
uglify = ./node_modules/.bin/uglify
|
||||
|
||||
JS_CLIENT_FILES=browser/*.js lib/carto/parser.js lib/carto/tree.js lib/carto/tree/*.js lib/carto/functions.js lib/carto/renderer_js.js
|
||||
|
||||
all: dist
|
||||
|
||||
lint:
|
||||
./node_modules/.bin/jshint lib/carto/*.js lib/carto/tree/*.js
|
||||
|
||||
ifndef only
|
||||
test:
|
||||
@NODE_PATH=./lib:$NODE_PATH $(expresso) -R spec -I lib test/*.test.js
|
||||
else
|
||||
test:
|
||||
@NODE_PATH=./lib:$NODE_PATH $(expresso) -R spec -I lib test/${only}.test.js
|
||||
endif
|
||||
|
||||
check: test
|
||||
|
||||
doc:
|
||||
$(docco) lib/carto/*.js lib/carto/tree/*.js
|
||||
|
||||
dist/carto.js: $(JS_CLIENT_FILES)
|
||||
cat $(JS_CLIENT_FILES) > dist/carto.js
|
||||
|
||||
dist: dist/carto.js
|
||||
|
||||
|
||||
.PHONY: test
|
2110
package-lock.json
generated
Normal file
2110
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
49
package.json
49
package.json
@ -1,19 +1,17 @@
|
||||
{
|
||||
"name": "carto",
|
||||
"version": "0.11.0",
|
||||
"description": "Mapnik Stylesheet Compiler",
|
||||
"url": "https://github.com/mapbox/carto",
|
||||
"version": "0.15.1-cdb5",
|
||||
"description": "CartoCSS Stylesheet Compiler",
|
||||
"url": "https://github.com/cartodb/carto",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "http://github.com/mapbox/carto.git"
|
||||
"type": "git",
|
||||
"url": "http://github.com/cartodb/carto.git"
|
||||
},
|
||||
"author": {
|
||||
"name": "Mapbox",
|
||||
"url": "http://mapbox.com/",
|
||||
"email": "info@mapbox.com"
|
||||
"name": "CartoDB",
|
||||
"url": "http://cartodb.com/"
|
||||
},
|
||||
"keywords": [
|
||||
"mapnik",
|
||||
"maps",
|
||||
"css",
|
||||
"stylesheets"
|
||||
@ -21,14 +19,17 @@
|
||||
"contributors": [
|
||||
"Tom MacWright <macwright@gmail.com>",
|
||||
"Konstantin Käfer",
|
||||
"Alexis Sellier <self@cloudhead.net>"
|
||||
"Alexis Sellier <self@cloudhead.net>",
|
||||
"Raul Ochoa <rochoa@cartodb.com>",
|
||||
"Javi Santana <jsantana@cartodb.com>"
|
||||
],
|
||||
"licenses": [{
|
||||
"licenses": [
|
||||
{
|
||||
"type": "Apache"
|
||||
}],
|
||||
}
|
||||
],
|
||||
"bin": {
|
||||
"carto": "./bin/carto",
|
||||
"mml2json.js": "./bin/mml2json.js"
|
||||
"carto": "./bin/carto"
|
||||
},
|
||||
"man": "./man/carto.1",
|
||||
"main": "./lib/carto/index",
|
||||
@ -36,19 +37,27 @@
|
||||
"node": ">=0.4.x"
|
||||
},
|
||||
"dependencies": {
|
||||
"underscore": "~1.6.0",
|
||||
"mapnik-reference": "5.0.9",
|
||||
"xml2js": "~0.4.2",
|
||||
"underscore": "1.8.3",
|
||||
"mapnik-reference": "~6.0.2",
|
||||
"optimist": "~0.6.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"mocha": "1.12.x",
|
||||
"jshint": "0.2.x",
|
||||
"docco": "0.3.x",
|
||||
"sax": "0.1.x"
|
||||
"sax": "0.1.x",
|
||||
"istanbul": "~0.2.14",
|
||||
"coveralls": "~2.10.1",
|
||||
"browserify": "~7.0.0",
|
||||
"uglify-js": "1.3.3"
|
||||
},
|
||||
"scripts": {
|
||||
"pretest": "npm install",
|
||||
"test": "mocha -R spec"
|
||||
"test": "mocha -R spec",
|
||||
"tdd": "env HIDE_LOGS=true mocha -w -R spec",
|
||||
"coverage": "istanbul cover ./node_modules/.bin/_mocha && coveralls < ./coverage/lcov.info",
|
||||
"bump": "npm version patch",
|
||||
"bump:major": "npm version major",
|
||||
"bump:minor": "npm version minor",
|
||||
"postversion": "git push origin master --follow-tags"
|
||||
}
|
||||
}
|
||||
|
25
test/color.test.js
Normal file
25
test/color.test.js
Normal file
@ -0,0 +1,25 @@
|
||||
var assert = require('assert');
|
||||
var tree = require('../lib/carto/tree.js');
|
||||
require('../lib/carto/functions');
|
||||
require('../lib/carto/tree/color');
|
||||
require('../lib/carto/tree/dimension');
|
||||
|
||||
describe('Color', function() {
|
||||
describe('basic functionality', function() {
|
||||
it('should be constructed', function() {
|
||||
var f = new tree.Color([0, 0, 0], 1);
|
||||
assert.deepEqual(f.toHSL(), {"h":0,"s":0,"l":0,"a":1});
|
||||
assert.ok(f);
|
||||
});
|
||||
});
|
||||
describe('functions', function() {
|
||||
it('should be constructed', function() {
|
||||
assert.deepEqual(tree.functions.rgb(0, 0, 0), new tree.Color([0, 0, 0], 1));
|
||||
assert.deepEqual(tree.functions.hue(new tree.Color([0, 0, 0], 1)), new tree.Dimension(0));
|
||||
assert.deepEqual(tree.functions.saturation(new tree.Color([0, 0, 0], 1)), new tree.Dimension(0, '%'));
|
||||
assert.deepEqual(tree.functions.lightness(new tree.Color([0, 0, 0], 1)), new tree.Dimension(0, '%'));
|
||||
assert.deepEqual(tree.functions.alpha(new tree.Color([0, 0, 0], 1)), new tree.Dimension(1));
|
||||
assert.deepEqual(tree.functions.greyscale(new tree.Color([0, 0, 0], 1)), new tree.Color([0, 0, 0], 1));
|
||||
});
|
||||
});
|
||||
});
|
14
test/comment.test.js
Normal file
14
test/comment.test.js
Normal file
@ -0,0 +1,14 @@
|
||||
var assert = require('assert');
|
||||
var tree = require('../lib/carto/tree.js');
|
||||
require('../lib/carto/tree/comment');
|
||||
|
||||
describe('Comment', function() {
|
||||
describe('basic functionality', function() {
|
||||
it('should be constructed', function() {
|
||||
var f = new tree.Comment('hello world');
|
||||
assert.deepEqual(f.toString(), '<!--hello world-->');
|
||||
assert.deepEqual(f.ev(), f);
|
||||
assert.ok(f);
|
||||
});
|
||||
});
|
||||
});
|
@ -20,6 +20,9 @@ helper.files('errorhandling', 'mml', function(file) {
|
||||
local_data_dir: path.join(__dirname, 'rendering'),
|
||||
filename: file
|
||||
}).render(mml);
|
||||
// should not get here
|
||||
assert.ok(false);
|
||||
done();
|
||||
} catch(err) {
|
||||
if (err.message.indexOf('***') > -1) throw err;
|
||||
var result = helper.resultFile(file);
|
||||
@ -54,6 +57,9 @@ helper.files('errorhandling', 'mss', function(file) {
|
||||
// will match if the style was loaded from mml
|
||||
filename: basename
|
||||
}).renderMSS(mss);
|
||||
// should not get here
|
||||
assert.ok(false);
|
||||
done();
|
||||
} catch(err) {
|
||||
if (err.message.indexOf('***') > -1) throw err;
|
||||
var result = helper.resultFile(file);
|
||||
|
15
test/errorhandling/bad_op.mml
Normal file
15
test/errorhandling/bad_op.mml
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
"srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over",
|
||||
"Stylesheet": [
|
||||
"bad_op.mss"
|
||||
],
|
||||
"Layer": [{
|
||||
"id": "world",
|
||||
"name": "world",
|
||||
"srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over",
|
||||
"Datasource": {
|
||||
"file": "http://tilemill-data.s3.amazonaws.com/test_data/shape_demo.zip",
|
||||
"type": "shape"
|
||||
}
|
||||
}]
|
||||
}
|
3
test/errorhandling/bad_op.mss
Normal file
3
test/errorhandling/bad_op.mss
Normal file
@ -0,0 +1,3 @@
|
||||
#world {
|
||||
line-width: 20% + 2px;
|
||||
}
|
1
test/errorhandling/bad_op.result
Normal file
1
test/errorhandling/bad_op.result
Normal file
@ -0,0 +1 @@
|
||||
bad_op.mss:2:4 If two operands differ, the first must not be %
|
15
test/errorhandling/bad_op_2.mml
Normal file
15
test/errorhandling/bad_op_2.mml
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
"srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over",
|
||||
"Stylesheet": [
|
||||
"bad_op_2.mss"
|
||||
],
|
||||
"Layer": [{
|
||||
"id": "world",
|
||||
"name": "world",
|
||||
"srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over",
|
||||
"Datasource": {
|
||||
"file": "http://tilemill-data.s3.amazonaws.com/test_data/shape_demo.zip",
|
||||
"type": "shape"
|
||||
}
|
||||
}]
|
||||
}
|
3
test/errorhandling/bad_op_2.mss
Normal file
3
test/errorhandling/bad_op_2.mss
Normal file
@ -0,0 +1,3 @@
|
||||
#world {
|
||||
line-width: 20px * 2%;
|
||||
}
|
1
test/errorhandling/bad_op_2.result
Normal file
1
test/errorhandling/bad_op_2.result
Normal file
@ -0,0 +1 @@
|
||||
bad_op_2.mss:2:4 Percent values can only be added or subtracted from other values
|
@ -1,5 +1,4 @@
|
||||
#world[zoom=5] {
|
||||
text-face-name: 2;
|
||||
line-rasterizer: 'full';
|
||||
text-name: 'foo';
|
||||
}
|
||||
|
@ -1,2 +1 @@
|
||||
invalid_value.mss:2:2 Invalid value for text-face-name, the type font is expected. 2 (of type float) was given.
|
||||
invalid_value.mss:3:2 Invalid value for line-rasterizer, the type keyword (options: full, fast) is expected. full (of type string) was given.
|
||||
invalid_value.mss:2:2 Invalid value for text-face-name, the type font is expected. 2 (of type float) was given.
|
15
test/errorhandling/invaliddimension.mml
Normal file
15
test/errorhandling/invaliddimension.mml
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
"srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over",
|
||||
"Stylesheet": [
|
||||
"invaliddimension.mss"
|
||||
],
|
||||
"Layer": [{
|
||||
"id": "world",
|
||||
"name": "world",
|
||||
"srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over",
|
||||
"Datasource": {
|
||||
"file": "http://tilemill-data.s3.amazonaws.com/test_data/shape_demo.zip",
|
||||
"type": "shape"
|
||||
}
|
||||
}]
|
||||
}
|
3
test/errorhandling/invaliddimension.mss
Normal file
3
test/errorhandling/invaliddimension.mss
Normal file
@ -0,0 +1,3 @@
|
||||
#world {
|
||||
line-width: 10wifflewaffles;
|
||||
}
|
1
test/errorhandling/invaliddimension.result
Normal file
1
test/errorhandling/invaliddimension.result
Normal file
@ -0,0 +1 @@
|
||||
invaliddimension.mss:2:4 Invalid unit: 'wifflewaffles'
|
@ -1,4 +1,4 @@
|
||||
#t {
|
||||
text-name: invalid;
|
||||
text-face-name: "Dejagnu";
|
||||
text-name: valid;
|
||||
text-face-name: 2;
|
||||
}
|
||||
|
@ -1 +1 @@
|
||||
issue297.mss:2:2 Invalid value for text-name, the type expression is expected. invalid (of type keyword) was given.
|
||||
issue297.mss:3:2 Invalid value for text-face-name, the type font is expected. 2 (of type float) was given.
|
102
test/filtered.test.js
Normal file
102
test/filtered.test.js
Normal file
@ -0,0 +1,102 @@
|
||||
/**
|
||||
* Test the filtered field.
|
||||
*
|
||||
* When compiled, a rule provides metainformation fields like index, constant...etc
|
||||
* one of this fields is the "filtered field".
|
||||
*
|
||||
* This field gives information about whether a property is filtered or not.
|
||||
*
|
||||
* A property is filtered if it was activated inside a filter. In the following cartocss
|
||||
* code marker-color.filtered will be true because it's inside a population filter.
|
||||
*
|
||||
* #layer {
|
||||
* maker-width: 20;
|
||||
* [population > 100] {
|
||||
* marker-color: red; // this property is filtered
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* "zoom" is a special case, and it only should be considered when its value is not the default.
|
||||
*/
|
||||
var assert = require('assert');
|
||||
var Carto = require('../lib/carto/index.js');
|
||||
var renderer = new Carto.RendererJS({ strict: true });
|
||||
|
||||
describe('property.filtered', function () {
|
||||
it('should be false when the property is not filtered', function () {
|
||||
var style = [
|
||||
'#layer {',
|
||||
' marker-fill: red;',
|
||||
'}'
|
||||
].join('\n');
|
||||
var layers = renderer.render(style).layers[0].shader;
|
||||
assert(!layers['marker-fill'].filtered);
|
||||
});
|
||||
|
||||
it('should be true when the property is filtered', function () {
|
||||
var style = [
|
||||
'#layer {',
|
||||
' [foo > 30] {',
|
||||
' marker-fill: red;',
|
||||
' }',
|
||||
'}'
|
||||
].join('\n');
|
||||
|
||||
var layers = renderer.render(style).layers[0].shader;
|
||||
assert(layers['marker-fill'].filtered);
|
||||
});
|
||||
|
||||
it('should be true when the property is filtered at first level', function () {
|
||||
var style = [
|
||||
'#layer [foo > 30] {',
|
||||
' marker-fill: red;',
|
||||
'}`'
|
||||
].join('\n');
|
||||
|
||||
var layers = renderer.render(style).layers[0].shader;
|
||||
assert(layers['marker-fill'].filtered);
|
||||
});
|
||||
|
||||
it('should be false when the property is not filterd but there is another filtered properties', function () {
|
||||
var style = [
|
||||
'#layer {',
|
||||
' marker-fill: red;',
|
||||
' [bar < 200]{',
|
||||
' marker-allow-overlap: false;',
|
||||
' }',
|
||||
'}`'
|
||||
].join('\n');
|
||||
|
||||
var layers = renderer.render(style).layers[0].shader;
|
||||
|
||||
assert(!layers['marker-fill'].filtered);
|
||||
assert(layers['marker-allow-overlap'].filtered);
|
||||
});
|
||||
|
||||
it('should be true when the property is filtered and have a default value', function () {
|
||||
var style = [
|
||||
'#layer {',
|
||||
' marker-fill: red;',
|
||||
' [bar < 200]{',
|
||||
' marker-fill: blue;',
|
||||
' }',
|
||||
'}`'
|
||||
].join('\n');
|
||||
var layers = renderer.render(style).layers[0].shader;
|
||||
|
||||
assert(layers['marker-fill'].filtered);
|
||||
});
|
||||
|
||||
it('should be true when filtering by zoom', function () {
|
||||
var style = [
|
||||
'#layer {',
|
||||
' [zoom < 5]{',
|
||||
' marker-fill: blue;',
|
||||
' }',
|
||||
'}`'
|
||||
].join('\n');
|
||||
var layers = renderer.render(style).layers[0].shader;
|
||||
|
||||
assert(layers['marker-fill'].filtered);
|
||||
});
|
||||
});
|
@ -54,7 +54,8 @@ var _mapnik_reference_latest = {
|
||||
["x-gradient", 0],
|
||||
["y-gradient", 0],
|
||||
["invert", 0],
|
||||
["sharpen", 0]
|
||||
["sharpen", 0],
|
||||
["ramp", 0]
|
||||
],
|
||||
"doc": "A list of image filters."
|
||||
},
|
||||
|
@ -34,7 +34,7 @@ helper.files('rendering-mss', 'mss', function(file) {
|
||||
fs.writeFileSync(expected,output);
|
||||
}
|
||||
var expected_data = fs.readFileSync(expected).toString();
|
||||
assert.equal(output,expected_data);
|
||||
assert.equal(output.trim(),expected_data.trim());
|
||||
});
|
||||
});
|
||||
});
|
||||
|
3
test/rendering-mss/line-width-zoom.mss
Normal file
3
test/rendering-mss/line-width-zoom.mss
Normal file
@ -0,0 +1,3 @@
|
||||
#layer {
|
||||
line-width:"@zoom";
|
||||
}
|
5
test/rendering-mss/line-width-zoom.xml
Normal file
5
test/rendering-mss/line-width-zoom.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<Style name="style" filter-mode="first">
|
||||
<Rule>
|
||||
<LineSymbolizer stroke-width="@zoom" />
|
||||
</Rule>
|
||||
</Style>
|
5
test/rendering-mss/variable-quoting-of-enum.mss
Normal file
5
test/rendering-mss/variable-quoting-of-enum.mss
Normal file
@ -0,0 +1,5 @@
|
||||
#world {
|
||||
line-rasterizer: 'fast';
|
||||
// carto should collapse to one
|
||||
line-rasterizer: fast;
|
||||
}
|
5
test/rendering-mss/variable-quoting-of-enum.xml
Normal file
5
test/rendering-mss/variable-quoting-of-enum.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<Style name="style" filter-mode="first">
|
||||
<Rule>
|
||||
<LineSymbolizer rasterizer="fast" />
|
||||
</Rule>
|
||||
</Style>
|
@ -2,4 +2,6 @@
|
||||
#world {
|
||||
point-file: url(foo.png);
|
||||
point-transform: translate( @trans * 2, @trans);
|
||||
marker-width: 2;
|
||||
marker-transform: scale(2);
|
||||
}
|
||||
|
@ -3,9 +3,10 @@
|
||||
<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over">
|
||||
|
||||
|
||||
<Style name="world" filter-mode="first" >
|
||||
<Style name="world" filter-mode="first">
|
||||
<Rule>
|
||||
<PointSymbolizer file="[absolute path]" transform="translate(4,2)" />
|
||||
<MarkersSymbolizer width="2" transform="scale(2)" />
|
||||
</Rule>
|
||||
</Style>
|
||||
<Layer name="world"
|
||||
|
148
test/rendering_js-strict.test.js
Normal file
148
test/rendering_js-strict.test.js
Normal file
@ -0,0 +1,148 @@
|
||||
var assert = require('assert');
|
||||
var carto = require('../lib/carto');
|
||||
var tree = require('../lib/carto/tree');
|
||||
|
||||
describe('RendererJS Strict Mode', function() {
|
||||
|
||||
var style = [
|
||||
'#world {',
|
||||
'polygon-fill: red;',
|
||||
'line-width: 2;',
|
||||
'line-color: #f00;',
|
||||
'[frame-offset = 1] {',
|
||||
'line-width: 3;',
|
||||
'}',
|
||||
'[frame-offset = 2] {',
|
||||
'line-width: 3;',
|
||||
'}',
|
||||
'}',
|
||||
'',
|
||||
'#worls[frame-offset = 10] {',
|
||||
'line-width: 4;',
|
||||
'}'
|
||||
].join('\n');
|
||||
|
||||
var reference = {
|
||||
version: '1.0.0',
|
||||
style: {},
|
||||
layer: {},
|
||||
colors: {},
|
||||
filter: {},
|
||||
symbolizers: {
|
||||
line: {
|
||||
"stroke": {
|
||||
"css": "line-color",
|
||||
"default-value": "rgba(0,0,0,1)",
|
||||
"type": "color",
|
||||
"default-meaning": "black and fully opaque (alpha = 1), same as rgb(0,0,0)",
|
||||
"doc": "The color of a drawn line"
|
||||
},
|
||||
"stroke-width": {
|
||||
"css": "line-width",
|
||||
"default-value": 1,
|
||||
"type": "float",
|
||||
"doc": "The width of a line in pixels"
|
||||
},
|
||||
"stroke-opacity": {
|
||||
"css": "line-opacity",
|
||||
"default-value": 1,
|
||||
"type": "float",
|
||||
"default-meaning": "opaque",
|
||||
"doc": "The opacity of a line"
|
||||
},
|
||||
"stroke-linejoin": {
|
||||
"css": "line-join",
|
||||
"default-value": "miter",
|
||||
"type": [
|
||||
"miter",
|
||||
"miter-revert",
|
||||
"round",
|
||||
"bevel"
|
||||
],
|
||||
"expression": true,
|
||||
"doc": "The behavior of lines when joining.",
|
||||
"default-meaning": "The line joins will be rendered using a miter look."
|
||||
},
|
||||
"stroke-linecap": {
|
||||
"css": "line-cap",
|
||||
"default-value": "butt",
|
||||
"type": [
|
||||
"butt",
|
||||
"round",
|
||||
"square"
|
||||
],
|
||||
"expression": true,
|
||||
"doc": "The display of line endings.",
|
||||
"default-meaning": "The line endings will be rendered using a butt look."
|
||||
},
|
||||
"comp-op": {
|
||||
"css": "line-comp-op",
|
||||
"default-value": "overlay",
|
||||
"default-meaning": "Add the current symbolizer on top of other symbolizer.",
|
||||
"doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",
|
||||
"type": [
|
||||
"multiply",
|
||||
"add",
|
||||
"overlay"
|
||||
],
|
||||
"expression": true
|
||||
},
|
||||
"stroke-dasharray": {
|
||||
"css": "line-dasharray",
|
||||
"type": "numbers",
|
||||
"expression": true,
|
||||
"doc": "A pair of length values [a,b], where (a) is the dash length and (b) is the gap length respectively. More than two values are supported for more complex patterns.",
|
||||
"default-value": "none",
|
||||
"default-meaning": "The line will be drawn without dashes."
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var expectedErrorMessageRegex = /Unrecognized rule: polygon-fill/;
|
||||
|
||||
before(function() {
|
||||
this.referenceData = tree.Reference.data;
|
||||
});
|
||||
|
||||
after(function() {
|
||||
if (this.referenceData) {
|
||||
tree.Reference.setData(this.referenceData);
|
||||
}
|
||||
});
|
||||
|
||||
it('should fail if a feature is not supported and strict is turned on', function () {
|
||||
assert.throws(
|
||||
function () {
|
||||
var RendererJS = new carto.RendererJS({reference: reference, mapnik_version: '1.0.0', strict: true });
|
||||
var shader = RendererJS.render(style);
|
||||
},
|
||||
expectedErrorMessageRegex
|
||||
);
|
||||
});
|
||||
|
||||
function rendererStrictModeOffTest(RendererJS) {
|
||||
return function () {
|
||||
var shader = RendererJS.render(style);
|
||||
|
||||
assert.ok(shader.layers);
|
||||
assert.equal(shader.layers.length, 2);
|
||||
};
|
||||
}
|
||||
|
||||
it('should pass if a feature is not supported but strict mode is not specified', rendererStrictModeOffTest(
|
||||
new carto.RendererJS({reference: reference, mapnik_version: '1.0.0' })
|
||||
));
|
||||
|
||||
it('should pass if a feature is not supported but strict is turned off', function () {
|
||||
new carto.RendererJS({reference: reference, mapnik_version: '1.0.0', strict: false })
|
||||
});
|
||||
|
||||
it('should pass if a feature is supported and strict is turned on', function () {
|
||||
var RendererJS = new carto.RendererJS({reference: reference, mapnik_version: '1.0.0', strict: true });
|
||||
var cartocss = '#layer { line-width: 10 }';
|
||||
var shader = RendererJS.render(cartocss);
|
||||
assert.ok(shader);
|
||||
});
|
||||
|
||||
});
|
@ -1,27 +1,27 @@
|
||||
|
||||
var SHOW_LOGS = (process.env.HIDE_LOGS !== 'true');
|
||||
var assert = require('assert');
|
||||
var carto = require('../lib/carto');
|
||||
describe('RenderingJS', function() {
|
||||
var shader;
|
||||
var style = [
|
||||
'#world {',
|
||||
'line-width: 2;',
|
||||
'line-color: #f00;',
|
||||
'[frame-offset = 1] {',
|
||||
'line-width: 3;',
|
||||
'}',
|
||||
'[frame-offset = 2] {',
|
||||
'line-width: 3;',
|
||||
'}',
|
||||
'}',
|
||||
'',
|
||||
'#worls[frame-offset = 10] {',
|
||||
'line-width: 4;',
|
||||
'#world {',
|
||||
'line-width: 2;',
|
||||
'line-color: #f00;',
|
||||
'[frame-offset = 1] {',
|
||||
'line-width: 3;',
|
||||
'}',
|
||||
'[frame-offset = 2] {',
|
||||
'line-width: 3;',
|
||||
'}',
|
||||
'}',
|
||||
'',
|
||||
'#worls[frame-offset = 10] {',
|
||||
'line-width: 4;',
|
||||
'}'
|
||||
].join('\n');
|
||||
|
||||
beforeEach(function() {
|
||||
shader = (new carto.RendererJS({ debug: true })).render(style);
|
||||
shader = (new carto.RendererJS({ debug: SHOW_LOGS })).render(style);
|
||||
});
|
||||
|
||||
it ("shold render layers", function() {
|
||||
@ -45,7 +45,7 @@ describe('RenderingJS', function() {
|
||||
|
||||
it ("shold render variables", function() {
|
||||
var style = '#test { marker-width: [testing]; }';
|
||||
shader = (new carto.RendererJS({ debug: true })).render(style);
|
||||
shader = (new carto.RendererJS({ debug: SHOW_LOGS })).render(style);
|
||||
var layer = shader.getLayers()[0];
|
||||
var props = layer.getStyle({testing: 2}, { 'zoom': 0, 'frame-offset': 10 });
|
||||
assert( props['marker-width'] === 2);
|
||||
@ -53,7 +53,7 @@ describe('RenderingJS', function() {
|
||||
|
||||
it ("should allow filter based rendering", function() {
|
||||
var style = '#test { marker-width: 10; [zoom = 1] { marker-width: 1; } }';
|
||||
shader = (new carto.RendererJS({ debug: true })).render(style);
|
||||
shader = (new carto.RendererJS({ debug: SHOW_LOGS })).render(style);
|
||||
var layer = shader.getLayers()[0];
|
||||
var props = layer.getStyle({}, { 'zoom': 0, 'frame-offset': 10 });
|
||||
assert( props['marker-width'] === 10);
|
||||
@ -63,8 +63,8 @@ describe('RenderingJS', function() {
|
||||
|
||||
it ("symbolizers should be in rendering order", function() {
|
||||
var style = '#test { polygon-fill: red; line-color: red; }';
|
||||
style += '#test2 { line-color: red;polygon-fill: red; line-witdh: 10; }';
|
||||
var shader = (new carto.RendererJS({ debug: true })).render(style);
|
||||
style += '#test2 { line-color: red;polygon-fill: red; line-width: 10; }';
|
||||
var shader = (new carto.RendererJS({ debug: SHOW_LOGS })).render(style);
|
||||
var layer0 = shader.getLayers()[0];
|
||||
assert(layer0.getSymbolizers()[0] === 'polygon');
|
||||
assert(layer0.getSymbolizers()[1] === 'line');
|
||||
@ -74,22 +74,166 @@ describe('RenderingJS', function() {
|
||||
assert(layer0.getSymbolizers()[1] === 'line');
|
||||
});
|
||||
|
||||
it ("colorize should return a list of colours in same order", function() {
|
||||
var style = '#test { image-filters: colorize-alpha(blue, cyan, green, yellow, orange, red); }';
|
||||
var shader = (new carto.RendererJS({ debug: SHOW_LOGS })).render(style);
|
||||
var layer0 = shader.getLayers()[0];
|
||||
var st = layer0.getStyle({ value: 1 }, {"frame-offset": 0, "zoom": 3});
|
||||
var expectedColours = [[0, 0, 255], [0, 255, 255], [0, 128, 0], [255, 255, 0], [255, 165, 0], [255, 0, 0]];
|
||||
for (var i = 0; i < st["image-filters"].args; i++){
|
||||
assert (st["image-filters"].args[i].rgb === expectedColours[i]);
|
||||
}
|
||||
});
|
||||
|
||||
it ("should return list of marker-files", function(){
|
||||
var css = [
|
||||
'Map {',
|
||||
'-torque-time-attribute: "date";',
|
||||
'-torque-aggregation-function: "count(cartodb_id)";',
|
||||
'-torque-frame-count: 760;',
|
||||
'-torque-animation-duration: 15;',
|
||||
'-torque-resolution: 2',
|
||||
'}',
|
||||
'#layer {',
|
||||
' marker-width: 3;',
|
||||
' marker-fill-opacity: 0.8;',
|
||||
' marker-fill: #FEE391; ',
|
||||
' marker-file: url(http://localhost:8081/gal.svg); ',
|
||||
' comp-op: "lighten";',
|
||||
' [value > 2] { marker-file: url(http://upload.wikimedia.org/wikipedia/commons/4/43/Flag_of_the_Galactic_Empire.svg); }',
|
||||
' [value > 3] { marker-file: url(http://upload.wikimedia.org/wikipedia/commons/c/c9/Flag_of_Syldavia.svg); }',
|
||||
' [frame-offset = 1] { marker-width: 10; marker-fill-opacity: 0.05;}',
|
||||
' [frame-offset = 2] { marker-width: 15; marker-fill-opacity: 0.02;}',
|
||||
'}'
|
||||
].join('\n');
|
||||
var shader = (new carto.RendererJS({ debug: SHOW_LOGS })).render(css);
|
||||
var markerURLs = shader.getImageURLs();
|
||||
var against = ["http://localhost:8081/gal.svg", "http://upload.wikimedia.org/wikipedia/commons/4/43/Flag_of_the_Galactic_Empire.svg", "http://upload.wikimedia.org/wikipedia/commons/c/c9/Flag_of_Syldavia.svg"];
|
||||
for(var i = 0; i<against.length; i++){
|
||||
assert(against[i] == markerURLs[i])
|
||||
}
|
||||
})
|
||||
|
||||
it ("should return variable for styles that change", function() {
|
||||
var style = '#test { marker-width: [prop]; }';
|
||||
var shader = (new carto.RendererJS({ debug: true })).render(style);
|
||||
var shader = (new carto.RendererJS({ debug: SHOW_LOGS })).render(style);
|
||||
var layer0 = shader.getLayers()[0];
|
||||
assert(layer0.isVariable());
|
||||
|
||||
style = '#test { marker-width: 1; }';
|
||||
shader = (new carto.RendererJS({ debug: true })).render(style);
|
||||
shader = (new carto.RendererJS({ debug: SHOW_LOGS })).render(style);
|
||||
layer0 = shader.getLayers()[0];
|
||||
assert(!layer0.isVariable());
|
||||
|
||||
style = '#test { marker-width: [prop]; marker-fill: red; }';
|
||||
shader = (new carto.RendererJS({ debug: true })).render(style);
|
||||
shader = (new carto.RendererJS({ debug: SHOW_LOGS })).render(style);
|
||||
layer0 = shader.getLayers()[0];
|
||||
assert(layer0.isVariable());
|
||||
|
||||
});
|
||||
|
||||
it("should parse styles with string", function() {
|
||||
var style = '#test { [column = "test\'ing"] { marker-width: 10; } }';
|
||||
var shader = (new carto.RendererJS({ debug: SHOW_LOGS })).render(style);
|
||||
var layer = shader.getLayers()[0];
|
||||
var props = layer.getStyle({column: 'test\'ing'}, { 'zoom': 0, 'frame-offset': 10 });
|
||||
assert(props['marker-width'] === 10);
|
||||
});
|
||||
|
||||
it("should parse styles with filters not supported by dot notation", function() {
|
||||
var style = '#test["mapnik::geometry_type"=1] { marker-width: 10; }';
|
||||
var shader = (new carto.RendererJS({ debug: SHOW_LOGS })).render(style);
|
||||
var layer = shader.getLayers()[0];
|
||||
var props = layer.getStyle({"mapnik::geometry_type": 1}, { 'zoom': 0 });
|
||||
assert.equal(props['marker-width'], 10);
|
||||
var emptyFilterProps = layer.getStyle({"mapnik::geometry_type": 2}, { 'zoom': 0 });
|
||||
assert.equal(emptyFilterProps['marker-width'], null);
|
||||
});
|
||||
|
||||
it ("should parse turbocarto", function(){
|
||||
var css = [
|
||||
'#layer {',
|
||||
' marker-width: ramp([cartodb_id], (#fff, #bbb), jenks);',
|
||||
'}'
|
||||
].join('\n');
|
||||
var shader = (new carto.RendererJS({ debug: SHOW_LOGS })).render(css);
|
||||
var layer = shader.getLayers()[0];
|
||||
var st = layer.shader['marker-width'].style({}, {zoom: 1})
|
||||
assert.equal(st.name, "ramp")
|
||||
assert.equal(st.args.length, 3);
|
||||
assert.equal(st.args[1].value[0].rgb[0], 255);
|
||||
assert.equal(st.args[1].value[0].rgb[1], 255);
|
||||
assert.equal(st.args[1].value[0].rgb[2], 255);
|
||||
assert.equal(st.args[2].value, 'jenks');
|
||||
})
|
||||
|
||||
it("should parse turbocarto with inner functions", function(){
|
||||
var css = [
|
||||
'#layer {',
|
||||
' marker-width: ramp([cartodb_id], cartocolor(Bold), category(10));',
|
||||
'}'
|
||||
].join('\n');
|
||||
var shader = (new carto.RendererJS({ debug: SHOW_LOGS })).render(css);
|
||||
var layer = shader.getLayers()[0];
|
||||
var st = layer.shader['marker-width'].style({}, {zoom: 1});
|
||||
assert.equal(st.name, "ramp");
|
||||
assert.equal(st.args.length, 3);
|
||||
assert.equal(st.args[1].name, 'cartocolor');
|
||||
assert.equal(st.args[1].args[0].value, 'Bold');
|
||||
assert.equal(st.args[2].name, 'category');
|
||||
assert.equal(st.args[2].args[0].value, 10);
|
||||
});
|
||||
|
||||
it("should work with multiple operands", function(){
|
||||
var css = [
|
||||
'#layer {',
|
||||
' marker-width: [value] * [value] * 0.5;',
|
||||
'}'
|
||||
].join('\n');
|
||||
var shader = (new carto.RendererJS({ debug: false })).render(css);
|
||||
var layer = shader.getLayers()[0];
|
||||
var width = layer.shader['marker-width'].style({value: 4}, {zoom: 1});
|
||||
assert.equal(width, 8);
|
||||
});
|
||||
|
||||
it("should work with numbers", function(){
|
||||
var css = [
|
||||
'#layer {',
|
||||
' line-dasharray: 5, 10;',
|
||||
'}'
|
||||
].join('\n');
|
||||
var shader = (new carto.RendererJS({ debug: false })).render(css);
|
||||
var layer = shader.getLayers()[0];
|
||||
var dasharray = layer.shader['line-dasharray'].style({value: 4}, {zoom: 1});
|
||||
assert.deepEqual(dasharray, [5, 10]);
|
||||
});
|
||||
|
||||
it("should not throw `ReferenceError` with `=~` operator", function(){
|
||||
var css = [
|
||||
'#layer[name=~".*wadus*"] {',
|
||||
' marker-width: 14;',
|
||||
'}'
|
||||
].join('\n');
|
||||
|
||||
assert.doesNotThrow(function () {
|
||||
var shader = (new carto.RendererJS({})).render(css);
|
||||
var layer = shader.getLayers()[0];
|
||||
var value = layer.shader['marker-width'].style({ name: 'wadus' }, { zoom: 1 });
|
||||
assert.equal(value, 14);
|
||||
}, ReferenceError);
|
||||
});
|
||||
|
||||
it("`=~` operator should support numbers", function(){
|
||||
var css = [
|
||||
'#layer[value=~"^10"] {',
|
||||
' marker-width: 14;',
|
||||
'}'
|
||||
].join('\n');
|
||||
|
||||
assert.doesNotThrow(function () {
|
||||
var shader = (new carto.RendererJS({})).render(css);
|
||||
var layer = shader.getLayers()[0];
|
||||
var value = layer.shader['marker-width'].style({ value: 10 }, { zoom: 1 });
|
||||
assert.equal(value, 14);
|
||||
}, Error);
|
||||
});
|
||||
});
|
||||
|
1655
test/underscore.js
1655
test/underscore.js
File diff suppressed because it is too large
Load Diff
@ -5,7 +5,7 @@ var assert = require('assert');
|
||||
|
||||
|
||||
describe('Version check', function() {
|
||||
xit('test version matches package.json version and changelog', function() {
|
||||
it('test version matches package.json version and changelog', function() {
|
||||
if (parseInt(process.version.split('.')[1]) > 4) {
|
||||
var info = require('../package.json');
|
||||
assert.deepEqual(info.version.split('.'), carto.version);
|
||||
|
Loading…
Reference in New Issue
Block a user