Formatting and VSCode Workspace

This commit is contained in:
Michael Fabian 'Xaymar' Dirks
2019-11-03 11:37:41 +01:00
parent f3eb46e2ba
commit 46e031d24a
3 changed files with 244 additions and 199 deletions
+1 -5
View File
@@ -14,13 +14,9 @@
"error",
"tab"
],
"linebreak-style": [
"error",
"unix"
],
"quotes": [
"error",
"single"
"double"
],
"semi": [
"error",
+19
View File
@@ -0,0 +1,19 @@
{
"folders": [
{
"path": "."
}
],
"settings": {
"editor.defaultFormatter": "dbaeumer.vscode-eslint",
"editor.formatOnPaste": true,
"editor.formatOnSave": true,
"[javascript]": {
"editor.defaultFormatter": "vscode.typescript-language-features"
},
"typescript.preferences.quoteStyle": "double",
"typescript.format.semicolons": "insert",
"javascript.preferences.quoteStyle": "double",
"javascript.format.semicolons": "insert"
}
}
+100 -70
View File
@@ -1,4 +1,4 @@
'use strict';
"use strict";
/*
Internationalization Class for JavaScript
@@ -93,7 +93,7 @@ class I18n {
* @param {string} baseLanguageKey Key to use for base language overrides. (Default = _base)
* @throws Exception on invalid parameters.
*/
constructor(defaultLanguage, baseLanguageKey = '_base') {
constructor(defaultLanguage, baseLanguageKey = "_base") {
this._sanitizeLanguage(defaultLanguage);
this._verifyKey(baseLanguageKey);
@@ -103,9 +103,9 @@ class I18n {
this.baseLanguageKey = baseLanguageKey;
this.events = {
'missingkey': new Map(),
'missinglanguage': new Map(),
'change': new Map(),
missingkey: new Map(),
missinglanguage: new Map(),
change: new Map()
};
this.dirtyTs = performance.now();
@@ -122,7 +122,7 @@ class I18n {
this.dirtyTs = performance.now();
// Event: onchange
this._callEvent('change');
this._callEvent("change");
}
/** Retrieve the global base language.
@@ -154,7 +154,7 @@ class I18n {
this.dirtyTs = performance.now();
// Event: onchange
this._callEvent('change');
this._callEvent("change");
}
/** Load a new language.
@@ -165,7 +165,7 @@ class I18n {
* @returns {Promise}
* @throws Exception on invalid parameters or invalid data.
*/
loadLanguage(language, data, encoding = 'utf-8') {
loadLanguage(language, data, encoding = "utf-8") {
// Verify input.
language = this._sanitizeLanguage(language);
this._verifyData(data);
@@ -173,36 +173,37 @@ class I18n {
return new Promise((resolve, reject) => {
// Decode data from various forms.
let decodePromise;
if ((data instanceof File) || (data instanceof Blob)) {
if (data instanceof File || data instanceof Blob) {
decodePromise = new Promise((fileResolve, fileReject) => {
let freader = new FileReader();
freader.onload(() => {
fileResolve(JSON.parse(freader.result));
});
freader.onabort((ev) => {
freader.onabort(ev => {
fileReject(ev);
});
freader.onerror((ev) => {
freader.onerror(ev => {
fileReject(ev);
});
freader.readAsText(data, encoding);
});
} else if (typeof (data) == 'string') {
} else if (typeof data == "string") {
decodePromise = new Promise((parseResolve, parseReject) => {
parseReject;
parseResolve(JSON.parse(data));
});
} else if (typeof (data) == 'object') {
} else if (typeof data == "object") {
decodePromise = new Promise((passResolve, passReject) => {
passReject;
passResolve(data);
});
} else {
reject('invalid data');
reject("invalid data");
}
// Load Data
decodePromise.then((result) => {
decodePromise.then(
result => {
let language_map = new Map();
for (let key in result) {
language_map.set(key, result[key]);
@@ -212,12 +213,14 @@ class I18n {
this.dirtyTs = performance.now();
// Event: onchange
this._callEvent('change');
this._callEvent("change");
resolve(language);
}, (reason) => {
},
reason => {
reject(reason);
});
}
);
});
}
@@ -259,7 +262,7 @@ class I18n {
this.dirtyTs = performance.now();
// Event: onchange
this._callEvent('change');
this._callEvent("change");
}
/** Clear a key from a language.
@@ -290,7 +293,7 @@ class I18n {
}
// Event: onchange
this._callEvent('change');
this._callEvent("change");
return true;
}
@@ -314,7 +317,7 @@ class I18n {
// Set key.
let language_map = this.languages.get(language);
if ((language_map.has(key)) && !force) {
if (language_map.has(key) && !force) {
return false;
}
language_map.set(key, value);
@@ -325,7 +328,7 @@ class I18n {
}
// Event: onchange
this._callEvent('change');
this._callEvent("change");
return true;
}
@@ -354,15 +357,15 @@ class I18n {
* @return {string} Id of the event (for unhooking).
*/
hook(event, callback) {
if (typeof (event) != 'string') {
throw 'event must be a string';
if (typeof event != "string") {
throw "event must be a string";
}
event = event.toLowerCase();
if (typeof (callback) != 'function') {
throw 'callback must be a function';
if (typeof callback != "function") {
throw "callback must be a function";
}
if (this.events[event] == undefined) {
throw 'event is unknown';
throw "event is unknown";
}
let uid = this._uuid();
@@ -372,15 +375,15 @@ class I18n {
}
unhook(event, callbackid) {
if (typeof (event) != 'string') {
throw 'event must be a string';
if (typeof event != "string") {
throw "event must be a string";
}
event = event.toLowerCase();
if (typeof (event) != 'number') {
throw 'callbackid must be a number';
if (typeof event != "number") {
throw "callbackid must be a number";
}
if (this.events[event] == undefined) {
throw 'event is unknown';
throw "event is unknown";
}
if (!this.events[event].has(callbackid)) {
@@ -413,7 +416,7 @@ class I18n {
break;
} else {
// Event: onMissingKey
this._callEvent('missingKey', key, language);
this._callEvent("missingKey", key, language);
}
}
@@ -429,18 +432,23 @@ class I18n {
* @returns {Promise} resolved when successful, rejected if applier returns false.
* @throws Exception on invalid parameters.
*/
domTranslate(language, property = 'data-i18n', resolver = undefined, applier = undefined) {
domTranslate(
language,
property = "data-i18n",
resolver = undefined,
applier = undefined
) {
language = this._sanitizeLanguage(language);
if ((resolver != undefined) && (typeof (resolver) != 'function')) {
throw 'resolver must be a function';
if (resolver != undefined && typeof resolver != "function") {
throw "resolver must be a function";
} else if (resolver == undefined) {
let self = this;
resolver = (language, key, el) => {
return self._defaultResolver(language, key, el);
};
}
if ((applier != undefined) && (typeof (applier) != 'function')) {
throw 'applier must be a function';
if (applier != undefined && typeof applier != "function") {
throw "applier must be a function";
} else if (applier == undefined) {
let self = this;
applier = (language, key, translation, el) => {
@@ -464,15 +472,15 @@ class I18n {
// Private Functions
_verifyLanguageKnown(language) {
if (!this.languages.has(language)) {
throw 'language unknown';
throw "language unknown";
}
}
_verifyKey(key) {
if (typeof (key) == 'string') {
if (typeof key == "string") {
return;
}
throw 'key must be of type string';
throw "key must be of type string";
}
_verifyKeyKnown(language, key) {
@@ -480,15 +488,15 @@ class I18n {
this._verifyKey(key);
if (!this.languages.get(language).has(key)) {
throw 'key unknown in language';
throw "key unknown in language";
}
}
_verifyData(data) {
if (typeof (data) == 'string') {
if (typeof data == "string") {
return;
}
if (typeof (data) == 'object') {
if (typeof data == "object") {
return;
}
if (data instanceof File) {
@@ -497,14 +505,14 @@ class I18n {
if (data instanceof Blob) {
return;
}
throw 'data must be of type string, object, File or Blob';
throw "data must be of type string, object, File or Blob";
}
_sanitizeLanguage(language) {
try {
this._verifyKey(language);
} catch (e) {
throw 'language must be of type string';
throw "language must be of type string";
}
return language.toLowerCase();
}
@@ -593,7 +601,7 @@ class I18n {
let baseLanguages = languageMap.get(this.baseLanguageKey);
// Convert to array for for...in.
if (typeof (baseLanguages) == 'string') {
if (typeof baseLanguages == "string") {
baseLanguages = [baseLanguages];
} else if (!(baseLanguages instanceof Array)) {
continue;
@@ -601,23 +609,23 @@ class I18n {
for (let base of baseLanguages) {
base = this._sanitizeLanguage(base);
if (!chain.includes(base) && (this.languages.has(base))) {
if (!chain.includes(base) && this.languages.has(base)) {
chain.push(base);
} else if (!missing.includes(base) && (!this.languages.has(base))) {
} else if (!missing.includes(base) && !this.languages.has(base)) {
missing.push(base);
}
}
// Append the global base languages if there are no other languages left.
if (pos == (chain.length - 1)) {
if (pos == chain.length - 1) {
let baseLanguages = this.baseLanguage;
if (typeof (this.baseLanguage) == 'string') {
if (typeof this.baseLanguage == "string") {
baseLanguages = [this.baseLanguage];
}
for (let base of baseLanguages) {
if (!chain.includes(base) && (this.languages.has(base))) {
if (!chain.includes(base) && this.languages.has(base)) {
chain.push(base);
} else if (!missing.includes(base) && (!this.languages.has(base))) {
} else if (!missing.includes(base) && !this.languages.has(base)) {
missing.push(base);
}
}
@@ -627,7 +635,7 @@ class I18n {
// Trigger event for all missing languages
for (let missingLanguage of missing) {
// Event: onMissingLanguage
this._callEvent('missingLanguage', missingLanguage);
this._callEvent("missingLanguage", missingLanguage);
}
// Store.
@@ -642,24 +650,45 @@ class I18n {
* Source: https://stackoverflow.com/a/21963136
*/
_uuid() {
const lut = []; for (var i = 0; i < 256; i++) { lut[i] = (i < 16 ? '0' : '') + (i).toString(16); }
var d0 = Math.random() * 0xffffffff | 0;
var d1 = Math.random() * 0xffffffff | 0;
var d2 = Math.random() * 0xffffffff | 0;
var d3 = Math.random() * 0xffffffff | 0;
return lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + '-' +
lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + '-' + lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + '-' +
lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + '-' + lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] +
lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff];
const lut = [];
for (var i = 0; i < 256; i++) {
lut[i] = (i < 16 ? "0" : "") + i.toString(16);
}
var d0 = (Math.random() * 0xffffffff) | 0;
var d1 = (Math.random() * 0xffffffff) | 0;
var d2 = (Math.random() * 0xffffffff) | 0;
var d3 = (Math.random() * 0xffffffff) | 0;
return (
lut[d0 & 0xff] +
lut[(d0 >> 8) & 0xff] +
lut[(d0 >> 16) & 0xff] +
lut[(d0 >> 24) & 0xff] +
"-" +
lut[d1 & 0xff] +
lut[(d1 >> 8) & 0xff] +
"-" +
lut[((d1 >> 16) & 0x0f) | 0x40] +
lut[(d1 >> 24) & 0xff] +
"-" +
lut[(d2 & 0x3f) | 0x80] +
lut[(d2 >> 8) & 0xff] +
"-" +
lut[(d2 >> 16) & 0xff] +
lut[(d2 >> 24) & 0xff] +
lut[d3 & 0xff] +
lut[(d3 >> 8) & 0xff] +
lut[(d3 >> 16) & 0xff] +
lut[(d3 >> 24) & 0xff]
);
}
_callEvent(name) {
if (typeof(name) != 'string') {
throw 'name must be a string';
if (typeof name != "string") {
throw "name must be a string";
}
name = name.toLowerCase();
if (this.events[name] == undefined) {
throw 'invalid event call';
throw "invalid event call";
}
if (this.events[name].size == 0) {
return;
@@ -668,8 +697,9 @@ class I18n {
let args = Array.prototype.slice.call(arguments, 1);
this.events[name].forEach((value, key, map) => {
key; map;
if (typeof (value) != 'function') {
key;
map;
if (typeof value != "function") {
return;
}
try {
@@ -682,8 +712,8 @@ class I18n {
}
// Compatible with Node.js and Browsers
if (typeof (module) != 'undefined') {
if (typeof module != "undefined") {
module.exports = exports = {
'I18n': I18n
I18n: I18n
};
}