diff options
author | Christoph Cullmann <cullmann@kde.org> | 2021-02-18 22:21:36 +0100 |
---|---|---|
committer | Christoph Cullmann <cullmann@kde.org> | 2021-02-18 22:21:36 +0100 |
commit | 0c7cb4486a89ec6fe9680e6569ef41d4b82d557d (patch) | |
tree | 081941052bcab0caf69487b6bf5ab2df5deb3b7b /themes/LoveIt/assets/lib/mapbox-gl/mapbox-gl-language.js | |
parent | 640572ecab69291d2c266de2011b795a861e7c21 (diff) |
use maintained theme
Diffstat (limited to 'themes/LoveIt/assets/lib/mapbox-gl/mapbox-gl-language.js')
-rw-r--r-- | themes/LoveIt/assets/lib/mapbox-gl/mapbox-gl-language.js | 260 |
1 files changed, 0 insertions, 260 deletions
diff --git a/themes/LoveIt/assets/lib/mapbox-gl/mapbox-gl-language.js b/themes/LoveIt/assets/lib/mapbox-gl/mapbox-gl-language.js deleted file mode 100644 index bda7206..0000000 --- a/themes/LoveIt/assets/lib/mapbox-gl/mapbox-gl-language.js +++ /dev/null @@ -1,260 +0,0 @@ -/** - * Create a new [Mapbox GL JS plugin](https://www.mapbox.com/blog/build-mapbox-gl-js-plugins/) that - * modifies the layers of the map style to use the 'text-field' that matches the browser language. - * @constructor - * @param {object} options - Options to configure the plugin. - * @param {string[]} [options.supportedLanguages] - List of supported languages - * @param {Function} [options.languageTransform] - Custom style transformation to apply - * @param {RegExp} [options.languageField=/^\{name/] - RegExp to match if a text-field is a language field - * @param {Function} [options.getLanguageField] - Given a language choose the field in the vector tiles - * @param {string} [options.languageSource] - Name of the source that contains the different languages. - * @param {string} [options.defaultLanguage] - Name of the default language to initialize style after loading. - * @param {string[]} [options.excludedLayerIds] - Name of the layers that should be excluded from translation. - */ -function MapboxLanguage(options) { - options = Object.assign({}, options); - if (!(this instanceof MapboxLanguage)) { - throw new Error('MapboxLanguage needs to be called with the new keyword'); - } - - this.setLanguage = this.setLanguage.bind(this); - this._initialStyleUpdate = this._initialStyleUpdate.bind(this); - - this._defaultLanguage = options.defaultLanguage; - this._isLanguageField = options.languageField || /^\{name/; - this._getLanguageField = options.getLanguageField || function nameField(language) { - return language === 'mul' ? '{name}' : '{name_' + language + '}'; - }; - this._languageSource = options.languageSource || null; - this._languageTransform = options.languageTransform || function (style, language) { - if (language === 'ar') { - return noSpacing(style); - } else { - return standardSpacing(style); - } - }; - this._excludedLayerIds = options.excludedLayerIds || []; - this.supportedLanguages = options.supportedLanguages || ['ar', 'en', 'es', 'fr', 'de', 'ja', 'ko', 'mul', 'pt', 'ru', 'zh']; -} - -function standardSpacing(style) { - var changedLayers = style.layers.map(function (layer) { - if (!(layer.layout || {})['text-field']) return layer; - var spacing = 0; - if (layer['source-layer'] === 'state_label') { - spacing = 0.15; - } - if (layer['source-layer'] === 'marine_label') { - if (/-lg/.test(layer.id)) { - spacing = 0.25; - } - if (/-md/.test(layer.id)) { - spacing = 0.15; - } - if (/-sm/.test(layer.id)) { - spacing = 0.1; - } - } - if (layer['source-layer'] === 'place_label') { - if (/-suburb/.test(layer.id)) { - spacing = 0.15; - } - if (/-neighbour/.test(layer.id)) { - spacing = 0.1; - } - if (/-islet/.test(layer.id)) { - spacing = 0.01; - } - } - if (layer['source-layer'] === 'airport_label') { - spacing = 0.01; - } - if (layer['source-layer'] === 'rail_station_label') { - spacing = 0.01; - } - if (layer['source-layer'] === 'poi_label') { - if (/-scalerank/.test(layer.id)) { - spacing = 0.01; - } - } - if (layer['source-layer'] === 'road_label') { - if (/-label-/.test(layer.id)) { - spacing = 0.01; - } - if (/-shields/.test(layer.id)) { - spacing = 0.05; - } - } - return Object.assign({}, layer, { - layout: Object.assign({}, layer.layout, { - 'text-letter-spacing': spacing - }) - }); - }); - - return Object.assign({}, style, { - layers: changedLayers - }); -} - -function noSpacing(style) { - var changedLayers = style.layers.map(function (layer) { - if (!(layer.layout || {})['text-field']) return layer; - var spacing = 0; - return Object.assign({}, layer, { - layout: Object.assign({}, layer.layout, { - 'text-letter-spacing': spacing - }) - }); - }); - - return Object.assign({}, style, { - layers: changedLayers - }); -} - -function isNameStringField(isLangField, property) { - return typeof property === 'string' && isLangField.test(property); -} - -function isNameFunctionField(isLangField, property) { - return property.stops && property.stops.filter(function (stop) { - return isLangField.test(stop[1]); - }).length > 0; -} - -function adaptPropertyLanguage(isLangField, property, languageFieldName) { - if (isNameStringField(isLangField, property)) return languageFieldName; - if (isNameFunctionField(isLangField, property)) { - var newStops = property.stops.map(function (stop) { - if (isLangField.test(stop[1])) { - return [stop[0], languageFieldName]; - } - return stop; - }); - return Object.assign({}, property, { - stops: newStops - }); - } - return property; -} - -function changeLayerTextProperty(isLangField, layer, languageFieldName, excludedLayerIds) { - if (layer.layout && layer.layout['text-field'] && excludedLayerIds.indexOf(layer.id) === -1) { - return Object.assign({}, layer, { - layout: Object.assign({}, layer.layout, { - 'text-field': adaptPropertyLanguage(isLangField, layer.layout['text-field'], languageFieldName) - }) - }); - } - return layer; -} - -function findStreetsSource(style) { - var sources = Object.keys(style.sources).filter(function (sourceName) { - var source = style.sources[sourceName]; - return /mapbox-streets-v\d/.test(source.url); - }); - return sources[0]; -} - -/** - * Explicitly change the language for a style. - * @param {object} style - Mapbox GL style to modify - * @param {string} language - The language iso code - * @returns {object} the modified style - */ -MapboxLanguage.prototype.setLanguage = function (style, language) { - if (this.supportedLanguages.indexOf(language) < 0) throw new Error('Language ' + language + ' is not supported'); - var streetsSource = this._languageSource || findStreetsSource(style); - if (!streetsSource) return style; - - var field = this._getLanguageField(language); - var isLangField = this._isLanguageField; - var excludedLayerIds = this._excludedLayerIds; - var changedLayers = style.layers.map(function (layer) { - if (layer.source === streetsSource) return changeLayerTextProperty(isLangField, layer, field, excludedLayerIds); - return layer; - }); - - var languageStyle = Object.assign({}, style, { - layers: changedLayers - }); - - return this._languageTransform(languageStyle, language); -}; - -MapboxLanguage.prototype._initialStyleUpdate = function () { - var style = this._map.getStyle(); - var language = this._defaultLanguage || browserLanguage(this.supportedLanguages); - - // We only update the style once - this._map.off('styledata', this._initialStyleUpdate); - this._map.setStyle(this.setLanguage(style, language)); -}; - -function browserLanguage(supportedLanguages) { - var language = navigator.languages ? navigator.languages[0] : (navigator.language || navigator.userLanguage); - var parts = language.split('-'); - var languageCode = language; - if (parts.length > 1) { - languageCode = parts[0]; - } - if (supportedLanguages.indexOf(languageCode) > -1) { - return languageCode; - } - return null; -} - -MapboxLanguage.prototype.onAdd = function (map) { - this._map = map; - this._map.on('styledata', this._initialStyleUpdate); - this._container = document.createElement('div'); - return this._container; -}; - -MapboxLanguage.prototype.onRemove = function () { - this._map.off('styledata', this._initialStyleUpdate); - this._map = undefined; -}; - -function ie11Polyfill() { - if (typeof Object.assign != 'function') { - // Must be writable: true, enumerable: false, configurable: true - Object.defineProperty(Object, 'assign', { - // eslint-disable-next-line no-unused-vars - value: function assign(target, varArgs) { // .length of function is 2 - // eslint-disable-next-line strict - 'use strict'; - if (target === null) { // TypeError if undefined or null - throw new TypeError('Cannot convert undefined or null to object'); - } - - var to = Object(target); - - for (var index = 1; index < arguments.length; index++) { - var nextSource = arguments[index]; - - if (nextSource !== null) { // Skip over if undefined or null - for (var nextKey in nextSource) { - // Avoid bugs when hasOwnProperty is shadowed - if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { - to[nextKey] = nextSource[nextKey]; - } - } - } - } - return to; - }, - writable: true, - configurable: true - }); - } -} - -if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { - module.exports = MapboxLanguage; -} else { - ie11Polyfill(); - window.MapboxLanguage = MapboxLanguage; -} |