Repository: shimohq/chinese-programmer-wrong-pronunciation Branch: master Commit: cd0b6bfab2d3 Files: 21 Total size: 63.6 KB Directory structure: gitextract_c8hfxxzq/ ├── .editorconfig ├── .github/ │ └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── README.md └── tools/ ├── addword.py └── chromium_extension/ ├── README.md ├── css/ │ └── app.css ├── format-code.sh ├── images/ │ └── README.md ├── js/ │ ├── app/ │ │ ├── box.js │ │ ├── components.js │ │ ├── init.js │ │ ├── pretty-box.js │ │ ├── search-engine.js │ │ └── utils.js │ └── content-script.js ├── manifest.json ├── package.json ├── rules/ │ └── remove_content_security_policy.json └── web-components/ ├── README.md └── x-custom-box.html ================================================ FILE CONTENTS ================================================ ================================================ FILE: .editorconfig ================================================ # EditorConfig is awesome: https://EditorConfig.org # top-most EditorConfig file root = true # Unix-style newlines with a newline ending every file [*] end_of_line = lf insert_final_newline = true # Matches multiple files with brace expansion notation # Set default charset [*.{js,py}] charset = utf-8 # 4 space indentation [*.py] indent_style = space indent_size = 4 # Tab indentation (no size specified) [Makefile] indent_style = tab # Indentation override for all JS under lib directory [lib/**.js] indent_style = space indent_size = 2 # Matches the exact files either package.json or .travis.yml [{package.json,.travis.yml}] indent_style = space indent_size = 2 ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ ================================================ FILE: .gitignore ================================================ /tools/chromium_extension/_metadata /tools/chromium_extension/node_modules /tools/chromium_extension/package-lock.json /.idea ================================================ FILE: README.md ================================================ ## Words Commonly Mispronounced by Chinese Programmers ## 中国程序员容易发音错误的单词(点击🔊收听正确读音) ### 重要更新 - 我们团队最新推出了一款新产品 **[@OfficeSDK](https://officesdk.com)**,拥有强大的文档预览与编辑功能,欢迎了解! - chromium扩展:无页面跳转,实时检索英语发音 - 安装 [chromium 扩展](tools/chromium_extension/README.md) 或者 - [外部独立库](https://github.com/jingjingxyk/chinese-programmer-wrong-pronunciation-chromium-extension.git) - 简洁的单词列表,正确读音不用再打开新网页:https://cpwp.netlify.app/ - [iOS应用](https://apps.apple.com/cn/app/%E7%8C%BF%E5%8D%95%E8%AF%8D-%E4%B8%AD%E5%9B%BD%E7%A8%8B%E5%BA%8F%E5%91%98%E5%AE%B9%E6%98%93%E5%8F%91%E9%9F%B3%E9%94%99%E8%AF%AF%E7%9A%84%E5%8D%95%E8%AF%8D/id1626487291) | 单词 | 正确发音(英音) | 正确发音(美音) | 错误发音 | 中文释义 | | ------------- | ------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | ----------------------- | ------------------- | | access | [🔊](https://dict.youdao.com/dictvoice?audio=access&type=1) /'ækses/ | [🔊](https://dict.youdao.com/dictvoice?audio=access&type=2) /ˈækses/ | ❌ /ək'ses/ | 访问 | | Adobe | [🔊](https://dict.youdao.com/dictvoice?audio=Adobe&type=1) /ə'dəʊbi/ | [🔊](https://dict.youdao.com/dictvoice?audio=Adobe&type=2) /ə'dəʊbi/ | ❌ /əˈdub/ | 奥多比(公司名) | | admin | [🔊](https://dict.youdao.com/dictvoice?audio=admin&type=1) /'ædmɪn/ | [🔊](https://dict.youdao.com/dictvoice?audio=admin&type=2) /ˈædmɪn/ | ❌ /ɜ:d'mɪn/ | 管理员 | | adversarial | [🔊](https://dict.youdao.com/dictvoice?audio=adversarial&type=1) /ˌædvəˈseəriəl/ | [🔊](https://dict.youdao.com/dictvoice?audio=adversarial&type=2) /ˌædvərˈseriəl/ | ❌ /ədˈvɜːrsəriəl/ | 对抗的 | | agile | [🔊](https://dict.youdao.com/dictvoice?audio=agile&type=1) /'ædʒaɪl/ | [🔊](https://dict.youdao.com/dictvoice?audio=agile&type=2) /ˈædʒl/ | ❌ /ə'dʒaɪl/ | 敏捷开发 | | amazon | [🔊](https://dict.youdao.com/dictvoice?audio=amazon&type=1) /'æməzən/ | [🔊](https://dict.youdao.com/dictvoice?audio=amazon&type=2) /ˈæməzɑːn/ | ❌ /'əmeizən/ /ə'meizən/ | 亚马逊(公司名) | | analogy | [🔊](https://dict.youdao.com/dictvoice?audio=analogy&type=1) /əˈnælədʒi/ | [🔊](https://dict.youdao.com/dictvoice?audio=analogy&type=2) /əˈnælədʒi/ | ❌ /ænə'lɒdʒi/ | 类比 | | Angular | [🔊](https://dict.youdao.com/dictvoice?audio=Angular&type=1) /'æŋgjʊlə/ | [🔊](https://dict.youdao.com/dictvoice?audio=Angular&type=2) /ˈæŋɡjələr/ | ❌ /'æŋɡələ/ /'æŋdʒʌlə/ | 前端框架名 | | AJAX | [🔊](https://dict.youdao.com/dictvoice?audio=AJAX&type=1) /'eidʒæks/ | [🔊](https://dict.youdao.com/dictvoice?audio=AJAX&type=2) /'eidʒæks/ | ❌ /ə'dʒʌks/ | 异步JS和XML | | alias | [🔊](https://dict.youdao.com/dictvoice?audio=alias&type=1) /ˈeɪliəs/ | [🔊](https://dict.youdao.com/dictvoice?audio=alias&type=2) /ˈeɪliəs/ | ❌ /ə'lais/ | 别名 | | align | [🔊](https://dict.youdao.com/dictvoice?audio=align&type=1) /əˈlaɪn/ | [🔊](https://dict.youdao.com/dictvoice?audio=align&type=2) /əˈlaɪn/ | ❌ /ə'lidʒen/ | 对齐 | | Apache | [🔊](https://dict.youdao.com/dictvoice?audio=Apache&type=1) /ə'pætʃɪ/ | [🔊](https://dict.youdao.com/dictvoice?audio=Apache&type=2) /əˈpætʃi/ | ❌ /ʌpʌtʃ/ | Web服务器软件 | | app | [🔊](https://dict.youdao.com/dictvoice?audio=app&type=1) /æp/ | [🔊](https://dict.youdao.com/dictvoice?audio=app&type=2) /æp/ | ❌ /eipi'pi/ | 应用程序 | | archive | [🔊](https://dict.youdao.com/dictvoice?audio=archive&type=1) /'ɑːkaɪv/ | [🔊](https://dict.youdao.com/dictvoice?audio=archive&type=2) /'ɑːkaɪv/ | ❌ /'ətʃɪv/ | 归档;存档 | | array | [🔊](https://dict.youdao.com/dictvoice?audio=array&type=1) /ə'rei/ | [🔊](https://dict.youdao.com/dictvoice?audio=array&type=2) /əˈreɪ/ | ❌ /æ'rei/ | 数组 | | ASCII | [🔊](https://dict.youdao.com/dictvoice?audio=ascii&type=1) /'æski/ | [🔊](https://dict.youdao.com/dictvoice?audio=ascii&type=2) /ˈæski/ | ❌ /ɑːsk/ | 美国信息交换标准代码 | | aspect | [🔊](https://dict.youdao.com/dictvoice?audio=aspect&type=1) /'æspekt/ | [🔊](https://dict.youdao.com/dictvoice?audio=aspect&type=2) /ˈæspekt/ | ❌ /ə'spekt/ | 方面;切面 | | async | [🔊](https://dict.youdao.com/dictvoice?audio=async&type=1) /əˈsɪŋk/ | [🔊](https://dict.youdao.com/dictvoice?audio=async&type=2) /æˈsɪŋk/ | ❌ /'æsɪŋk/ | 异步 | | avatar | [🔊](https://dict.youdao.com/dictvoice?audio=avatar&type=1) /'ævətɑː/ | [🔊](https://dict.youdao.com/dictvoice?audio=avatar&type=2) /ˈævətɑːr/ | ❌ /ə'vʌtɑ/ | 头像 | | Azure | [🔊](https://dict.youdao.com/dictvoice?audio=azure&type=1) /'æʒə/ | [🔊](https://dict.youdao.com/dictvoice?audio=azure&type=2) /ˈæʒər/ | ❌ /ˈæzʊʒə/ | 微软云计算平台 | | Bazel | [🔊](https://dict.youdao.com/dictvoice?audio=bazel&type=1) /ˈbeɪzəl/ | [🔊](https://dict.youdao.com/dictvoice?audio=bazel&type=1) /ˈbeɪzəl/ | ❌ /bæ zəl/ | 构建工具名 | | bind | [🔊](https://dict.youdao.com/dictvoice?audio=bind&type=1) /baɪnd/ | [🔊](https://dict.youdao.com/dictvoice?audio=bind&type=2) /baɪnd/ | ❌ /bɪnd/ | 绑定 | | BIOS | [🔊](https://dict.youdao.com/dictvoice?audio=bios&type=1) /ˈbaɪɒs/ | /'baɪɑs/ | ❌ /ˈbɪɒs/ | 基本输入输出系统 | | cache | [🔊](https://dict.youdao.com/dictvoice?audio=cache&type=1) /kæʃ/ | [🔊](https://dict.youdao.com/dictvoice?audio=cache&type=2) /kæʃ/ | ❌ /kætʃ/ | 缓存 | | Canal | [🔊](https://dict.youdao.com/dictvoice?audio=canal&type=1) /kəˈnæl/ | [🔊](https://dict.youdao.com/dictvoice?audio=canal&type=2) /kəˈnæl/ | ❌ /ˈkænl/ | 阿里分布式数据库同步中间件 | | chaos | [🔊](https://dict.youdao.com/dictvoice?audio=chaos&type=1) /ˈkeɪɒs/ | [🔊](https://dict.youdao.com/dictvoice?audio=chaos&type=2) /ˈkeɪɑːs/ | ❌ /ˈtʃoʊs/ | 混乱;混沌 | | Chrome | [🔊](https://dict.youdao.com/dictvoice?audio=chrome&type=1) /krəʊm/ | [🔊](https://dict.youdao.com/dictvoice?audio=chrome&type=2) /kroʊm/ | ❌ /tʃɔːm/ | 谷歌浏览器 | | clang | [🔊](https://dict.youdao.com/dictvoice?audio=clang&type=1) /klæŋ/ | [🔊](https://dict.youdao.com/dictvoice?audio=clang&type=2) /klæŋ/ | ❌ /sɪlæŋ/ | C/C++ 编译器 | | context | [🔊](https://dict.youdao.com/dictvoice?audio=context&type=1) /ˈkɒntekst/ | [🔊](https://dict.youdao.com/dictvoice?audio=context&type=2) / ˈkɑːntekst/ | ❌ /kənˈtekst/ | 上下文 | | Coq | [🔊](https://upload.wikimedia.org/wikipedia/commons/4/47/Fr-coq.ogg) IPA French ['kɔkʲ] 读若拼音“goq” | | ❌ IPA English ['kʰɒk] | 形式化证明 | | daemon | [🔊](https://dict.youdao.com/dictvoice?audio=Daemon&type=1) /'diːmən/ | [🔊](https://dict.youdao.com/dictvoice?audio=Daemon&type=2) /ˈdiːmən/ | ❌ /dæmən/ | 后台服务进程 | | debt | [🔊](https://dict.youdao.com/dictvoice?audio=debt&type=1) /det/ | [🔊](https://dict.youdao.com/dictvoice?audio=debt&type=2) /det/ | ❌ /de'bit/ | 债务 | | deny | [🔊](https://dict.youdao.com/dictvoice?audio=deny&type=1) /dɪ'naɪ/ | [🔊](https://dict.youdao.com/dictvoice?audio=deny&type=2) /dɪˈnaɪ/ | ❌ /'dæni/ | 拒绝;否认 | | deprecate | [🔊](https://dict.youdao.com/dictvoice?audio=deprecate&type=1) /ˈdeprəkeɪt/ | [🔊](https://dict.youdao.com/dictvoice?audio=deprecate&type=2) /ˈdeprəkeɪt/ | | 弃用 | | deque | [🔊](https://dict.youdao.com/dictvoice?audio=deque&type=1) /'dek/ | [🔊](https://dict.youdao.com/dictvoice?audio=deque&type=2) /dɛk/ | ❌ /di'kju/ | 双端队列 | | digest | [🔊](https://dict.youdao.com/dictvoice?audio=digest&type=1) n. /'dɑɪdʒɛst/ v. /dɑɪ'dʒɛst/ | [🔊](https://dict.youdao.com/dictvoice?audio=digest&type=2) /daɪˈdʒest,dɪˈdʒest/ | ❌ /'dɪgɛst/ | 摘要 | | Dijkstra | [🔊](https://upload.wikimedia.org/wikipedia/commons/8/85/Dijkstra.ogg) Dutch:/ˈdɛikstra/ English:/ˈdaɪkstrə/ | [🔊](https://upload.wikimedia.org/wikipedia/commons/8/85/Dijkstra.ogg) | | 迪杰斯特拉算法/最短路算法 | | Django | [🔊](https://dict.youdao.com/dictvoice?audio=Django&type=1) /ˈdʒæŋɡoʊ/ | [🔊](https://dict.youdao.com/dictvoice?audio=Django&type=2) /ˈdʒæŋɡoʊ/ | ❌ /diˈdʒæŋɡoʊ/ | Python Web 框架名 | | doc | [🔊](https://dict.youdao.com/dictvoice?audio=doc&type=1) /dɒk/ | [🔊](https://dict.youdao.com/dictvoice?audio=doc&type=2) /dɒk/ | ❌ /daʊk/ | 文档 | | dotnet | [🔊](https://dict.youdao.com/dictvoice?audio=dotnet&type=1) /dɒtnet/ | [🔊](https://dict.youdao.com/dictvoice?audio=dotnet&type=2) /dɑːtnet/ | ❌ /daʊtnet/ | .NET 平台 | | edition | [🔊](https://dict.youdao.com/dictvoice?audio=edition&type=1) /ɪˈdɪʃ(ə)n/ | [🔊](https://dict.youdao.com/dictvoice?audio=edition&type=2) /ɪˈdɪʃn/ | ❌ /eˈdɪʃn/ | 版本 | | ephemeral | [🔊](https://dict.youdao.com/dictvoice?audio=ephemeral&type=1) /ɪˈfemərəl/ | [🔊](https://dict.youdao.com/dictvoice?audio=ephemeral&type=2) /ɪˈfemərəl/ | ❌ /efe'merəl/ | 临时的 | | epoch | [🔊](https://dict.youdao.com/dictvoice?audio=epoch&type=1) /ˈiːpɒk/ | [🔊](https://dict.youdao.com/dictvoice?audio=epoch&type=2) /ˈepək/ | ❌ /'ɛpətʃ/ | 时间起点;训练轮次;纪元 | | execute | [🔊](https://dict.youdao.com/dictvoice?audio=execute&type=1) /ˈeksɪkjuːt/ | [🔊](https://dict.youdao.com/dictvoice?audio=execute&type=2) /ˈeksɪkjuːt/ | | 执行 | | executor | [🔊](https://dict.youdao.com/dictvoice?audio=executor&type=1) /ɪɡˈzekjətə(r)/ | [🔊](https://dict.youdao.com/dictvoice?audio=executor&type=2) /ɪɡˈzekjətər/ | | 执行器 | | event | [🔊](https://dict.youdao.com/dictvoice?audio=event&type=1) /ɪ'vent/ | [🔊](https://dict.youdao.com/dictvoice?audio=event&type=2) /ɪˈvent/ | ❌ /'ɪvənt/ | 事件 | | exit | [🔊](https://dict.youdao.com/dictvoice?audio=exit&type=1) /ˈeksɪt/ | [🔊](https://dict.youdao.com/dictvoice?audio=exit&type=2) /ˈeksɪt; ˈeɡzɪt/ | ❌ /ig'zit/ | 退出 | | facade | [🔊](https://dict.youdao.com/dictvoice?audio=facade&type=1) /fə'sɑːd/ | [🔊](https://dict.youdao.com/dictvoice?audio=facade&type=2) /fəˈsɑːd/ | ❌ /'feikeid/ | 外观 | | Fedora | [🔊](https://dict.youdao.com/dictvoice?audio=fedora&type=1) /fɪ'dɔːrə/ | [🔊](https://dict.youdao.com/dictvoice?audio=fedora&type=2) /fɪˈdɔːrə/ | ❌ /'fedərə/ | Linux 发行版名 | | format | [🔊](https://dict.youdao.com/dictvoice?audio=format&type=1) /'fɔːmæt/ | [🔊](https://dict.youdao.com/dictvoice?audio=format&type=2) /ˈfɔːrmæt/ | ❌ /fɔ'mæt/ | 格式 | | gauge | [🔊](https://dict.youdao.com/dictvoice?audio=gauge&type=1) /ɡeɪdʒ/ | [🔊](https://dict.youdao.com/dictvoice?audio=gauge&type=2) /ɡeɪdʒ/ | ❌ /ɡɑudʒ/ | 仪表盘 | | Git | [🔊](https://dict.youdao.com/dictvoice?audio=git&type=1) /ɡɪt/ | [🔊](https://dict.youdao.com/dictvoice?audio=git&type=2) /ɡɪt/ | ❌ /dʒɪt/ | 分布式版本控制系统 | | GNU | [🔊](https://upload.wikimedia.org/wikipedia/commons/2/24/En-gnu.ogg) /gnu:/ | [🔊](https://upload.wikimedia.org/wikipedia/commons/2/24/En-gnu.ogg) /gnuː,gnjuː/ | | 操作系统名 | | Grafana | [🔊](http://www.howtopronounce.cc/file/e204a97ed1e440c5ab15ea0117beb955.mp3) /grəˈfɑːnˌɑː/ | [🔊](http://www.howtopronounce.cc/file/e204a97ed1e440c5ab15ea0117beb955.mp3 ) /grəˈfɑːnˌɑː/ | | 监控可视化平台 | | GraphQL | [🔊](https://dict.youdao.com/dictvoice?audio=GraphQL&type=1) /græf kju ɛl/ | [🔊](https://dict.youdao.com/dictvoice?audio=GraphQL&type=2) /græf kju ɛl/ | ❌ /dʒɪgræf kju ɛl/ | API 查询语言 | | GUI | [🔊](https://dict.youdao.com/dictvoice?audio=GUI&type=1) /ˈɡu:i/ | [🔊](https://dict.youdao.com/dictvoice?audio=GUI&type=2) /ˈɡu:i/ | | 图形用户界面 | | Haskell | [🔊](https://dict.youdao.com/dictvoice?audio=haskell&type=1) /ˈhæskəl/ | [🔊](https://dict.youdao.com/dictvoice?audio=haskell&type=2) /ˈhæskəl/ | ❌ /hæˈskəl/ | 编程语言名 | | height | [🔊](https://dict.youdao.com/dictvoice?audio=height&type=1) /haɪt/ | [🔊](https://dict.youdao.com/dictvoice?audio=height&type=2) /haɪt/ | ❌ /heɪt/ | 高度;高度属性 | | hidden | [🔊](https://dict.youdao.com/dictvoice?audio=hidden&type=1) /'hɪdn/ | [🔊](https://dict.youdao.com/dictvoice?audio=hidden&type=2) /ˈhɪdn/ | ❌ /'haɪdn/ | 隐藏 | | IEEE | [🔊](https://dict.youdao.com/dictvoice?audio=I_triple_e&type=1) /aɪ ˈtrɪpəl i/ | [🔊](https://dict.youdao.com/dictvoice?audio=I_triple_e&type=2) /aɪ ˈtrɪpəl i/ | ❌ /'aɪ'iː'iː'iː/ | 电气电子工程师学会 | | image | [🔊](https://dict.youdao.com/dictvoice?audio=image&type=1) /'ɪmɪdʒ/ | [🔊](https://dict.youdao.com/dictvoice?audio=image&type=2) /ˈɪmɪdʒ/ | ❌ /ɪ'meɪdʒ/ | 图像;映像 | | implement | [🔊](https://dict.youdao.com/dictvoice?audio=implement&type=1) /'ɪmplɪm(ə)nt/ | [🔊](https://dict.youdao.com/dictvoice?audio=implement&type=2) /ˈɪmplɪmənt/ /ˈɪmpləˌment/ | ❌ /ɪm'plem(ə)nt/ | 实现(接口) | | integer | [🔊](https://dict.youdao.com/dictvoice?audio=integer&type=1) /'ɪntɪdʒə/ | [🔊](https://dict.youdao.com/dictvoice?audio=integer&type=2) /ˈɪntɪdʒər/ | ❌ /ˈɪntaɪgə/ | 整数;整型 | | issue | [🔊](https://dict.youdao.com/dictvoice?audio=issue&type=1) /'ɪʃuː/ | [🔊](https://dict.youdao.com/dictvoice?audio=issue&type=2) /ˈɪʃuː/ | ❌ /ˈaɪʃuː/ | 问题;议题 | | Java | [🔊](https://dict.youdao.com/dictvoice?audio=java&type=1) /'dʒɑːvə/ | [🔊](https://dict.youdao.com/dictvoice?audio=java&type=2) /ˈdʒɑːvə/ | | 编程语言名 | | jpg | [🔊](https://dict.youdao.com/dictvoice?audio=JPEG&type=1) /'dʒeɪpeɡ/ | [🔊](https://dict.youdao.com/dictvoice?audio=JPEG&type=2) /'dʒeɪpeɡ/ | ❌ /ˈdʒeɪˈpi:ˈdʒiː/ | 图片格式名 | | key | [🔊](https://dict.youdao.com/dictvoice?audio=key&type=1) /kiː/ | [🔊](https://dict.youdao.com/dictvoice?audio=key&type=2) /kiː/ | ❌ /kei/ | 键;密钥;主键;关键字 | | kubernetes* | [🔊](https://content.swncdn.com/biblestudytools/audio/lexicons/greek-mp3/2942g.mp3) /kubз'netɪs/ | [🔊](https://content.swncdn.com/biblestudytools/audio/lexicons/greek-mp3/2942g.mp3) /kuːbə˞'netiz/ | | 容器编排平台 | | lambda | [🔊](https://dict.youdao.com/dictvoice?audio=lambda&type=1) /ˈlæmdə/ | [🔊](https://dict.youdao.com/dictvoice?audio=lambda&type=2) /ˈlæmdə/ | ❌ /ˈlɒŋmdɑ/ | λ;匿名函数表达式 | | Ldap | [🔊](https://dict.youdao.com/dictvoice?audio=ldap&type=1) /el'dæp/ | [🔊](https://dict.youdao.com/dictvoice?audio=ldap&type=2) /el'dæp/ | ❌ /el'daːp/ | 轻量级目录访问协议 | | legacy | [🔊](https://dict.youdao.com/dictvoice?audio=legacy&type=1) /'leɡəsi/ | [🔊](https://dict.youdao.com/dictvoice?audio=legacy&type=2) /'leɡəsi/ | ❌ /'li:gasi/ | 遗留的 | | linear | [🔊](https://dict.youdao.com/dictvoice?audio=linear&type=1) /'lɪnɪə/ | [🔊](https://dict.youdao.com/dictvoice?audio=linear&type=2) /ˈlɪniər/ | ❌ /'laɪə/ | 线性的 | | LINQ | [🔊](https://dict.youdao.com/dictvoice?audio=link&type=1) /lɪŋk/ | [🔊](https://dict.youdao.com/dictvoice?audio=link&type=2) /lɪŋk/ | ❌ /lɪŋkju:/ | .NET 里的集成查询 | | Linux | [🔊](https://dict.youdao.com/dictvoice?audio=linux&type=1) /'lɪnəks/ | [🔊](https://dict.youdao.com/dictvoice?audio=linux&type=2) /ˈlaɪnəks/ /ˈlɪnəks/ | ❌ /ˈlɪnʌks/ /ˈlɪnjuːks/ | 操作系统内核;Linux 系统 | | locale | [🔊](https://dict.youdao.com/dictvoice?audio=locale&type=1) /ləʊ'kɑːl/ | [🔊](https://dict.youdao.com/dictvoice?audio=locale&type=2) /loʊˈkæl/ | ❌ /ˈloʊk(ə)l/ | 本地化设置 | | Lucene | [🔊](https://dict.youdao.com/dictvoice?audio=lucene&type=1) /lu'siːn/ | [🔊](https://dict.youdao.com/dictvoice?audio=lucene&type=2) /lu'siːn/ | ❌ /'lu:sən/ | 全文检索引擎库 | | macro | [🔊](https://dict.youdao.com/dictvoice?audio=macro&type=1) /ˈmækrəʊ/ | [🔊](https://dict.youdao.com/dictvoice?audio=macro&type=2) /ˈmækroʊ/ | ❌ /ˈmakroʊ/ | 宏;宏定义 | | main | [🔊](https://dict.youdao.com/dictvoice?audio=main&type=1) /meɪn/ | [🔊](https://dict.youdao.com/dictvoice?audio=main&type=2) /meɪn/ | ❌ /mɪn/ | 主函数;主入口 | | margin | [🔊](https://dict.youdao.com/dictvoice?audio=margin&type=1) /'mɑːdʒɪn/ | [🔊](https://dict.youdao.com/dictvoice?audio=margin&type=2) /ˈmɑːrdʒɪn/ | ❌ /'mʌgɪn/ | 边距 | | matrix | [🔊](https://dict.youdao.com/dictvoice?audio=matrix&type=1) /ˈmeɪtrɪks/ | [🔊](https://dict.youdao.com/dictvoice?audio=matrix&type=2) /ˈmeɪtrɪks/ | ❌ /ˈmɑ:trɪks/ | 矩阵 | | maven | [🔊](https://dict.youdao.com/dictvoice?audio=maven&type=1) /'meɪvn/ | [🔊](https://dict.youdao.com/dictvoice?audio=maven&type=2) /ˈmeɪvn/ | ❌ /'maːvn/ | Java 构建与依赖管理工具 | | max | [🔊](https://dict.youdao.com/dictvoice?audio=max&type=1) /mæks/ | [🔊](https://dict.youdao.com/dictvoice?audio=max&type=2) /mæks/ | ❌ /mɑ:ks/ | 最大值 | | Microsoft | [🔊](https://dict.youdao.com/dictvoice?audio=Microsoft&type=1) /'maikrəusɔft/ | [🔊](https://dict.youdao.com/dictvoice?audio=Microsoft&type=2) /ˈmaɪkrəsɔːft/ | ❌ /'mikrəusɔft/ | 微软(公司名) | | migrate | [🔊](https://dict.youdao.com/dictvoice?audio=migrate&type=1) /maɪˈɡreɪt/ | [🔊](https://dict.youdao.com/dictvoice?audio=migrate&type=2) /ˈmaɪɡreɪt/ | ❌ /ˈmɪɡreɪt/ | 迁移 | | miscellaneous | [🔊](https://dict.youdao.com/dictvoice?audio=miscellaneous&type=1) /ˌmɪsəˈleɪniəs/ | [🔊](https://dict.youdao.com/dictvoice?audio=miscellaneous&type=2) /ˌmɪsəˈleɪniəs/ | | 杂项;其他 | | module | [🔊](https://dict.youdao.com/dictvoice?audio=module&type=1) /'mɒdjuːl/ | [🔊](https://dict.youdao.com/dictvoice?audio=module&type=2) /ˈmɑːdʒuːl/ | ❌ /'məʊdl/ | 模块;组件/功能模块 | | native | [🔊](https://dict.youdao.com/dictvoice?audio=native&type=1) /ˈneɪtɪv/ | [🔊](https://dict.youdao.com/dictvoice?audio=native&type=2) /ˈneɪtɪv/ | ❌ /ˈnætɪv/ | 原生的;本地的 | | nginx | Engine X | Engine X | | Web 服务器名 | | null | [🔊](https://dict.youdao.com/dictvoice?audio=null&type=1) /nʌl/ | [🔊](https://dict.youdao.com/dictvoice?audio=null&type=2) /nʌl/ | ❌ /naʊ/ | 空;空值;空指针 | | obsolete | [🔊](https://dict.youdao.com/dictvoice?audio=obsolete&type=1) /ˈɒbsəliːt/ | [🔊](https://dict.youdao.com/dictvoice?audio=obsolete&type=2) /ˌɑːbsəˈliːt/ | | 过时的;淘汰的 | | OS X | OS ten | OS ten | ❌ /ɔs eks/ | 苹果桌面操作系统旧称 | | phantom | [🔊](https://dict.youdao.com/dictvoice?audio=phantom&type=1) /'fæntəm/ | [🔊](https://dict.youdao.com/dictvoice?audio=phantom&type=2) /ˈfæntəm/ | ❌ /'pæntəm/ | 幽灵/虚拟的 | | parameter | [🔊](https://dict.youdao.com/dictvoice?audio=parameter&type=1) /pə'ræmɪtə/ | [🔊](https://dict.youdao.com/dictvoice?audio=parameter&type=2) /pəˈræmɪtər/ | ❌ /'pærəmɪtə/ | 参数;形参 | | premise | [🔊](https://dict.youdao.com/dictvoice?audio=premise&type=1) /ˈpremɪs/ | [🔊](https://dict.youdao.com/dictvoice?audio=premise&type=2) /ˈpremɪs/ | ❌ /prɪ'mɪs/ | 前提;前置条件 | | privilege | [🔊](https://dict.youdao.com/dictvoice?audio=privilege&type=1) /'prɪvəlɪdʒ/ | [🔊](https://dict.youdao.com/dictvoice?audio=privilege&type=2) /ˈprɪvəlɪdʒ/ | ❌ /'prɪvɪlɪdʒ/ | 权限;特权 | | probe | [🔊](https://dict.youdao.com/dictvoice?audio=probe&type=1) /prəʊb/ | [🔊](https://dict.youdao.com/dictvoice?audio=probe&type=2) /proʊb/ | ❌ /proʊbi/ | 探针;探测/探测请求 | | Prometheus | [🔊](https://dict.youdao.com/dictvoice?audio=prometheus&type=1) /prə-ˈmē-thē-əs/ | [🔊](https://dict.youdao.com/dictvoice?audio=prometheus&type=2) /pro'miθɪəs/ | | 时序数据库监控系统 | | putty | [🔊](https://dict.youdao.com/dictvoice?audio=putty&type=1) /ˈpʌti/ | [🔊](https://dict.youdao.com/dictvoice?audio=putty&type=2) /ˈpʌti/ | ❌ /ˈpuːti/ | 开源 SSH 和 Telnet 客户端 | | Qt | [🔊](https://dict.youdao.com/dictvoice?audio=cute&type=1) /kjuːt/ | [🔊](https://dict.youdao.com/dictvoice?audio=cute&type=2) /kjuːt/ | | 跨平台 GUI 框架 | | query | [🔊](https://dict.youdao.com/dictvoice?audio=query&type=1) /'kwɪəri/ | [🔊](https://dict.youdao.com/dictvoice?audio=query&type=2) /ˈkwɪri/ | ❌ /'kwaɪri/ | 查询 | | Realm | [🔊](https://dict.youdao.com/dictvoice?audio=realm&type=1) /relm/ | [🔊](https://dict.youdao.com/dictvoice?audio=realm&type=2) /relm/ | ❌ /riəlm/ | 移动端数据库名 | | reconcile | [🔊](https://dict.youdao.com/dictvoice?audio=reconcile&type=1) /ˈrekənsaɪl/ | [🔊](https://dict.youdao.com/dictvoice?audio=reconcile&type=2) /ˈrekənsaɪl/ | | 核对;协调一致 | | Redux | [🔊](https://dict.youdao.com/dictvoice?audio=redux&type=1) /ri'dʌks/ | [🔊](https://dict.youdao.com/dictvoice?audio=redux&type=2) /ri'dʌks/ | ❌ /'ridju:ks/ | 前端状态管理库名 | | resume | [🔊](https://dict.youdao.com/dictvoice?audio=resume&type=1) /rɪ'zju:m/ | [🔊](https://dict.youdao.com/dictvoice?audio=resume&type=2) /rɪˈzuːm/ | ❌ /rɪ'sju:m/ | 恢复/继续;简历 | | résumé | [🔊](https://dict.youdao.com/dictvoice?audio=résumé&type=1) /rezjumeɪ/ | [🔊](https://dict.youdao.com/dictvoice?audio=résumé&type=2) /ˈrezəmeɪ/ | ❌ /rɪ'sju:m/ | 简历 | | resolved | [🔊](https://dict.youdao.com/dictvoice?audio=resolved&type=1) /rɪ'zɒlvd/ | [🔊](https://dict.youdao.com/dictvoice?audio=resolved&type=2) /rɪˈzɑːlvd/ | ❌ /rɪ'səʊvd/ | 已解决 | | resort | [🔊](https://dict.youdao.com/dictvoice?audio=resort&type=1) /rɪˈzɔ:t/ | [🔊](https://dict.youdao.com/dictvoice?audio=resort&type=2) /rɪˈzɔːrt/ | ❌ /rɪˈsɔ:t/ | 求助于/采取 | | retina | [🔊](https://dict.youdao.com/dictvoice?audio=retina&type=1) /'retɪnə/ | [🔊](https://dict.youdao.com/dictvoice?audio=retina&type=2) /ˈretɪnə/ | ❌ /ri'tina/ | 苹果显示屏;视网膜 | | RISC-V | [🔊](https://dict.youdao.com/dictvoice?audio=risk-five&type=1) /'rɪsk faɪv/ | [🔊](https://dict.youdao.com/dictvoice?audio=risk-five&type=2) /'rɪsk faɪv/ | ❌ /'rɪsk v/ | 开源指令集架构 | | route | [🔊](https://dict.youdao.com/dictvoice?audio=route&type=1) /ruːt/ | [🔊](https://dict.youdao.com/dictvoice?audio=route&type=2) /ruːt,raʊt/ | ❌ /rəʊt/ | 路由;路由表/路由规则 | | San Jose | [🔊](https://dict.youdao.com/dictvoice?audio=san%20jose&type=1) /sænhəu'zei/ | [🔊](https://dict.youdao.com/dictvoice?audio=san%20jose&type=2) /sænhəu'zei/ | ❌ /sæn'ju:s/ | 圣何塞(地名) | | safari | [🔊](https://dict.youdao.com/dictvoice?audio=safari&type=1) /sə'fɑːrɪ/ | [🔊](https://dict.youdao.com/dictvoice?audio=safari&type=2) /səˈfɑːri/ | ❌ /sæfərɪ/ | 苹果浏览器名 | | scheme | [🔊](https://dict.youdao.com/dictvoice?audio=scheme&type=1) /skiːm/ | [🔊](https://dict.youdao.com/dictvoice?audio=scheme&type=2) /skiːm/ | ❌ /s'kæmə/ | 方案;协议方案;编程语言名 | | scala | [🔊](https://dict.youdao.com/dictvoice?audio=scala&type=1) /ˈskɑːlɑ/ | [🔊](https://dict.youdao.com/dictvoice?audio=scala&type=2) /ˈskɑːlɑ/ | ❌ /ˈskæːlɑ/ | 编程语言名 | | segue | [🔊](https://dict.youdao.com/dictvoice?audio=segue&type=1) /'sɛɡwe/ | [🔊](https://dict.youdao.com/dictvoice?audio=segue&type=2) /ˈseɡweɪ/ | ❌ /se'dʒ/ | 过渡/切换 | | SQL | /ˈsiːkwəl/ /ˈesˈkjuːˈel/ | /ˈsiːkwəl/ /ˈesˈkjuːˈel/ | ❌ /sərk(ə)l/ | 结构化查询语言 | | sudo | /'suːduː/ | /'suːduː/ | | 管理员权限运行 | | suite | [🔊](https://dict.youdao.com/dictvoice?audio=suite&type=1) /swiːt/ | [🔊](https://dict.youdao.com/dictvoice?audio=suite&type=2) /swiːt/ | ❌ /sjuːt/ | 套件 | | telemetry | [🔊](https://dict.youdao.com/dictvoice?audio=telemetry&type=1) /təˈlemətri/ | [🔊](https://dict.youdao.com/dictvoice?audio=telemetry&type=2) /təˈlemətri/ | ❌ /ˈtelɪmətri/ | 遥测 | | thymeleaf | [🔊](https://dict.youdao.com/dictvoice?audio=thymeleaf&type=1) /ˈtaɪmˌlɪːf/ | [🔊](https://dict.youdao.com/dictvoice?audio=thymeleaf&type=2) /ˈtaɪmˌlɪːf/ | ❌ /θiːmɪlɪːf/ | Java 模板引擎名 | | tuple | [🔊](https://dict.youdao.com/dictvoice?audio=tuple&type=1) /tjʊpəl/ | [🔊](https://dict.youdao.com/dictvoice?audio=tuple&type=2) /tuːpəl/ | | 元组;有序组 | | typical | [🔊](https://dict.youdao.com/dictvoice?audio=typical&type=1) /'tɪpɪkl/ | [🔊](https://dict.youdao.com/dictvoice?audio=typical&type=2) /ˈtɪpɪkl/ | ❌ /'taɪpɪkəl/ | 典型的 | | Ubuntu | [🔊](https://upload.wikimedia.org/wikipedia/commons/b/b5/En-Ubuntu_pronunciation.oga) /ʊ'bʊntʊ/ | [🔊](https://upload.wikimedia.org/wikipedia/commons/b/b5/En-Ubuntu_pronunciation.oga) /ʊ'bʊntʊ/ | ❌ /juː'bʊntʊ/ | Linux 发行版名 | | UEFI | U-E-F-I | U-E-F-I | ❌ /jufi/ /ɔːfi/ | 统一可扩展固件接口 | | Vagrant | [🔊](https://dict.youdao.com/dictvoice?audio=Vagrant&type=1) /ˈveɪɡrənt/ | [🔊](https://dict.youdao.com/dictvoice?audio=Vagrant&type=2) /ˈveɪɡrənt/ | /ˈvagɹent/ | 虚拟机名 | | variable | [🔊](https://dict.youdao.com/dictvoice?audio=variable&type=1) /'veəriəbl/ | [🔊](https://dict.youdao.com/dictvoice?audio=variable&type=2) /ˈveriəbl,ˈværiəbl/ | ❌ /və'raiəbl/ | 变量;变量名/变量类型 | | verbose | [🔊](https://dict.youdao.com/dictvoice?audio=verbose&type=1) /vɜːˈbəʊs/ | [🔊](https://dict.youdao.com/dictvoice?audio=verbose&type=2) /vɜːrˈboʊs/ | ❌ /'vɜːrboʊs/ | 冗长的 | | vue | [🔊](https://dict.youdao.com/dictvoice?audio=vue&type=1) /v'ju:/ | [🔊](https://dict.youdao.com/dictvoice?audio=vue&type=2) /v'ju:/ | ❌ /v'ju:i/ | 前端框架名 | | width | [🔊](https://dict.youdao.com/dictvoice?audio=width&type=1) /wɪdθ/ | [🔊](https://dict.youdao.com/dictvoice?audio=width&type=2) /wɪdθ,wɪtθ/ | ❌ /waɪdθ/ | 宽度;宽度属性 | | YouTube | [🔊](https://dict.youdao.com/dictvoice?audio=youtube&type=1) /'juː'tjuːb/ | [🔊](https://dict.youdao.com/dictvoice?audio=youtube&type=2) /'juː'tjuːb/ | ❌ /'juː'tʊbɪ/ | 视频网站名;“油管” | | Vite | [🔊](https://dict.youdao.com/dictvoice?audio=vite&type=1) /vit/ | [🔊](https://dict.youdao.com/dictvoice?audio=vite&type=2) /vit/ | ❌ /vaɪt/ | 前端构建工具 | ### 附注 * 无页面跳转,页面嵌入搜索引擎和实时检索英语发音,请安装[chromium 扩展](tools/chromium_extension/README.md) * [chromium 扩展新增功能截图](tools/chromium_extension/images/README.md) * 当使用简名 ‘Kube’ 称呼 ‘Kubernetes’ 时, 发音则与 ‘cube’(/kjuːb/) 一致 ### 相关链接 * 真人发音:https://www.bilibili.com/video/bv1nv411i7z3 (by @hailintao) * 简洁的单词列表,正确读音不用再打开新网页:https://cpwp.netlify.app/ (by @antfu7) * 国际音标严式记音(纽约音)https://github.com/b1f6c1c4/programming-pronunciations-en_US (by @b1f6c1c4) * 单词连读:https://corrector.justsong.cn/ (by [@songquanpeng](https://github.com/songquanpeng/pronunciation-corrector)) * [iOS app](https://apps.apple.com/cn/app/%E7%8C%BF%E5%8D%95%E8%AF%8D-%E4%B8%AD%E5%9B%BD%E7%A8%8B%E5%BA%8F%E5%91%98%E5%AE%B9%E6%98%93%E5%8F%91%E9%9F%B3%E9%94%99%E8%AF%AF%E7%9A%84%E5%8D%95%E8%AF%8D/id1626487291) (by @Chang12) * [chromium系浏览器扩展,无页面跳转,实时检索英语发音](https://github.com/jingjingxyk/chinese-programmer-wrong-pronunciation-chromium-extension.git) (by @jingjingxyk) ### 说明 1. 本着简单的原则, 又为了避免程序猿们出现选择困难症, '正确音标'采用了最接近有道词典音频的英式DJ音标,不代表其唯一性 1. 专业在线英语词典请参考: [在线英语词典哪个比较好?](https://www.zhihu.com/question/19707759) ### 参考资料 1. https://www.zhihu.com/question/19739907 2. https://www.v2ex.com/t/131094 3. https://www.v2ex.com/t/309350 4. https://www.v2ex.com/t/63781 5. https://www.v2ex.com/t/246033 6. https://www.v2ex.com/t/342087 ### Star History [![Star History Chart](https://api.star-history.com/svg?repos=shimohq/chinese-programmer-wrong-pronunciation&type=Date)](https://star-history.com/#shimohq/chinese-programmer-wrong-pronunciation&Date) ================================================ FILE: tools/addword.py ================================================ #!/usr/bin/env python3 # -*- coding: UTF-8 -*- """ Create the description for a word to be added to the word list Usage: addword.py """ import re import sys import urllib.request from bs4 import BeautifulSoup def main(): """Generate the information with pronunciations for a word to be added to the word list""" if len(sys.argv) != 2: print(__doc__) sys.exit(1) word = sys.argv[1] pronunciations = get_pronunciations(word) britsh_en = '[🔊](' + pronunciations[0][0] + ')' + ' ' + '/' + pronunciations[0][1] + '/' american_en = '[🔊](' + pronunciations[1][0] + ')' + ' ' + '/' + pronunciations[1][1] + '/' line = '| ' + word + ' | ' + britsh_en + ' | ' + american_en + ' | ' + ' ' + '|' print(line) def get_pronunciations(word): """Return the word's pronouciation URLs and phonetic transcriptions from youdao.com if available""" word = word.strip() word_url = 'https://dict.youdao.com/w/en/' + word pron_url = 'https://dict.youdao.com/dictvoice?audio='+ word + '&' britsh_en = [" ", " "] american_en = [" ", " "] try: response = urllib.request.urlopen(word_url).read() soup = BeautifulSoup(response, 'html.parser') spans = soup.find_all('span', {'class': 'pronounce'}) lines = [span.get_text() for span in spans] match = re.findall(r'\[.+\]', lines[0]) britsh_en[0] = pron_url + 'type=1' britsh_en[1] = match[0].replace('[', '').replace(']', '') match = re.findall(r'\[.+\]', lines[1]) american_en[0] = pron_url + 'type=2' american_en[1] = match[0].replace('[', '').replace(']', '') except: return britsh_en, american_en return britsh_en, american_en if __name__ == '__main__': main() ================================================ FILE: tools/chromium_extension/README.md ================================================ # 无页面跳转收听正确读音 的 chromium 扩展 ## 使用说明 1. 点击第一列,调用的是搜索框页面 1. 点击第二列和第三列,调用的播放音频功能 ## [获得最新版扩展](https://github.com/jingjingxyk/chinese-programmer-wrong-pronunciation-chromium-extension.git) ## 手动安装扩展 > 1. 下载 [chinese-programmer-wrong-pronunciation](https://github.com/shimohq/chinese-programmer-wrong-pronunciation/archive/refs/heads/master.zip) 然后解压,找到 `tools/chromium_extension` 子目录 > 2. 打开 Chrome,输入: `chrome://extensions/` > 3. 勾选 Developer Mode > 4. 选择 Load unpacked extension... 然后定位到刚才解压的文件夹里面的 `tools/chromium_extension` 目录,确定 > 5. 这就安装好了,去掉 Developer Mode 勾选。 > 6. 打开[`https://github.com/shimohq/chinese-programmer-wrong-pronunciation.git`](https://github.com/shimohq/chinese-programmer-wrong-pronunciation.git)点击单词,即可听正确的单词读音 ## 扩展开发参考 1. [content_scripts](https:////developer.chrome.com/docs/extensions/mv3/content_scripts/) 1. [Declare permissions](https:////developer.chrome.com/docs/extensions/mv3/declare_permissions/) 1. [ReplaceGoogleCDN](https://github.com/justjavac/ReplaceGoogleCDN.git) ## note ```text https://dict.youdao.com/dictvoice?audio=parameter&type=1 ``` ================================================ FILE: tools/chromium_extension/css/app.css ================================================ tr:hover { border: 8px solid #ddd !important; border-radius: 8px !important; box-shadow: 5px 5px 15px #daf5fe !important; color: #fff !important; background-color: #3ec487 !important; /* font-weight: 200; font-size: 1.1rem; */ } #chinese-programmer-wrong-pronunciation-custom-iframe-box { border: 8px solid #ddd !important; border-radius: 8px !important; box-shadow: 5px 5px 15px #daf5fe !important; z-index: 999; position: fixed !important; } .chinese-programmer-wrong-pronunciation-custom-iframe-box { right: 0 !important; top: 64px !important; } .chinese-programmer-wrong-pronunciation-custom-iframe-box-hidden { display: none; } #chinese-programmer-wrong-pronunciation-custom-iframe { width: 100%; height: 100%; min-width: 700px !important; min-height: 600px !important; } .chinese-programmer-wrong-pronunciation-custom-tool-bar { position: absolute; right: -5px; top: -32px; font-size: 16px; } .chinese-programmer-wrong-pronunciation-custom-window-close-icon { margin-right: 4px; margin-left: 10px; } .chinese-programmer-wrong-pronunciation-custom-tool-bar-setup { margin-right: 10px; font-size: 20px; } .chinese-programmer-wrong-pronunciation-custom-note-reset { font-size: 16px; color: #c5955d; } ================================================ FILE: tools/chromium_extension/format-code.sh ================================================ #!/bin/env bash set -exu __DIR__=$(cd "$(dirname "$0")";pwd) cd ${__DIR__} npm run format-code ================================================ FILE: tools/chromium_extension/images/README.md ================================================ # 新增功能截图 ## 嵌入搜索引擎 有道搜索 ![](https://github.com/jingjingxyk/chinese-programmer-wrong-pronunciation/blob/master/tools/chromium_extension/images/%E6%88%AA%E5%9B%BE2022-06-14-22-11.png?raw=true) ## 嵌入搜索引擎 谷歌搜索 ![](https://github.com/jingjingxyk/chinese-programmer-wrong-pronunciation/blob/master/tools/chromium_extension/images/截图2022-06-14-22-10.png?raw=true) ================================================ FILE: tools/chromium_extension/js/app/box.js ================================================ import * as utils from "./utils.js"; import * as components from "./components.js"; import * as searchEngine from "./search-engine.js"; let goToSearchPronounce = (word) => { let search_engine_name = "goToGoogleSearch"; search_engine_name = "goToYouDaoSearch"; // search_engine_name = "goToBingDictSearch"; // search_engine_name = "goToBingSearch"; //search_engine_name = "gotToYouDaoSearch"; let tab = "current_tab"; let opener = components.getSearchEngineOpener(); if (opener && opener.expired_date) { if (opener.expired_date > new Date().getTime()) { if (opener.search_engine_name) { search_engine_name = opener.search_engine_name; } if (opener.tab) { tab = opener.tab; } } } if (search_engine_name && searchEngine[search_engine_name]) { console.log(word); let url = searchEngine[search_engine_name](word); console.log(url); if (tab === "new_tab") { window.open(url, "_blank"); } else { let iframe = components.getIframe(); iframe.setAttribute("src", url); } } else { console.log("search engine no found !"); } }; let box = { ...utils, ...components, ...searchEngine, goToSearchPronounce }; export default box; ================================================ FILE: tools/chromium_extension/js/app/components.js ================================================ import { prettyBox } from "./pretty-box.js"; import { hasClass, addClass, removeClass } from "./utils.js"; let styleConfig = () => { let css = document.createElement("link"); css.setAttribute("rel", "stylesheet"); css.setAttribute("type", "text/css"); css.setAttribute("href", chrome.runtime.getURL("css/app.css")); document.head.appendChild(css); }; let customElement = () => { let link = document.createElement("link"); link.setAttribute( "href", chrome.runtime.getURL("web-components/x-custom-box.html") ); document.head.appendChild(link); }; let getIframe = () => { let box = document.querySelector( "#chinese-programmer-wrong-pronunciation-custom-iframe-box" ); let iframe = null; if (!box) { let custom_box = document.createElement( "x-chinese-programmer-wrong-pronunciation-custom-box" ); let aside = document.createElement("aside"); aside.setAttribute( "id", "chinese-programmer-wrong-pronunciation-custom-iframe-box" ); aside.setAttribute( "class", "chinese-programmer-wrong-pronunciation-custom-iframe-box" ); aside.setAttribute("draggable", "true"); let tool_bar = document.createElement("div"); tool_bar.setAttribute( "class", "chinese-programmer-wrong-pronunciation-custom-tool-bar" ); tool_bar.addEventListener("click", (event) => { event.preventDefault(); event.stopPropagation(); }); let window_close_icon = document.createElement("span"); window_close_icon.innerText = "❌"; window_close_icon.setAttribute( "class", "chinese-programmer-wrong-pronunciation-custom-window-close-icon" ); window_close_icon.addEventListener("click", closeSearchWindow); tool_bar.appendChild(window_close_icon); iframe = document.createElement("iframe"); iframe.setAttribute( "id", "chinese-programmer-wrong-pronunciation-custom-iframe" ); iframe.setAttribute("security", "restricted"); //iframe.setAttribute('sandbox',"") aside.appendChild(tool_bar); aside.appendChild(iframe); custom_box.appendChild(aside); document.body.appendChild(custom_box); //设置 box 可 拖拽 prettyBox(aside); //显示设置按键 showSetSearchEngine(tool_bar, window_close_icon); } else { if ( hasClass( box, "chinese-programmer-wrong-pronunciation-custom-iframe-box-hidden" ) ) { removeClass( box, "chinese-programmer-wrong-pronunciation-custom-iframe-box-hidden" ); } iframe = box.querySelector( "#chinese-programmer-wrong-pronunciation-custom-iframe" ); iframe.setAttribute("src", "about:blank"); //iframe.contentDocument.close() box.removeChild(iframe); iframe = document.createElement("iframe"); iframe.setAttribute( "id", "chinese-programmer-wrong-pronunciation-custom-iframe" ); iframe.setAttribute("security", "restricted"); box.appendChild(iframe); } return iframe; }; let opener_key = "how-to-pronounce-from-search-engine-open-tab-opener"; let getSearchEngineOpener = () => { return JSON.parse(sessionStorage.getItem(opener_key)); }; let showSetSearchEngine = (box, window_close_icon) => { let opener = getSearchEngineOpener(); { let search_engin_provider = { goToYouDaoSearch: "有道", goToGoogleSearch: "谷歌", goToBingDictSearch: "必应词典", goToBingSearch: "必应", }; let select = document.createElement("select"); select.setAttribute("name", "search_engin_provider"); select.setAttribute("class", "search_engin_provider"); let htmlContent = ""; for (let i in search_engin_provider) { let selected = ""; if (opener && opener.search_engine_name) { selected = i === opener.search_engine_name ? 'selected="selected"' : ""; } htmlContent += ``; } select.innerHTML = htmlContent; select.addEventListener("click", setSearchEngine); box.insertBefore(select, window_close_icon); } { let search_engin_provider_tab = { current_tab: "当前标签展示结果", new_tab: "新标签展示结果", }; let select = document.createElement("select"); select.setAttribute("class", "search_engin_provider_tab"); select.setAttribute("name", "search_engin_provider_tab"); let htmlContent = ""; for (let i in search_engin_provider_tab) { let selected = ""; if (opener && opener.tab) { selected = i === opener.tab ? 'selected="selected"' : ""; } htmlContent += ``; } select.innerHTML = htmlContent; select.addEventListener("click", setSearchEngineOpener); box.insertBefore(select, window_close_icon); } let div = document.createElement("span"); div.setAttribute( "class", "chinese-programmer-wrong-pronunciation-custom-tool-bar-setup" ); div.innerText = `⚙`; // box.insertBefore(div,select) }; //关闭窗口 let closeSearchWindow = () => { let box = document.querySelector( "#chinese-programmer-wrong-pronunciation-custom-iframe-box" ); console.log(box); if ( box && !hasClass( box, "chinese-programmer-wrong-pronunciation-custom-iframe-box-hidden" ) ) { addClass( box, "chinese-programmer-wrong-pronunciation-custom-iframe-box-hidden" ); } let iframe = box.querySelector( "#chinese-programmer-wrong-pronunciation-custom-iframe" ); iframe.setAttribute("src", "about:blank"); }; let setSearchEngine = (event) => { event.preventDefault(); event.stopPropagation(); console.log(event.target.value); setupConfig(event.target.value, null); }; let setSearchEngineOpener = (event) => { event.preventDefault(); event.stopPropagation(); console.log(event.target.value); setupConfig(null, event.target.value); }; let setupConfig = (search_engine_name, tab) => { let opener = getSearchEngineOpener(); //页面展示方式,默认有效期一天 let expired_date = new Date().getTime() + 24 * 60 * 60 * 1000; if (opener) { if (search_engine_name) { opener.search_engine_name = search_engine_name; } if (tab) { opener.tab = tab; } } else { tab = "current_tab"; search_engine_name = "goToYouDaoSearch"; opener = { tab: tab, expired_date: expired_date, search_engine_name: search_engine_name, }; } sessionStorage.setItem(opener_key, JSON.stringify(opener)); }; let showResetCurrentSearchEngineTab = () => { let div = document.createElement("div"); div.setAttribute( "id", "#chinese-programmer-wrong-pronunciation-custom-tools-bar" ); div.innerHTML = ` 关闭搜索页面🥳🥳🥳🥳🥳🥳更换搜索引擎 `; document .querySelector("#chinese-programmer-wrong-pronunciation-custom-iframe-box") .appendChild(div); }; let cleanOpener = () => { sessionStorage.removeItem(opener_key); console.log("恢复扩展默认配置---ok"); }; export { styleConfig, customElement, getIframe, getSearchEngineOpener, setSearchEngineOpener, cleanOpener, }; ================================================ FILE: tools/chromium_extension/js/app/init.js ================================================ import box from "./box.js"; let init = () => { let URLObj = new URL(location.href); console.log(URLObj); if (document.querySelector("#readme table tbody")) { //载入自定义组件样式 box.styleConfig(); //载入自定义组件 box.customElement(); let audio_player = new Audio(); audio_player.setAttribute("autoplay", "true"); document .querySelector("#readme table tbody") .addEventListener("click", (event) => { //console.log(event.target) // console.log(event.target.nodeType) // console.log(event.target.nodeName); let parentElement = event.target.parentElement; if (parentElement && parentElement.nodeName === "TR") { if (parentElement.firstElementChild === event.target) { //使用搜索引擎查询发音 box.goToSearchPronounce(event.target.innerText); } } event.preventDefault(); event.stopPropagation(); let audio_url = null; if (event.target.nodeName === "TD") { let aTag = event.target.querySelector("a"); if (aTag) { audio_url = aTag.getAttribute("href"); } } if (event.target.nodeName === "IMG") { let aTag = event.target.parentNode.parentNode; audio_url = aTag.getAttribute("href"); } if (event.target.nodeName === "G-EMOJI") { let aTag = event.target.parentNode; audio_url = aTag.getAttribute("href"); } if (audio_url) { let desURL = new URL(audio_url); //console.log(desURL.protocol); if (desURL.protocol === "http:") { //skip http location.href = audio_url; } else { // console.log("audio_url:", audio_url); audio_player.setAttribute("src", audio_url); } } }); document .querySelector("#readme table tbody") .addEventListener("mouseover", (event) => { let parentElement = event.target.parentElement; if (parentElement && parentElement.nodeName === "TR") { if (parentElement.firstElementChild === event.target) { event.target.setAttribute("title", "点击我打开搜索引擎检索"); event.target.style.cursor = "pointer"; } } }); let table = document.querySelector("#readme table"); let parent = table.parentNode; let note = document.createElement("span"); note.innerText = `⚪恢复扩展默认配置⚪`; note.setAttribute( "class", "chinese-programmer-wrong-pronunciation-custom-note-reset" ); note.addEventListener("click", (event) => { //重置配置 event.preventDefault(); event.stopPropagation(); box.cleanOpener(); }); parent.insertBefore(note, table); } else { console.log("no found README.md table"); } }; export { init }; ================================================ FILE: tools/chromium_extension/js/app/pretty-box.js ================================================ import { addClass, removeClass } from "./utils.js"; let prettyBox = (box) => { // 参考 https://blog.csdn.net/weixin_41910848/article/details/82218243 let dragging = false; let diffX = null; let diffY = null; box.onmousedown = function (event) { dragging = true; let left = box.offsetLeft; let top = box.offsetTop; removeClass( box, "chinese-programmer-wrong-pronunciation-custom-iframe-box" ); box.style.left = left + "px"; box.style.top = top + "px"; diffX = event.clientX - left; diffY = event.clientY - top; }; document.onmousemove = function (event) { if (dragging) { // console.log(event.clientX, event.clientY) //console.log(diffX, diffY) let moveX = event.clientX - diffX; let moveY = event.clientY - diffY; if (moveX < 0) { moveX = 0; } else if (moveX > window.innerWidth - box.offsetWidth) { moveX = window.innerWidth - box.offsetWidth; } if (moveY < 0) { moveY = 0; } else if (moveY > window.innerHeight - box.offsetHeight) { moveY = window.innerHeight - box.offsetHeight; } box.style.left = moveX + "px"; box.style.top = moveY + "px"; event.stopPropagation(); event.preventDefault(); } }; document.onmouseup = function (event) { dragging = false; }; box.onmouseup = (event) => { dragging = false; }; box.ondragstart = function (event) { console.log(box.offsetLeft, box.offsetTop); console.log("开始拖拽"); }; box.ondrag = function () { console.log(box.offsetLeft, box.offsetTop); console.log("拖拽中"); }; box.ondragend = function () { console.log(box.offsetLeft, box.offsetTop); console.log("拖拽结束"); }; }; export { prettyBox }; ================================================ FILE: tools/chromium_extension/js/app/search-engine.js ================================================ let goToGoogleSearch = (word) => { word = word.replace(/\s/, "+"); return `https://www.google.com/search?q=how+to+pronounce+${word}`; }; let goToYouDaoSearch = (word) => { word = word.replace(/\s/, "+"); return `https://www.youdao.com/result?word=${word}&lang=en`; }; let goToBingDictSearch = (word) => { return `https://cn.bing.com/dict/${word}`; }; let goToBingSearch = (word) => { return `https://cn.bing.com/search?q=how%20to%20pronounce%20${word}`; }; export { goToYouDaoSearch, goToGoogleSearch, goToBingDictSearch, goToBingSearch, }; ================================================ FILE: tools/chromium_extension/js/app/utils.js ================================================ function hasClass(el, className) { if (el.classList) return el.classList.contains(className); return !!el.className.match(new RegExp("(\\s|^)" + className + "(\\s|$)")); } function addClass(el, className) { if (el.classList) el.classList.add(className); else if (!hasClass(el, className)) el.className += " " + className; } function removeClass(el, className) { if (el.classList) el.classList.remove(className); else if (hasClass(el, className)) { let reg = new RegExp("(\\s|^)" + className + "(\\s|$)"); el.className = el.className.replace(reg, " "); } } function getCookie(name) { let arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)"); if ((arr = document.cookie.match(reg))) { return decodeURIComponent(arr[2]); } else { return null; } //await cookieStore.get({name:name}) } // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie function setCookie(name, value, second, path, domain) { var exp = new Date(); exp.setTime(exp.getTime() + second * 1000); document.cookie = name + "=" + encodeURIComponent(value) + ";expires=" + exp.toGMTString() + ";path=" + path + ";domain=" + domain + ";SameSite=None;Secure"; } async function getCookies(domain) { let cookies = await cookieStore.getAll({ domain: domain }); return cookies; } function encodeBase64(str) { return btoa(encodeURIComponent(str)); } function decodeBase64(encoded) { return decodeURIComponent(atob(encoded)); } function getParameterValue(name) { let reg = new RegExp("[^?&]?" + encodeURI(name) + "=[^&]+"); let arr = location.search.match(reg); if (arr != null) { return decodeURI(arr[0].substring(arr[0].search("=") + 1)); } return ""; } function createJSONFile(content, filename) { let blob = new Blob([JSON.stringify(content)], { type: "application/json" }); let url = window.URL.createObjectURL(blob); let a = document.createElement("a"); a.style.display = "none"; a.href = url; a.download = filename; a.click(); setTimeout(function () { window.URL.revokeObjectURL(url); }, 3000); } async function sleep(time) { return new Promise((resolve) => setTimeout(resolve, time)); } async function getMediaDevices() { return await navigator.mediaDevices.enumerateDevices(); } // new URLSearchParams // new URL // (new Date()).toISOString() export { addClass, removeClass, hasClass, setCookie, getCookie, encodeBase64, decodeBase64, getParameterValue, sleep, getMediaDevices, createJSONFile, }; ================================================ FILE: tools/chromium_extension/js/content-script.js ================================================ (async () => { let app = await import(chrome.runtime.getURL("js/app/init.js")); app.init(); })(); ================================================ FILE: tools/chromium_extension/manifest.json ================================================ { "name": "chinese-programmer-wrong-pronunciation-chromium-extension", "version": "0.1.0", "manifest_version": 3, "description": "页面无跳转 听正确读音", "content_scripts": [ { "matches": [ "*://*/shimohq/chinese-programmer-wrong-pronunciation/*", "*://*/jingjingxyk/chinese-programmer-wrong-pronunciation/*" ], "run_at": "document_idle", "js": ["js/content-script.js"] } ], "permissions": [ "declarativeNetRequest", "declarativeNetRequestWithHostAccess" ], "host_permissions": [ "*://github.com/*", "*://www.google.com/*", "*://cn.bing.com/*", "*://www.bing.com/*", "*://www.youdao.com/*", "*://dict.youdao.com/*" ], "web_accessible_resources": [ { "resources": ["*.js", "*.css", "*.html"], "matches": ["*://*/*"], "extension_ids": [], "use_dynamic_url": true } ], "declarative_net_request": { "rule_resources": [ { "id": "remove_content_security_policy", "enabled": true, "path": "rules/remove_content_security_policy.json" } ] }, "author": "https://github.com/jingjingxyk", "homepage_url": "https://github.com/shimohq/chinese-programmer-wrong-pronunciation.git" } ================================================ FILE: tools/chromium_extension/package.json ================================================ { "name": "chinese-programmer-wrong-pronunciation-chromium-extension", "version": "1.0.0", "description": "README.md 页面无跳转 即可听正确读音", "main": "index.js", "scripts": { "format-code": "npx prettier --write . && exit 1" }, "author": "", "license": "ISC", "devDependencies": { "prettier": "2.6.2" } } ================================================ FILE: tools/chromium_extension/rules/remove_content_security_policy.json ================================================ [ { "id": 1, "priority": 99, "action": { "type": "modifyHeaders", "responseHeaders": [ { "header": "content-security-policy", "operation": "remove" }, { "header": "content-security-policy-report-only", "operation": "remove" }, { "header": "expect-ct", "operation": "remove" }, { "header": "report-to", "operation": "remove" }, { "header": "x-content-security-policy", "operation": "remove" }, { "header": "x-webkit-csp", "operation": "remove" }, { "header": "x-xss-protection", "operation": "remove" }, { "header": "x-permitted-cross-domain-policies", "operation": "remove" }, { "header": "x-content-type-options", "operation": "remove" }, { "header": "x-frame-options", "operation": "remove" }, { "header": "X-Frame-Options", "operation": "remove" }, { "header": "permissions-policy", "operation": "remove" }, { "header": "timing-allow-origin", "operation": "remove" }, { "header": "cross-origin-embedder-policy", "operation": "remove" }, { "header": "cross-origin-opener-policy", "operation": "remove" }, { "header": "cross-origin-opener-policy-report-only", "operation": "remove" }, { "header": "cross-origin-embedder-policy-report-only", "operation": "remove" } ] }, "condition": { "urlFilter": "*", "requestDomains": [ "github.com", "githubusercontent.com", "www.google.com", "cn.bing.com", "www.bing.com", "fanyi.baidu.com", "www.youdao.com", "dict.youdao.com" ], "resourceTypes": [ "main_frame", "sub_frame", "stylesheet", "script", "image", "font", "object", "xmlhttprequest", "ping", "csp_report", "media", "websocket", "webtransport", "webbundle", "other" ] } } ] ================================================ FILE: tools/chromium_extension/web-components/README.md ================================================ # HTML Imports,HTML Template、Shadow DOM----统称为 Web Components 规范 ## Shadow DOM 实现代码隔离 ================================================ FILE: tools/chromium_extension/web-components/x-custom-box.html ================================================
自定义web组件-做代码隔离