@massif-maps/style-tools 6.1.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -0
- package/dist/cli.js +436 -0
- package/dist/cli.js.map +1 -0
- package/dist/generated/properties.json +2488 -0
- package/dist/legend-svg.js +142 -0
- package/dist/legend-svg.js.map +1 -0
- package/dist/mapbox2css/browser-host.js +27 -0
- package/dist/mapbox2css/browser-host.js.map +1 -0
- package/dist/mapbox2css/casing.js +84 -0
- package/dist/mapbox2css/casing.js.map +1 -0
- package/dist/mapbox2css/config.js +212 -0
- package/dist/mapbox2css/config.js.map +1 -0
- package/dist/mapbox2css/contour.js +61 -0
- package/dist/mapbox2css/contour.js.map +1 -0
- package/dist/mapbox2css/coverage.js +56 -0
- package/dist/mapbox2css/coverage.js.map +1 -0
- package/dist/mapbox2css/emissive.js +192 -0
- package/dist/mapbox2css/emissive.js.map +1 -0
- package/dist/mapbox2css/expression.js +606 -0
- package/dist/mapbox2css/expression.js.map +1 -0
- package/dist/mapbox2css/filter.js +285 -0
- package/dist/mapbox2css/filter.js.map +1 -0
- package/dist/mapbox2css/fold.js +588 -0
- package/dist/mapbox2css/fold.js.map +1 -0
- package/dist/mapbox2css/host.js +13 -0
- package/dist/mapbox2css/host.js.map +1 -0
- package/dist/mapbox2css/index.js +3599 -0
- package/dist/mapbox2css/index.js.map +1 -0
- package/dist/mapbox2css/narrow.js +284 -0
- package/dist/mapbox2css/narrow.js.map +1 -0
- package/dist/mapbox2css/node-host.js +36 -0
- package/dist/mapbox2css/node-host.js.map +1 -0
- package/dist/mapbox2css/placement.js +62 -0
- package/dist/mapbox2css/placement.js.map +1 -0
- package/dist/mapbox2css/png.js +264 -0
- package/dist/mapbox2css/png.js.map +1 -0
- package/dist/mapbox2css/properties.js +155 -0
- package/dist/mapbox2css/properties.js.map +1 -0
- package/dist/mapbox2css/schema.js +865 -0
- package/dist/mapbox2css/schema.js.map +1 -0
- package/dist/mapbox2css/shield.js +118 -0
- package/dist/mapbox2css/shield.js.map +1 -0
- package/dist/mapbox2css/split.js +380 -0
- package/dist/mapbox2css/split.js.map +1 -0
- package/dist/mapbox2css/sprite.js +882 -0
- package/dist/mapbox2css/sprite.js.map +1 -0
- package/dist/mapbox2css/types.js +2 -0
- package/dist/mapbox2css/types.js.map +1 -0
- package/dist/mapbox2css/variables.js +273 -0
- package/dist/mapbox2css/variables.js.map +1 -0
- package/dist/wasm.js +43 -0
- package/dist/wasm.js.map +1 -0
- package/package.json +48 -0
- package/wasm/massif-style.mjs +2 -0
- package/wasm/massif-style.wasm +0 -0
|
@@ -0,0 +1,588 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolving `["config", name]` to a constant, and evaluating everything that makes decidable.
|
|
3
|
+
*
|
|
4
|
+
* Mapbox Standard is written against its own config: 878 `["config", …]` reads across 150 layers,
|
|
5
|
+
* and every colour among them goes through the same idiom - take the configured colour apart with
|
|
6
|
+
* `to-hsla`, bind the three channels with `let`, adjust them, and put it back together with `hsl`:
|
|
7
|
+
*
|
|
8
|
+
* ["let", "l_colorLand", ["at", 2, ["to-hsla", ["config", "colorLand"]]],
|
|
9
|
+
* ["hsl", 20, 20, ["-", ["var", "l_colorLand"], 10]]]
|
|
10
|
+
*
|
|
11
|
+
* CartoCSS has none of those operators, so untouched this is 74 colour properties that convert to
|
|
12
|
+
* nothing. With the config value substituted the whole expression is constant arithmetic, and what
|
|
13
|
+
* comes out is a plain colour. That is what this file does: substitute, then evaluate as far as the
|
|
14
|
+
* constants reach, and leave everything else exactly as written.
|
|
15
|
+
*
|
|
16
|
+
* Structure is preserved on purpose. Only branches whose test is now DECIDED are removed, so the
|
|
17
|
+
* layer set, its properties and their order come out identical for every config - which is what
|
|
18
|
+
* lets one `style.mss` be shared by several palettes, one per `lightPreset`.
|
|
19
|
+
*/
|
|
20
|
+
/** A scalar. An array or object is still an expression until proven otherwise. */
|
|
21
|
+
function isScalar(node) {
|
|
22
|
+
return node === null || typeof node === 'string' || typeof node === 'number' || typeof node === 'boolean';
|
|
23
|
+
}
|
|
24
|
+
/** A constant value, whether written bare or wrapped in `["literal", …]`. */
|
|
25
|
+
function constantOf(node) {
|
|
26
|
+
if (isScalar(node))
|
|
27
|
+
return { value: node };
|
|
28
|
+
if (Array.isArray(node) && node[0] === 'literal' && node.length === 2)
|
|
29
|
+
return { value: node[1] };
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
/** A constant list - what `to-hsla` produces and `at` reads. Always kept wrapped, never bare. */
|
|
33
|
+
function constantList(node) {
|
|
34
|
+
const constant = constantOf(node);
|
|
35
|
+
return constant && Array.isArray(constant.value) ? constant.value : null;
|
|
36
|
+
}
|
|
37
|
+
const literal = (value) => (isScalar(value) ? value : ['literal', value]);
|
|
38
|
+
function numbersOf(args) {
|
|
39
|
+
const out = [];
|
|
40
|
+
for (const arg of args) {
|
|
41
|
+
const constant = constantOf(arg);
|
|
42
|
+
if (!constant || typeof constant.value !== 'number')
|
|
43
|
+
return null;
|
|
44
|
+
out.push(constant.value);
|
|
45
|
+
}
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
const CSS_COLOUR = /^(hsla?|rgba?)\(([^()]*)\)$/i;
|
|
49
|
+
/** Mapbox's channel ranges: hue 0-360, saturation and lightness 0-100, alpha 0-1. */
|
|
50
|
+
export function toHsla(value) {
|
|
51
|
+
if (typeof value !== 'string')
|
|
52
|
+
return null;
|
|
53
|
+
const text = value.trim();
|
|
54
|
+
const functional = CSS_COLOUR.exec(text);
|
|
55
|
+
if (functional) {
|
|
56
|
+
const parts = functional[2].split(/[,/\s]+/).filter(Boolean);
|
|
57
|
+
const numbers = parts.map((p) => parseFloat(p));
|
|
58
|
+
if (numbers.some((n) => Number.isNaN(n)))
|
|
59
|
+
return null;
|
|
60
|
+
const alpha = numbers.length > 3 ? numbers[3] : 1;
|
|
61
|
+
if (functional[1].toLowerCase().startsWith('hsl')) {
|
|
62
|
+
return [numbers[0], numbers[1], numbers[2], alpha];
|
|
63
|
+
}
|
|
64
|
+
return rgbToHsl(numbers[0], numbers[1], numbers[2], alpha);
|
|
65
|
+
}
|
|
66
|
+
const hex = /^#([0-9a-f]{3,8})$/i.exec(text);
|
|
67
|
+
if (hex) {
|
|
68
|
+
const digits = hex[1];
|
|
69
|
+
const expand = (i) => (digits.length <= 4
|
|
70
|
+
? parseInt(digits[i] + digits[i], 16)
|
|
71
|
+
: parseInt(digits.slice(i * 2, i * 2 + 2), 16));
|
|
72
|
+
const alpha = digits.length === 4 || digits.length === 8 ? expand(3) / 255 : 1;
|
|
73
|
+
return rgbToHsl(expand(0), expand(1), expand(2), alpha);
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
function rgbToHsl(r, g, b, a) {
|
|
78
|
+
const [rn, gn, bn] = [r / 255, g / 255, b / 255];
|
|
79
|
+
const max = Math.max(rn, gn, bn);
|
|
80
|
+
const min = Math.min(rn, gn, bn);
|
|
81
|
+
const l = (max + min) / 2;
|
|
82
|
+
if (max === min)
|
|
83
|
+
return [0, 0, l * 100, a];
|
|
84
|
+
const d = max - min;
|
|
85
|
+
const s = d / (l > 0.5 ? 2 - max - min : max + min);
|
|
86
|
+
const h = max === rn ? (gn - bn) / d + (gn < bn ? 6 : 0)
|
|
87
|
+
: max === gn ? (bn - rn) / d + 2
|
|
88
|
+
: (rn - gn) / d + 4;
|
|
89
|
+
return [h * 60, s * 100, l * 100, a];
|
|
90
|
+
}
|
|
91
|
+
/** Back out as CSS, which is what the CartoCSS grammar reads and what the palette shows. */
|
|
92
|
+
export function fromHsla(h, s, l, a) {
|
|
93
|
+
const round = (n) => Math.round(n * 100) / 100;
|
|
94
|
+
return a >= 1
|
|
95
|
+
? `hsl(${round(h)}, ${round(s)}%, ${round(l)}%)`
|
|
96
|
+
: `hsla(${round(h)}, ${round(s)}%, ${round(l)}%, ${round(a)})`;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Viewport terms, and what they resolve to.
|
|
100
|
+
*
|
|
101
|
+
* Mapbox thins its labels by where the tile falls on a pitched screen. `road-label`'s filter is
|
|
102
|
+
* `["case", ["<=", ["pitch"], 40], true, ["step", ["pitch"], …, ["<", ["distance-from-center"], 1] …]]`
|
|
103
|
+
* - true below 40 degrees of pitch, and progressively stricter above it. Our label culler does its
|
|
104
|
+
* own thinning and nothing feeds a camera angle back into a style, so these resolve to the flat,
|
|
105
|
+
* centred view: the clause becomes `true` and folds out of the filter around it.
|
|
106
|
+
*
|
|
107
|
+
* Left alone they took 27 LAYERS with them - every label in the style - because an untranslatable
|
|
108
|
+
* filter drops the whole rule, not just the test.
|
|
109
|
+
*/
|
|
110
|
+
const VIEWPORT = {
|
|
111
|
+
pitch: 0,
|
|
112
|
+
'distance-from-center': 0,
|
|
113
|
+
'line-progress': 0,
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Runtime INTERACTION state, which the SDK has no notion of at all: nothing is hovered, selected or
|
|
117
|
+
* on an active indoor floor, and nothing can become so. Folded to the value MapBox itself gives an
|
|
118
|
+
* unset one, so the `case` around it collapses to the branch that draws the ordinary feature.
|
|
119
|
+
*
|
|
120
|
+
* Left alone they cost whole layers rather than one property: `["to-boolean", ["feature-state",
|
|
121
|
+
* "select"]]` guards 3d-building's colour, and a dropped fill left the symbolizer on its default
|
|
122
|
+
* black; `["is-active-floor"]` sits inside poi-label's filter.
|
|
123
|
+
*/
|
|
124
|
+
export function isPitch(node) {
|
|
125
|
+
return Array.isArray(node) && node.length === 1 && node[0] === 'pitch';
|
|
126
|
+
}
|
|
127
|
+
const UNSET_STATE = {
|
|
128
|
+
'feature-state': null,
|
|
129
|
+
'is-active-floor': false,
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Replaces every `["config", name]` this map covers, then evaluates as far as the constants go.
|
|
133
|
+
* An unknown name is left alone, and so is anything reading a feature, the zoom or the scene light.
|
|
134
|
+
*/
|
|
135
|
+
export function foldConfig(node, values, scene = {}) {
|
|
136
|
+
return fold(node, { values, scene, bindings: new Map() });
|
|
137
|
+
}
|
|
138
|
+
function fold(node, context) {
|
|
139
|
+
if (Array.isArray(node)) {
|
|
140
|
+
const head = node[0];
|
|
141
|
+
if (head === 'config' && typeof node[1] === 'string' && context.values.has(node[1])) {
|
|
142
|
+
return literal(context.values.get(node[1]));
|
|
143
|
+
}
|
|
144
|
+
if (head === 'measure-light' && node[1] === 'brightness' && context.scene.brightness !== undefined && !context.scene.liveBrightness) {
|
|
145
|
+
return context.scene.brightness;
|
|
146
|
+
}
|
|
147
|
+
// A paint ramp over the camera angle stays live, the translator's to carry over view::tilt;
|
|
148
|
+
// only Standard's label thinning, a filter `step` or comparison, resolves to the flat view.
|
|
149
|
+
if (head === 'interpolate' && isPitch(node[2])) {
|
|
150
|
+
return [head, node[1], node[2], ...node.slice(3).map((n) => fold(n, context))];
|
|
151
|
+
}
|
|
152
|
+
if (typeof head === 'string' && node.length === 1 && head in VIEWPORT) {
|
|
153
|
+
return VIEWPORT[head];
|
|
154
|
+
}
|
|
155
|
+
if (typeof head === 'string' && head in UNSET_STATE) {
|
|
156
|
+
return UNSET_STATE[head];
|
|
157
|
+
}
|
|
158
|
+
// `["image", name, { params: … }]` is Standard's RECOLOURABLE sprite. The SDK picks a
|
|
159
|
+
// sprite by name and cannot tint one per feature, so the name is what survives and the
|
|
160
|
+
// params go. Unwrapped here rather than in the translator because the icon-name machinery
|
|
161
|
+
// walks the raw tree - a `match` over a field whose branches are `image` nodes only reads
|
|
162
|
+
// as data-driven once the wrapper is off.
|
|
163
|
+
if (head === 'image' && node.length >= 2) {
|
|
164
|
+
return fold(node[1], context);
|
|
165
|
+
}
|
|
166
|
+
// `let` binds names for its body only, so its bindings are folded first and the body is
|
|
167
|
+
// folded UNDER them - a generic map over the children would lose the scope.
|
|
168
|
+
if (head === 'let' && node.length >= 2 && node.length % 2 === 0) {
|
|
169
|
+
const scoped = { ...context, bindings: new Map(context.bindings) };
|
|
170
|
+
const kept = [];
|
|
171
|
+
for (let i = 1; i + 1 < node.length; i += 2) {
|
|
172
|
+
const name = node[i];
|
|
173
|
+
const value = fold(node[i + 1], scoped);
|
|
174
|
+
// A constant binding always inlines. A NON-constant one inlines when it is read at
|
|
175
|
+
// most ONCE in what follows: `let` exists to avoid repeating a subexpression, so a
|
|
176
|
+
// single reader can never blow the expression up, and none at all is dead. The
|
|
177
|
+
// wrapper is what hides the shape from everything downstream - poi-label names its
|
|
178
|
+
// icon through one binding read once, beside four colour bindings its body never
|
|
179
|
+
// reads, and leaving the `let` on cost every POI icon in Standard.
|
|
180
|
+
const inline = typeof name === 'string'
|
|
181
|
+
&& (constantOf(value) !== null || countVar(node.slice(i + 2), name) <= 1);
|
|
182
|
+
if (inline)
|
|
183
|
+
scoped.bindings.set(name, value);
|
|
184
|
+
else
|
|
185
|
+
kept.push(name, value);
|
|
186
|
+
}
|
|
187
|
+
const body = fold(node[node.length - 1], scoped);
|
|
188
|
+
return kept.length === 0 ? body : ['let', ...kept, body];
|
|
189
|
+
}
|
|
190
|
+
if (head === 'var' && typeof node[1] === 'string' && context.bindings.has(node[1])) {
|
|
191
|
+
return context.bindings.get(node[1]);
|
|
192
|
+
}
|
|
193
|
+
// Simplified ONLY where something was actually substituted. Folding an expression nothing
|
|
194
|
+
// resolved into would rewrite styles that have no config at all - it removed four layers
|
|
195
|
+
// from a MapTiler style whose output was already verified on device - and the point here is
|
|
196
|
+
// to resolve what the SDK cannot express, not to optimise anyone's expressions.
|
|
197
|
+
const folded = node.map((child) => fold(child, context));
|
|
198
|
+
return folded.some((child, i) => child !== node[i]) ? simplify(folded) : node;
|
|
199
|
+
}
|
|
200
|
+
if (node && typeof node === 'object') {
|
|
201
|
+
const entries = Object.entries(node);
|
|
202
|
+
const folded = entries.map(([key, child]) => [key, fold(child, context)]);
|
|
203
|
+
return folded.some(([, child], i) => child !== entries[i][1])
|
|
204
|
+
? Object.fromEntries(folded) : node;
|
|
205
|
+
}
|
|
206
|
+
return node;
|
|
207
|
+
}
|
|
208
|
+
/** How many times `["var", name]` is read in a subtree. Stops counting at 2 - only 1 matters. */
|
|
209
|
+
function countVar(node, name) {
|
|
210
|
+
if (!Array.isArray(node))
|
|
211
|
+
return 0;
|
|
212
|
+
if (node[0] === 'var' && node[1] === name)
|
|
213
|
+
return 1;
|
|
214
|
+
let seen = 0;
|
|
215
|
+
for (const child of node) {
|
|
216
|
+
seen += countVar(child, name);
|
|
217
|
+
if (seen > 1)
|
|
218
|
+
return seen;
|
|
219
|
+
}
|
|
220
|
+
return seen;
|
|
221
|
+
}
|
|
222
|
+
/** Every operator whose value follows from constant arguments alone. */
|
|
223
|
+
function simplify(expr) {
|
|
224
|
+
const [head, ...args] = expr;
|
|
225
|
+
const unchanged = expr;
|
|
226
|
+
switch (head) {
|
|
227
|
+
case 'match': return simplifyMatch(args);
|
|
228
|
+
case 'case': return simplifyCase(args);
|
|
229
|
+
case 'coalesce': return simplifyCoalesce(args);
|
|
230
|
+
case 'all':
|
|
231
|
+
case 'any': return simplifyLogic(head, args) ?? unchanged;
|
|
232
|
+
case '!': {
|
|
233
|
+
const operand = constantOf(args[0]);
|
|
234
|
+
return operand ? !operand.value : unchanged;
|
|
235
|
+
}
|
|
236
|
+
// Only meaningful here over a folded UNSET_STATE, which is the whole reason it is listed:
|
|
237
|
+
// it is what turns the `case` guarding a selected building into its ordinary colour.
|
|
238
|
+
case 'to-boolean': {
|
|
239
|
+
const operand = constantOf(args[0]);
|
|
240
|
+
return operand ? !!operand.value : unchanged;
|
|
241
|
+
}
|
|
242
|
+
case '==':
|
|
243
|
+
case '!=':
|
|
244
|
+
case '<':
|
|
245
|
+
case '<=':
|
|
246
|
+
case '>':
|
|
247
|
+
case '>=': return compare(head, args) ?? unchanged;
|
|
248
|
+
// The colour idiom: take a configured colour apart, adjust a channel, put it back.
|
|
249
|
+
case 'to-hsla': {
|
|
250
|
+
const value = constantOf(args[0]);
|
|
251
|
+
const hsla = value ? toHsla(value.value) : null;
|
|
252
|
+
return hsla ? literal(hsla) : unchanged;
|
|
253
|
+
}
|
|
254
|
+
case 'hsl':
|
|
255
|
+
case 'hsla': {
|
|
256
|
+
const numbers = numbersOf(args);
|
|
257
|
+
if (!numbers || numbers.length < 3)
|
|
258
|
+
return unchanged;
|
|
259
|
+
return fromHsla(numbers[0], numbers[1], numbers[2], head === 'hsla' ? numbers[3] ?? 1 : 1);
|
|
260
|
+
}
|
|
261
|
+
case 'rgb':
|
|
262
|
+
case 'rgba': {
|
|
263
|
+
const numbers = numbersOf(args);
|
|
264
|
+
if (!numbers || numbers.length < 3)
|
|
265
|
+
return unchanged;
|
|
266
|
+
const [h, s, l, a] = rgbToHsl(numbers[0], numbers[1], numbers[2], head === 'rgba' ? numbers[3] ?? 1 : 1);
|
|
267
|
+
return fromHsla(h, s, l, a);
|
|
268
|
+
}
|
|
269
|
+
case 'at': {
|
|
270
|
+
const index = constantOf(args[0]);
|
|
271
|
+
const list = constantList(args[1]);
|
|
272
|
+
if (!list || !index || typeof index.value !== 'number')
|
|
273
|
+
return unchanged;
|
|
274
|
+
return index.value >= 0 && index.value < list.length ? literal(list[index.value]) : unchanged;
|
|
275
|
+
}
|
|
276
|
+
case '+':
|
|
277
|
+
case '*':
|
|
278
|
+
case '-':
|
|
279
|
+
case '/':
|
|
280
|
+
case '%':
|
|
281
|
+
case '^':
|
|
282
|
+
case 'min':
|
|
283
|
+
case 'max':
|
|
284
|
+
case 'abs':
|
|
285
|
+
case 'floor':
|
|
286
|
+
case 'ceil':
|
|
287
|
+
case 'round':
|
|
288
|
+
case 'sqrt': return arithmetic(head, args) ?? unchanged;
|
|
289
|
+
// `random(lo, hi, seed)` scatters a value per feature and CartoCSS has no seed to do it
|
|
290
|
+
// with, so it folds to the MIDDLE of its range - one green for every tree instead of a
|
|
291
|
+
// spread around one. The bounds are what carry the intent; the scatter is texture.
|
|
292
|
+
case 'random': {
|
|
293
|
+
const lo = constantOf(args[0]);
|
|
294
|
+
const hi = constantOf(args[1]);
|
|
295
|
+
if (typeof lo?.value !== 'number' || typeof hi?.value !== 'number')
|
|
296
|
+
return unchanged;
|
|
297
|
+
return (lo.value + hi.value) / 2;
|
|
298
|
+
}
|
|
299
|
+
case 'to-number': {
|
|
300
|
+
const value = constantOf(args[0]);
|
|
301
|
+
if (!value)
|
|
302
|
+
return unchanged;
|
|
303
|
+
const number = Number(value.value);
|
|
304
|
+
return Number.isFinite(number) ? number : unchanged;
|
|
305
|
+
}
|
|
306
|
+
case 'to-boolean': {
|
|
307
|
+
const value = constantOf(args[0]);
|
|
308
|
+
return value ? Boolean(value.value) : unchanged;
|
|
309
|
+
}
|
|
310
|
+
case 'to-string': {
|
|
311
|
+
const value = constantOf(args[0]);
|
|
312
|
+
return value && isScalar(value.value) ? String(value.value ?? '') : unchanged;
|
|
313
|
+
}
|
|
314
|
+
case 'concat': {
|
|
315
|
+
const parts = args.map((a) => constantOf(a));
|
|
316
|
+
return parts.every((p) => p && typeof p.value === 'string')
|
|
317
|
+
? parts.map((p) => p.value).join('') : unchanged;
|
|
318
|
+
}
|
|
319
|
+
case 'interpolate':
|
|
320
|
+
case 'step': return simplifyRamp(head, args) ?? unchanged;
|
|
321
|
+
default: return unchanged;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
function arithmetic(head, args) {
|
|
325
|
+
const value = compute(head, args);
|
|
326
|
+
// A NaN or an infinity reaching the stylesheet is a broken declaration, not a value; leaving
|
|
327
|
+
// the expression as it was gets it reported as untranslatable instead of drawn wrong.
|
|
328
|
+
return typeof value === 'number' && !Number.isFinite(value) ? null : value;
|
|
329
|
+
}
|
|
330
|
+
function compute(head, args) {
|
|
331
|
+
const numbers = numbersOf(args);
|
|
332
|
+
if (!numbers || numbers.length === 0)
|
|
333
|
+
return null;
|
|
334
|
+
switch (head) {
|
|
335
|
+
case '+': return numbers.reduce((a, b) => a + b);
|
|
336
|
+
case '*': return numbers.reduce((a, b) => a * b);
|
|
337
|
+
// MapBox's unary minus negates; with two arguments it subtracts.
|
|
338
|
+
case '-': return numbers.length === 1 ? -numbers[0] : numbers[0] - numbers[1];
|
|
339
|
+
case '/': return numbers.length === 2 && numbers[1] !== 0 ? numbers[0] / numbers[1] : null;
|
|
340
|
+
case '%': return numbers.length === 2 && numbers[1] !== 0 ? numbers[0] % numbers[1] : null;
|
|
341
|
+
case '^': return numbers.length === 2 ? Math.pow(numbers[0], numbers[1]) : null;
|
|
342
|
+
case 'min': return Math.min(...numbers);
|
|
343
|
+
case 'max': return Math.max(...numbers);
|
|
344
|
+
case 'abs': return Math.abs(numbers[0]);
|
|
345
|
+
case 'floor': return Math.floor(numbers[0]);
|
|
346
|
+
case 'ceil': return Math.ceil(numbers[0]);
|
|
347
|
+
case 'round': return Math.round(numbers[0]);
|
|
348
|
+
case 'sqrt': return Math.sqrt(numbers[0]);
|
|
349
|
+
default: return null;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
function compare(head, args) {
|
|
353
|
+
const left = constantOf(args[0]);
|
|
354
|
+
const right = constantOf(args[1]);
|
|
355
|
+
// A third argument is a collator, whose comparison is not this one.
|
|
356
|
+
if (!left || !right || args.length > 2)
|
|
357
|
+
return null;
|
|
358
|
+
if (head === '==')
|
|
359
|
+
return left.value === right.value;
|
|
360
|
+
if (head === '!=')
|
|
361
|
+
return left.value !== right.value;
|
|
362
|
+
if (typeof left.value !== typeof right.value)
|
|
363
|
+
return null;
|
|
364
|
+
const [a, b] = [left.value, right.value];
|
|
365
|
+
return head === '<' ? a < b : head === '<=' ? a <= b : head === '>' ? a > b : a >= b;
|
|
366
|
+
}
|
|
367
|
+
function simplifyMatch(args) {
|
|
368
|
+
const unchanged = ['match', ...args];
|
|
369
|
+
const input = constantOf(args[0]);
|
|
370
|
+
if (!input || args.length < 4 || args.length % 2 !== 0)
|
|
371
|
+
return unchanged;
|
|
372
|
+
for (let i = 1; i + 1 < args.length; i += 2) {
|
|
373
|
+
const raw = args[i];
|
|
374
|
+
// A label list is data, never an expression.
|
|
375
|
+
const labels = Array.isArray(raw) && raw[0] !== 'literal' ? raw : [constantOf(raw)?.value];
|
|
376
|
+
if (!labels.every((l) => isScalar(l)))
|
|
377
|
+
return unchanged;
|
|
378
|
+
if (labels.some((l) => l === input.value))
|
|
379
|
+
return args[i + 1];
|
|
380
|
+
}
|
|
381
|
+
return args[args.length - 1];
|
|
382
|
+
}
|
|
383
|
+
function simplifyCase(args) {
|
|
384
|
+
if (args.length < 3 || args.length % 2 !== 1)
|
|
385
|
+
return ['case', ...args];
|
|
386
|
+
const kept = [];
|
|
387
|
+
for (let i = 0; i + 1 < args.length; i += 2) {
|
|
388
|
+
const test = constantOf(args[i]);
|
|
389
|
+
if (!test) {
|
|
390
|
+
kept.push(args[i], args[i + 1]);
|
|
391
|
+
continue;
|
|
392
|
+
}
|
|
393
|
+
// A decided branch either wins outright - everything after it is dead - or is dropped.
|
|
394
|
+
if (test.value)
|
|
395
|
+
return kept.length === 0 ? args[i + 1] : ['case', ...kept, args[i + 1]];
|
|
396
|
+
}
|
|
397
|
+
const fallback = args[args.length - 1];
|
|
398
|
+
return kept.length === 0 ? fallback : ['case', ...kept, fallback];
|
|
399
|
+
}
|
|
400
|
+
function simplifyCoalesce(args) {
|
|
401
|
+
const kept = [];
|
|
402
|
+
for (const arg of args) {
|
|
403
|
+
const value = constantOf(arg);
|
|
404
|
+
if (value && value.value !== null)
|
|
405
|
+
return kept.length === 0 ? arg : ['coalesce', ...kept, arg];
|
|
406
|
+
if (!value)
|
|
407
|
+
kept.push(arg);
|
|
408
|
+
}
|
|
409
|
+
return kept.length === 0 ? null : kept.length === 1 ? kept[0] : ['coalesce', ...kept];
|
|
410
|
+
}
|
|
411
|
+
function simplifyLogic(head, args) {
|
|
412
|
+
const decisive = head !== 'all';
|
|
413
|
+
const kept = [];
|
|
414
|
+
for (const arg of args) {
|
|
415
|
+
const value = constantOf(arg);
|
|
416
|
+
if (!value) {
|
|
417
|
+
kept.push(arg);
|
|
418
|
+
continue;
|
|
419
|
+
}
|
|
420
|
+
if (Boolean(value.value) === decisive)
|
|
421
|
+
return decisive;
|
|
422
|
+
}
|
|
423
|
+
return kept.length === 0 ? !decisive : kept.length === args.length ? null : [head, ...kept];
|
|
424
|
+
}
|
|
425
|
+
/** A ramp over a now-constant input is just the value it lands on. */
|
|
426
|
+
function simplifyRamp(head, args) {
|
|
427
|
+
const inputIndex = head === 'interpolate' ? 1 : 0;
|
|
428
|
+
const input = constantOf(args[inputIndex]);
|
|
429
|
+
if (!input || typeof input.value !== 'number')
|
|
430
|
+
return null;
|
|
431
|
+
const stops = [];
|
|
432
|
+
const first = inputIndex + 1;
|
|
433
|
+
// `step`'s first argument after the input is the value BELOW every stop, so it is a stop at -inf.
|
|
434
|
+
if (head === 'step')
|
|
435
|
+
stops.push([-Infinity, args[first]]);
|
|
436
|
+
for (let i = head === 'step' ? first + 1 : first; i + 1 < args.length + 1 && i + 1 <= args.length; i += 2) {
|
|
437
|
+
const key = constantOf(args[i]);
|
|
438
|
+
if (!key || typeof key.value !== 'number')
|
|
439
|
+
return null;
|
|
440
|
+
stops.push([key.value, args[i + 1]]);
|
|
441
|
+
}
|
|
442
|
+
if (stops.length === 0)
|
|
443
|
+
return null;
|
|
444
|
+
let below = null;
|
|
445
|
+
let above = null;
|
|
446
|
+
for (const stop of stops) {
|
|
447
|
+
if (stop[0] <= input.value)
|
|
448
|
+
below = stop;
|
|
449
|
+
else {
|
|
450
|
+
above = stop;
|
|
451
|
+
break;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
// Outside the stops mapbox CLAMPS to the nearest end. Interpolating past the first one instead
|
|
455
|
+
// divides by a zero-width span: night's brightness of 0.06 under a ramp starting at 0.1 came
|
|
456
|
+
// out as a literal NaN in the opacity of every landuse polygon.
|
|
457
|
+
if (!below)
|
|
458
|
+
return stops[0][1];
|
|
459
|
+
if (!above || above[0] === below[0])
|
|
460
|
+
return below[1];
|
|
461
|
+
if (head === 'step' || below[0] === -Infinity)
|
|
462
|
+
return below[1];
|
|
463
|
+
const kind = args[0];
|
|
464
|
+
const linear = Array.isArray(kind) && (kind[0] === 'linear' || (kind[0] === 'exponential' && kind[1] === 1));
|
|
465
|
+
const [a, b] = [constantOf(below[1]), constantOf(above[1])];
|
|
466
|
+
const t = (input.value - below[0]) / (above[0] - below[0]);
|
|
467
|
+
// Stops that are still expressions cannot be blended - Standard ramps a per-feature `match`
|
|
468
|
+
// over the scene brightness, and at dusk the value lands between the two. Snapping to the
|
|
469
|
+
// nearer end keeps ONE value per property, which is what every preset sharing a style.mss
|
|
470
|
+
// depends on; the alternative is a colour that converts to nothing at that preset alone.
|
|
471
|
+
if (!a || !b)
|
|
472
|
+
return t < 0.5 ? below[1] : above[1];
|
|
473
|
+
if (!linear)
|
|
474
|
+
return null;
|
|
475
|
+
if (typeof a.value === 'number' && typeof b.value === 'number') {
|
|
476
|
+
return a.value + (b.value - a.value) * t;
|
|
477
|
+
}
|
|
478
|
+
// A colour ramp over the scene brightness is how Standard states a lit and an unlit form of the
|
|
479
|
+
// same colour, so it has to resolve too - in HSL, which is the space it wrote them in.
|
|
480
|
+
const [from, to] = [toHsla(a.value), toHsla(b.value)];
|
|
481
|
+
if (!from || !to)
|
|
482
|
+
return null;
|
|
483
|
+
const mix = (i) => from[i] + (to[i] - from[i]) * t;
|
|
484
|
+
// Round the hue the short way, or a ramp from 350 to 10 sweeps backwards through the wheel.
|
|
485
|
+
let hue = from[0] + (((to[0] - from[0]) % 360 + 540) % 360 - 180) * t;
|
|
486
|
+
hue = ((hue % 360) + 360) % 360;
|
|
487
|
+
return fromHsla(hue, mix(1), mix(2), mix(3));
|
|
488
|
+
}
|
|
489
|
+
/** The whole layer, folded - filter, layout and paint alike, since Standard keys all three. */
|
|
490
|
+
export function foldLayer(layer, values, scene = {}) {
|
|
491
|
+
// The icon's `params` have to be taken before the fold, which unwraps
|
|
492
|
+
// `["image", name, { params }]` down to the name. They are the icon's colours - a disc, its
|
|
493
|
+
// ring and the glyph - and the sheet bakes only the icon's OWN defaults into its flat render,
|
|
494
|
+
// so these are the only place the style's per-feature colours survive. Folded on their own,
|
|
495
|
+
// since they read `config` and `let` like the rest of the layer.
|
|
496
|
+
const params = foldImageParams(layer.layout?.['icon-image'], values, scene);
|
|
497
|
+
const folded = foldConfig(layer, values, scene);
|
|
498
|
+
if (!params)
|
|
499
|
+
return folded;
|
|
500
|
+
const scope = imageParamScope(layer.layout?.['icon-image']);
|
|
501
|
+
const layout = {
|
|
502
|
+
...folded.layout, [RECOLOURABLE_ICON]: true, [ICON_PARAMS]: params,
|
|
503
|
+
};
|
|
504
|
+
if (scope)
|
|
505
|
+
layout[ICON_PARAM_SCOPE] = scope;
|
|
506
|
+
return { ...folded, layout };
|
|
507
|
+
}
|
|
508
|
+
/** The synthetic layout keys foldLayer leaves behind; `icon-image` no longer says any of them. */
|
|
509
|
+
export const RECOLOURABLE_ICON = 'massif:recolourable-icon';
|
|
510
|
+
export const ICON_PARAMS = 'massif:icon-params';
|
|
511
|
+
export const ICON_PARAM_SCOPE = 'massif:icon-param-scope';
|
|
512
|
+
function hasImageParams(node) {
|
|
513
|
+
if (!Array.isArray(node))
|
|
514
|
+
return false;
|
|
515
|
+
if (node[0] === 'image' && node.length >= 3)
|
|
516
|
+
return true;
|
|
517
|
+
return node.some((child) => hasImageParams(child));
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* The branch the params belong to, when they do not cover the whole layer.
|
|
521
|
+
*
|
|
522
|
+
* Standard's transit label recolours seven networks by name and lets every other one through to the
|
|
523
|
+
* sheet's own artwork - `match(get(network), [bus, …], image(…, {params}), image(…))`. Applied to
|
|
524
|
+
* all of them, Paris's own metro roundel (white disc, blue ring, blue M) came out as the generic
|
|
525
|
+
* blue square with a white M. Null when the params cover everything, which needs no test at all.
|
|
526
|
+
*/
|
|
527
|
+
function imageParamScope(node) {
|
|
528
|
+
if (!Array.isArray(node))
|
|
529
|
+
return null;
|
|
530
|
+
if (node[0] === 'match' && node.length >= 5 && node.length % 2 === 1
|
|
531
|
+
&& !hasImageParams(node[node.length - 1])) {
|
|
532
|
+
let input = node[1];
|
|
533
|
+
while (Array.isArray(input) && (input[0] === 'string' || input[0] === 'to-string')) {
|
|
534
|
+
input = input[1];
|
|
535
|
+
}
|
|
536
|
+
if (Array.isArray(input) && input[0] === 'get' && typeof input[1] === 'string') {
|
|
537
|
+
for (let i = 2; i + 1 < node.length; i += 2) {
|
|
538
|
+
if (!hasImageParams(node[i + 1]))
|
|
539
|
+
continue;
|
|
540
|
+
const raw = Array.isArray(node[i]) ? node[i] : [node[i]];
|
|
541
|
+
if (!raw.every((label) => typeof label === 'string'))
|
|
542
|
+
return null;
|
|
543
|
+
return { field: input[1], labels: raw };
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
for (const child of node) {
|
|
548
|
+
const found = imageParamScope(child);
|
|
549
|
+
if (found)
|
|
550
|
+
return found;
|
|
551
|
+
}
|
|
552
|
+
return null;
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* The params of the FIRST `["image", name, { params }]` in the value, folded. A branching
|
|
556
|
+
* icon-image may state several - Standard's transit label recolours its known networks and falls
|
|
557
|
+
* through to a bare name - and one rule carries one set of colours, so the first is the rule's.
|
|
558
|
+
*
|
|
559
|
+
* Folded IN PLACE of that image node where the tree allows, because the bindings around it are
|
|
560
|
+
* still in scope there: Standard's POI icon decomposes its colour into four `let` vars before
|
|
561
|
+
* naming the icon, and the params read them. Taken out and folded alone they are `["var", …]` and
|
|
562
|
+
* nothing resolves - which cost the POI disc its class colour. A tree that does not collapse to
|
|
563
|
+
* the params (a `match` on a FEATURE field keeps every branch) falls back to folding them alone,
|
|
564
|
+
* which is enough where the params read only `config`.
|
|
565
|
+
*/
|
|
566
|
+
function foldImageParams(image, values, scene) {
|
|
567
|
+
let params = null;
|
|
568
|
+
const substitute = (node) => {
|
|
569
|
+
if (params !== null || !Array.isArray(node))
|
|
570
|
+
return node;
|
|
571
|
+
if (node[0] === 'image' && node.length >= 3 && node[2] && typeof node[2] === 'object' && !Array.isArray(node[2])) {
|
|
572
|
+
const own = node[2].params;
|
|
573
|
+
if (own && typeof own === 'object' && !Array.isArray(own)) {
|
|
574
|
+
params = own;
|
|
575
|
+
return own;
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
return node.map(substitute);
|
|
579
|
+
};
|
|
580
|
+
const substituted = substitute(image);
|
|
581
|
+
if (params === null)
|
|
582
|
+
return null;
|
|
583
|
+
const inPlace = foldConfig(substituted, values, scene);
|
|
584
|
+
if (inPlace && typeof inPlace === 'object' && !Array.isArray(inPlace))
|
|
585
|
+
return inPlace;
|
|
586
|
+
return foldConfig(params, values, scene);
|
|
587
|
+
}
|
|
588
|
+
//# sourceMappingURL=fold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fold.js","sourceRoot":"","sources":["../../src/mapbox2css/fold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the sprite slicer needs from the world outside it: bytes in, PNGs decoded and encoded,
|
|
3
|
+
* files out.
|
|
4
|
+
*
|
|
5
|
+
* The conversion itself is plain data work and runs anywhere, but sprites are the one part that
|
|
6
|
+
* reads the network and writes files. Behind this interface the CLI keeps using `node:fs` and
|
|
7
|
+
* `pngjs`, and the website's style preview uses `fetch` and a canvas — which is what lets the
|
|
8
|
+
* whole converter be bundled for a browser, since neither of those two imports survives there.
|
|
9
|
+
*/
|
|
10
|
+
export function createImage(width, height) {
|
|
11
|
+
return { width, height, data: new Uint8Array(width * height * 4) };
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/mapbox2css/host.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA2BH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,MAAc;IACrD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;AACvE,CAAC"}
|