* (Apollon77) Implement Service triggers to use any value to trigger or stringified JSON to call with fields

This commit is contained in:
Ingo Fischer
2022-03-21 17:11:48 +01:00
parent b887a75ede
commit 3b83e686f7
21 changed files with 433 additions and 251 deletions
+131 -197
View File
@@ -1,19 +1,18 @@
/*!
* ioBroker gulpfile
* Date: 2019-01-28
*/
'use strict';
const gulp = require('gulp');
const fs = require('fs');
const pkg = require('./package.json');
const gulp = require('gulp');
const fs = require('fs');
const pkg = require('./package.json');
const iopackage = require('./io-package.json');
const version = (pkg && pkg.version) ? pkg.version : iopackage.common.version;
/*var appName = getAppName();
function getAppName() {
var parts = __dirname.replace(/\\/g, '/').split('/');
return parts[parts.length - 1].split('.')[0].toLowerCase();
}
*/
const version = (pkg && pkg.version) ? pkg.version : iopackage.common.version;
const fileName = 'words.js';
let languages = {
const EMPTY = '';
const translate = require('./lib/tools').translateText;
const languages = {
en: {},
de: {},
ru: {},
@@ -26,25 +25,18 @@ let languages = {
'zh-cn': {}
};
function lang2data(lang, isFlat) {
let str = isFlat ? '' : '{\n';
function lang2data(lang) {
let str ='{\n';
let count = 0;
for (const w in lang) {
if (lang.hasOwnProperty(w)) {
count++;
if (isFlat) {
str += (lang[w] === '' ? (isFlat[w] || w) : lang[w]) + '\n';
} else {
const key = ' "' + w.replace(/"/g, '\\"') + '": ';
str += key + '"' + lang[w].replace(/"/g, '\\"') + '",\n';
}
const key = ' "' + w.replace(/"/g, '\\"') + '": ';
str += key + '"' + lang[w].replace(/"/g, '\\"') + '",\n';
}
}
if (!count) {
return isFlat ? '' : '{\n}';
}
if (isFlat) {
return str;
return '{\n}';
} else {
return str.substring(0, str.length - 2) + '\n}';
}
@@ -58,26 +50,9 @@ function readWordJs(src) {
} else {
words = fs.readFileSync(src + fileName).toString();
}
words = words.substring(words.indexOf('{'), words.length);
words = words.substring(0, words.lastIndexOf(';'));
const lines = words.split(/\r\n|\r|\n/g);
let i = 0;
while (!lines[i].match(/^systemDictionary = {/)) {
i++;
}
lines.splice(0, i);
// remove last empty lines
i = lines.length - 1;
while (!lines[i]) {
i--;
}
if (i < lines.length - 1) {
lines.splice(i + 1);
}
lines[0] = lines[0].replace('systemDictionary = ', '');
lines[lines.length - 1] = lines[lines.length - 1].trim().replace(/};$/, '}');
words = lines.join('\n');
const resultFunc = new Function('return ' + words + ';');
return resultFunc();
@@ -85,14 +60,15 @@ function readWordJs(src) {
return null;
}
}
function padRight(text, totalLength) {
return text + (text.length < totalLength ? new Array(totalLength - text.length).join(' ') : '');
}
function writeWordJs(data, src) {
let text = '// DO NOT EDIT THIS FILE!!! IT WILL BE AUTOMATICALLY GENERATED FROM src/i18n\n';
text += '/*global systemDictionary:true */\n';
text += '\'use strict\';\n\n';
function writeWordJs(data, src) {
let text = '';
text += '/*global systemDictionary:true */\n';
text += "'use strict';\n\n";
text += 'systemDictionary = {\n';
for (const word in data) {
if (data.hasOwnProperty(word)) {
@@ -110,9 +86,7 @@ function writeWordJs(data, src) {
text += line + '},\n';
}
}
text = text.replace(/},\n$/, '}\n');
text += '};';
if (fs.existsSync(src + 'js/' + fileName)) {
fs.writeFileSync(src + 'js/' + fileName, text);
} else {
@@ -120,8 +94,6 @@ function writeWordJs(data, src) {
}
}
const EMPTY = '';
function words2languages(src) {
const langs = Object.assign({}, languages);
const data = readWordJs(src);
@@ -145,10 +117,11 @@ function words2languages(src) {
fs.mkdirSync(src + 'i18n/');
}
for (const l in langs) {
if (!langs.hasOwnProperty(l)) continue;
if (!langs.hasOwnProperty(l))
continue;
const keys = Object.keys(langs[l]);
//keys.sort();
let obj = {};
keys.sort();
const obj = {};
for (let k = 0; k < keys.length; k++) {
obj[keys[k]] = langs[l][keys[k]];
}
@@ -162,144 +135,36 @@ function words2languages(src) {
console.error('Cannot read or parse ' + fileName);
}
}
function words2languagesFlat(src) {
let langs = Object.assign({}, languages);
const data = readWordJs(src);
if (data) {
for (const word in data) {
if (data.hasOwnProperty(word)) {
for (const lang in data[word]) {
if (data[word].hasOwnProperty(lang)) {
langs[lang][word] = data[word][lang];
// pre-fill all other languages
for (const j in langs) {
if (langs.hasOwnProperty(j)) {
langs[j][word] = langs[j][word] || EMPTY;
}
}
}
}
}
}
const keys = Object.keys(langs.en);
//keys.sort();
for (const l in langs) {
if (!langs.hasOwnProperty(l)) continue;
let obj = {};
for (let k = 0; k < keys.length; k++) {
obj[keys[k]] = langs[l][keys[k]];
}
langs[l] = obj;
}
if (!fs.existsSync(src + 'i18n/')) {
fs.mkdirSync(src + 'i18n/');
}
for (const ll in langs) {
if (!langs.hasOwnProperty(ll)) continue;
if (!fs.existsSync(src + 'i18n/' + ll)) {
fs.mkdirSync(src + 'i18n/' + ll);
}
fs.writeFileSync(src + 'i18n/' + ll + '/flat.txt', lang2data(langs[ll], langs.en));
}
fs.writeFileSync(src + 'i18n/flat.txt', keys.join('\n'));
} else {
console.error('Cannot read or parse ' + fileName);
}
}
function languagesFlat2words(src) {
const dirs = fs.readdirSync(src + 'i18n/');
let langs = {};
let bigOne = {};
const order = Object.keys(languages);
dirs.sort((a, b) => {
const posA = order.indexOf(a);
const posB = order.indexOf(b);
if (posA === -1 && posB === -1) {
if (a > b) return 1;
if (a < b) return -1;
return 0;
} else if (posA === -1) {
return -1;
} else if (posB === -1) {
return 1;
} else {
if (posA > posB) return 1;
if (posA < posB) return -1;
return 0;
}
});
const keys = fs.readFileSync(src + 'i18n/flat.txt').toString().split('\n');
for (let l = 0; l < dirs.length; l++) {
if (dirs[l] === 'flat.txt') continue;
let lang = dirs[l];
const values = fs.readFileSync(src + 'i18n/' + lang + '/flat.txt').toString().split('\n');
langs[lang] = {};
keys.forEach(function (word, i) {
langs[lang][word] = values[i].replace(/<\/ i>/g, '</i>').replace(/<\/ b>/g, '</b>').replace(/<\/ span>/g, '</span>').replace(/% s/g, ' %s');
});
const words = langs[lang];
for (const word in words) {
if (words.hasOwnProperty(word)) {
bigOne[word] = bigOne[word] || {};
if (words[word] !== EMPTY) {
bigOne[word][lang] = words[word];
}
}
}
}
// read actual words.js
const aWords = readWordJs();
const temporaryIgnore = ['pt', 'fr', 'nl', 'flat.txt'];
if (aWords) {
// Merge words together
for (const w in aWords) {
if (aWords.hasOwnProperty(w)) {
if (!bigOne[w]) {
console.warn('Take from actual words.js: ' + w);
bigOne[w] = aWords[w]
}
dirs.forEach(function (lang) {
if (temporaryIgnore.indexOf(lang) !== -1) return;
if (!bigOne[w][lang]) {
console.warn('Missing "' + lang + '": ' + w);
}
});
}
}
}
writeWordJs(bigOne, src);
}
function languages2words(src) {
const dirs = fs.readdirSync(src + 'i18n/');
let langs = {};
let bigOne = {};
const langs = {};
const bigOne = {};
const order = Object.keys(languages);
dirs.sort((a, b) => {
dirs.sort(function (a, b) {
const posA = order.indexOf(a);
const posB = order.indexOf(b);
if (posA === -1 && posB === -1) {
if (a > b) return 1;
if (a < b) return -1;
if (a > b)
return 1;
if (a < b)
return -1;
return 0;
} else if (posA === -1) {
return -1;
} else if (posB === -1) {
return 1;
} else {
if (posA > posB) return 1;
if (posA < posB) return -1;
if (posA > posB)
return 1;
if (posA < posB)
return -1;
return 0;
}
});
for (let l = 0; l < dirs.length; l++) {
if (dirs[l] === 'flat.txt') continue;
const lang = dirs[l];
for (const lang of dirs) {
if (lang === 'flat.txt')
continue;
langs[lang] = fs.readFileSync(src + 'i18n/' + lang + '/translations.json').toString();
langs[lang] = JSON.parse(langs[lang]);
const words = langs[lang];
@@ -315,17 +180,18 @@ function languages2words(src) {
// read actual words.js
const aWords = readWordJs();
const temporaryIgnore = ['pt', 'fr', 'nl', 'it'];
const temporaryIgnore = ['flat.txt'];
if (aWords) {
// Merge words together
for (const w in aWords) {
if (aWords.hasOwnProperty(w)) {
if (!bigOne[w]) {
console.warn('Take from actual words.js: ' + w);
bigOne[w] = aWords[w]
bigOne[w] = aWords[w];
}
dirs.forEach(function (lang) {
if (temporaryIgnore.indexOf(lang) !== -1) return;
if (temporaryIgnore.indexOf(lang) !== -1)
return;
if (!bigOne[w][lang]) {
console.warn('Missing "' + lang + '": ' + w);
}
@@ -338,37 +204,53 @@ function languages2words(src) {
writeWordJs(bigOne, src);
}
gulp.task('admin (words.js => json)', done => {
async function translateNotExisting(obj, baseText, yandex) {
let t = obj['en'];
if (!t) {
t = baseText;
}
if (t) {
for (let l in languages) {
if (!obj[l]) {
const time = new Date().getTime();
obj[l] = await translate(t, l, yandex);
console.log('en -> ' + l + ' ' + (new Date().getTime() - time) + ' ms');
}
}
}
}
//TASKS
gulp.task('adminWords2languages', function (done) {
words2languages('./admin/');
done();
});
gulp.task('admin (words.js => flat)', done => {
words2languagesFlat('./admin/');
done();
});
gulp.task('admin (flat => words.js)', done => {
languagesFlat2words('./admin/');
done();
});
gulp.task('admin (json => words.js)', done => {
gulp.task('adminLanguages2words', function (done) {
languages2words('./admin/');
done();
});
gulp.task('updatePackages', done => {
gulp.task('updatePackages', function (done) {
iopackage.common.version = pkg.version;
iopackage.common.news = iopackage.common.news || {};
if (!iopackage.common.news[pkg.version]) {
const news = iopackage.common.news;
let newNews = {};
const newNews = {};
newNews[pkg.version] = {
en: 'news',
de: 'neues',
ru: 'новое'
ru: 'новое',
pt: 'novidades',
nl: 'nieuws',
fr: 'nouvelles',
it: 'notizie',
es: 'noticias',
pl: 'nowości',
'zh-cn': '新'
};
iopackage.common.news = Object.assign(newNews, news);
}
@@ -376,12 +258,12 @@ gulp.task('updatePackages', done => {
done();
});
gulp.task('updateReadme', done => {
gulp.task('updateReadme', function (done) {
const readme = fs.readFileSync('README.md').toString();
const pos = readme.indexOf('## Changelog\n');
if (pos !== -1) {
let readmeStart = readme.substring(0, pos + '## Changelog\n'.length);
let readmeEnd = readme.substring(pos + '## Changelog\n'.length);
const readmeStart = readme.substring(0, pos + '## Changelog\n'.length);
const readmeEnd = readme.substring(pos + '## Changelog\n'.length);
if (readme.indexOf(version) === -1) {
const timestamp = new Date();
@@ -400,4 +282,56 @@ gulp.task('updateReadme', done => {
done();
});
gulp.task('translate', async function (done) {
let yandex;
const i = process.argv.indexOf('--yandex');
if (i > -1) {
yandex = process.argv[i + 1];
}
if (iopackage && iopackage.common) {
if (iopackage.common.news) {
console.log('Translate News');
for (let k in iopackage.common.news) {
console.log('News: ' + k);
let nw = iopackage.common.news[k];
await translateNotExisting(nw, null, yandex);
}
}
if (iopackage.common.titleLang) {
console.log('Translate Title');
await translateNotExisting(iopackage.common.titleLang, iopackage.common.title, yandex);
}
if (iopackage.common.desc) {
console.log('Translate Description');
await translateNotExisting(iopackage.common.desc, null, yandex);
}
if (fs.existsSync('./admin/i18n/en/translations.json')) {
let enTranslations = require('./admin/i18n/en/translations.json');
for (let l in languages) {
console.log('Translate Text: ' + l);
let existing = {};
if (fs.existsSync('./admin/i18n/' + l + '/translations.json')) {
existing = require('./admin/i18n/' + l + '/translations.json');
}
for (let t in enTranslations) {
if (!existing[t]) {
existing[t] = await translate(enTranslations[t], l, yandex);
}
}
if (!fs.existsSync('./admin/i18n/' + l + '/')) {
fs.mkdirSync('./admin/i18n/' + l + '/');
}
fs.writeFileSync('./admin/i18n/' + l + '/translations.json', JSON.stringify(existing, null, 4));
}
}
}
fs.writeFileSync('io-package.json', JSON.stringify(iopackage, null, 4));
});
gulp.task('translateAndUpdateWordsJS', gulp.series('translate', 'adminLanguages2words', 'adminWords2languages'));
gulp.task('default', gulp.series('updatePackages', 'updateReadme'));