[Libreoffice-commits] online.git: loleaflet/.eslintignore loleaflet/js loleaflet/Makefile.am loleaflet/README

Henry Castro (via logerrit) logerrit at kemper.freedesktop.org
Wed Feb 19 16:32:31 UTC 2020


 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 <hcastro at collabora.com>
AuthorDate: Wed Feb 19 10:17:31 2020 -0400
Commit:     Henry Castro <hcastro at 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 <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Henry Castro <hcastro at 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 at 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 at 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); 
+    }
+}
+
+}());


More information about the Libreoffice-commits mailing list