diff options
author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2020-09-19 19:04:28 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-19 19:04:28 -0400 |
commit | 51d4e5b0ff4c0054bf5012464414ec0657d09963 (patch) | |
tree | 9920d1a9c84bf968ca8105700450792d78ac0088 /dev/util.js | |
parent | 4293f731537906785da3b1f20535ddd18a4edd21 (diff) |
Dev/test script organization (#846)
* Move lint scripts
* Move dictionary-validate.js
* Move schema-validate.js
* Move createTestDictionaryArchive, remove yomichan-test.js
* Rename yomichan-util.js to util.js
* Move test/yomichan-vm.js to dev/vm.js
* Move getArgs into util.js (and fix name)
* Create test-all.js
* Update test-code script
Diffstat (limited to 'dev/util.js')
-rw-r--r-- | dev/util.js | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/dev/util.js b/dev/util.js new file mode 100644 index 00000000..971837af --- /dev/null +++ b/dev/util.js @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2020 Yomichan Authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +const fs = require('fs'); +const path = require('path'); + + +let JSZip = null; + + +function getJSZip() { + if (JSZip === null) { + process.noDeprecation = true; // Suppress a warning about JSZip + JSZip = require(path.join(__dirname, '../ext/mixed/lib/jszip.min.js')); + process.noDeprecation = false; + } + return JSZip; +} + + +function getArgs(args, argMap) { + let key = null; + let canKey = true; + let onKey = false; + for (const arg of args) { + onKey = false; + + if (canKey && arg.startsWith('--')) { + if (arg.length === 2) { + canKey = false; + key = null; + onKey = false; + } else { + key = arg.substring(2); + onKey = true; + } + } + + const target = argMap.get(key); + if (typeof target === 'boolean') { + argMap.set(key, true); + key = null; + } else if (typeof target === 'number') { + argMap.set(key, target + 1); + key = null; + } else if (target === null || typeof target === 'string') { + if (!onKey) { + argMap.set(key, arg); + key = null; + } + } else if (Array.isArray(target)) { + if (!onKey) { + target.push(arg); + key = null; + } + } else { + console.error(`Unknown argument: ${arg}`); + key = null; + } + } + + return argMap; +} + +function getAllFiles(baseDirectory, relativeTo=null, predicate=null) { + const results = []; + const directories = [baseDirectory]; + while (directories.length > 0) { + const directory = directories.shift(); + const fileNames = fs.readdirSync(directory); + for (const fileName of fileNames) { + const fullFileName = path.join(directory, fileName); + const relativeFileName = (relativeTo !== null ? path.relative(relativeTo, fullFileName) : fullFileName); + const stats = fs.lstatSync(fullFileName); + if (stats.isFile()) { + if (typeof predicate !== 'function' || predicate(fullFileName, directory, baseDirectory)) { + results.push(relativeFileName); + } + } else if (stats.isDirectory()) { + directories.push(fullFileName); + } + } + } + return results; +} + +function getDefaultManifest() { + const {manifest} = getDefaultManifestAndVariants(); + return manifest; +} + +function getDefaultManifestAndVariants() { + const fileName = path.join(__dirname, 'data', 'manifest-variants.json'); + const {manifest, variants} = JSON.parse(fs.readFileSync(fileName)); + return {manifest, variants}; +} + +function createManifestString(manifest) { + return JSON.stringify(manifest, null, 4) + '\n'; +} + +function createDictionaryArchive(dictionaryDirectory, dictionaryName) { + const fileNames = fs.readdirSync(dictionaryDirectory); + + const JSZip2 = getJSZip(); + const archive = new JSZip2(); + + for (const fileName of fileNames) { + if (/\.json$/.test(fileName)) { + const content = fs.readFileSync(path.join(dictionaryDirectory, fileName), {encoding: 'utf8'}); + const json = JSON.parse(content); + if (fileName === 'index.json' && typeof dictionaryName === 'string') { + json.title = dictionaryName; + } + archive.file(fileName, JSON.stringify(json, null, 0)); + } else { + const content = fs.readFileSync(path.join(dictionaryDirectory, fileName), {encoding: null}); + archive.file(fileName, content); + } + } + + return archive; +} + + +module.exports = { + get JSZip() { return getJSZip(); }, + getArgs, + getAllFiles, + getDefaultManifest, + getDefaultManifestAndVariants, + createManifestString, + createDictionaryArchive +}; |