扩展MV3;Double S 快捷搜索功能完善;README完成
This commit is contained in:
commit
0620de4fa7
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2023 程序员小墨
|
||||||
|
|
||||||
|
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.
|
111
README.md
Normal file
111
README.md
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
<div align="center" style="text-align: center;">
|
||||||
|
<img src="resources/image/logo.png" width="128" style="width: 128px;">
|
||||||
|
<p>
|
||||||
|
<b>
|
||||||
|
<span style="font-size: 20px;">小墨助手 - 一个Chrome浏览器扩展</span>
|
||||||
|
<br>
|
||||||
|
<span style="font-size: 15px;"><i>Xiaomo Assistant</i> - a Chrome extension</span>
|
||||||
|
</b>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
> ⚠️目前项目只有基础功能,建议过段时间再来逛逛嗷~
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 简介 Overview
|
||||||
|
|
||||||
|
小墨助手是一个Chrome浏览器扩展,针对Chrome内核浏览器用户,旨在提高资料检索及浏览器日常使用时的便捷性及高效性。
|
||||||
|
|
||||||
|
*Xiaomo Assistant* is a Chrome browser extension for Chrome kernel browser users, designed to improve the convenience and efficiency of data retrieval and daily use of the browser.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 功能 Extension Features
|
||||||
|
|
||||||
|
小墨助手主要有以下功能:
|
||||||
|
|
||||||
|
*Xiaomo Assistant* mainly has the following functions:
|
||||||
|
|
||||||
|
| 功能 features | 简介 introduction |
|
||||||
|
| -------------------------------------------------------- | ------------------------------------------------------------ |
|
||||||
|
| Double S 快捷搜索<br />Double S quick search | 在浏览器搜索框输入 `ss` 然后按下空格或回车键,即可进入快捷搜索功能<br />接下来可以按照提示进行输入,然后按回车即可<br />Enter `ss` in the omnibox and then press the space or enter key to access the feature.<br /> You can then type as prompted and press Enter. |
|
||||||
|
| Google 广告屏蔽<br />Google AD blocking | 暂无简介<br />No introduction yet |
|
||||||
|
| 阅读全文自动展开<br />Expand the full text automatically | 暂无简介<br />No introduction yet |
|
||||||
|
| 确认页直接跳转<br />Confirm page redirection | 暂无简介<br />No introduction yet |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 浏览器支持 Browser support
|
||||||
|
|
||||||
|
| 浏览器 | 支持情况 |
|
||||||
|
| --------------- | ----------- |
|
||||||
|
| Google Chrome | ✔️(107.0.0+) |
|
||||||
|
| Microsoft Edge | ✔️(107.0.0+) |
|
||||||
|
| Mozilla Firefox | ❌ |
|
||||||
|
|
||||||
|
>**为何不支持Firefox?**
|
||||||
|
>
|
||||||
|
>因为Firefox采用的浏览器内核与Chrome、Edge等浏览器不同,所以暂时不支持。
|
||||||
|
>
|
||||||
|
>**Why not support firefox?**
|
||||||
|
>
|
||||||
|
>Cuz Firefox uses a different browser kernel than Chrome, Edge and other browsers
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 快速上手 Quick Start
|
||||||
|
|
||||||
|
> 下面以Chrome浏览器为例说明,其他浏览器大同小异。
|
||||||
|
>
|
||||||
|
> The following uses Chrome as an example. Other browsers are similar.
|
||||||
|
|
||||||
|
第一步 下载扩展压缩包并解压:**【下载地址暂未更新】**
|
||||||
|
|
||||||
|
Step 1 Download and extracted the extension package: **[Download link hasn't been updated yet]**
|
||||||
|
|
||||||
|
第二步 打开您的Chrome浏览器并访问`chrome://extensions/`
|
||||||
|
|
||||||
|
Step 2 Open your Chrome browser and access `chrome://extensions/`
|
||||||
|
|
||||||
|
> 请确保你已经安装了谷歌浏览器。如果没有安装,[点击此处下载](https://www.google.com/intl/zh-CN/chrome/)
|
||||||
|
>
|
||||||
|
> Please make sure you have Google Chrome installed. If not, [click here](https://www.google.com/intl/en-US/chrome/) to download.
|
||||||
|
|
||||||
|
第三步 打开开发者模式
|
||||||
|
|
||||||
|
Step 3 Open Developer mode.
|
||||||
|
|
||||||
|
第四步 点击“加载已解压的扩展程序”按钮
|
||||||
|
|
||||||
|
Step 4 Click "Load unzipped Extension" button.
|
||||||
|
|
||||||
|
第五步 选择刚刚解压出的文件夹即可完成安装
|
||||||
|
|
||||||
|
Step 5 Select the folder we've just extracted to complete the installation.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 作者 Authors
|
||||||
|
|
||||||
|
[程序员小墨](https://github.com/coder-xiaomo)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 关于 About
|
||||||
|
|
||||||
|
### 本项目的前身 Predecessor of the project
|
||||||
|
|
||||||
|
> This is a brief introduction to the project's predecessor, which is currently not translated into English
|
||||||
|
|
||||||
|
本项目的前身是:[学生助手](https://github.com/bitdance-team/chrome-extension),该项目由[BitDance Team](https://github.com/bitdance-team)(学生团队)开发,是参加第二届青训营的结营项目,获得[第二届青训营最佳创意奖](https://mp.weixin.qq.com/s/6ky6cAiCLjXFhedaMJtxtg)。(团队成员及详细信息可以点击链接查看)
|
||||||
|
|
||||||
|
[我](https://github.com/coder-xiaomo)作为团队队长,一直在思考如何让这个浏览器扩展真正成为一个能够使用的工具。考虑到原有项目功能比较杂乱,所以决定重新整理整个项目,删繁就简,打磨核心功能。目前重新整理了整个项目的代码框架和结构,删除了实际意义不大的部分功能,将扩展manifest更新至MV3并调整了部分代码。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 许可证 License
|
||||||
|
|
||||||
|
本项目使用MIT许可证授权。请参阅[LICENSE](./LICENSE)文件获取完整许可证文本。
|
||||||
|
|
||||||
|
This project is licensed under the MIT License. See the [LICENSE](./LICENSE) file for the full license text.
|
68
background.js
Normal file
68
background.js
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
// refer: https://developer.chrome.com/docs/extensions/mv3/service_workers/#manifest
|
||||||
|
console.clear()
|
||||||
|
console.log("[小墨助手]", "Service Worker init success.")
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 右键菜单
|
||||||
|
*/
|
||||||
|
chrome.contextMenus.create({
|
||||||
|
id: 'bitdance',
|
||||||
|
title: '小墨助手'
|
||||||
|
})
|
||||||
|
|
||||||
|
chrome.contextMenus.create({
|
||||||
|
id: 'bitdance-advanced-search',
|
||||||
|
title: '高级搜索',
|
||||||
|
parentId: 'bitdance',
|
||||||
|
// onclick: function (info) {
|
||||||
|
// }
|
||||||
|
})
|
||||||
|
chrome.contextMenus.onClicked.addListener(function (info) {
|
||||||
|
console.log('当前菜单信息:' + JSON.stringify(info))
|
||||||
|
console.log("[小墨助手]", "高级搜索 已点击菜单")
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
// Events must be registered synchronously from the start of the page.
|
||||||
|
chrome.runtime.onInstalled.addListener(() => {
|
||||||
|
console.log("[小墨助手]", "chrome.runtime.onInstalled.")
|
||||||
|
chrome.contextMenus.create({
|
||||||
|
"id": "sampleContextMenu",
|
||||||
|
"title": "Sample Context Menu",
|
||||||
|
"contexts": ["selection"]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
//
|
||||||
|
chrome.commands.onCommand.addListener((command) => {
|
||||||
|
console.log("[小墨助手]", `Command: ${command}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 书签
|
||||||
|
*/
|
||||||
|
// This will run when a bookmark is created.
|
||||||
|
chrome.bookmarks.onCreated.addListener(() => {
|
||||||
|
// do something
|
||||||
|
console.log("[小墨助手]", "chrome.bookmarks.onCreated.")
|
||||||
|
});
|
||||||
|
|
||||||
|
// chrome.runtime.onMessage.addListener((message, sender, reply) => {
|
||||||
|
// chrome.runtime.onMessage.removeListener(event);
|
||||||
|
// });
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const filter = {
|
||||||
|
url: [
|
||||||
|
{
|
||||||
|
urlMatches: 'https://www.baidu.com/.*?',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
chrome.webNavigation.onCompleted.addListener((details) => {
|
||||||
|
console.info("[小墨助手]", "The user has loaded my favorite website!", details);
|
||||||
|
}, filter);
|
||||||
|
|
||||||
|
importScripts("./scripts/advanced-search/background.js");
|
232
generate-manifest.js
Normal file
232
generate-manifest.js
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
const path = require("path")
|
||||||
|
const fs = require("fs")
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* manifest 修改之后记得执行下面这条命令重新 generate
|
||||||
|
* node generate-manifest.js
|
||||||
|
*
|
||||||
|
* 或者使用这条命令监控文件变化
|
||||||
|
* nodemon generate-manifest.js
|
||||||
|
*/
|
||||||
|
// Manifest file format: https://developer.chrome.com/docs/extensions/mv3/manifest/
|
||||||
|
var manifest = {
|
||||||
|
/**
|
||||||
|
* Required
|
||||||
|
*/
|
||||||
|
"manifest_version": 3,
|
||||||
|
"name": "小墨助手",
|
||||||
|
"version": "1.0.0",
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recommended
|
||||||
|
*/
|
||||||
|
"action": {
|
||||||
|
// 浏览器右上角插件logo
|
||||||
|
"default_icon": { // optional
|
||||||
|
"16": "resources/image/logo.png",
|
||||||
|
"24": "resources/image/logo.png",
|
||||||
|
"32": "resources/image/logo.png"
|
||||||
|
},
|
||||||
|
// 浏览器右上角logo 鼠标悬浮显示文字
|
||||||
|
"default_title": "点击打开小墨助手 配置页面", // optional, shown in tooltip
|
||||||
|
"default_popup": "html/popup.html" // optional
|
||||||
|
},
|
||||||
|
|
||||||
|
// "default_locale": "zh",
|
||||||
|
// 如果需要配置default_locale,那么需要创建_locales/zh/messages.json,内容框架如下
|
||||||
|
// { "keyName": { "message": "msg", "description": "desc" } }
|
||||||
|
|
||||||
|
"description": "便捷,易用的浏览器小助手",
|
||||||
|
|
||||||
|
"icons": { // 插件配置页面图标
|
||||||
|
"16": "resources/image/logo.png",
|
||||||
|
"32": "resources/image/logo.png",
|
||||||
|
"48": "resources/image/logo.png",
|
||||||
|
"128": "resources/image/logo.png"
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optional
|
||||||
|
*/
|
||||||
|
// "author": "developer@example.com",
|
||||||
|
|
||||||
|
// "automation": {},
|
||||||
|
|
||||||
|
"background": {
|
||||||
|
// "service_worker": "scripts/service_worker/background.js"
|
||||||
|
"service_worker": "background.js"
|
||||||
|
},
|
||||||
|
|
||||||
|
// "chrome_settings_overrides": {},
|
||||||
|
|
||||||
|
"chrome_url_overrides": {},
|
||||||
|
|
||||||
|
"commands": {
|
||||||
|
// 最多可以设置 4 个快捷键,必须包含 Ctrl 或 Alt
|
||||||
|
// refer: https://developer.chrome.com/docs/extensions/reference/commands/
|
||||||
|
// 查看: chrome://extensions/shortcuts
|
||||||
|
"_execute_action": {
|
||||||
|
"suggested_key": {
|
||||||
|
"default": "Alt+Comma",
|
||||||
|
// "windows": "Alt+Comma",
|
||||||
|
// "mac": "Alt+Comma",
|
||||||
|
// "chromeos": "Alt+Comma",
|
||||||
|
// "linux": "Alt+Comma"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"toggle-feature-foo": {
|
||||||
|
"suggested_key": {
|
||||||
|
"default": "Ctrl+Shift+U",
|
||||||
|
"mac": "Command+Shift+U"
|
||||||
|
},
|
||||||
|
"description": "Toggle feature foo",
|
||||||
|
"global": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"content_scripts": [
|
||||||
|
{
|
||||||
|
"matches": [
|
||||||
|
"<all_urls>",
|
||||||
|
"*://*/*"
|
||||||
|
],
|
||||||
|
"js": [
|
||||||
|
// "assets/js/lib/jquery.min.js",
|
||||||
|
// "assets/js/content.js",
|
||||||
|
// "assets/js/direct-url/url.js",
|
||||||
|
"scripts/advanced-search/content.js"
|
||||||
|
],
|
||||||
|
"css": [],
|
||||||
|
"run_at": "document_start"
|
||||||
|
},
|
||||||
|
// {
|
||||||
|
// // 屏蔽Google广告模块
|
||||||
|
// "matches": [
|
||||||
|
// "*://*/*"
|
||||||
|
// ],
|
||||||
|
// "js": [
|
||||||
|
// // "assets/js/remove-google-ads/removeAds.js"
|
||||||
|
// ],
|
||||||
|
// "run_at": "document_start"
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// // 自动展开模块
|
||||||
|
// "matches": [
|
||||||
|
// "*://blog.csdn.net/*",
|
||||||
|
// "*://www.it1352.com/*"
|
||||||
|
// ],
|
||||||
|
// "js": [
|
||||||
|
// // "assets/js/lib/jquery.min.js",
|
||||||
|
// // "assets/js/expand-full-text/expand.js"
|
||||||
|
// ],
|
||||||
|
// "run_at": "document_start"
|
||||||
|
// },
|
||||||
|
{
|
||||||
|
// 自动搜索模块
|
||||||
|
"matches": [
|
||||||
|
"*://fanyi.qq.com/*",
|
||||||
|
"*://baike.baidu.com/*",
|
||||||
|
"*://fanyi.youdao.com/*",
|
||||||
|
"*://www.cnki.net/*",
|
||||||
|
"*://qikan.cqvip.com/*",
|
||||||
|
"*://lib.cqvip.com/*"
|
||||||
|
],
|
||||||
|
"js": [
|
||||||
|
"scripts/advanced-search/content-helper.js"
|
||||||
|
],
|
||||||
|
"run_at": "document_start"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
"content_security_policy": {},
|
||||||
|
|
||||||
|
"cross_origin_embedder_policy": {},
|
||||||
|
|
||||||
|
"cross_origin_opener_policy": {},
|
||||||
|
|
||||||
|
// "declarative_net_request": {},
|
||||||
|
|
||||||
|
// "devtools_page": "devtools.html",
|
||||||
|
|
||||||
|
"event_rules": [],
|
||||||
|
|
||||||
|
// "export": {},
|
||||||
|
|
||||||
|
// "externally_connectable": {},
|
||||||
|
|
||||||
|
"file_browser_handlers": [],
|
||||||
|
|
||||||
|
"file_system_provider_capabilities": {},
|
||||||
|
|
||||||
|
// "homepage_url": "https://path/to/homepage", // 主页待配置
|
||||||
|
|
||||||
|
"host_permissions": [],
|
||||||
|
|
||||||
|
// "import": [],
|
||||||
|
|
||||||
|
"incognito": "spanning", // spanning, split, or not_allowed
|
||||||
|
|
||||||
|
"input_components": [],
|
||||||
|
|
||||||
|
// "key": "publicKey",
|
||||||
|
|
||||||
|
"minimum_chrome_version": "107",
|
||||||
|
|
||||||
|
// "nacl_modules": [],
|
||||||
|
|
||||||
|
// "oauth2": {},
|
||||||
|
|
||||||
|
"omnibox": {
|
||||||
|
"keyword": "ss"
|
||||||
|
},
|
||||||
|
|
||||||
|
"optional_host_permissions": [],
|
||||||
|
|
||||||
|
"optional_permissions": [],
|
||||||
|
|
||||||
|
"options_page": "html/options.html",
|
||||||
|
|
||||||
|
"options_ui": {},
|
||||||
|
|
||||||
|
"permissions": [
|
||||||
|
//
|
||||||
|
"commands",
|
||||||
|
// 浏览器书签
|
||||||
|
"bookmarks",
|
||||||
|
// 右键菜单
|
||||||
|
"contextMenus",
|
||||||
|
"storage",
|
||||||
|
"webNavigation"
|
||||||
|
],
|
||||||
|
|
||||||
|
// "replacement_web_app": "https://example.com", // 待配置
|
||||||
|
|
||||||
|
"requirements": {},
|
||||||
|
|
||||||
|
"sandbox": {},
|
||||||
|
|
||||||
|
// "short_name": "Short Name",
|
||||||
|
|
||||||
|
"storage": {},
|
||||||
|
|
||||||
|
"tts_engine": {},
|
||||||
|
|
||||||
|
// "update_url": "https://path/to/updateInfo.xml",
|
||||||
|
|
||||||
|
"version_name": "1.0 beta", // 插件配置页面显示版本
|
||||||
|
|
||||||
|
"web_accessible_resources": []
|
||||||
|
}
|
||||||
|
|
||||||
|
function save(beautify = false) {
|
||||||
|
if (beautify) {
|
||||||
|
fs.writeFileSync(path.join(__dirname, "./manifest.json"), JSON.stringify(manifest, null, 4))
|
||||||
|
} else {
|
||||||
|
fs.writeFileSync(path.join(__dirname, "./manifest.json"), JSON.stringify(manifest))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
save()
|
1
html/assets/css/global.css
Normal file
1
html/assets/css/global.css
Normal file
@ -0,0 +1 @@
|
|||||||
|
*{margin:0;padding:0}li{list-style:none}a{text-decoration:none}body{background:#a6c1ee}
|
17
html/assets/css/global.less
Normal file
17
html/assets/css/global.less
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
// 全局样式
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background: #a6c1ee;
|
||||||
|
}
|
1
html/assets/css/popup.css
Normal file
1
html/assets/css/popup.css
Normal file
@ -0,0 +1 @@
|
|||||||
|
#popup{min-height:420px;width:300px;margin:12px 5px;user-select:none}#popup .control-panel .btn{width:81px;height:32px;color:#fff;cursor:pointer;background-color:#5ca3ef;border:none;border-radius:4px}#popup .control-panel .btn:hover{background-color:#6fc6ff}#popup .control-panel .btn:active{transform:translate(0, 1px);box-shadow:0px 1px 0px 0px}#popup .setting{width:100%;margin-top:12px}#popup .setting ul li{margin:7px 0;height:44px;border-radius:25px;background:#ffffffc9;padding:0}#popup .setting ul li .setting-item{padding-left:18px;padding-right:2px}#popup .setting ul li .setting-item span{font-size:14px;line-height:44px}#popup .setting ul li .setting-item .button{position:relative;float:right;top:6px;right:6px;width:66px;height:32px;border-radius:100px}#popup .setting ul li .setting-item .button .checkbox{position:relative;width:100%;height:100%;opacity:0;cursor:pointer;z-index:3}#popup .setting ul li .setting-item .button .knobs,#popup .setting ul li .setting-item .button .layer{position:absolute;top:0;right:0;bottom:0;left:0}#popup .setting ul li .setting-item .button .knobs{z-index:2}#popup .setting ul li .setting-item .button .layer{border-radius:100px;width:100%;background-color:#ebf7fc;z-index:1}#popup .setting ul li .setting-item .button .knobs::before{content:"YES";position:absolute;top:2px;left:34px;width:20px;height:10px;color:#fff;font-size:10px;font-weight:bold;text-align:center;line-height:1;padding:9px 4px;background-color:#03a9f4;border-radius:50%}#popup .setting ul li .setting-item .button .checkbox:checked+.knobs:before{content:"NO";left:3px;background-color:#f44336}#popup .setting ul li .setting-item .button .checkbox:checked~.layer{background-color:#fcebeb}#popup .setting ul li .setting-item .button .knobs,#popup .setting ul li .setting-item .button .knobs:before,#popup .setting ul li .setting-item .button .layer{transition:.3s ease all}
|
111
html/assets/css/popup.less
Normal file
111
html/assets/css/popup.less
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
#popup {
|
||||||
|
min-height: 420px;
|
||||||
|
width: 300px;
|
||||||
|
margin: 12px 5px;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
.control-panel {
|
||||||
|
.btn {
|
||||||
|
width: 81px;
|
||||||
|
height: 32px;
|
||||||
|
color: #fff;
|
||||||
|
cursor: pointer;
|
||||||
|
background-color: #5ca3ef;
|
||||||
|
border: none;
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: #6fc6ff;
|
||||||
|
}
|
||||||
|
&:active {
|
||||||
|
transform: translate(0px, 1px);
|
||||||
|
box-shadow: 0px 1px 0px 0px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.setting {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 12px;
|
||||||
|
ul {
|
||||||
|
li {
|
||||||
|
margin: 7px 0;
|
||||||
|
height: 44px;
|
||||||
|
border-radius: 25px;
|
||||||
|
background: #ffffffc9;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
.setting-item {
|
||||||
|
padding-left: 18px;
|
||||||
|
padding-right: 2px;
|
||||||
|
span {
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 44px;
|
||||||
|
}
|
||||||
|
.button {
|
||||||
|
position: relative;
|
||||||
|
float: right;
|
||||||
|
top: 6px;
|
||||||
|
right: 6px;
|
||||||
|
width: 66px;
|
||||||
|
height: 32px;
|
||||||
|
border-radius: 100px;
|
||||||
|
.checkbox {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
opacity: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
z-index: 3;
|
||||||
|
}
|
||||||
|
.knobs,
|
||||||
|
.layer {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
.knobs {
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
.layer {
|
||||||
|
border-radius: 100px;
|
||||||
|
width: 100%;
|
||||||
|
background-color: #ebf7fc;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
.knobs::before {
|
||||||
|
content: "YES";
|
||||||
|
position: absolute;
|
||||||
|
top: 2px;
|
||||||
|
left: 34px;
|
||||||
|
width: 20px;
|
||||||
|
height: 10px;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 10px;
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 1;
|
||||||
|
padding: 9px 4px;
|
||||||
|
background-color: #03a9f4;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
.checkbox:checked + .knobs:before {
|
||||||
|
content: "NO";
|
||||||
|
left: 3px;
|
||||||
|
background-color: #f44336;
|
||||||
|
}
|
||||||
|
.checkbox:checked ~ .layer {
|
||||||
|
background-color: #fcebeb;
|
||||||
|
}
|
||||||
|
.knobs,
|
||||||
|
.knobs:before,
|
||||||
|
.layer {
|
||||||
|
transition: 0.3s ease all;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
108
html/assets/js/popup.js
Normal file
108
html/assets/js/popup.js
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
$(function() {
|
||||||
|
/**
|
||||||
|
* Direct Url
|
||||||
|
*/
|
||||||
|
const btnDirectUrl = document.querySelector("#btnDirectUrl");
|
||||||
|
// 页面加载时,更新界面开关状态
|
||||||
|
chrome.storage.sync.get("State_DirectUrl", ({ State_DirectUrl }) => {
|
||||||
|
btnDirectUrl.checked = !State_DirectUrl;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 点击开关时存储按钮状态并刷新页面
|
||||||
|
btnDirectUrl.addEventListener("change", () => {
|
||||||
|
chrome.storage.sync.set({ State_DirectUrl: !btnDirectUrl.checked });
|
||||||
|
refreshPage('Direct Url');
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expand Fulltext
|
||||||
|
*/
|
||||||
|
const btnExpandFulltext = document.querySelector("#btnExpandFulltext");
|
||||||
|
// 页面加载时,更新界面开关状态
|
||||||
|
chrome.storage.sync.get("State_ExpandFulltext", ({ State_ExpandFulltext }) => {
|
||||||
|
btnExpandFulltext.checked = !State_ExpandFulltext;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 点击开关时存储按钮状态并刷新页面
|
||||||
|
btnExpandFulltext.addEventListener("change", () => {
|
||||||
|
chrome.storage.sync.set({ State_ExpandFulltext: !btnExpandFulltext.checked });
|
||||||
|
refreshPage('Expand Fulltext');
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Google 广告拦截
|
||||||
|
*/
|
||||||
|
const btnGoogleAds = document.querySelector("#btnAdsBlock");
|
||||||
|
// 页面加载时,更新界面开关状态
|
||||||
|
chrome.storage.sync.get('State_AdsBlock', function(budget) {
|
||||||
|
btnGoogleAds.checked = !budget.State_AdsBlock;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 点击开关时存储按钮状态并刷新页面
|
||||||
|
$("#btnAdsBlock").click(function() {
|
||||||
|
chrome.storage.sync.set({ 'State_AdsBlock': !btnGoogleAds.checked });
|
||||||
|
chrome.extension.getBackgroundPage().updateAdsBlockStatus(!btnGoogleAds.checked);
|
||||||
|
refreshPage('Ads Block');
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Double S 快捷搜索
|
||||||
|
*/
|
||||||
|
const btnSSSearch = document.querySelector("#btnSSSearch");
|
||||||
|
// 页面加载时,更新界面开关状态
|
||||||
|
chrome.storage.sync.get('State_SSSearch', function(budget) {
|
||||||
|
btnSSSearch.checked = !budget.State_SSSearch;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 点击开关时存储按钮状态并刷新页面
|
||||||
|
$("#btnSSSearch").click(function() {
|
||||||
|
chrome.storage.sync.set({ 'State_SSSearch': !btnSSSearch.checked });
|
||||||
|
// refreshPage('SS Search');
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************************
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断是否是浏览器设置页面
|
||||||
|
* 即是否是 chrome:// 或 edge:// 开头的链接
|
||||||
|
* @param {} url
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
function isBrowserSettingPage({url, action, showSorryInfo = true }) {
|
||||||
|
var protocol, isSettingPage = true;
|
||||||
|
if(/^chrome:\/\/.*$/.test(url)) {
|
||||||
|
protocol = "chrome://"
|
||||||
|
} else if(/^edge:\/\/.*$/.test(url)) {
|
||||||
|
protocol = "edge://"
|
||||||
|
} else {
|
||||||
|
isSettingPage = false;
|
||||||
|
}
|
||||||
|
if(showSorryInfo && isSettingPage) {
|
||||||
|
alert(`十分抱歉,由于浏览器限制,“${protocol}”开头的网站不支持${action}`);
|
||||||
|
}
|
||||||
|
return isSettingPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 改变开关自动刷新页面
|
||||||
|
*/
|
||||||
|
function refreshPage(messageInfo) {
|
||||||
|
chrome.tabs.query({
|
||||||
|
active: true,
|
||||||
|
currentWindow: true
|
||||||
|
}, (tabs) => {
|
||||||
|
console.log(tabs);
|
||||||
|
let message = {
|
||||||
|
info: messageInfo,
|
||||||
|
action: "refreshPage"
|
||||||
|
}
|
||||||
|
chrome.tabs.sendMessage(tabs[0].id, message, res => {
|
||||||
|
console.log(res);
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
5
html/assets/lib/jquery.min.js
vendored
Normal file
5
html/assets/lib/jquery.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
14
html/options.html
Normal file
14
html/options.html
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>配置 | 小墨助手</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1 style="text-align: center;">
|
||||||
|
小墨助手 配置页
|
||||||
|
</h1>
|
||||||
|
</body>
|
||||||
|
</html>
|
66
html/popup.html
Normal file
66
html/popup.html
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="zh">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<title>小墨助手</title>
|
||||||
|
<link rel="stylesheet" href="assets/css/global.css">
|
||||||
|
<link rel="stylesheet" href="assets/css/popup.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="popup">
|
||||||
|
<div class="control-panel">
|
||||||
|
<button class="btn" id="transform">翻译</button>
|
||||||
|
<button class="btn" id="btnScreenshot">截图</button>
|
||||||
|
</div>
|
||||||
|
<div class="setting">
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<div class="setting-item">
|
||||||
|
<span>Double S 快捷搜索</span>
|
||||||
|
<div class="button">
|
||||||
|
<input type="checkbox" id="btnSSSearch" class="checkbox" />
|
||||||
|
<div class="knobs"></div>
|
||||||
|
<div class="layer"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<div class="setting-item">
|
||||||
|
<span>确认访问页自动跳转</span>
|
||||||
|
<div class="button">
|
||||||
|
<input type="checkbox" id="btnDirectUrl" class="checkbox" />
|
||||||
|
<div class="knobs"></div>
|
||||||
|
<div class="layer"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<div class="setting-item">
|
||||||
|
<span>Google广告屏蔽</span>
|
||||||
|
<div class="button">
|
||||||
|
<input type="checkbox" id="btnAdsBlock" class="checkbox" />
|
||||||
|
<div class="knobs"></div>
|
||||||
|
<div class="layer"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<div class="setting-item">
|
||||||
|
<span>阅读原文自动展开</span>
|
||||||
|
<div class="button">
|
||||||
|
<input type="checkbox" id="btnExpandFulltext" class="checkbox" />
|
||||||
|
<div class="knobs"></div>
|
||||||
|
<div class="layer"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script src="assets/lib/jquery.min.js"></script>
|
||||||
|
<script src="assets/js/popup.js"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
1
manifest.json
Normal file
1
manifest.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"manifest_version":3,"name":"小墨助手","version":"1.0.0","action":{"default_icon":{"16":"resources/image/logo.png","24":"resources/image/logo.png","32":"resources/image/logo.png"},"default_title":"点击打开小墨助手 配置页面","default_popup":"html/popup.html"},"description":"便捷,易用的浏览器小助手","icons":{"16":"resources/image/logo.png","32":"resources/image/logo.png","48":"resources/image/logo.png","128":"resources/image/logo.png"},"background":{"service_worker":"background.js"},"chrome_url_overrides":{},"commands":{"_execute_action":{"suggested_key":{"default":"Alt+Comma"}},"toggle-feature-foo":{"suggested_key":{"default":"Ctrl+Shift+U","mac":"Command+Shift+U"},"description":"Toggle feature foo","global":true}},"content_scripts":[{"matches":["<all_urls>","*://*/*"],"js":["scripts/advanced-search/content.js"],"css":[],"run_at":"document_start"},{"matches":["*://fanyi.qq.com/*","*://baike.baidu.com/*","*://fanyi.youdao.com/*","*://www.cnki.net/*","*://qikan.cqvip.com/*","*://lib.cqvip.com/*"],"js":["scripts/advanced-search/content-helper.js"],"run_at":"document_start"}],"content_security_policy":{},"cross_origin_embedder_policy":{},"cross_origin_opener_policy":{},"event_rules":[],"file_browser_handlers":[],"file_system_provider_capabilities":{},"host_permissions":[],"incognito":"spanning","input_components":[],"minimum_chrome_version":"107","omnibox":{"keyword":"ss"},"optional_host_permissions":[],"optional_permissions":[],"options_page":"html/options.html","options_ui":{},"permissions":["commands","bookmarks","contextMenus","storage","webNavigation"],"requirements":{},"sandbox":{},"storage":{},"tts_engine":{},"version_name":"1.0 beta","web_accessible_resources":[]}
|
12
nodemon.json
Normal file
12
nodemon.json
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"ignore": [
|
||||||
|
".git",
|
||||||
|
"node_modules",
|
||||||
|
".gitignore"
|
||||||
|
],
|
||||||
|
"env": {
|
||||||
|
"NODE_ENV": "development"
|
||||||
|
},
|
||||||
|
"ext": "js",
|
||||||
|
"__ext": "js,json"
|
||||||
|
}
|
BIN
resources/image/logo.png
Normal file
BIN
resources/image/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 24 KiB |
1097
scripts/advanced-search/background.js
Normal file
1097
scripts/advanced-search/background.js
Normal file
File diff suppressed because it is too large
Load Diff
139
scripts/advanced-search/content-helper.js
Normal file
139
scripts/advanced-search/content-helper.js
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
console.log("[小墨助手]", "自动搜索模块加载成功")
|
||||||
|
|
||||||
|
window.onload = () => {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 先处理不需要传入参数,只需要点击按钮的情况,然后再处理需要传入参数的情况
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* **********************************************************************************************
|
||||||
|
*
|
||||||
|
* 不需要传入参数情况
|
||||||
|
*
|
||||||
|
* **********************************************************************************************
|
||||||
|
*/
|
||||||
|
switch (window.location.host) {
|
||||||
|
|
||||||
|
case "fanyi.qq.com": // 腾讯翻译君
|
||||||
|
document.getElementsByClassName("language-translate-button")[0].click()
|
||||||
|
// $(".language-translate-button")[0].click()
|
||||||
|
clearUrlParams();
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* **********************************************************************************************
|
||||||
|
*
|
||||||
|
* 需要传入参数的情况
|
||||||
|
*
|
||||||
|
* **********************************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定义函数
|
||||||
|
*/
|
||||||
|
// 获取 URL 参数
|
||||||
|
// refer: https://www.cnblogs.com/chen-lhx/p/5198612.html
|
||||||
|
function getUrlVar(name) {
|
||||||
|
var vars = [], hash;
|
||||||
|
let paramString = window.location.href.slice(window.location.href.indexOf('?') + 1)
|
||||||
|
if (paramString.includes("#"))
|
||||||
|
paramString = paramString.substring(0, paramString.indexOf("#"))
|
||||||
|
var hashes = paramString.split('&');
|
||||||
|
for (var i = 0; i < hashes.length; i++) {
|
||||||
|
hash = hashes[i].split('=');
|
||||||
|
vars.push(hash[0]);
|
||||||
|
vars[hash[0]] = hash[1];
|
||||||
|
}
|
||||||
|
return decodeURIComponent(vars[name] ?? "");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从URL参数中剔除指定参数
|
||||||
|
function clearUrlParams() {
|
||||||
|
// 参数获取完成后,清除页面参数
|
||||||
|
// History.replaceState() refer: https://developer.mozilla.org/zh-CN/docs/Web/API/History/replaceState
|
||||||
|
// history.replaceState({}, "", "/");
|
||||||
|
let urlParams = (location.search + "&").replace(/__xiaomo_extension__=.*?\&/, ""); // 在最后补上一个 & ,然后替换掉 __xiaomo_extension__=xxx&
|
||||||
|
urlParams = urlParams.substring(0, urlParams.length - 1); // 去掉最后一个 &
|
||||||
|
history.replaceState({}, "", location.pathname + urlParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开始代码逻辑
|
||||||
|
*/
|
||||||
|
// 获取参数
|
||||||
|
let transText = getUrlVar('__xiaomo_extension__')
|
||||||
|
|
||||||
|
console.log("[小墨助手]", "transText:", transText);
|
||||||
|
|
||||||
|
// 如果没有传递参数,那么就不执行
|
||||||
|
if (!transText || transText.trim() == "" || transText == "undefined")
|
||||||
|
return
|
||||||
|
|
||||||
|
switch (window.location.host) {
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "baike.baidu.com": // 百度百科
|
||||||
|
document.getElementById("query").value = transText
|
||||||
|
document.getElementById("search").click()
|
||||||
|
// 跳转新页面,所以不需要清除页面参数
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "fanyi.youdao.com": // 有道翻译
|
||||||
|
// 插件获取不到 Vue 对象(window.$,DOM元素app的properties),但是在控制台可以
|
||||||
|
// console.log(JSON.stringify(Object.keys(window)))
|
||||||
|
// console.log(Object.getOwnPropertyDescriptors(app))
|
||||||
|
// console.log(Object.getOwnPropertyDescriptors(document.getElementById("app")))
|
||||||
|
|
||||||
|
// let youdaoVueApp = window.app // window.app.__vue_app__.value // window.$("#app").__vue_app__
|
||||||
|
// console.log(youdaoVueApp)
|
||||||
|
|
||||||
|
// 获取输入框
|
||||||
|
let input = document.getElementById("js_fanyi_input")
|
||||||
|
// let submit = document.querySelector(".transBtn.searchBtn.red-button") // 此时页面上没有显示翻译按钮,所以获取不到
|
||||||
|
// console.log(input)
|
||||||
|
|
||||||
|
// 输入文字
|
||||||
|
input.innerHTML = transText
|
||||||
|
|
||||||
|
// 输入框要触发输入事件,才能显示出按钮
|
||||||
|
// refer: https://blog.csdn.net/weixin_54051261/article/details/125752218
|
||||||
|
input.dispatchEvent(
|
||||||
|
new Event("input", {
|
||||||
|
view: window,
|
||||||
|
bubbles: true,
|
||||||
|
cancelable: true,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
// 光标挪到最后
|
||||||
|
// refer: https://blog.csdn.net/weixin_44461275/article/details/126282272
|
||||||
|
function keepLastIndex(obj) {
|
||||||
|
obj.focus(); // 解决ff不获取焦点无法定位问题
|
||||||
|
var range = window.getSelection(); // 创建range
|
||||||
|
range.selectAllChildren(obj); // range 选择obj下所有子内容
|
||||||
|
range.collapseToEnd(); // 光标移至最后
|
||||||
|
}
|
||||||
|
keepLastIndex(input)
|
||||||
|
|
||||||
|
// 最后清理URL上的参数
|
||||||
|
clearUrlParams();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "www.cnki.net": // 中国知网
|
||||||
|
document.getElementById("txt_SearchText").value = transText
|
||||||
|
document.querySelector(".search-btn").click()
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "qikan.cqvip.com": // 维普期刊
|
||||||
|
document.getElementById("searchKeywords").value = transText
|
||||||
|
document.getElementById("btnSearch").click()
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("[小墨助手]", "自动搜索模块完成搜索 [" + transText + "]");
|
||||||
|
}
|
1
scripts/advanced-search/content.js
Normal file
1
scripts/advanced-search/content.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
console.log("[小墨助手]", "高级搜索功能模块加载成功");
|
Loading…
Reference in New Issue
Block a user