loleaflet/.eslintignore | 1 loleaflet/Makefile.am | 31 ++++- loleaflet/README | 3 loleaflet/js/l10n.js | 284 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 314 insertions(+), 5 deletions(-)
New commits: commit 8ce1846e5e4e2f663f390ff7e0e21ab24df5c843 Author: Henry Castro <hcas...@collabora.com> AuthorDate: Wed Feb 19 10:17:31 2020 -0400 Commit: Henry Castro <hcas...@collabora.com> CommitDate: Wed Feb 19 17:32:10 2020 +0100 loleaflet: import l10n.js library The file was imported from node_modules/l10n-for-node/l10n.js, the main reason is to analyze the source code, debug and patch if necessary To obtain the source code from npm repository make libs Change-Id: I7bd4d400c504f57a94566e187c6d26361aed8bd0 Reviewed-on: https://gerrit.libreoffice.org/c/online/+/89043 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Henry Castro <hcas...@collabora.com> diff --git a/loleaflet/.eslintignore b/loleaflet/.eslintignore index 6f11545b6..4d6c90ac9 100644 --- a/loleaflet/.eslintignore +++ b/loleaflet/.eslintignore @@ -1,4 +1,5 @@ # We only directly edit toolbar.js in dist/ +**/js/l10n.js **/js/w2ui-1.5.rc1.js **/src/unocommands.js **/src/viamapi-client.js diff --git a/loleaflet/Makefile.am b/loleaflet/Makefile.am index edc6551aa..e52c2288a 100644 --- a/loleaflet/Makefile.am +++ b/loleaflet/Makefile.am @@ -60,6 +60,20 @@ $(foreach file,$(1),$(call file_target,\ $(file))) endef +define npm_source + for package in $(1); do \ + npm pack $${package}; \ + fname=$$(ls *.tgz); \ + pdir=$${fname%%.tgz}; \ + mkdir -p $${pdir}; \ + tar -xzf $${fname} -C $${pdir} --strip-components=1; \ + rm $${fname}; \ + done +endef + +NODE_MODULES_SRC =\ + l10n-for-node@0.0.1 + LOLEAFLET_CSS =\ $(builddir)/node_modules/select2/dist/css/select2.css \ $(srcdir)/css/w2ui-1.5.rc1.css \ @@ -111,15 +125,17 @@ NODE_MODULES_JS =\ node_modules/vex-js/dist/js/vex.combined.js \ node_modules/@braintree/sanitize-url/dist.js -LOLEAFLET_LIBS_JS =\ - jquery.mCustomScrollbar.js \ - w2ui-1.5.rc1.js +LOLEAFLET_LIBS_JS = if !ENABLE_MOBILEAPP -NODE_MODULES_JS +=\ - node_modules/l10n-for-node/l10n.js +LOLEAFLET_LIBS_JS +=\ + l10n.js endif +LOLEAFLET_LIBS_JS +=\ + jquery.mCustomScrollbar.js \ + w2ui-1.5.rc1.js + NODE_MODULES_JS_SRC = $(patsubst %.js,$(builddir)/%.js,$(NODE_MODULES_JS)) NODE_MODULES_JS_DST = $(patsubst %.js,$(builddir)/dist/%.js,$(NODE_MODULES_JS)) @@ -331,6 +347,11 @@ install-data-hook: mkdir -p $(DESTDIR)$(pkgdatadir)/loleaflet; \ cp -ar dist/ $(DESTDIR)$(pkgdatadir)/loleaflet/; +libs: + @mkdir -p $(abs_srcdir)/libs + @cd $(abs_srcdir)/libs \ + && $(call npm_source,$(NODE_MODULES_SRC)) + pot: xgettext --from-code=UTF-8 --keyword=_ --output=po/templates/loleaflet-ui.pot \ admin/admin.strings.js \ diff --git a/loleaflet/README b/loleaflet/README index d9faac10f..d9a3dbddc 100644 --- a/loleaflet/README +++ b/loleaflet/README @@ -38,6 +38,9 @@ To update any of the dependency, process often goes like this: If you have not installed `shrinkpack' globally using `npm install -g shrinkpack@next', it should be in node_modules/.bin/shrinkpack, so you can use the binary from there. +If you need to get the sources: + make libs + Building -------- diff --git a/loleaflet/js/l10n.js b/loleaflet/js/l10n.js new file mode 100644 index 000000000..4beab6e7a --- /dev/null +++ b/loleaflet/js/l10n.js @@ -0,0 +1,284 @@ +/* + * l10n.js + * 2016-05-17 + * + * By Eli Grey, http://eligrey.com + * Licensed under the MIT License + * See https://github.com/eligrey/l10n.js/blob/master/LICENSE.md + */ + +/*global XMLHttpRequest, setTimeout, document, navigator, ActiveXObject*/ + +/*! @source http://purl.eligrey.com/github/l10n.js/blob/master/l10n.js*/ + +(function () { +"use strict"; + +var + undef_type = "undefined" +, string_type = "string" +, nav = {} +, String_ctr = String +, has_own_prop = Object.prototype.hasOwnProperty +, load_queues = {} +, localizations = {} +, FALSE = !1 +, TRUE = !0 +, browserless = FALSE +// the official format is application/vnd.oftn.l10n+json, though l10n.js will also +// accept application/x-l10n+json and application/l10n+json +, l10n_js_media_type = /^\s*application\/(?:vnd\.oftn\.|x-)?l10n\+json\s*(?:$|;)/i +, XHR + +// property minification aids +, $locale = "locale" +, $default_locale = "defaultLocale" +, $to_locale_string = "toLocaleString" +, $to_lowercase = "toLowerCase" + +, array_index_of = Array.prototype.indexOf || function (item) { + var + len = this.length + , i = 0 + ; + + for (; i < len; i++) { + if (i in this && this[i] === item) { + return i; + } + } + + return -1; +} +, request_JSON = function (uri) { + if(browserless) + return loadFromDisk(uri); + + var req = new XHR(), + data = {}; + + // sadly, this has to be blocking to allow for a graceful degrading API + req.open("GET", uri, FALSE); + req.send(null); + + // Status codes can be inconsistent across browsers so we simply try to parse + // the response text and catch any errors. This deals with failed requests as + // well as malformed json files. + try { + data = JSON.parse(req.responseText); + } catch(e) { + // warn about error without stopping execution + setTimeout(function () { + // Error messages are not localized as not to cause an infinite loop + var l10n_err = new Error("Unable to load localization data: " + uri); + l10n_err.name = "Localization Error"; + throw l10n_err; + }, 0); + } + + return data; +} +, load = String_ctr[$to_locale_string] = function (data) { + // don't handle function.toLocaleString(indentationAmount:Number) + if (arguments.length > 0 && typeof data !== "number") { + if (typeof data === string_type) { + load(request_JSON(data)); + } else if (data === FALSE) { + // reset all localizations + localizations = {}; + } else { + // Extend current localizations instead of completely overwriting them + var locale, localization, message; + for (locale in data) { + if (has_own_prop.call(data, locale)) { + localization = data[locale]; + locale = locale[$to_lowercase](); + + if (!(locale in localizations) || localization === FALSE) { + // reset locale if not existing or reset flag is specified + localizations[locale] = {}; + } + + if (localization === FALSE) { + continue; + } + + // URL specified + if (typeof localization === string_type) { + if (String_ctr[$locale][$to_lowercase]().indexOf(locale) === 0) { + localization = request_JSON(localization); + } else { + // queue loading locale if not needed + if (!(locale in load_queues)) { + load_queues[locale] = []; + } + load_queues[locale].push(localization); + continue; + } + } + + for (message in localization) { + if (has_own_prop.call(localization, message)) { + localizations[locale][message] = localization[message]; + } + } + } + } + } + } + // Return what function.toLocaleString() normally returns + return Function.prototype[$to_locale_string].apply(String_ctr, arguments); +} +, loadFromDisk = String_ctr[$to_locale_string] = function (uri) { + const fs = require('fs'); + var read = fs.readFileSync(uri, 'utf8'); + return JSON.parse(read); +} +, process_load_queue = function (locale) { + var + queue = load_queues[locale] + , i = 0 + , len = queue.length + , localization + ; + + for (; i < len; i++) { + localization = {}; + localization[locale] = request_JSON(queue[i]); + load(localization); + } + + delete load_queues[locale]; +} +, use_default +, localize = String_ctr.prototype[$to_locale_string] = function () { + var + using_default = use_default + , current_locale = String_ctr[using_default ? $default_locale : $locale] + , parts = current_locale[$to_lowercase]().split("-") + , i = parts.length + , this_val = this.valueOf() + , locale + ; + + use_default = FALSE; + + // Iterate through locales starting at most-specific until a localization is found + do { + locale = parts.slice(0, i).join("-"); + // load locale if not loaded + if (locale in load_queues) { + process_load_queue(locale); + } + if (locale in localizations && this_val in localizations[locale]) { + return localizations[locale][this_val]; + } + } + while (i--); + + if (!using_default && String_ctr[$default_locale]) { + use_default = TRUE; + return localize.call(this_val); + } + + return this_val; +} +; + +try +{ + nav = self.navigator; +} +catch(selfNotFoundException) +{ + if(global.nav) + { + nav = global.nav; + } + else + { + var nodeError = "Problem setting nav in L10N. You are most likely running in a non-browser environment like Node." + + "If this is the case, you can resolve this error by setting global.nav to an object which contains a \"language\" field. "; + throw new Error(nodeError); + } + browserless = TRUE; +} + +if (!browserless && typeof XMLHttpRequest === undef_type && typeof ActiveXObject !== undef_type) { + var AXO = ActiveXObject; + + XHR = function () { + try { + return new AXO("Msxml2.XMLHTTP.6.0"); + } catch (xhrEx1) {} + try { + return new AXO("Msxml2.XMLHTTP.3.0"); + } catch (xhrEx2) {} + try { + return new AXO("Msxml2.XMLHTTP"); + } catch (xhrEx3) {} + + throw new Error("XMLHttpRequest not supported by this browser."); + }; +} else { + try + { + XHR = XMLHttpRequest; + } + catch(xhrEx4) + { + if(global.XMLHttpRequest) { + XHR = global.XMLHttpRequest; + } + else { + var nodeError = "Problem setting XHR in L10N. You are most likely running in a non-browser environment like Node." + + "If this is the case, you can resolve this error by setting global.XMLHttpRequest to a function which produces XMLHttpRequests. " + + "\nTip: if you are using node, you might want to use the XHR2 package (usage: global.XMLHttpRequest = require('xhr2')"; + throw new Error(nodeError); + } + } +} + +String_ctr[$default_locale] = String_ctr[$default_locale] || ""; +String_ctr[$locale] = nav && (nav.language || nav.userLanguage) || ""; + +if (!browserless || typeof document !== undef_type) { + var + elts = document.getElementsByTagName("link") + , i = elts.length + , localization + ; + + while (i--) { + var + elt = elts[i] + , rel = (elt.getAttribute("rel") || "")[$to_lowercase]().split(/\s+/) + ; + + if (l10n_js_media_type.test(elt.type)) { + if (array_index_of.call(rel, "localizations") !== -1) { + // multiple localizations + load(elt.getAttribute("href")); + } else if (array_index_of.call(rel, "localization") !== -1) { + // single localization + localization = {}; + localization[(elt.getAttribute("hreflang") || "")[$to_lowercase]()] = + elt.getAttribute("href"); + load(localization); + } + } + } +} +else +{ + if(global.l10NLocalFilePath) { + load(global.l10NLocalFilePath); + } + else { + var nodeError = "Problem loading localization file. You are most likely running in a non-browser environment like Node." + + "If this is the case, you can resolve this error by setting global.l10NLocalFilePath to the path of your localization file. "; + throw new Error(nodeError); + } +} + +}()); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits