diff options
39 files changed, 399 insertions, 71 deletions
| diff --git a/.eslintrc.json b/.eslintrc.json index 2730acb5..db8ff1fa 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -63,7 +63,7 @@          "semi-spacing": ["error", {"before": false, "after": true}],          "space-in-parens": ["error", "never"],          "space-unary-ops": "error", -        "spaced-comment": ["error", "always", {"markers": ["global"]}], +        "spaced-comment": ["error", "always"],          "switch-colon-spacing": ["error", {"after": true, "before": false}],          "template-curly-spacing": ["error", "never"],          "template-tag-spacing": ["error", "never"], diff --git a/ext/bg/js/anki.js b/ext/bg/js/anki.js index 39c6ad51..a70388bd 100644 --- a/ext/bg/js/anki.js +++ b/ext/bg/js/anki.js @@ -16,7 +16,9 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global requestJson*/ +/* global + * requestJson + */  /*   * AnkiConnect diff --git a/ext/bg/js/audio-uri-builder.js b/ext/bg/js/audio-uri-builder.js index 15cea995..499c3441 100644 --- a/ext/bg/js/audio-uri-builder.js +++ b/ext/bg/js/audio-uri-builder.js @@ -16,7 +16,9 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global jpIsStringEntirelyKana*/ +/* global + * jpIsStringEntirelyKana + */  class AudioUriBuilder {      constructor() { diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js index 349fb4eb..978c5a4a 100644 --- a/ext/bg/js/backend.js +++ b/ext/bg/js/backend.js @@ -16,13 +16,32 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global optionsSave, utilIsolate -conditionsTestValue, profileConditionsDescriptor -handlebarsRenderDynamic -requestText, requestJson, optionsLoad -dictConfigured, dictTermsSort, dictEnabledSet -jpConvertReading, jpDistributeFuriganaInflected, jpKatakanaToHiragana -AnkiNoteBuilder, AudioSystem, AudioUriBuilder, Translator, AnkiConnect, AnkiNull, Mecab, BackendApiForwarder, JsonSchema, ClipboardMonitor*/ +/* global + * AnkiConnect + * AnkiNoteBuilder + * AnkiNull + * AudioSystem + * AudioUriBuilder + * BackendApiForwarder + * ClipboardMonitor + * JsonSchema + * Mecab + * Translator + * conditionsTestValue + * dictConfigured + * dictEnabledSet + * dictTermsSort + * handlebarsRenderDynamic + * jpConvertReading + * jpDistributeFuriganaInflected + * jpKatakanaToHiragana + * optionsLoad + * optionsSave + * profileConditionsDescriptor + * requestJson + * requestText + * utilIsolate + */  class Backend {      constructor() { diff --git a/ext/bg/js/clipboard-monitor.js b/ext/bg/js/clipboard-monitor.js index a6d73c79..9a881f57 100644 --- a/ext/bg/js/clipboard-monitor.js +++ b/ext/bg/js/clipboard-monitor.js @@ -16,7 +16,9 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global jpIsStringPartiallyJapanese*/ +/* global + * jpIsStringPartiallyJapanese + */  class ClipboardMonitor extends EventDispatcher {      constructor({getClipboard}) { diff --git a/ext/bg/js/context.js b/ext/bg/js/context.js index 1095c7e0..c3e74656 100644 --- a/ext/bg/js/context.js +++ b/ext/bg/js/context.js @@ -16,7 +16,11 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global apiCommandExec, apiGetEnvironmentInfo, apiOptionsGet*/ +/* global + * apiCommandExec + * apiGetEnvironmentInfo + * apiOptionsGet + */  function showExtensionInfo() {      const node = document.getElementById('extension-info'); diff --git a/ext/bg/js/database.js b/ext/bg/js/database.js index 558f3ceb..08a2a39f 100644 --- a/ext/bg/js/database.js +++ b/ext/bg/js/database.js @@ -16,7 +16,12 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global dictFieldSplit, requestJson, JsonSchema, JSZip*/ +/* global + * JSZip + * JsonSchema + * dictFieldSplit + * requestJson + */  class Database {      constructor() { diff --git a/ext/bg/js/handlebars.js b/ext/bg/js/handlebars.js index 3ee4e7fa..e3ce6bd0 100644 --- a/ext/bg/js/handlebars.js +++ b/ext/bg/js/handlebars.js @@ -16,7 +16,11 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global jpIsCodePointKanji, jpDistributeFurigana, Handlebars*/ +/* global + * Handlebars + * jpDistributeFurigana + * jpIsCodePointKanji + */  function handlebarsEscape(text) {      return Handlebars.Utils.escapeExpression(text); diff --git a/ext/bg/js/japanese.js b/ext/bg/js/japanese.js index fc69dbba..3b37754d 100644 --- a/ext/bg/js/japanese.js +++ b/ext/bg/js/japanese.js @@ -16,7 +16,9 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global wanakana*/ +/* global + * wanakana + */  const JP_HALFWIDTH_KATAKANA_MAPPING = new Map([      ['ヲ', 'ヲヺ-'], diff --git a/ext/bg/js/options.js b/ext/bg/js/options.js index 879b4a59..bd0bbe0e 100644 --- a/ext/bg/js/options.js +++ b/ext/bg/js/options.js @@ -16,7 +16,9 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global utilStringHashCode*/ +/* global + * utilStringHashCode + */  /*   * Generic options functions diff --git a/ext/bg/js/search-frontend.js b/ext/bg/js/search-frontend.js index 453a0b79..a470e873 100644 --- a/ext/bg/js/search-frontend.js +++ b/ext/bg/js/search-frontend.js @@ -16,7 +16,9 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global apiOptionsGet*/ +/* global + * apiOptionsGet + */  async function searchFrontendSetup() {      await yomichan.prepare(); diff --git a/ext/bg/js/search-query-parser-generator.js b/ext/bg/js/search-query-parser-generator.js index 1ab23a82..664858a4 100644 --- a/ext/bg/js/search-query-parser-generator.js +++ b/ext/bg/js/search-query-parser-generator.js @@ -16,7 +16,10 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global apiGetQueryParserTemplatesHtml, TemplateHandler*/ +/* global + * TemplateHandler + * apiGetQueryParserTemplatesHtml + */  class QueryParserGenerator {      constructor() { diff --git a/ext/bg/js/search-query-parser.js b/ext/bg/js/search-query-parser.js index c64d0fea..06316ce2 100644 --- a/ext/bg/js/search-query-parser.js +++ b/ext/bg/js/search-query-parser.js @@ -16,7 +16,15 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global apiTermsFind, apiOptionsSet, apiTextParse, apiTextParseMecab, TextScanner, QueryParserGenerator, docSentenceExtract*/ +/* global + * QueryParserGenerator + * TextScanner + * apiOptionsSet + * apiTermsFind + * apiTextParse + * apiTextParseMecab + * docSentenceExtract + */  class QueryParser extends TextScanner {      constructor(search) { diff --git a/ext/bg/js/search.js b/ext/bg/js/search.js index 5881f6f8..e2bdff73 100644 --- a/ext/bg/js/search.js +++ b/ext/bg/js/search.js @@ -16,7 +16,14 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global apiOptionsSet, apiTermsFind, apiClipboardGet, Display, QueryParser, ClipboardMonitor*/ +/* global + * ClipboardMonitor + * Display + * QueryParser + * apiClipboardGet + * apiOptionsSet + * apiTermsFind + */  class DisplaySearch extends Display {      constructor() { diff --git a/ext/bg/js/settings/anki-templates.js b/ext/bg/js/settings/anki-templates.js index b1665048..c5222d30 100644 --- a/ext/bg/js/settings/anki-templates.js +++ b/ext/bg/js/settings/anki-templates.js @@ -16,10 +16,18 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global getOptionsContext, getOptionsMutable, settingsSaveOptions -ankiGetFieldMarkers, ankiGetFieldMarkersHtml -apiOptionsGet, apiTermsFind, apiGetDefaultAnkiFieldTemplates, apiTemplateRender -AnkiNoteBuilder*/ +/* global + * AnkiNoteBuilder + * ankiGetFieldMarkers + * ankiGetFieldMarkersHtml + * apiGetDefaultAnkiFieldTemplates + * apiOptionsGet + * apiTemplateRender + * apiTermsFind + * getOptionsContext + * getOptionsMutable + * settingsSaveOptions + */  function onAnkiFieldTemplatesReset(e) {      e.preventDefault(); diff --git a/ext/bg/js/settings/anki.js b/ext/bg/js/settings/anki.js index 782691ab..b706cd1b 100644 --- a/ext/bg/js/settings/anki.js +++ b/ext/bg/js/settings/anki.js @@ -16,9 +16,16 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global getOptionsContext, getOptionsMutable, settingsSaveOptions -utilBackgroundIsolate, utilAnkiGetDeckNames, utilAnkiGetModelNames, utilAnkiGetModelFieldNames -onFormOptionsChanged*/ +/* global + * getOptionsContext + * getOptionsMutable + * onFormOptionsChanged + * settingsSaveOptions + * utilAnkiGetDeckNames + * utilAnkiGetModelFieldNames + * utilAnkiGetModelNames + * utilBackgroundIsolate + */  // Private diff --git a/ext/bg/js/settings/audio.js b/ext/bg/js/settings/audio.js index c825be6b..38dd6349 100644 --- a/ext/bg/js/settings/audio.js +++ b/ext/bg/js/settings/audio.js @@ -16,8 +16,14 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global getOptionsContext, getOptionsMutable, settingsSaveOptions, apiAudioGetUri -AudioSystem, AudioSourceUI*/ +/* global + * AudioSourceUI + * AudioSystem + * apiAudioGetUri + * getOptionsContext + * getOptionsMutable + * settingsSaveOptions + */  let audioSourceUI = null;  let audioSystem = null; diff --git a/ext/bg/js/settings/backup.js b/ext/bg/js/settings/backup.js index daa08c61..21417dfb 100644 --- a/ext/bg/js/settings/backup.js +++ b/ext/bg/js/settings/backup.js @@ -16,9 +16,17 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global apiOptionsGetFull, apiGetEnvironmentInfo, apiGetDefaultAnkiFieldTemplates -utilBackend, utilIsolate, utilBackgroundIsolate, utilReadFileArrayBuffer -optionsGetDefault, optionsUpdateVersion*/ +/* global + * apiGetDefaultAnkiFieldTemplates + * apiGetEnvironmentInfo + * apiOptionsGetFull + * optionsGetDefault + * optionsUpdateVersion + * utilBackend + * utilBackgroundIsolate + * utilIsolate + * utilReadFileArrayBuffer + */  // Exporting diff --git a/ext/bg/js/settings/conditions-ui.js b/ext/bg/js/settings/conditions-ui.js index 4ca86b07..9d61d25e 100644 --- a/ext/bg/js/settings/conditions-ui.js +++ b/ext/bg/js/settings/conditions-ui.js @@ -16,7 +16,9 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global conditionsNormalizeOptionValue*/ +/* global + * conditionsNormalizeOptionValue + */  class ConditionsUI {      static instantiateTemplate(templateSelector) { diff --git a/ext/bg/js/settings/dictionaries.js b/ext/bg/js/settings/dictionaries.js index b9551073..5e59cc3d 100644 --- a/ext/bg/js/settings/dictionaries.js +++ b/ext/bg/js/settings/dictionaries.js @@ -16,11 +16,23 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global getOptionsContext, getOptionsMutable, getOptionsFullMutable, settingsSaveOptions, apiOptionsGetFull, apiOptionsGet -utilBackgroundIsolate, utilDatabaseDeleteDictionary, utilDatabaseGetDictionaryInfo, utilDatabaseGetDictionaryCounts -utilDatabasePurge, utilDatabaseImport -storageUpdateStats, storageEstimate -PageExitPrevention*/ +/* global + * PageExitPrevention + * apiOptionsGet + * apiOptionsGetFull + * getOptionsContext + * getOptionsFullMutable + * getOptionsMutable + * settingsSaveOptions + * storageEstimate + * storageUpdateStats + * utilBackgroundIsolate + * utilDatabaseDeleteDictionary + * utilDatabaseGetDictionaryCounts + * utilDatabaseGetDictionaryInfo + * utilDatabaseImport + * utilDatabasePurge + */  let dictionaryUI = null; diff --git a/ext/bg/js/settings/main.js b/ext/bg/js/settings/main.js index 1bf1444c..ebc443df 100644 --- a/ext/bg/js/settings/main.js +++ b/ext/bg/js/settings/main.js @@ -16,13 +16,26 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global getOptionsContext, apiOptionsSave -utilBackend, utilIsolate, utilBackgroundIsolate -ankiErrorShown, ankiFieldsToDict -ankiTemplatesUpdateValue, onAnkiOptionsChanged, onDictionaryOptionsChanged -appearanceInitialize, audioSettingsInitialize, profileOptionsSetup, dictSettingsInitialize -ankiInitialize, ankiTemplatesInitialize, storageInfoInitialize, backupInitialize -*/ +/* global + * ankiErrorShown + * ankiFieldsToDict + * ankiInitialize + * ankiTemplatesInitialize + * ankiTemplatesUpdateValue + * apiOptionsSave + * appearanceInitialize + * audioSettingsInitialize + * backupInitialize + * dictSettingsInitialize + * getOptionsContext + * onAnkiOptionsChanged + * onDictionaryOptionsChanged + * profileOptionsSetup + * storageInfoInitialize + * utilBackend + * utilBackgroundIsolate + * utilIsolate + */  function getOptionsMutable(optionsContext) {      return utilBackend().getOptions( diff --git a/ext/bg/js/settings/popup-preview-frame.js b/ext/bg/js/settings/popup-preview-frame.js index 1ceac177..6a149841 100644 --- a/ext/bg/js/settings/popup-preview-frame.js +++ b/ext/bg/js/settings/popup-preview-frame.js @@ -16,7 +16,13 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global apiOptionsGet, Popup, PopupProxyHost, Frontend, TextSourceRange*/ +/* global + * Frontend + * Popup + * PopupProxyHost + * TextSourceRange + * apiOptionsGet + */  class SettingsPopupPreview {      constructor() { diff --git a/ext/bg/js/settings/profiles.js b/ext/bg/js/settings/profiles.js index f946a33a..b35b6309 100644 --- a/ext/bg/js/settings/profiles.js +++ b/ext/bg/js/settings/profiles.js @@ -16,9 +16,17 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global getOptionsMutable, getOptionsFullMutable, settingsSaveOptions, apiOptionsGetFull -utilBackgroundIsolate, formWrite -conditionsClearCaches, ConditionsUI, profileConditionsDescriptor*/ +/* global + * ConditionsUI + * apiOptionsGetFull + * conditionsClearCaches + * formWrite + * getOptionsFullMutable + * getOptionsMutable + * profileConditionsDescriptor + * settingsSaveOptions + * utilBackgroundIsolate + */  let currentProfileIndex = 0;  let profileConditionsContainer = null; diff --git a/ext/bg/js/settings/storage.js b/ext/bg/js/settings/storage.js index 8978414e..ae305e22 100644 --- a/ext/bg/js/settings/storage.js +++ b/ext/bg/js/settings/storage.js @@ -16,7 +16,9 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global apiGetEnvironmentInfo*/ +/* global + * apiGetEnvironmentInfo + */  function storageBytesToLabeledString(size) {      const base = 1000; diff --git a/ext/bg/js/translator.js b/ext/bg/js/translator.js index c01a7124..25da9bf0 100644 --- a/ext/bg/js/translator.js +++ b/ext/bg/js/translator.js @@ -16,12 +16,28 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global requestJson -dictTermsMergeBySequence, dictTagBuildSource, dictTermsMergeByGloss, dictTermsSort, dictTagsSort -dictEnabledSet, dictTermsGroup, dictTermsCompressTags, dictTermsUndupe, dictTagSanitize -jpDistributeFurigana, jpConvertHalfWidthKanaToFullWidth, jpConvertNumericTofullWidth -jpConvertAlphabeticToKana, jpHiraganaToKatakana, jpKatakanaToHiragana, jpIsCodePointJapanese -Database, Deinflector*/ +/* global + * Database + * Deinflector + * dictEnabledSet + * dictTagBuildSource + * dictTagSanitize + * dictTagsSort + * dictTermsCompressTags + * dictTermsGroup + * dictTermsMergeByGloss + * dictTermsMergeBySequence + * dictTermsSort + * dictTermsUndupe + * jpConvertAlphabeticToKana + * jpConvertHalfWidthKanaToFullWidth + * jpConvertNumericTofullWidth + * jpDistributeFurigana + * jpHiraganaToKatakana + * jpIsCodePointJapanese + * jpKatakanaToHiragana + * requestJson + */  class Translator {      constructor() { diff --git a/ext/fg/js/document.js b/ext/fg/js/document.js index 35861475..490f61bb 100644 --- a/ext/fg/js/document.js +++ b/ext/fg/js/document.js @@ -16,7 +16,11 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global TextSourceElement, TextSourceRange, DOM*/ +/* global + * DOM + * TextSourceElement + * TextSourceRange + */  const REGEX_TRANSPARENT_COLOR = /rgba\s*\([^)]*,\s*0(?:\.0+)?\s*\)/; diff --git a/ext/fg/js/float.js b/ext/fg/js/float.js index bc459d23..393c2719 100644 --- a/ext/fg/js/float.js +++ b/ext/fg/js/float.js @@ -16,7 +16,12 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global popupNestedInitialize, apiForward, apiGetMessageToken, Display*/ +/* global + * Display + * apiForward + * apiGetMessageToken + * popupNestedInitialize + */  class DisplayFloat extends Display {      constructor() { diff --git a/ext/fg/js/frontend-initialize.js b/ext/fg/js/frontend-initialize.js index e674724e..8424b21d 100644 --- a/ext/fg/js/frontend-initialize.js +++ b/ext/fg/js/frontend-initialize.js @@ -16,7 +16,11 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global PopupProxyHost, PopupProxy, Frontend*/ +/* global + * Frontend + * PopupProxy + * PopupProxyHost + */  async function main() {      await yomichan.prepare(); diff --git a/ext/fg/js/frontend.js b/ext/fg/js/frontend.js index 929ab56a..768b9326 100644 --- a/ext/fg/js/frontend.js +++ b/ext/fg/js/frontend.js @@ -16,7 +16,14 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global apiGetZoom, apiOptionsGet, apiTermsFind, apiKanjiFind, docSentenceExtract, TextScanner*/ +/* global + * TextScanner + * apiGetZoom + * apiKanjiFind + * apiOptionsGet + * apiTermsFind + * docSentenceExtract + */  class Frontend extends TextScanner {      constructor(popup, ignoreNodes) { diff --git a/ext/fg/js/popup-nested.js b/ext/fg/js/popup-nested.js index 3e5f5b80..06f8fc4b 100644 --- a/ext/fg/js/popup-nested.js +++ b/ext/fg/js/popup-nested.js @@ -16,7 +16,9 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global apiOptionsGet*/ +/* global + * apiOptionsGet + */  let popupNestedInitialized = false; diff --git a/ext/fg/js/popup-proxy-host.js b/ext/fg/js/popup-proxy-host.js index 49123ee1..793d3949 100644 --- a/ext/fg/js/popup-proxy-host.js +++ b/ext/fg/js/popup-proxy-host.js @@ -16,7 +16,11 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global apiFrameInformationGet, FrontendApiReceiver, Popup*/ +/* global + * FrontendApiReceiver + * Popup + * apiFrameInformationGet + */  class PopupProxyHost {      constructor() { diff --git a/ext/fg/js/popup-proxy.js b/ext/fg/js/popup-proxy.js index 093cdd2e..f7cef214 100644 --- a/ext/fg/js/popup-proxy.js +++ b/ext/fg/js/popup-proxy.js @@ -16,7 +16,9 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global FrontendApiSender*/ +/* global + * FrontendApiSender + */  class PopupProxy {      constructor(id, depth, parentId, parentFrameId, url) { diff --git a/ext/fg/js/popup.js b/ext/fg/js/popup.js index bc40a8c4..d752812e 100644 --- a/ext/fg/js/popup.js +++ b/ext/fg/js/popup.js @@ -16,7 +16,10 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global apiInjectStylesheet, apiGetMessageToken*/ +/* global + * apiGetMessageToken + * apiInjectStylesheet + */  class Popup {      constructor(id, depth, frameIdPromise) { diff --git a/ext/mixed/js/display-generator.js b/ext/mixed/js/display-generator.js index 470e2a15..49afc44b 100644 --- a/ext/mixed/js/display-generator.js +++ b/ext/mixed/js/display-generator.js @@ -16,7 +16,10 @@   * along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -/*global apiGetDisplayTemplatesHtml, TemplateHandler*/ +/* global + * TemplateHandler + * apiGetDisplayTemplatesHtml + */  class DisplayGenerator {      constructor() { diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index a220c1f7..515e28a7 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -16,10 +16,24 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global docRangeFromPoint, docSentenceExtract -apiKanjiFind, apiTermsFind, apiNoteView, apiOptionsGet, apiDefinitionsAddable, apiDefinitionAdd -apiScreenshotGet, apiForward, apiAudioGetUri -AudioSystem, DisplayGenerator, WindowScroll, DisplayContext, DOM*/ +/* global + * AudioSystem + * DOM + * DisplayContext + * DisplayGenerator + * WindowScroll + * apiAudioGetUri + * apiDefinitionAdd + * apiDefinitionsAddable + * apiForward + * apiKanjiFind + * apiNoteView + * apiOptionsGet + * apiScreenshotGet + * apiTermsFind + * docRangeFromPoint + * docSentenceExtract + */  class Display {      constructor(spinner, container) { diff --git a/ext/mixed/js/text-scanner.js b/ext/mixed/js/text-scanner.js index ff0eac8b..a08e09fb 100644 --- a/ext/mixed/js/text-scanner.js +++ b/ext/mixed/js/text-scanner.js @@ -16,7 +16,11 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -/*global docRangeFromPoint, TextSourceRange, DOM*/ +/* global + * DOM + * TextSourceRange + * docRangeFromPoint + */  class TextScanner {      constructor(node, ignoreNodes, ignoreElements, ignorePoints) { diff --git a/package.json b/package.json index 74d89dda..eb449ea9 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@      },      "scripts": {          "test": "npm run test-lint && npm run test-code", -        "test-lint": "eslint .", +        "test-lint": "eslint . && node ./test/lint/global-declarations.js",          "test-code": "node ./test/test-schema.js && node ./test/test-dictionary.js && node ./test/test-database.js && node ./test/test-document.js"      },      "repository": { diff --git a/test/lint/global-declarations.js b/test/lint/global-declarations.js new file mode 100644 index 00000000..2629cc5e --- /dev/null +++ b/test/lint/global-declarations.js @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2020  Alex Yatskov <alex@foosoft.net> + * Author: Alex Yatskov <alex@foosoft.net> + * + * 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'); +const assert = require('assert'); +const {getAllFiles} = require('../yomichan-test'); + + +function countOccurences(string, pattern) { +    return (string.match(pattern) || []).length; +} + +function getNewline(string) { +    const count1 = countOccurences(string, /(?:^|[^\r])\n/g); +    const count2 = countOccurences(string, /\r\n/g); +    const count3 = countOccurences(string, /\r(?:[^\n]|$)/g); +    if (count2 > count1) { +        return (count3 > count2) ? '\r' : '\r\n'; +    } else { +        return (count3 > count1) ? '\r' : '\n'; +    } +} + + +function validateGlobals(fileName, fix) { +    const pattern = /\/\*\s*global\s+([\w\W]*?)\*\//g; +    const trimPattern = /^[\s,*]+|[\s,*]+$/g; +    const splitPattern = /[\s,*]+/; +    const source = fs.readFileSync(fileName, {encoding: 'utf8'}); +    let match; +    let first = true; +    let endIndex = 0; +    let newSource = ''; +    const newline = getNewline(source); +    while ((match = pattern.exec(source)) !== null) { +        if (!first) { +            console.error(`Encountered more than one global declaration in ${fileName}`); +            return false; +        } +        first = false; + +        const parts = match[1].replace(trimPattern, '').split(splitPattern); +        parts.sort(); + +        const actual = match[0]; +        const expected = `/* global${parts.map((v) => `${newline} * ${v}`).join('')}${newline} */`; + +        try { +            assert.strictEqual(actual, expected); +        } catch (e) { +            console.error(`Global declaration error encountered in ${fileName}:`); +            console.error(e.message); +            if (!fix) { +                return false; +            } +        } + +        newSource += source.substring(0, match.index); +        newSource += expected; +        endIndex = match.index + match[0].length; +    } + +    newSource += source.substring(endIndex); + +    if (fix) { +        fs.writeFileSync(fileName, newSource, {encoding: 'utf8'}); +    } + +    return true; +} + + +function main() { +    const fix = (process.argv.length >= 2 && process.argv[2] === '--fix'); +    const directory = path.resolve(__dirname, '..', '..', 'ext'); +    const pattern = /\.js$/; +    const ignorePattern = /[\\/]ext[\\/]mixed[\\/]lib[\\/]/; +    const fileNames = getAllFiles(directory, (f) => pattern.test(f) && !ignorePattern.test(f)); +    for (const fileName of fileNames) { +        if (!validateGlobals(fileName, fix)) { +            process.exit(-1); +            return; +        } +    } +    process.exit(0); +} + + +if (require.main === module) { main(); } diff --git a/test/yomichan-test.js b/test/yomichan-test.js index 0fc97b4b..5fa7730b 100644 --- a/test/yomichan-test.js +++ b/test/yomichan-test.js @@ -50,8 +50,29 @@ function createTestDictionaryArchive(dictionary, dictionaryName) {      return archive;  } +function getAllFiles(baseDirectory, predicate=null) { +    const results = []; +    const directories = [path.resolve(baseDirectory)]; +    while (directories.length > 0) { +        const directory = directories.shift(); +        for (const fileName of fs.readdirSync(directory)) { +            const fullFileName = path.resolve(directory, fileName); +            const stats = fs.statSync(fullFileName); +            if (stats.isFile()) { +                if (typeof predicate !== 'function' || predicate(fullFileName, directory, baseDirectory)) { +                    results.push(fullFileName); +                } +            } else if (stats.isDirectory()) { +                directories.push(fullFileName); +            } +        } +    } +    return results; +} +  module.exports = {      createTestDictionaryArchive, +    getAllFiles,      get JSZip() { return getJSZip(); }  }; |