diff --git a/.babelrc b/.babelrc deleted file mode 100644 index c13c5f6..0000000 --- a/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["es2015"] -} diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..e94f814 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1 @@ +defaults diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..51bd461 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 + +[*.{js,json,ts,tsx}] +charset = utf-8 \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..5da5008 --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +JS_ENV="development" +JS_ROOT="./" +JS_i18n="../../../src/_locales" \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..8bcae8b --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: magicoflolis diff --git a/.github/ISSUE_TEMPLATE/01_bug_report.yml b/.github/ISSUE_TEMPLATE/01_bug_report.yml new file mode 100644 index 0000000..ebbcfd9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/01_bug_report.yml @@ -0,0 +1,70 @@ +name: "🐞 Bug report" +description: File a bug report. +title: "[bug]: " +labels: ["bug 🐞"] +assignees: + - magicoflolis +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! + - type: checkboxes + attributes: + label: Is there an existing issue for this? + description: Please search to see if an issue already exists for the bug you encountered. + options: + - label: I have searched the existing issues + required: true + - type: dropdown + id: type + attributes: + label: Type + description: How are you using Magic Userscript+? + multiple: true + options: + - User Script + - Web Extension + validations: + required: true + - type: input + id: browser + attributes: + label: Web Browser + description: What browser are you seeing this bug on? + validations: + required: true + - type: input + id: userjs-manager + attributes: + label: User Script Manager + description: What user script manager are you using? - not required when using Web Extension + validations: + required: false + - type: input + id: url + attributes: + label: URL + description: What URL did the bug occur on? + validations: + required: true + - type: textarea + id: what-happened + attributes: + label: What happened? + description: Describe the bug. + placeholder: A clear and concise description of the bug. + value: "A bug happened!" + validations: + required: true + - type: textarea + id: bug-reproduction + attributes: + label: Steps To Reproduce + description: Steps to reproduce the bug. + placeholder: | + 1. Navigated to '...' + 1. Console error '...' + 1. etc. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/02_feature_request.yml b/.github/ISSUE_TEMPLATE/02_feature_request.yml new file mode 100644 index 0000000..990c982 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/02_feature_request.yml @@ -0,0 +1,14 @@ +name: "💡 Feature request" +description: Suggest an idea for this project +title: "[feat]: " +labels: ["feature-request 💡"] +assignees: + - magicoflolis +body: + - type: textarea + id: description + attributes: + label: Feature description + description: A clear and concise description, please include if your feature request is related to a problem. + validations: + required: true diff --git a/.gitignore b/.gitignore index 42f232d..c61cb6a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,28 @@ -node_modules/ -.idea/ -.DS_Store +# ignore haters +haters/ + +build +node_modules + +Notes +.history +web-ext +web-ext-artifacts +web-server + +*.ini + +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* +*.tsbuildinfo + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local diff --git a/.swcrc b/.swcrc new file mode 100644 index 0000000..6ff7ceb --- /dev/null +++ b/.swcrc @@ -0,0 +1,26 @@ +{ + "$schema": "https://json.schemastore.org/swcrc", + "jsc": { + "parser": { + "syntax": "ecmascript", + "jsx": false, + "dynamicImport": false, + "privateMethod": false, + "functionBind": false, + "exportDefaultFrom": false, + "exportNamespaceFrom": false, + "decorators": false, + "decoratorsBeforeExport": false, + "topLevelAwait": false, + "importMeta": false + }, + "target": "es2020" + }, + "module": { + "type": "es6", + "strict": false, + "strictMode": true, + "lazy": false, + "noInterop": false + } +} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 36d2057..0000000 --- a/.travis.yml +++ /dev/null @@ -1,32 +0,0 @@ -language: node_js -node_js: 9 -before_script: - - npm install yarn webpack -g - - git checkout master - - cd crx - - yarn - - cd .. - - yarn - -script: - - yarn build - - cd crx - - yarn build - - cd .. - -after_success: - - pwd - - git commit -a -m "Travis build" - - git status - - git push "https://${GH_TOKEN}@${GH_REF}" master:master - -cache: - yarn: true - webpack: true - directories: - - "node_modules" - - "crx/node_modules" - -env: - global: - - GH_REF: github.com/jae-jae/Userscript-Plus.git \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..5e05bdd --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + "recommendations": [ + "mrmlnc.vscode-autoprefixer", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "mrmlnc.vscode-scss", + "adpyke.vscode-userscript", + "xyz.local-history" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..b54e9f0 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,46 @@ +{ + "version": "0.2.0", + "compounds": [ + { + "name": "Attach/Launch", + "configurations": ["SF", "Attach:Firefox"] + } + ], + "configurations": [ + { + "name": "Attach:Firefox", + "type": "firefox", + "request": "attach", + }, + { + "name": "SF", + "type": "firefox", + "request": "launch", + "profile": "UserJS", + "clearConsoleOnReload": true, + "reAttach": true, + "reloadOnAttach": true, + "keepProfileChanges": false, + "url": "https://www.google.com/", + "addonPath": "${workspaceFolder}/build/firefox", + "reloadOnChange": "${workspaceFolder}/src/**", + "firefoxArgs": ["--devtools"], + "pathMappings": [ + { + "url": "webpack:///js", + "path": "${workspaceFolder}/src/js" + }, + { + "url": "webpack:///src/", + "path": "${webRoot}/src/" + } + ], + "log": { + "fileName": "${workspaceFolder}/log.txt", + "fileLevel": { + "default": "Debug" + } + } + } + ] +} diff --git a/CHANGELOG.user.md b/CHANGELOG.user.md new file mode 100644 index 0000000..c67f69b --- /dev/null +++ b/CHANGELOG.user.md @@ -0,0 +1,300 @@ +# Changelog + +**Known Issues:** + +* SVG elements don't load on every webpage: + * _can be blocked by host, external scripts, web extensions, etc._ +* Outlook Website Loading Problem [#70](https://github.com/magicoflolis/Userscript-Plus/issues/70) + * Recommend excluding this userscript on `*.office.com` domains within your userscript manager or switch to the webextension version as it does not injected itself into the page. + * Caused by `Duplicated Default Trusted Types policy`. + +**TODO:** + +* Finish translations. +* Finish blacklist section. +* GitHub engine - filter out UserScript and UserStyles that don't match the host +* Rework TrustedTypePolicy code + +## v7.6.8 + +* Bug fixes: + * ~~Fixed [#70](https://github.com/magicoflolis/Userscript-Plus/issues/70)~~ + +--- + +## v7.6.7 + +* Bug fixes: + * Fixed [#69](https://github.com/magicoflolis/Userscript-Plus/issues/69) + +--- + +## v7.6.6 + +* Config changes: + * `autofetch` is now OFF by default +* Internal changes: + * refactored some code, better readability + * added info icon along with help links +* General changes: + * while `autofetch` is off, clicking the counter for the first time will auto fetch results + * minor bug fixes + +**TODO:** + +* Finish translations. +* Finish blacklist section. +* GitHub engine - filter out UserScript and UserStyles that don't match the host + +--- + +## v7.6.5 + +* fixed [#67](https://github.com/magicoflolis/Userscript-Plus/issues/67) + +--- + +## v7.6.4 + +* fixed `this.hostCache` for real this time +* changed `safeSelf` into a class + +--- + +## v7.6.3 + +* fixed [#66](https://github.com/magicoflolis/Userscript-Plus/issues/66) + * `this.cache` should have been `this.hostCache`, my bad + +--- + +## v7.6.2 + +* Improvements: + * improved multiple UserScript/UserStyle detection + * improved cache system + * _improved_ hostname recognition - somewhat follows web extension version + * improved readablity of "Theme Colors" section + * improved import/export of config and theme + * improved download process of UserScripts and UserStyles +* Config changes: + * GitHub engine: + * if your a UserScript or UserStyle developer and it's hosted on GitHub see [GitHub Detection](https://github.com/magicoflolis/Userscript-Plus/tree/master/wiki#github-detection) + * will now list all UserScripts and UserStyles within a repository - _even if they don't match the host_ + * multiple urls will now be fetched: + * `https://api.github.com/search/repositories?q=topic:{domain}+topic:userstyle` - cannot be changed in the settings menu + * `https://api.github.com/search/repositories?q=topic:{domain}+topic:userscript` - reset your config or manually set this address for changes to take effect + * the repository is removed from the list if no valid UserScripts or UserStyles are found +* Bug fixes: + * fixed "Enabling a engine requires the page to be reloaded, while disabling a engine does not." + * fixed "If an item changes after the list is sorted, the sorting won't be updated" + * fixed menu not timing out when "Fetch on load" was disabled + * fixed tab when searching for all-sites / `*` + * fixed searching settings +* Internal changes: + * removed `Memorize` class + * removed unused \@grants `GM_addValueChangeListener`, `GM_removeValueChangeListener`, and there `GM.*` counter parts + * removed some unused functions, types, css + * shortened some functions, types, css +* i18n additions (still not localized): + * new keys: `code`, `metadata`, `preview_metadata`, `recommend_author`, `recommend_other`, `default_sort` + +**TODO:** + +* Finish translations. +* Finish blacklist section. +* GitHub engine - filter out UserScript and UserStyles that don't match the host + +--- + +## v7.6.1 + +* Fixed sorting + +--- + +## v7.6.0 + +* New feature, `Preview Metadata` - same as `Preview Code` but loads userscripts metadata head +* New feature, `Page` - loads additonal information from userscripts homepage +* Config changes, moved `codePreview` value to `preview: code`, recommended resetting your config to clear any old/unused settings. + * If you had `Preview Code` enabled, you will need to re-enable it +* When `Preview Metadata` and `Preview Code` are both enabled, it will display the entire userscript +* Icon changes, svgs are now from [fontawesome.com](https://fontawesome.com) +* Search engines have been moved to the `Search Engines` section +* Improved mobile UI +* Improved userscript parsing +* Improved load times - added custom event to handle async item changes +* Improved GitHub engine + * Number of stars for a repo = daily installs + * Number of watchers for a repo = good rating +* Cleanup old css +* Minor bug fixes + +**Known Issues:** + +* Enabling a engine requires the page to be reloaded, while disabling a engine does not. + * This is caused by the cache system. +* If an item changes after the list is sorted, the sorting won't be updated + +**TODO:** + +* Finish translations. +* Finish blacklist section. + +--- + +## v7.5.0 + +* Merged [#64](https://github.com/magicoflolis/Userscript-Plus/pull/64) +* Cleaned up old comments + +**Known Issues:** + +* Enabling a engine requires the page to be reloaded, while disabling a engine does not. + * This is caused by the cache system. +* "Filter out other languages" may not filter _every_ userscript that is not in your language. + +**TODO:** + +* Finish translations. +* Finish blacklist section. +* Finish config section. + +--- + +## v7.4.0 + +* Merged [#59](https://github.com/magicoflolis/Userscript-Plus/pull/59) +* Added `githubusercontent.com` to `@connect`. +* Added `autoSort` to config. +* Added sorting to the following: "Total installs", "Ratings", "Created date". + * Still in the early stages, but functional +* Reworked counter system. +* Tweaked cache system. + * Reduced how often the script will cache something. +* Cleaned up code. +* Fixed minor issues. + +**Known Issues:** + +* Enabling a engine requires the page to be reloaded, while disabling a engine does not. + * This is caused by the cache system. +* "Filter out other languages" may not filter _every_ userscript that is not in your language. + +**TODO:** + +* Finish translations. +* Finish blacklist section. +* Finish config section. +* Merge [#64](https://github.com/magicoflolis/Userscript-Plus/pull/64) + +--- + +## v7.3.0 + +* Re-organized config list. +* Added [GreasyFork Bullshit Filter](https://greasyfork.org/scripts/12179) into list. + * You can enable it under "List Filters" in the config. + * You can also do `filter:` in the search bar to quickly filter the list. + * Full list here: [Wiki Page](https://github.com/magicoflolis/Userscript-Plus/tree/master/wiki/README.md) + * Example: `filter:ascii` => filters out non-ASCII scripts + +**Known Issues:** + +* "Filter out other languages" may not filter _every_ userscript that is not in your language. + +**TODO:** + +* Finish translations. +* Finish blacklist section. +* Merge [#59](https://github.com/magicoflolis/Userscript-Plus/pull/59) +* Add sorting to the following: "Total installs", "Ratings", "Created date" + +--- + +## v7.2.0 + +* New config "Inject on load", when disabled prevents this script from injecting the menu automatically. + * You can still inject the menu through the context menu in your UserScript manager. + * This will reduce overall distraction the script can have on certain pages. +* New config "Fetch on load", when disabled prevents UserScripts from being fetched automatically. + * When the menu is re-injected through the context menu in your UserScript manager UserScripts will always be fetched automatically. + * This will reduce network traffic for the engines. +* Improved design of theme section. +* Improved design of blacklist section, adding new pages to the list is still incomplete. +* Changed "Sync with GM" to "Sync with UserScript Manager". +* Made it so translated UserScripts are a different color in the list. +* CSS adjustments. + +**Known Issues:** + +* "Filter out other languages" may not filter _every_ userscript that is not in your language. + +**TODO:** + +* Add [GreasyFork Bullshit Filter](https://greasyfork.org/scripts/12179) into list +* Merge [#59](https://github.com/magicoflolis/Userscript-Plus/pull/59) +* Add sorting to the following: "Total installs", "Ratings", "Created date" + +--- + +## v7.1.1 + +* Fixed "Error When Opening YouTube" [#63](https://github.com/magicoflolis/Userscript-Plus/issues/63) + +--- + +## v7.1.0 + +* Implemented [Task Scheduling API](https://developer.mozilla.org/en-US/docs/Web/API/Prioritized_Task_Scheduling_API) + * Limited availability, see [Browser compatibility](https://developer.mozilla.org/en-US/docs/Web/API/Scheduler#browser_compatibility) + * I added basic polyfills so hopefully there won't be issues. +* Improved error handling +* _Be sure to look in your console if the UserScript stops working for some reason!_ + +**Known Issues:** + +* "Filter out other languages" may not filter _every_ userscript that is not in your language. + +**TODO:** + +* Add [GreasyFork Bullshit Filter](https://greasyfork.org/scripts/12179) into list +* Merge [#59](https://github.com/magicoflolis/Userscript-Plus/pull/59) +* Add sorting to the following: "Total installs", "Ratings", "Created date" +* Improve design of blacklist section + +--- + +## v7.0.0 + +* Ability to change the URL of each engine + * **Please reset your config if updating!** +* Added "Bad UserScripts" which will blacklist certain userscripts from showing +* Search improvements + * Can now search settings + * New search abilities, example `license:MIT` + * `code_url:` or `url:` + * `author:` or `users:` + * `locale:` or `i18n:` + * `id:` + * `license:` + * `name:` + * `description:` + * `search_engine:` or `engine:` +* UI ajustments + +**Known Issues:** + +* "Filter out other languages" may not filter _every_ userscript that is not in your language. + +**TODO:** + +* Add sorting to the following: "Total installs", "Ratings", "Created date" +* Improve design of blacklist section + +--- + +## Previous Changes + +[https://github.com/magicoflolis/Userscript-Plus/releases](https://github.com/magicoflolis/Userscript-Plus/releases) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..3544874 --- /dev/null +++ b/LICENSE @@ -0,0 +1,9 @@ + The MIT License (MIT) + +Copyright © 2024 Magic + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README-RU.md b/README-RU.md deleted file mode 100644 index 5943791..0000000 --- a/README-RU.md +++ /dev/null @@ -1,77 +0,0 @@ -![userscript+.gif](https://cdn.rawgit.com/jae-jae/_resources/master/img/userscript+.gif) -# Userscript+ - -[![Build Status](https://travis-ci.org/jae-jae/Userscript-Plus.svg?branch=master)](https://travis-ci.org/jae-jae/Userscript-Plus) -[![Tampermonkey](https://img.shields.io/badge/Tampermonkey-up%20to%20date-green.svg)](https://tampermonkey.net/) -[![webpack](https://img.shields.io/badge/webpack-3.x-orange.svg)](https://github.com/webpack/webpack) -[![Vue](https://img.shields.io/badge/Vue-2.4%2B-yellow.svg)](https://vuejs.org/) -[![iView](https://img.shields.io/badge/iView-2.2.0-brightgreen.svg)](https://www.iviewui.com) -[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com) -[![i18n](https://img.shields.io/badge/i18n-PR-blue.svg)](https://github.com/jae-jae/Userscript-Plus/tree/master/src/common/lang) -[![GitHub stars](https://img.shields.io/github/stars/jae-jae/Userscript-Plus.svg?style=social&label=Star&style=flat-square)](https://github.com/jae-jae/Userscript-Plus) - -> Показать пользовательские скрипты (UserJS) для текущего сайта. Легкий способ установить пользовательские скрипты для Tampermonkey. - -**Userscript +** пользовательский скрипт для Tampermonkey, который, когда вы заходите на сайты, автоматически предлагает во всплывающей подсказе в правом нижнем углу скрипты Tampermonkey для текущей страницы, и может установить выбранный скрипт. - -Зачастую, мы не знаем, что сайты имеют готовые скрипты для оптимизации страницы или сайта, но **Userscript+** поможет автоматически найти подходящие пользовательские скрипты, и по умолчанию, отсортирует их по рейтингу от высокого к низкому, что даёт тебе новый удобный способ использования `Tampermonkey`! - -> - [English description](https://github.com/jae-jae/Userscript-Plus/blob/master/README.md) -> - [中文说明](https://github.com/jae-jae/Userscript-Plus/blob/master/README-ZH.md) - -## Установка -1. Установите плагин `Tampermonkey` для Chrome/Firefox - - Интернет-магазин Chrome: [https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo]( https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo) - - Дополнения Firefox: [https://addons.mozilla.org/ru/firefox/addon/tampermonkey](https://addons.mozilla.org/ru/firefox/addon/tampermonkey) - -2. Установите `Userscript+` - - Вы можете установить этот скрипт через `GreasyFork` или` GitHub`: - - GreasyFork: [https://greasyfork.org/ru/scripts/24508](https://greasyfork.org/ru/scripts/24508-userscript-show-site-all-userjs) - - GitHub: [https://github.com/jae-jae/Userscript-Plus/raw/master/dist/show-site-all-userjs.user.js](https://github.com/jae-jae/Userscript-Plus/raw/master/dist/show-site-all-userjs.user.js) - -### Userscript+ дополнение для Chrome/Firefox -![](https://raw.githubusercontent.com/jae-jae/_resources/master/img/175033.png) -- Интернет-магазин Chrome:[https://chrome.google.com/webstore/detail/okiocdganiomklllkfkmhneoibegifch](https://chrome.google.com/webstore/detail/okiocdganiomklllkfkmhneoibegifch) - -- Github: [https://github.com/jae-jae/Userscript-Plus/raw/master/crx/extension.crx](https://github.com/jae-jae/Userscript-Plus/raw/master/crx/extension.crx) - -- Дополнения Firefox: [https://addons.mozilla.org/ru/firefox/addon/userscript-for-tampermonkey](https://addons.mozilla.org/ru/firefox/addon/userscript-for-tampermonkey) - -## Что делает: -- Автоматически отображает значок в правом нижнем углу страницы, рекомендуя скрипты, автоматически исчезает спустя 10 секунд -- Отфильтровывет 50 скриптов с самым высоким рейтингом -- Список скриптов имет поисковый фильтр -- Список скриптов поддерживает произвольную сортировку -- Поддерживает установку скрипта в один клик -- Просмотр описания скрипта -- Показывает ссылки на домашнюю страницу скрипта и автора -- При нажатии кнопки "закрыть" всплывающий значок больше не появится на всех страницах сайта в `текущей сессии` -- Всплывающий значок отображается только когда найдены доступные скрипты для текущего сайта -- Поддержка многоязыковой интернализации i18n. (**[Содействие с локализацией](https://github.com/jae-jae/Userscript-Plus/tree/master/src/common/lang) приветствуется!**) -- Vue + iView UI отзывчивый и приятный дизайн интерфейса. - -## Белый список и Чёрный список -> Редактировать скрипт => Вкладка настроек => Includes/Excludes - -В `Tampermonkey`, чтобы войти в интерфейс редактирования скрипта, выберите вкладку` Настройки `, нужная вкладка находится в опциях ` Includes/Excludes `, установите белый и чёрный список, смотрите пример: - -![us+en-ex.gif](https://cdn.rawgit.com/jae-jae/_resources/master/img/us+en-ex.gif) - -## Известные баги - -1. На некоторых сайтах иконка интерфейса плагина не отображается,например: Github - - **Причина**: Это происходит из за того что, политики безопасности этих сайтов не позволяют файлу иконки плагина загрузиться, как результат не позволяя ей корректно отобразиться. - -## Содействие - -Если вы желаете содействовать развитию проекта кодом, пожалуйста, прочитайте следующую [спецификацию стандарта](https://standardjs.com/). - -## Лицензия -MIT - - - diff --git a/README-ZH.md b/README-ZH.md deleted file mode 100644 index 29da784..0000000 --- a/README-ZH.md +++ /dev/null @@ -1,76 +0,0 @@ -![userscript+cn.gif](https://cdn.rawgit.com/jae-jae/_resources/master/img/userscript+cn.gif) -# Userscript+ - -[![Build Status](https://travis-ci.org/jae-jae/Userscript-Plus.svg?branch=master)](https://travis-ci.org/jae-jae/Userscript-Plus) -[![Tampermonkey](https://img.shields.io/badge/Tampermonkey-up%20to%20date-green.svg)](https://tampermonkey.net/) -[![webpack](https://img.shields.io/badge/webpack-3.x-orange.svg)](https://github.com/webpack/webpack) -[![Vue](https://img.shields.io/badge/Vue-2.4%2B-yellow.svg)](https://vuejs.org/) -[![iView](https://img.shields.io/badge/iView-2.2.0-brightgreen.svg)](https://www.iviewui.com) -[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com) -[![i18n](https://img.shields.io/badge/i18n-PR-blue.svg)](https://github.com/jae-jae/Userscript-Plus/tree/master/src/common/lang) -[![GitHub stars](https://img.shields.io/github/stars/badges/shields.svg?style=social&label=Star&style=flat-square)](https://github.com/jae-jae/Userscript-Plus) - -> 显示当前网站所有的UserJS,一种更容易安装UserJS的方式对于Tampermonkey - -**Userscript+** 是一款`Tampermonkey`脚本,作用是当你浏览网页的时候,从右下角自动为你推荐适用于当前页面的`Tampermonkey`脚本,并且可以一键安装指定的脚本。 - -很多时候,我们并不知道一些网站是否有用户提供用来优化页面的脚本,而**Userscript+** 就能帮你自动寻找适用的UserJS,并默认按照评分高低排序推荐给你,给你带来一种全新的`Tampermonkey`使用体验! - -> 旧版本,V1.x:[https://gist.github.com/jae-jae/39d526079cb2408389129caf98debc29](https://gist.github.com/jae-jae/39d526079cb2408389129caf98debc29) - -## 安装 -1. 安装Chrome/Firefox插件`Tampermonkey` - - Chrome Store: [https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo]( https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo) - - Firefox addons:[https://addons.mozilla.org/en-US/firefox/addon/tampermonkey](https://addons.mozilla.org/en-US/firefox/addon/tampermonkey) - -2. 安装`Userscript+` - - 你可以通过`GreasyFork`或者`GitHub`来安装此脚本: - - GreasyFork: [https://greasyfork.org/zh-CN/scripts/24508](https://greasyfork.org/zh-CN/scripts/24508-userscript-show-site-all-userjs) - - GitHub: [https://github.com/jae-jae/Userscript-Plus/raw/master/dist/show-site-all-userjs.user.js](https://github.com/jae-jae/Userscript-Plus/raw/master/dist/show-site-all-userjs.user.js) - -### Userscript+ Chrome/Firefox插件 -![](https://raw.githubusercontent.com/jae-jae/_resources/master/img/175033.png) -独立的Chrome/Firefox插件版本,更加方便好用: -- Chrome webstore:[https://chrome.google.com/webstore/detail/okiocdganiomklllkfkmhneoibegifch](https://chrome.google.com/webstore/detail/okiocdganiomklllkfkmhneoibegifch) - -- Github: [https://github.com/jae-jae/Userscript-Plus/raw/master/crx/extension.crx](https://github.com/jae-jae/Userscript-Plus/raw/master/crx/extension.crx) - -- Firefox Add-ons: [https://addons.mozilla.org/zh-CN/firefox/addon/userscript-for-tampermonkey](https://addons.mozilla.org/zh-CN/firefox/addon/userscript-for-tampermonkey) - -## 特性 -- 自动在右下角静默为你推荐脚本,并会在10秒后自动消失 -- 筛选评分最高的前50条脚本 -- 脚本列表支持搜索过滤 -- 脚本列表支持自定义排序 -- 支持一键安装脚本 -- 支持查看脚本详情 -- 支持访问脚本首页和作者首页 -- 点击关闭按钮后,当前网站的`本次会话`的所有页面都将不会再出现本插件的提示框 -- 只有当找到了适用于当前网站的脚本的时候才会显示提示框 -- i18n国际化多语言支持。(**[欢迎PR补充语言库!](https://github.com/jae-jae/Userscript-Plus/tree/master/src/common/lang)**) -- Vue+iView界面设计流畅漂亮 - -## 白名单和黑名单 -> 脚本编辑界面 => 设置选项卡 => 包含/排除 - -在`Tampermonkey`中进入到本脚本编辑界面,选择`设置`选项卡,这个选项卡下面有`包含/排除`选项,在这里设置白名单和黑名单,看图: - -![userscript+cn+hei2.gif](https://cdn.rawgit.com/jae-jae/_resources/master/img/userscript+cn+hei2.gif) - -## 已知Bug - -1. 在某些网站下面插件界面图标不显示,如:Github - - **原因**:这是因为这些网站的安全策略阻止了插件图标字体文件的加载,导致图标无法正常显示 - -## 贡献代码 - -如果你愿意为本项目贡献代码,请遵守[standard](https://standardjs.com/)规范。 - -## License -MIT - - diff --git a/README.de.md b/README.de.md new file mode 100644 index 0000000..344bc20 --- /dev/null +++ b/README.de.md @@ -0,0 +1,19 @@ +# Magic Userscript+ + +| Preview(s) | +|:----------:| +![Demo 1](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo3.gif)| +![Demo 2](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo2.gif)| +![Demo 3](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo1.png)| + +## Source Code + +* [GitHub](https://github.com/magicoflolis/Userscript-Plus) + +### Contacts + +[GitHub](https://github.com/magicoflolis) + +[Twitter](https://twitter.com/for_lollipops) + +[Greasy Fork](https://greasyfork.org/users/166061) diff --git a/README.es.md b/README.es.md new file mode 100644 index 0000000..344bc20 --- /dev/null +++ b/README.es.md @@ -0,0 +1,19 @@ +# Magic Userscript+ + +| Preview(s) | +|:----------:| +![Demo 1](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo3.gif)| +![Demo 2](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo2.gif)| +![Demo 3](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo1.png)| + +## Source Code + +* [GitHub](https://github.com/magicoflolis/Userscript-Plus) + +### Contacts + +[GitHub](https://github.com/magicoflolis) + +[Twitter](https://twitter.com/for_lollipops) + +[Greasy Fork](https://greasyfork.org/users/166061) diff --git a/README.fr.md b/README.fr.md new file mode 100644 index 0000000..344bc20 --- /dev/null +++ b/README.fr.md @@ -0,0 +1,19 @@ +# Magic Userscript+ + +| Preview(s) | +|:----------:| +![Demo 1](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo3.gif)| +![Demo 2](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo2.gif)| +![Demo 3](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo1.png)| + +## Source Code + +* [GitHub](https://github.com/magicoflolis/Userscript-Plus) + +### Contacts + +[GitHub](https://github.com/magicoflolis) + +[Twitter](https://twitter.com/for_lollipops) + +[Greasy Fork](https://greasyfork.org/users/166061) diff --git a/README.it.md b/README.it.md new file mode 100644 index 0000000..344bc20 --- /dev/null +++ b/README.it.md @@ -0,0 +1,19 @@ +# Magic Userscript+ + +| Preview(s) | +|:----------:| +![Demo 1](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo3.gif)| +![Demo 2](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo2.gif)| +![Demo 3](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo1.png)| + +## Source Code + +* [GitHub](https://github.com/magicoflolis/Userscript-Plus) + +### Contacts + +[GitHub](https://github.com/magicoflolis) + +[Twitter](https://twitter.com/for_lollipops) + +[Greasy Fork](https://greasyfork.org/users/166061) diff --git a/README.ja.md b/README.ja.md new file mode 100644 index 0000000..344bc20 --- /dev/null +++ b/README.ja.md @@ -0,0 +1,19 @@ +# Magic Userscript+ + +| Preview(s) | +|:----------:| +![Demo 1](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo3.gif)| +![Demo 2](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo2.gif)| +![Demo 3](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo1.png)| + +## Source Code + +* [GitHub](https://github.com/magicoflolis/Userscript-Plus) + +### Contacts + +[GitHub](https://github.com/magicoflolis) + +[Twitter](https://twitter.com/for_lollipops) + +[Greasy Fork](https://greasyfork.org/users/166061) diff --git a/README.md b/README.md index f8c16ec..06604ba 100644 --- a/README.md +++ b/README.md @@ -1,77 +1,165 @@ -![userscript+.gif](https://cdn.rawgit.com/jae-jae/_resources/master/img/userscript+.gif) -# Userscript+ +

