From 989e34457bbae61c3bfc80e0b1fd0d95d6ae1182 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 13 Oct 2016 11:50:31 +0300 Subject: [PATCH 1/3] support numeric-precision layout property for tokenizing text --- js/symbol/resolve_text.js | 6 ++++-- js/util/token.js | 8 ++++++-- test/js/util/token.test.js | 1 + 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/js/symbol/resolve_text.js b/js/symbol/resolve_text.js index c38cbf7db7e..4dac5d33170 100644 --- a/js/symbol/resolve_text.js +++ b/js/symbol/resolve_text.js @@ -13,16 +13,18 @@ module.exports = resolveText; */ function resolveText(features, layoutProperties, codepoints) { var textFeatures = []; + var textField = layoutProperties['text-field']; + var transform = layoutProperties['text-transform']; + var numericMultiplier = Math.pow(10, layoutProperties['numeric-precision']); for (var i = 0, fl = features.length; i < fl; i++) { - var text = resolveTokens(features[i].properties, layoutProperties['text-field']); + var text = resolveTokens(features[i].properties, textField, numericMultiplier); if (!text) { textFeatures[i] = null; continue; } text = text.toString(); - var transform = layoutProperties['text-transform']; if (transform === 'uppercase') { text = text.toLocaleUpperCase(); } else if (transform === 'lowercase') { diff --git a/js/util/token.js b/js/util/token.js index 814c070bf5b..b6949daadef 100644 --- a/js/util/token.js +++ b/js/util/token.js @@ -10,8 +10,12 @@ module.exports = resolveTokens; * @returns {string} the template with tokens replaced * @private */ -function resolveTokens(properties, text) { +function resolveTokens(properties, text, numericMultiplier) { return text.replace(/{([^{}]+)}/g, function(match, key) { - return key in properties ? properties[key] : ''; + var value = key in properties ? properties[key] : ''; + if (typeof value === 'number' && numericMultiplier !== undefined) { + value = Math.round(value * numericMultiplier) / numericMultiplier; + } + return value; }); } diff --git a/test/js/util/token.test.js b/test/js/util/token.test.js index 066d36767db..ba952ea4ba0 100644 --- a/test/js/util/token.test.js +++ b/test/js/util/token.test.js @@ -14,6 +14,7 @@ test('token', function(t) { t.equal('dashed', resolveTokens({'dashed-property': 'dashed'}, '{dashed-property}')); t.equal('150 m', resolveTokens({'HØYDE': 150}, '{HØYDE} m')); t.equal('mapbox', resolveTokens({'$special:characters;': 'mapbox'}, '{$special:characters;}')); + t.equal('12.345 m', resolveTokens({foo: 12.345178911111}, '{foo} m', 1e3)); t.end(); }); From 4e64e06d875caa6e1b07f9362b509577ab78235e Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 13 Oct 2016 11:55:11 +0300 Subject: [PATCH 2/3] fix text fields without numeric precision set --- js/symbol/resolve_text.js | 3 ++- js/util/token.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/js/symbol/resolve_text.js b/js/symbol/resolve_text.js index 4dac5d33170..da6537a0237 100644 --- a/js/symbol/resolve_text.js +++ b/js/symbol/resolve_text.js @@ -15,7 +15,8 @@ function resolveText(features, layoutProperties, codepoints) { var textFeatures = []; var textField = layoutProperties['text-field']; var transform = layoutProperties['text-transform']; - var numericMultiplier = Math.pow(10, layoutProperties['numeric-precision']); + var numericPrecision = layoutProperties['numeric-precision']; + var numericMultiplier = numericPrecision ? Math.pow(10, numericPrecision) : null; for (var i = 0, fl = features.length; i < fl; i++) { var text = resolveTokens(features[i].properties, textField, numericMultiplier); diff --git a/js/util/token.js b/js/util/token.js index b6949daadef..83554bf56d5 100644 --- a/js/util/token.js +++ b/js/util/token.js @@ -13,7 +13,7 @@ module.exports = resolveTokens; function resolveTokens(properties, text, numericMultiplier) { return text.replace(/{([^{}]+)}/g, function(match, key) { var value = key in properties ? properties[key] : ''; - if (typeof value === 'number' && numericMultiplier !== undefined) { + if (typeof value === 'number' && numericMultiplier != null) { value = Math.round(value * numericMultiplier) / numericMultiplier; } return value; From ae713d7ea77bb2b1efcbf0bdfa3ac88eae68aa86 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Thu, 13 Oct 2016 12:04:30 +0300 Subject: [PATCH 3/3] add a default for numeric precision; handle 0 values --- js/symbol/resolve_text.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/symbol/resolve_text.js b/js/symbol/resolve_text.js index da6537a0237..697c481c1a4 100644 --- a/js/symbol/resolve_text.js +++ b/js/symbol/resolve_text.js @@ -16,7 +16,8 @@ function resolveText(features, layoutProperties, codepoints) { var textField = layoutProperties['text-field']; var transform = layoutProperties['text-transform']; var numericPrecision = layoutProperties['numeric-precision']; - var numericMultiplier = numericPrecision ? Math.pow(10, numericPrecision) : null; + if (numericPrecision === undefined) numericPrecision = 8; // to be replaced with spec default + var numericMultiplier = Math.pow(10, numericPrecision); for (var i = 0, fl = features.length; i < fl; i++) { var text = resolveTokens(features[i].properties, textField, numericMultiplier);