2026-08-09: Reset setting if updating to UserScript v7.6.9

+
If WebExtension: https://greasyfork.org/.. to https://api.greasyfork.org/..
-[![Build Status](https://travis-ci.org/jae-jae/Userscript-Plus.svg?branch=master)](https://travis-ci.org/jae-jae/Userscript-Plus) -[![Tampermonkey](https://img.shields.io/badge/Tampermonkey-up%20to%20date-green.svg)](https://tampermonkey.net/) -[![webpack](https://img.shields.io/badge/webpack-3.x-orange.svg)](https://github.com/webpack/webpack) -[![Vue](https://img.shields.io/badge/Vue-2.4%2B-yellow.svg)](https://vuejs.org/) -[![iView](https://img.shields.io/badge/iView-2.2.0-brightgreen.svg)](https://www.iviewui.com) -[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com) -[![i18n](https://img.shields.io/badge/i18n-PR-blue.svg)](https://github.com/jae-jae/Userscript-Plus/tree/master/src/common/lang) -[![GitHub stars](https://img.shields.io/github/stars/jae-jae/Userscript-Plus.svg?style=social&label=Star&style=flat-square)](https://github.com/jae-jae/Userscript-Plus) +--- -> Show current site all UserJS,The easier way to install UserJs for Tampermonkey. +[![Badge License](https://img.shields.io/github/license/magicoflolis/Userscript-Plus?style=flat-square)](https://github.com/magicoflolis/Userscript-Plus/blob/master/LICENSE) +[![Badge Issues](https://img.shields.io/github/issues/magicoflolis/Userscript-Plus?style=flat-square)](https://github.com/magicoflolis/Userscript-Plus/issues) +[![Badge Greasy Fork](https://img.shields.io/greasyfork/dt/421603?style=flat-square)](https://greasyfork.org/scripts/421603) +[![Badge Stars](https://img.shields.io/github/stars/magicoflolis/Userscript-Plus?style=flat-square)](https://github.com/magicoflolis/Userscript-Plus/stargazers) -**Userscript +** is a `Tampermonkey` user script, the role is when you browse the web, from the bottom right corner automatically for you to recommend the current page `Tampermonkey` script, and can install a designated script. +--- -Many times, we do not know whether some sites have users to provide the script to optimize the page, but **Userscript+** will be able to help you automatically find the applicable UserJS, and by default, according to the score from high to low order recommended to you, bring you a new `Tampermonkey` use experience! +

+ + + +Magic Userscript+ +

-> - [中文说明](https://github.com/jae-jae/Userscript-Plus/blob/master/README-ZH.md) -> - [Описание на русском](https://github.com/jae-jae/Userscript-Plus/blob/master/README-RU.md) +*A complete rewrite of [Userscript+ : Show Site All UserJS](https://github.com/jae-jae/Userscript-Plus)* -## Installation -1. Install the Chrome/Firefox plugin `Tampermonkey` - - Chrome Store: [https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo]( https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo) - - Firefox addons:[https://addons.mozilla.org/en-US/firefox/addon/tampermonkey](https://addons.mozilla.org/en-US/firefox/addon/tampermonkey) - -2. Install `Userscript+` +Finds available UserScripts and UserStyles for the current webpage, the power of [Greasy Fork](https://greasyfork.org) on the go! - You can install this script via `GreasyFork` or` GitHub`:: - - GreasyFork: [https://greasyfork.org/en/scripts/24508](https://greasyfork.org/en/scripts/24508-userscript-show-site-all-userjs) - - GitHub: [https://github.com/jae-jae/Userscript-Plus/raw/master/dist/show-site-all-userjs.user.js](https://github.com/jae-jae/Userscript-Plus/raw/master/dist/show-site-all-userjs.user.js) +[UserScript Changelog](https://github.com/magicoflolis/Userscript-Plus/blob/master/CHANGELOG.user.md) -### Userscript+ Chrome/Firefox extension -![](https://raw.githubusercontent.com/jae-jae/_resources/master/img/175033.png) -- Chrome webstore:[https://chrome.google.com/webstore/detail/okiocdganiomklllkfkmhneoibegifch](https://chrome.google.com/webstore/detail/okiocdganiomklllkfkmhneoibegifch) +[Web Extension Changelog](https://github.com/magicoflolis/Userscript-Plus/releases) -- Github: [https://github.com/jae-jae/Userscript-Plus/raw/master/crx/extension.crx](https://github.com/jae-jae/Userscript-Plus/raw/master/crx/extension.crx) +[List of known issues by Web Browser](https://github.com/magicoflolis/Userscript-Plus/blob/master/browser-issues.md) -- Firefox Add-ons: [https://addons.mozilla.org/en-US/firefox/addon/userscript-for-tampermonkey](https://addons.mozilla.org/en-US/firefox/addon/userscript-for-tampermonkey) +## **Download** + +**UserScript:** + +> [!IMPORTANT] +> The UserScript only works on `HTTPS` sites! ([https://example.com](https://example.com)) + +* [Greasy Fork](https://greasyfork.org/scripts/421603) +* [GitHub Repo](https://github.com/magicoflolis/Userscript-Plus/blob/master/dist/magic-userjs.user.js?raw=1) +* [Open UserJS](https://openuserjs.org/scripts/Magic/Magic_Userscript+_Show_Site_All_UserJS) - Outdated + +**Web Extension:** + +* [GitHub Repo](https://github.com/magicoflolis/Userscript-Plus/releases) +* [Firefox Add-ons](https://addons.mozilla.org/firefox/addon/userscript-plus/) +* [Chrome Web Store](https://chromewebstore.google.com/detail/kbelpalpbddhjhoakbjkfookjeiennbo) +* [Edge Add-ons](https://microsoftedge.microsoft.com/addons/detail/golkolijobdaldjgefapmcknlmkjlhdh) +* ~~[Opera Add-ons](https://github.com/magicoflolis/Userscript-Plus/releases)~~ - Under review + +**Bookmarklet (not recommended):** + +Save this URL as a bookmark, clicking it will cause the **UserScript version** to inject itself into the current webpage. + +```js filename="src/UserJS/main.js" +javascript:(function(){['https://cdn.jsdelivr.net/gh/magicoflolis/Userscript-Plus@master/userscript/dist/magic-userjs.user.js'].map(s=>document.body.appendChild(document.createElement('script')).src=s)})(); +``` ## Features -- Automatically appear in the lower right corner, recommend scripts for you, and will automatically disappear after 10 seconds -- Filter the top 50 script with the highest score -- The script list supports search filtering -- The script list supports custom sorting -- Supports one-click installation script -- Support for viewing script details -- Support access to the script home page and author home page -- Click the close button, the current site `this session` all the pages will no longer appear prompt box -- A prompt box is displayed only when found available script for the current site -- i18n international multilingual support.(**[Locale contributions](https://github.com/jae-jae/Userscript-Plus/tree/master/src/common/lang) are welcomed!**) -- Vue + iView UI design smooth and beautiful -## Whitelist and blacklist -> Edit script => Settings tab => Includes/Excludes +* General: + * UI designed for mobile and desktop devices + * Multiple language support - date formats are based on your current language + * Import / export config and theme + * Customize theme UI +* Query UserScripts and UserStyles from: + * [Greasy Fork](https://greasyfork.org) - enabled by default + * [Sleazy Fork](https://sleazyfork.org) - disabled by default + * [GitHub](https://github.com/search?l=JavaScript&o=desc&q="==UserScript==") ( requires [Personal Access Token](https://github.com/settings/tokens), no permissions are required ) - disabled by default +* Built-in UserScripts: + * [GreasyFork Bullshit Filter](https://greasyfork.org/scripts/12179) - disabled by default + * [Greasyfork Search with Sleazyfork Results include](https://greasyfork.org/scripts/23840) - disabled by default +* Automation: + * Fetch on load - query on page load +* Blacklist: + * Attempts to exclude certain hosts from being queried - localhost, bank, government, etc. +* Menu: + * Search for UserScripts - for shortcuts see [Wiki](https://github.com/magicoflolis/Userscript-Plus/blob/master/wiki/README.md#shortcuts) + * Filter UserScripts which do not match your current language + * Sort UserScripts, default sorting "Daily Installs" + * Preview UserScripts code before install + * Save UserScript as a local file + * UserScript highlights: + * UserScripts created by the [author](https://greasyfork.org/users/166061) - enabled by default + * UserScript recommendations - enabled by default + +**UserScript Features:** + +> Tested and compatible with [TamperMonkey](https://www.tampermonkey.net/) or [ViolentMonkey](https://violentmonkey.github.io/) + +* General: + * Maximize, minimize, or close menu + * Sync config with UserScript manager or per host + * Customize timeout window - can be re-injected using your managers User Script Commands menu +* Query UserScripts and UserStyles from: + * [Open UserJS](https://openuserjs.org) ( limited availability, will read `Too many requests...` if limit is reached ) - disabled by default +* Automation: + * Inject on load - injects menu on page load + * Automatic fullscreen - maximizes menu when opened +* UserScript Commands via `GM_registerMenuCommand`: + * Inject Userscript+ - injects menu into the page + * Close Userscript+ - removes menu from the page + +**Web Extension Features:** + +* General: + * You can fullscreen the list and it will open it to a new tab + +## Previews + +

+ + +

+ +## FAQ / Troubleshooting + +**(UserScript) How do I open the menu?:** + +* Click or touch the bottom right of a webpage + +**(UserScript) Nothing appears bottom right:** + +> [List of known issues by Web Browser](https://github.com/magicoflolis/Userscript-Plus/blob/master/browser-issues.md) + +* Try again on another webpage [[Test Page](https://youtube.com)] +* Default timeout is 10000ms before the count disappears +* If issue persists, see [View Console Logs](#view-console-logs) or submit a [New Issue](https://github.com/magicoflolis/Userscript-Plus/issues/new/choose) + +**(UserScript) Error occurred while injecting Container:** + +* Try again on another webpage [[Test Page](https://youtube.com)] +* This error is caused by the current webpage not supporting [attachShadow](https://developer.mozilla.org/en-US/docs/Web/API/Element/attachShadow) + +**(UserScript) Error occurred while loading UserJS for this webpage:** + +* Reload the webpage or try again on a different webpage [[Test Page](https://youtube.com)] +* This error *may* be caused by + * An error occurred in an enabled search engine while fetching content + * Script is unable to fetch content on current or all webpages + +**No available UserJS for this webpage:** + +* This error *can* be caused when no UserJS could be found in enabled search engines +* If there are known UserJS to exist in enabled search engines, enable `Filter out other languages` -In the `Tampermonkey` to enter the script editing interface, select` Setting `tab, this tab below the` Includes/Excludes `option, set the white list and blacklist here, see Figure: +## View Console Logs -![us+en-ex.gif](https://cdn.rawgit.com/jae-jae/_resources/master/img/us+en-ex.gif) +* Open your web browsers Inspect Element and navigate to it's Console +* Locate the following **[UserJS] < message >** ( you can filter your Console by entering **UserJS** or **[** ) +* **If nothing appears, this means the script is not executing at all!** +* For any additional help, submit a [New Issue](https://github.com/magicoflolis/Userscript-Plus/issues/new/choose) -## Known bug +## Want to Contribute? -1. In some sites below the plug-in interface icon is not displayed,Such as:Github - - **Reason**:This is because the security policy of these sites to prevent the plug-in icon font file loading, resulting in the icon does not display properly. - -## Contribute +Fork this repo and open a [pull request](https://github.com/magicoflolis/Userscript-Plus/pulls) - [Rules](https://github.com/magicoflolis/Userscript-Plus/blob/master/wiki/Build.md#contribution-rules) - [Guide](https://github.com/magicoflolis/Userscript-Plus/blob/master/wiki/Build.md#contribution-guide) -If you are willing to contribute code to this project, please follow the [standard](https://standardjs.com/) specification. +How to add or edit translations? How to build? - [Build](https://github.com/magicoflolis/Userscript-Plus/blob/master/wiki/Build.md) -## License -MIT +### Roadmap +* See TODO section in [UserScript Changelog](https://github.com/magicoflolis/Userscript-Plus/blob/master/CHANGELOG.user.md) +* See TODO section in [Web Extension Changelog](https://github.com/magicoflolis/Userscript-Plus/releases) +### Source Code +* [https://github.com/magicoflolis/Userscript-Plus](https://github.com/magicoflolis/Userscript-Plus) diff --git a/README.nl.md b/README.nl.md new file mode 100644 index 0000000..344bc20 --- /dev/null +++ b/README.nl.md @@ -0,0 +1,19 @@ +# Magic Userscript+ + +| Preview(s) | +|:----------:| +![Demo 1](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo3.gif)| +![Demo 2](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo2.gif)| +![Demo 3](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo1.png)| + +## Source Code + +* [GitHub](https://github.com/magicoflolis/Userscript-Plus) + +### Contacts + +[GitHub](https://github.com/magicoflolis) + +[Twitter](https://twitter.com/for_lollipops) + +[Greasy Fork](https://greasyfork.org/users/166061) diff --git a/README.pl.md b/README.pl.md new file mode 100644 index 0000000..344bc20 --- /dev/null +++ b/README.pl.md @@ -0,0 +1,19 @@ +# Magic Userscript+ + +| Preview(s) | +|:----------:| +![Demo 1](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo3.gif)| +![Demo 2](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo2.gif)| +![Demo 3](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo1.png)| + +## Source Code + +* [GitHub](https://github.com/magicoflolis/Userscript-Plus) + +### Contacts + +[GitHub](https://github.com/magicoflolis) + +[Twitter](https://twitter.com/for_lollipops) + +[Greasy Fork](https://greasyfork.org/users/166061) diff --git a/README.pt.md b/README.pt.md new file mode 100644 index 0000000..344bc20 --- /dev/null +++ b/README.pt.md @@ -0,0 +1,19 @@ +# Magic Userscript+ + +| Preview(s) | +|:----------:| +![Demo 1](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo3.gif)| +![Demo 2](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo2.gif)| +![Demo 3](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo1.png)| + +## Source Code + +* [GitHub](https://github.com/magicoflolis/Userscript-Plus) + +### Contacts + +[GitHub](https://github.com/magicoflolis) + +[Twitter](https://twitter.com/for_lollipops) + +[Greasy Fork](https://greasyfork.org/users/166061) diff --git a/README.ru.md b/README.ru.md new file mode 100644 index 0000000..344bc20 --- /dev/null +++ b/README.ru.md @@ -0,0 +1,19 @@ +# Magic Userscript+ + +| Preview(s) | +|:----------:| +![Demo 1](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo3.gif)| +![Demo 2](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo2.gif)| +![Demo 3](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo1.png)| + +## Source Code + +* [GitHub](https://github.com/magicoflolis/Userscript-Plus) + +### Contacts + +[GitHub](https://github.com/magicoflolis) + +[Twitter](https://twitter.com/for_lollipops) + +[Greasy Fork](https://greasyfork.org/users/166061) diff --git a/README.zh-tw.md b/README.zh-tw.md new file mode 100644 index 0000000..344bc20 --- /dev/null +++ b/README.zh-tw.md @@ -0,0 +1,19 @@ +# Magic Userscript+ + +| Preview(s) | +|:----------:| +![Demo 1](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo3.gif)| +![Demo 2](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo2.gif)| +![Demo 3](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo1.png)| + +## Source Code + +* [GitHub](https://github.com/magicoflolis/Userscript-Plus) + +### Contacts + +[GitHub](https://github.com/magicoflolis) + +[Twitter](https://twitter.com/for_lollipops) + +[Greasy Fork](https://greasyfork.org/users/166061) diff --git a/README.zh.md b/README.zh.md new file mode 100644 index 0000000..344bc20 --- /dev/null +++ b/README.zh.md @@ -0,0 +1,19 @@ +# Magic Userscript+ + +| Preview(s) | +|:----------:| +![Demo 1](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo3.gif)| +![Demo 2](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo2.gif)| +![Demo 3](https://raw.githubusercontent.com/magicoflolis/Userscript-Plus/master/assets/demo1.png)| + +## Source Code + +* [GitHub](https://github.com/magicoflolis/Userscript-Plus) + +### Contacts + +[GitHub](https://github.com/magicoflolis) + +[Twitter](https://twitter.com/for_lollipops) + +[Greasy Fork](https://greasyfork.org/users/166061) diff --git a/UserJS.json b/UserJS.json new file mode 100644 index 0000000..a814551 --- /dev/null +++ b/UserJS.json @@ -0,0 +1,69 @@ +{ + "version": "7.6.8", + "name": "Magic Userscript+ : Show Site All UserJS", + "description": "Finds available userscripts for the current webpage.", + "author": "Magic ", + "bugs": "https://github.com/magicoflolis/Userscript-Plus/issues", + "homepage": "https://github.com/magicoflolis/Userscript-Plus", + "icon": "./src/img/icon_64.png", + "downloadURL": "https://github.com/magicoflolis/Userscript-Plus/raw/master/dist/magic-userjs.user.js", + "updateURL": "https://github.com/magicoflolis/Userscript-Plus/raw/master/dist/magic-userjs.meta.js", + "license": "MIT", + "build": { + "source": { + "metadata": "./src/UserJS/header.js", + "code": "./src/UserJS/main.js", + "mainCSS": "./src/sass/magicuserjs.scss" + }, + "watch": { + "files": ["main.js", "header.js", "_main.scss"], + "dirs": ["src/UserJS", "src/sass"] + }, + "paths": { + "fileName": "magic-userjs", + "dir": "./dist", + "i18n": { + "default": "en", + "dir": "../../../src/_locales" + }, + "dev": { + "fileName": "magic-userjs.dev", + "dir": "./web-server" + } + } + }, + "metadata": { + "compatible": ["chrome", "firefox", "edge", "opera", "safari"], + "connect": [ + "greasyfork.org", + "sleazyfork.org", + "github.com", + "githubusercontent.com", + "openuserjs.org" + ], + "grant": [ + "GM_addElement", + "GM_info", + "GM_getValue", + "GM_openInTab", + "GM_setValue", + "GM_registerMenuCommand", + "GM_xmlhttpRequest", + "GM.addElement", + "GM.info", + "GM.getValue", + "GM.openInTab", + "GM.setValue", + "GM.registerMenuCommand", + "GM.xmlHttpRequest" + ], + "exclude": [], + "include": [], + "exclude-match": [], + "match": ["https://*/*"], + "noframes": true, + "resource": {}, + "require": [], + "run-at": "document-start" + } +} diff --git a/Userscript-Plus.code-workspace b/Userscript-Plus.code-workspace new file mode 100644 index 0000000..a90eb82 --- /dev/null +++ b/Userscript-Plus.code-workspace @@ -0,0 +1,41 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "search.exclude": { + "**/.vscode/**": true, + "**/build/**": true, + "**/dist/**": true, + "**/node_modules/**": true, + "**/Notes/**": true + }, + "explorer.excludeGitIgnore": true, + "files.exclude": { + "**/.vscode/**": true, + "**/build/**": true, + "**/dist/**": true, + "**/node_modules/**": true, + "**/Notes/**": true + }, + "local-history.daysLimit": 3, + "local-history.maxDisplay": 10, + "local-history.saveDelay": 0, + "local-history.dateLocale": "en-US", + "local-history.exclude": [ + "**/.history/**", + "**/.vscode/**", + "**/node_modules/**", + "**/typings/**", + "**/out/**", + "**/Code/User/**", + "**/*.code-workspace", + "**/build/**", + "**/dist/**", + "**/Notes/**" + ], + "local-history.path": "${workspaceFolder}/.vscode" + } +} \ No newline at end of file diff --git a/assets/install-userscript.gif b/assets/install-userscript.gif new file mode 100644 index 0000000..35e039f Binary files /dev/null and b/assets/install-userscript.gif differ diff --git a/assets/preview.png b/assets/preview.png new file mode 100644 index 0000000..14cfa87 Binary files /dev/null and b/assets/preview.png differ diff --git a/assets/step-1.png b/assets/step-1.png new file mode 100644 index 0000000..1a3bff7 Binary files /dev/null and b/assets/step-1.png differ diff --git a/assets/step-2.png b/assets/step-2.png new file mode 100644 index 0000000..b790dbf Binary files /dev/null and b/assets/step-2.png differ diff --git a/assets/step-3.png b/assets/step-3.png new file mode 100644 index 0000000..d7ef586 Binary files /dev/null and b/assets/step-3.png differ diff --git a/assets/using-tabs.gif b/assets/using-tabs.gif new file mode 100644 index 0000000..4e70942 Binary files /dev/null and b/assets/using-tabs.gif differ diff --git a/browser-issues.md b/browser-issues.md new file mode 100644 index 0000000..e7b8c2a --- /dev/null +++ b/browser-issues.md @@ -0,0 +1,23 @@ +# Known issues by Web Browser + +> Last updated: 5/2/2024 + +[Submit a New Issue](https://github.com/magicoflolis/Userscript-Plus/issues/new/choose) + +- [Known issues by Web Browser](#known-issues-by-web-browser) + - [Kiwi Browser](#kiwi-browser) + - [Opera](#opera) + +## Kiwi Browser + +**Installed using (from .zip/.crx/.user.js):** + +- Userscript version does not have access to Privileged APIs (`GM_*` or `GM.*`) + - Recommended to install using a user script manager _[Violentmonkey](https://violentmonkey.github.io/) or [Tampermonkey](https://www.tampermonkey.net/)_ + +## Opera + +**General:** + +- Cannot load on search engine sites (common example: [google.com](https://www.google.com)) + - As stated using ViolentMonkey: _Violentmonkey cannot run userscripts in this page (common examples: browser UI, an extension, blocked via policies, a search engine site in Opera)_ diff --git a/build/userscript.js b/build/userscript.js deleted file mode 100644 index 9a744e6..0000000 --- a/build/userscript.js +++ /dev/null @@ -1,43 +0,0 @@ -var babel = require("babel-core"); -var fs = require("fs"); -var tpl = fs.readFileSync('./userscript/tpl.js').toString(); -var code = babel.transformFileSync("./userscript/main.js").code; - -var nano = function(template, data) { - return template.replace(/\{([\w\.]*)\}/g, function(str, key) { - let keys = key.split("."), - v = data[keys.shift()]; - for (let i = 0, l = keys.length; i < l; i++) v = v[keys[i]]; - return (typeof v !== "undefined" && v !== null) ? v : ""; - }); -}; - -var renderOut = function(outFile,ljs){ - var ujs = nano(tpl, { - ljs: ljs, - code: code, - time: (+new Date()) - }); - - fs.writeFile(outFile, ujs, function(err) { - if (err) { - return console.log(err); - } - return console.log('build-out:' + outFile); - }); -}; - -var time = (+new Date()); - -var ljs = `// @require https://cdn.jsdelivr.net/gh/jae-jae/l.js/userjs/l.userjs.min.js -// @require https://greasyfork.org/scripts/23420-userjs-base-js/code/userjs-basejs.js -// @resource uiJs https://cdn.jsdelivr.net/gh/jae-jae/Userscript-Plus/dist/ui.js?_=${time}`; - -var ljs_GF = `// @require https://greasyfork.org/scripts/23419-l-js/code/ljs.js -// @require https://greasyfork.org/scripts/23420-userjs-base-js/code/userjs-basejs.js -// @resource uiJs https://cdn.jsdelivr.net/gh/jae-jae/Userscript-Plus/dist/ui.gf.js?_=${time}`; - - -renderOut('./dist/show-site-all-userjs.user.js',ljs); -//greasyfork version -renderOut('./dist/show-site-all-userjs.gf.user.js',ljs_GF); \ No newline at end of file diff --git a/build/webpack.config.js b/build/webpack.config.js deleted file mode 100644 index 3566a45..0000000 --- a/build/webpack.config.js +++ /dev/null @@ -1,50 +0,0 @@ -var webpack = require('webpack'); -var CopyWebpackPlugin = require('copy-webpack-plugin'); - -module.exports = { - entry: { - ui:"./src/main.js" - }, - output: { - path: __dirname + '/../dist', - filename: "[name].js" - }, - module: { - rules: [ - { - test: /\.js$/, - exclude: /node_modules/, - loader: "babel-loader" - }, - { - test:/\.vue$/, - loader: "vue-loader" - }, - { - test: /\.css$/, - use: [ 'style-loader', 'css-loader' ] - }, - { - test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, - loader: 'url-loader' - }, - { - test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, - loader: 'url-loader' - } - ] - }, - plugins: [ - new webpack.optimize.UglifyJsPlugin({ - compress: { - warnings: false - } - }), - new CopyWebpackPlugin([ - { - from: './src/ui.html', - to: 'ui.html' - } - ]) - ] -} \ No newline at end of file diff --git a/build/webpack.gf.config.js b/build/webpack.gf.config.js deleted file mode 100644 index 81515cc..0000000 --- a/build/webpack.gf.config.js +++ /dev/null @@ -1,40 +0,0 @@ -var webpack = require('webpack'); -var CopyWebpackPlugin = require('copy-webpack-plugin'); - -module.exports = { - entry: { - ui:"./src/main.js" - }, - output: { - path: __dirname + '/../dist', - filename: "[name].gf.js" - }, - module: { - rules: [ - { - test: /\.js$/, - exclude: /node_modules/, - loader: "babel-loader" - }, - { - test:/\.vue$/, - loader: "vue-loader" - }, - { - test: /\.css$/, - use: [ 'style-loader', 'css-loader' ] - }, - { - test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, - loader: 'url-loader' - }, - { - test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, - loader: 'url-loader' - } - ] - }, - plugins: [ - - ] -} \ No newline at end of file diff --git a/crx/.gitignore b/crx/.gitignore deleted file mode 100644 index 42f232d..0000000 --- a/crx/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules/ -.idea/ -.DS_Store diff --git a/crx/README.md b/crx/README.md deleted file mode 100644 index 77f862c..0000000 --- a/crx/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Userscript+ Chrome extension - -![](https://raw.githubusercontent.com/jae-jae/_resources/master/img/175033.png) - -- Install: [https://github.com/jae-jae/Userscript-Plus/raw/master/crx/extension.crx](https://github.com/jae-jae/Userscript-Plus/raw/master/crx/extension.crx) \ No newline at end of file diff --git a/crx/extension.crx b/crx/extension.crx deleted file mode 100644 index 75a5711..0000000 Binary files a/crx/extension.crx and /dev/null differ diff --git a/crx/extension/background.js b/crx/extension/background.js deleted file mode 100644 index 09094b9..0000000 --- a/crx/extension/background.js +++ /dev/null @@ -1,78 +0,0 @@ - -const countApi = 'https://greasyfork.org/scripts/by-site.json' - -function getCurrentTabUrl(callback) { - // Query filter to be passed to chrome.tabs.query - see - // https://developer.chrome.com/extensions/tabs#method-query - var queryInfo = { - active: true, - currentWindow: true - }; - - chrome.tabs.query(queryInfo, (tabs) => { - // chrome.tabs.query invokes the callback with a list of tabs that match the - // query. When the popup is opened, there is certainly a window and at least - // one tab, so we can safely assume that |tabs| is a non-empty array. - // A window can only have one active tab at a time, so the array consists of - // exactly one tab. - var tab = tabs[0]; - - // A tab is a plain object that provides information about the tab. - // See https://developer.chrome.com/extensions/tabs#type-Tab - var url = tab.url; - - // tab.url is only available if the "activeTab" permission is declared. - // If you want to see the URL of other tabs (e.g. after removing active:true - // from |queryInfo|), then the "tabs" permission is required to see their - // "url" properties. - console.assert(typeof url == 'string', 'tab.url should be a string'); - - callback(url); - }); - - // Most methods of the Chrome extension APIs are asynchronous. This means that - // you CANNOT do something like this: - // - // var url; - // chrome.tabs.query(queryInfo, (tabs) => { - // url = tabs[0].url; - // }); - // alert(url); // Shows "undefined", because chrome.tabs.query is async. - } - - function getUrlHost(url) { - let a = document.createElement('a'); - a.href = url; - let mainHost = psl.get(a.hostname) || a.hostname.split('.').splice(-2).join('.') - return mainHost - } - - function changeBadge(data) { - getCurrentTabUrl(function(url){ - let host = getUrlHost(url) - let count = data[host] - count = count > 50 ? 50 : count - sessionStorage.setItem('host',host) - if(count) { - chrome.browserAction.setBadgeText({ - text: count.toString() - }) - }else { - chrome.browserAction.setBadgeText({ - text: '' - }) - } - }) - } - -fetch(countApi).then((r) => { - r.json().then((data) => { - console.log('count data loaded!') - chrome.tabs.onUpdated.addListener(() => { - changeBadge(data) - }) - chrome.tabs.onActivated.addListener(() => { - changeBadge(data) - }) - }) -}) \ No newline at end of file diff --git a/crx/extension/images/icon_128.png b/crx/extension/images/icon_128.png deleted file mode 100644 index 5f447a5..0000000 Binary files a/crx/extension/images/icon_128.png and /dev/null differ diff --git a/crx/extension/images/icon_16.png b/crx/extension/images/icon_16.png deleted file mode 100644 index d5fddf1..0000000 Binary files a/crx/extension/images/icon_16.png and /dev/null differ diff --git a/crx/extension/images/icon_32.png b/crx/extension/images/icon_32.png deleted file mode 100644 index 7bba475..0000000 Binary files a/crx/extension/images/icon_32.png and /dev/null differ diff --git a/crx/extension/images/icon_96.png b/crx/extension/images/icon_96.png deleted file mode 100644 index c6a052a..0000000 Binary files a/crx/extension/images/icon_96.png and /dev/null differ diff --git a/crx/extension/manifest.json b/crx/extension/manifest.json deleted file mode 100644 index ce49711..0000000 --- a/crx/extension/manifest.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "manifest_version": 2, - - "name": "Userscript+ for Tampermonkey", - "description": "Show current site all UserJS,The easier way to install UserJs for Tampermonkey.", - "version": "1.4.5", - "author": "Jaeger ", - "homepage_url": "https://github.com/jae-jae/Userscript-Plus", - "icons": { - "16": "images/icon_16.png", - "32": "images/icon_32.png", - "96": "images/icon_96.png", - "128": "images/icon_128.png" - }, - - "browser_action": { - "default_icon": { - "16": "images/icon_16.png", - "32": "images/icon_32.png", - "96": "images/icon_96.png", - "128": "images/icon_128.png" - }, - "default_popup": "popup.html" - }, - - "background": { - "scripts": ["psl.min.js","background.js"], - "persistent": false - }, - - "permissions": [ - "tabs", - "*://*/*" - ] - } \ No newline at end of file diff --git a/crx/extension/popup.html b/crx/extension/popup.html deleted file mode 100644 index 16974d4..0000000 --- a/crx/extension/popup.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - Show Site All UserJS - - - -
- -
- - - - - \ No newline at end of file diff --git a/crx/extension/popup.js b/crx/extension/popup.js deleted file mode 100644 index 36be16a..0000000 --- a/crx/extension/popup.js +++ /dev/null @@ -1,40 +0,0 @@ -!function(A){function t(i){if(e[i])return e[i].exports;var n=e[i]={i:i,l:!1,exports:{}};return A[i].call(n.exports,n,n.exports,t),n.l=!0,n.exports}var e={};t.m=A,t.c=e,t.d=function(A,e,i){t.o(A,e)||Object.defineProperty(A,e,{configurable:!1,enumerable:!0,get:i})},t.n=function(A){var e=A&&A.__esModule?function(){return A.default}:function(){return A};return t.d(e,"a",e),e},t.o=function(A,t){return Object.prototype.hasOwnProperty.call(A,t)},t.p="",t(t.s=20)}([function(A,t){function e(A,t){var e=A[1]||"",n=A[3];if(!n)return e;if(t&&"function"==typeof btoa){var M=i(n);return[e].concat(n.sources.map(function(A){return"/*# sourceURL="+n.sourceRoot+A+" */"})).concat([M]).join("\n")}return[e].join("\n")}function i(A){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(A))))+" */"}A.exports=function(A){var t=[];return t.toString=function(){return this.map(function(t){var i=e(t,A);return t[2]?"@media "+t[2]+"{"+i+"}":i}).join("")},t.i=function(A,e){"string"==typeof A&&(A=[[null,A,""]]);for(var i={},n=0;n1)for(var e=1;ee.parts.length&&(i.parts.length=e.parts.length)}else{for(var g=[],n=0;n=0&&Math.floor(t)===t&&isFinite(A)}function l(A){return M(A)&&"function"==typeof A.then&&"function"==typeof A.catch}function T(A){return null==A?"":Array.isArray(A)||s(A)&&A.toString===Si?JSON.stringify(A,null,2):String(A)}function u(A){var t=parseFloat(A);return isNaN(t)?A:t}function d(A,t){for(var e=Object.create(null),i=A.split(","),n=0;n-1)return A.splice(e,1)}}function B(A,t){return Hi.call(A,t)}function E(A){var t=Object.create(null);return function(e){return t[e]||(t[e]=A(e))}}function N(A,t){function e(e){var i=arguments.length;return i?i>1?A.apply(t,arguments):A.call(t,e):A.call(t)}return e._length=A.length,e}function w(A,t){return A.bind(t)}function y(A,t){t=t||0;for(var e=A.length-t,i=new Array(e);e--;)i[e]=A[e+t];return i}function Q(A,t){for(var e in t)A[e]=t[e];return A}function h(A){for(var t={},e=0;e-1)if(g&&!B(M,"default"))o=!1;else if(""===o||o===Vi(t)){var r=sA(String,M.type);(r<0||I0&&(i=bA(i,(t||"")+"_"+e),mA(i[0])&&mA(r)&&(a[o]=F(r.text+i[0].text),i.shift()),a.push.apply(a,i)):I(i)?mA(r)?a[o]=F(r.text+i):""!==i&&a.push(F(i)):mA(i)&&mA(r)?a[o]=F(r.text+i.text):(g(A._isVList)&&M(i.tag)&&n(i.key)&&M(t)&&(i.key="__vlist"+t+"_"+e+"__"),a.push(i)));return a}function jA(A){var t=A.$options.provide;t&&(A._provided="function"==typeof t?t.call(A):t)}function LA(t){var e=vA(t.$options.inject,t);e&&(k(!1),Object.keys(e).forEach(function(i){"production"!==A.env.NODE_ENV?H(t,i,e[i],function(){wn('Avoid mutating an injected value directly since the changes will be overwritten whenever the provided component re-renders. injection being mutated: "'+i+'"',t)}):H(t,i,e[i])}),k(!0))}function vA(t,e){if(t){for(var i=Object.create(null),n=Nn?Reflect.ownKeys(t):Object.keys(t),M=0;M0,M=A?!!A.$stable:!n,g=A&&A.$key;if(A){if(A._normalized)return A._normalized;if(M&&e&&e!==ki&&g===e.$key&&!n&&!e.$hasNormal)return e;i={};for(var o in A)A[o]&&"$"!==o[0]&&(i[o]=SA(t,o,A[o]))}else i={};for(var I in t)I in i||(i[I]=GA(t,I));return A&&Object.isExtensible(A)&&(A._normalized=i),m(i,"$stable",M),m(i,"$key",g),m(i,"$hasNormal",n),i}function SA(A,t,e){var i=function(){var A=arguments.length?e.apply(null,arguments):e({});return A=A&&"object"==typeof A&&!Array.isArray(A)?[A]:zA(A),A&&(0===A.length||1===A.length&&A[0].isComment)?void 0:A};return e.proxy&&Object.defineProperty(A,t,{get:i,enumerable:!0,configurable:!0}),i}function GA(A,t){return function(){return A[t]}}function OA(A,t){var e,i,n,g,o;if(Array.isArray(A)||"string"==typeof A)for(e=new Array(A.length),i=0,n=A.length;i.",t),o=new jn(An.parsePlatformTagName(e),i,n,void 0,void 0,t)):o=i&&i.pre||!M(a=nA(t.$options,"components",e))?new jn(e,i,n,void 0,void 0,t):gt(a,i,t,n,e)}else o=gt(e,i,t,n);return Array.isArray(o)?o:M(o)?(M(r)&&Ct(o,r),M(i)&<(i),o):vn()}function Ct(A,t,e){if(A.ns=t,"foreignObject"===A.tag&&(t=void 0,e=!0),M(A.children))for(var i=0,o=A.children.length;iBM)){wn("You may have an infinite update loop "+(t.user?'in watcher with expression "'+t.expression+'"':"in a component render function."),t.vm);break}var i=NM.slice(),n=EM.slice();Lt(),kt(i),Ft(n),En&&An.devtools&&En.emit("flush")}function Ft(A){for(var t=A.length;t--;){var e=A[t],i=e.vm;i._watcher===e&&i._isMounted&&!i._isDestroyed&&jt(i,"updated")}}function Ut(A){A._inactive=!1,NM.push(A)}function kt(A){for(var t=0;txM&&EM[i].id>t.id;)i--;EM.splice(i+1,0,t)}else EM.push(t);if(!QM){if(QM=!0,"production"!==A.env.NODE_ENV&&!An.async)return void vt();NA(vt)}}}function Gt(A,t,e){bM.get=function(){return this[t][e]},bM.set=function(A){this[t][e]=A},Object.defineProperty(A,e,bM)}function Ot(A){A._watchers=[];var t=A.$options;t.props&&Ht(A,t.props),t.methods&&Xt(A,t.methods),t.data?Rt(A):O(A._data={},!0),t.computed&&Wt(A,t.computed),t.watch&&t.watch!==ln&&Kt(A,t.watch)}function Ht(t,e){var i=t.$options.propsData||{},n=t._props={},M=t.$options._propKeys=[],g=!t.$parent;g||k(!1);for(var o in e)!function(o){M.push(o);var I=MA(o,e,i,t);if("production"!==A.env.NODE_ENV){var r=Vi(o);(Oi(r)||An.isReservedAttr(r))&&wn('"'+r+'" is a reserved attribute and cannot be used as component prop.',t),H(n,o,I,function(){g||DM||wn("Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: \""+o+'"',t)})}else H(n,o,I);o in t||Gt(t,"_props",o)}(o);k(!0)}function Rt(t){var e=t.$options.data;e=t._data="function"==typeof e?Jt(e,t):e||{},s(e)||(e={},"production"!==A.env.NODE_ENV&&wn("data functions should return an object:\nhttps://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function",t));for(var i=Object.keys(e),n=t.$options.props,M=t.$options.methods,g=i.length;g--;){var o=i[g];"production"!==A.env.NODE_ENV&&M&&B(M,o)&&wn('Method "'+o+'" has already been defined as a data property.',t),n&&B(n,o)?"production"!==A.env.NODE_ENV&&wn('The data property "'+o+'" is already declared as a prop. Use prop default value instead.',t):z(o)||Gt(t,"_data",o)}O(e,!0)}function Jt(A,t){L();try{return A.call(t,t)}catch(A){return uA(A,t,"data()"),{}}finally{v()}}function Wt(t,e){var i=t._computedWatchers=Object.create(null),n=Bn();for(var M in e){var g=e[M],o="function"==typeof g?g:g.get;"production"!==A.env.NODE_ENV&&null==o&&wn('Getter is missing for computed property "'+M+'".',t),n||(i[M]=new mM(t,o||x,x,jM)),M in t?"production"!==A.env.NODE_ENV&&(M in t.$data?wn('The computed property "'+M+'" is already defined in data.',t):t.$options.props&&M in t.$options.props&&wn('The computed property "'+M+'" is already defined as a prop.',t)):Pt(t,M,g)}}function Pt(t,e,i){var n=!Bn();"function"==typeof i?(bM.get=n?Vt(e):Zt(i),bM.set=x):(bM.get=i.get?n&&!1!==i.cache?Vt(e):Zt(i.get):x,bM.set=i.set||x),"production"!==A.env.NODE_ENV&&bM.set===x&&(bM.set=function(){wn('Computed property "'+e+'" was assigned to but it has no setter.',this)}),Object.defineProperty(t,e,bM)}function Vt(A){return function(){var t=this._computedWatchers&&this._computedWatchers[A];if(t)return t.dirty&&t.evaluate(),mn.target&&t.depend(),t.value}}function Zt(A){return function(){return A.call(this,this)}}function Xt(t,e){var i=t.$options.props;for(var n in e)"production"!==A.env.NODE_ENV&&("function"!=typeof e[n]&&wn('Method "'+n+'" has type "'+typeof e[n]+'" in the component definition. Did you reference the function correctly?',t),i&&B(i,n)&&wn('Method "'+n+'" has already been defined as a prop.',t),n in t&&z(n)&&wn('Method "'+n+'" conflicts with an existing Vue instance method. Avoid defining component methods that start with _ or $.')),t[n]="function"!=typeof e[n]?x:Zi(e[n],t)}function Kt(A,t){for(var e in t){var i=t[e];if(Array.isArray(i))for(var n=0;n-1)return this;var e=y(arguments,1);return e.unshift(this),"function"==typeof A.install?A.install.apply(A,e):"function"==typeof A&&A.apply(null,e),t.push(A),this}}function ie(A){A.mixin=function(A){return this.options=iA(this.options,A),this}}function ne(t){t.cid=0;var e=1;t.extend=function(t){t=t||{};var i=this,n=i.cid,M=t._Ctor||(t._Ctor={});if(M[n])return M[n];var g=t.name||i.options.name;"production"!==A.env.NODE_ENV&&g&&q(g);var o=function(A){this._init(A)};return o.prototype=Object.create(i.prototype),o.prototype.constructor=o,o.cid=e++,o.options=iA(i.options,t),o.super=i,o.options.props&&Me(o),o.options.computed&&ge(o),o.extend=i.extend,o.mixin=i.mixin,o.use=i.use,qi.forEach(function(A){o[A]=i[A]}),g&&(o.options.components[g]=o),o.superOptions=i.options,o.extendOptions=t,o.sealedOptions=Q({},o.options),M[n]=o,o}}function Me(A){var t=A.options.props;for(var e in t)Gt(A.prototype,"_props",e)}function ge(A){var t=A.options.computed;for(var e in t)Pt(A.prototype,e,t[e])}function oe(t){qi.forEach(function(e){t[e]=function(t,i){return i?("production"!==A.env.NODE_ENV&&"component"===e&&q(t),"component"===e&&s(i)&&(i.name=i.name||t,i=this.options._base.extend(i)),"directive"===e&&"function"==typeof i&&(i={bind:i,update:i}),this.options[e+"s"][t]=i,i):this.options[e+"s"][t]}})}function Ie(A){return A&&(A.Ctor.options.name||A.tag)}function re(A,t){return Array.isArray(A)?A.indexOf(t)>-1:"string"==typeof A?A.split(",").indexOf(t)>-1:!!c(A)&&A.test(t)}function ae(A,t){var e=A.cache,i=A.keys,n=A._vnode;for(var M in e){var g=e[M];if(g){var o=Ie(g.componentOptions);o&&!t(o)&&se(e,M,i,n)}}}function se(A,t,e,i){var n=A[t];!n||i&&n.tag===i.tag||n.componentInstance.$destroy(),A[t]=null,D(e,t)}function ce(A){for(var t=A.data,e=A,i=A;M(i.componentInstance);)(i=i.componentInstance._vnode)&&i.data&&(t=Ce(i.data,t));for(;M(e=e.parent);)e&&e.data&&(t=Ce(t,e.data));return le(t.staticClass,t.class)}function Ce(A,t){return{staticClass:Te(A.staticClass,t.staticClass),class:M(A.class)?[A.class,t.class]:t.class}}function le(A,t){return M(A)||M(t)?Te(A,ue(t)):""}function Te(A,t){return A?t?A+" "+t:A:t||""}function ue(A){return Array.isArray(A)?de(A):r(A)?De(A):"string"==typeof A?A:""}function de(A){for(var t,e="",i=0,n=A.length;i-1?eg[A]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:eg[A]=/HTMLUnknownElement/.test(t.toString())}function Ne(t){if("string"==typeof t){var e=document.querySelector(t);return e||("production"!==A.env.NODE_ENV&&wn("Cannot find element: "+t),document.createElement("div"))}return t}function we(A,t){var e=document.createElement(A);return"select"!==A?e:(t.data&&t.data.attrs&&void 0!==t.data.attrs.multiple&&e.setAttribute("multiple","multiple"),e)}function ye(A,t){return document.createElementNS(qM[A],t)}function Qe(A){return document.createTextNode(A)}function he(A){return document.createComment(A)}function xe(A,t,e){A.insertBefore(t,e)}function Ye(A,t){A.removeChild(t)}function fe(A,t){A.appendChild(t)}function pe(A){return A.parentNode}function ze(A){return A.nextSibling}function me(A){return A.tagName}function be(A,t){A.textContent=t}function je(A,t){A.setAttribute(t,"")}function Le(A,t){var e=A.data.ref;if(M(e)){var i=A.context,n=A.componentInstance||A.elm,g=i.$refs;t?Array.isArray(g[e])?D(g[e],n):g[e]===n&&(g[e]=void 0):A.data.refInFor?Array.isArray(g[e])?g[e].indexOf(n)<0&&g[e].push(n):g[e]=[n]:g[e]=n}}function ve(A,t){return A.key===t.key&&(A.tag===t.tag&&A.isComment===t.isComment&&M(A.data)===M(t.data)&&Fe(A,t)||g(A.isAsyncPlaceholder)&&A.asyncFactory===t.asyncFactory&&n(t.asyncFactory.error))}function Fe(A,t){if("input"!==A.tag)return!0;var e,i=M(e=A.data)&&M(e=e.attrs)&&e.type,n=M(e=t.data)&&M(e=e.attrs)&&e.type;return i===n||ig(i)&&ig(n)}function Ue(A,t,e){var i,n,g={};for(i=t;i<=e;++i)n=A[i].key,M(n)&&(g[n]=i);return g}function ke(A,t){(A.data.directives||t.data.directives)&&Se(A,t)}function Se(A,t){var e,i,n,M=A===gg,g=t===gg,o=Ge(A.data.directives,A.context),I=Ge(t.data.directives,t.context),r=[],a=[];for(e in I)i=o[e],n=I[e],i?(n.oldValue=i.value,n.oldArg=i.arg,He(n,"update",t,A),n.def&&n.def.componentUpdated&&a.push(n)):(He(n,"bind",t,A),n.def&&n.def.inserted&&r.push(n));if(r.length){var s=function(){for(var e=0;e-1?We(A,t,e):VM(t)?_M(e)?A.removeAttribute(t):(e="allowfullscreen"===t&&"EMBED"===A.tagName?"true":t,A.setAttribute(t,e)):JM(t)?A.setAttribute(t,PM(t,e)):XM(t)?_M(e)?A.removeAttributeNS(ZM,KM(t)):A.setAttributeNS(ZM,t,e):We(A,t,e)}function We(A,t,e){if(_M(e))A.removeAttribute(t);else{if(rn&&!an&&"TEXTAREA"===A.tagName&&"placeholder"===t&&""!==e&&!A.__ieph){var i=function(t){t.stopImmediatePropagation(),A.removeEventListener("input",i)};A.addEventListener("input",i),A.__ieph=!0}A.setAttribute(t,e)}}function Pe(A,t){var e=t.elm,i=t.data,g=A.data;if(!(n(i.staticClass)&&n(i.class)&&(n(g)||n(g.staticClass)&&n(g.class)))){var o=ce(t),I=e._transitionClasses;M(I)&&(o=Te(o,ue(I))),o!==e._prevClass&&(e.setAttribute("class",o),e._prevClass=o)}}function Ve(A){if(M(A[Cg])){var t=rn?"change":"input";A[t]=[].concat(A[Cg],A[t]||[]),delete A[Cg]}M(A[lg])&&(A.change=[].concat(A[lg],A.change||[]),delete A[lg])}function Ze(A,t,e){var i=kM;return function n(){null!==t.apply(null,arguments)&&Ke(A,n,e,i)}}function Xe(A,t,e,i){if(Tg){var n=YM,M=t;t=M._wrapper=function(A){if(A.target===A.currentTarget||A.timeStamp>=n||A.timeStamp<=0||A.target.ownerDocument!==document)return M.apply(this,arguments)}}kM.addEventListener(A,t,Tn?{capture:e,passive:i}:e)}function Ke(A,t,e,i){(i||kM).removeEventListener(A,t._wrapper||t,e)}function _e(A,t){if(!n(A.data.on)||!n(t.data.on)){var e=t.data.on||{},i=A.data.on||{};kM=t.elm,Ve(e),hA(e,i,Xe,Ke,Ze,t.context),kM=void 0}}function qe(A,t){if(!n(A.data.domProps)||!n(t.data.domProps)){var e,i,g=t.elm,o=A.data.domProps||{},I=t.data.domProps||{};M(I.__ob__)&&(I=t.data.domProps=Q({},I));for(e in o)e in I||(g[e]="");for(e in I){if(i=I[e],"textContent"===e||"innerHTML"===e){if(t.children&&(t.children.length=0),i===o[e])continue;1===g.childNodes.length&&g.removeChild(g.childNodes[0])}if("value"===e&&"PROGRESS"!==g.tagName){g._value=i;var r=n(i)?"":String(i);$e(g,r)&&(g.value=r)}else if("innerHTML"===e&&Ag(g.tagName)&&n(g.innerHTML)){SM=SM||document.createElement("div"),SM.innerHTML=""+i+"";for(var a=SM.firstChild;g.firstChild;)g.removeChild(g.firstChild);for(;a.firstChild;)g.appendChild(a.firstChild)}else if(i!==o[e])try{g[e]=i}catch(A){}}}}function $e(A,t){return!A.composing&&("OPTION"===A.tagName||Ai(A,t)||ti(A,t))}function Ai(A,t){var e=!0;try{e=document.activeElement!==A}catch(A){}return e&&A.value!==t}function ti(A,t){var e=A.value,i=A._vModifiers;if(M(i)){if(i.number)return u(e)!==u(t);if(i.trim)return e.trim()!==t.trim()}return e!==t}function ei(A){var t=ii(A.style);return A.staticStyle?Q(A.staticStyle,t):t}function ii(A){return Array.isArray(A)?h(A):"string"==typeof A?Dg(A):A}function ni(A,t){var e,i={};if(t)for(var n=A;n.componentInstance;)(n=n.componentInstance._vnode)&&n.data&&(e=ei(n.data))&&Q(i,e);(e=ei(A.data))&&Q(i,e);for(var M=A;M=M.parent;)M.data&&(e=ei(M.data))&&Q(i,e);return i}function Mi(A,t){var e=t.data,i=A.data;if(!(n(e.staticStyle)&&n(e.style)&&n(i.staticStyle)&&n(i.style))){var g,o,I=t.elm,r=i.staticStyle,a=i.normalizedStyle||i.style||{},s=r||a,c=ii(t.data.style)||{};t.data.normalizedStyle=M(c.__ob__)?Q({},c):c;var C=ni(t,!0);for(o in s)n(C[o])&&Ng(I,o,"");for(o in C)(g=C[o])!==s[o]&&Ng(I,o,null==g?"":g)}}function gi(A,t){if(t&&(t=t.trim()))if(A.classList)t.indexOf(" ")>-1?t.split(hg).forEach(function(t){return A.classList.add(t)}):A.classList.add(t);else{var e=" "+(A.getAttribute("class")||"")+" ";e.indexOf(" "+t+" ")<0&&A.setAttribute("class",(e+t).trim())}}function oi(A,t){if(t&&(t=t.trim()))if(A.classList)t.indexOf(" ")>-1?t.split(hg).forEach(function(t){return A.classList.remove(t)}):A.classList.remove(t),A.classList.length||A.removeAttribute("class");else{for(var e=" "+(A.getAttribute("class")||"")+" ",i=" "+t+" ";e.indexOf(i)>=0;)e=e.replace(i," ");e=e.trim(),e?A.setAttribute("class",e):A.removeAttribute("class")}}function Ii(A){if(A){if("object"==typeof A){var t={};return!1!==A.css&&Q(t,xg(A.name||"v")),Q(t,A),t}return"string"==typeof A?xg(A):void 0}}function ri(A){Lg(function(){Lg(A)})}function ai(A,t){var e=A._transitionClasses||(A._transitionClasses=[]);e.indexOf(t)<0&&(e.push(t),gi(A,t))}function si(A,t){A._transitionClasses&&D(A._transitionClasses,t),oi(A,t)}function ci(A,t,e){var i=Ci(A,t),n=i.type,M=i.timeout,g=i.propCount;if(!n)return e();var o=n===fg?mg:jg,I=0,r=function(){A.removeEventListener(o,a),e()},a=function(t){t.target===A&&++I>=g&&r()};setTimeout(function(){I0&&(e=fg,a=g,s=M.length):t===pg?r>0&&(e=pg,a=r,s=I.length):(a=Math.max(g,r),e=a>0?g>r?fg:pg:null,s=e?e===fg?M.length:I.length:0),{type:e,timeout:a,propCount:s,hasTransform:e===fg&&vg.test(i[zg+"Property"])}}function li(A,t){for(;A.length explicit "+t+" duration is not a valid number - got "+JSON.stringify(A)+".",e.context):isNaN(A)&&wn(" explicit "+t+" duration is NaN - the duration expression might be incorrect.",e.context)}function Bi(A){return"number"==typeof A&&!isNaN(A)}function Ei(A){if(n(A))return!1;var t=A.fns;return M(t)?Ei(Array.isArray(t)?t[0]:t):(A._length||A.length)>1}function Ni(A,t){!0!==t.data.show&&ui(t)}function wi(A,t,e){yi(A,t,e),(rn||sn)&&setTimeout(function(){yi(A,t,e)},0)}function yi(t,e,i){var n=e.value,M=t.multiple;if(M&&!Array.isArray(n))return void("production"!==A.env.NODE_ENV&&wn('