[
  {
    "path": ".editorconfig",
    "content": "# EditorConfig is awesome: https://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n# Unix-style newlines with a newline ending every file\n[*]\nend_of_line = lf\ninsert_final_newline = true\n\n# Matches multiple files with brace expansion notation\n# Set default charset\n[*.{js,py}]\ncharset = utf-8\n\n# 4 space indentation\n[*.py]\nindent_style = space\nindent_size = 4\n\n# Tab indentation (no size specified)\n[Makefile]\nindent_style = tab\n\n# Indentation override for all JS under lib directory\n[lib/**.js]\nindent_style = space\nindent_size = 2\n\n# Matches the exact files either package.json or .travis.yml\n[{package.json,.travis.yml}]\nindent_style = space\nindent_size = 2"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!--\nPR说明:\n1. 尽量提交常用的单词和中国程序员容易读错的单词。\n1. 选择合适的Labels。\n1. 音标目前为[海词](http://dict.cn/)英式发音, 使用 [DJ 音标写法](https://zh.wikipedia.org/wiki/DJ%E9%9F%B3%E6%A8%99)。\n1. 音频地址 英音：http://dict.youdao.com/dictvoice?audio=${word}&type=1，美音：http://dict.youdao.com/dictvoice?audio=${word}&type=2 ，如果没有或者发音不准确再使用其他音频。\n1. 音标到这个有道网页找 http://dict.youdao.com/w/eng/{word}。\n1. 音标使用斜线 `/.../`。\n1. tools目录下有个python程序可以从有道网站创建单词信息。\n   - Usage: `tools/addword.py <word>`\n-->\n"
  },
  {
    "path": ".gitignore",
    "content": "/tools/chromium_extension/_metadata\n/tools/chromium_extension/node_modules\n/tools/chromium_extension/package-lock.json\n/.idea\n"
  },
  {
    "path": "README.md",
    "content": "## Words Commonly Mispronounced by Chinese Programmers\n## 中国程序员容易发音错误的单词(点击🔊收听正确读音)\n\n### 重要更新\n- 我们团队最新推出了一款新产品 **[@OfficeSDK](https://officesdk.com)**，拥有强大的文档预览与编辑功能，欢迎了解！\n\n- chromium扩展：无页面跳转，实时检索英语发音\n  -  安装 [chromium 扩展](tools/chromium_extension/README.md) 或者\n  - [外部独立库](https://github.com/jingjingxyk/chinese-programmer-wrong-pronunciation-chromium-extension.git)\n- 简洁的单词列表，正确读音不用再打开新网页：https://cpwp.netlify.app/\n- [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)\n\n\n\n| 单词            | 正确发音（英音）                                                                                                      | 正确发音（美音）                                                                                            | 错误发音                    | 中文释义                |\n| ------------- | ------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | ----------------------- | ------------------- |\n| access        | [🔊](https://dict.youdao.com/dictvoice?audio=access&type=1)  /'ækses/                                         | [🔊](https://dict.youdao.com/dictvoice?audio=access&type=2)  /ˈækses/                               | ❌ /ək'ses/              | 访问                  |\n| Adobe         | [🔊](https://dict.youdao.com/dictvoice?audio=Adobe&type=1)  /ə'dəʊbi/                                         | [🔊](https://dict.youdao.com/dictvoice?audio=Adobe&type=2)  /ə'dəʊbi/                               | ❌ /əˈdub/               | 奥多比（公司名）            |\n| 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/             | 管理员                 |\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/       | 对抗的                 |\n| 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/             | 敏捷开发                |\n| 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/ | 亚马逊（公司名）            |\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/           | 类比                  |\n| 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ə/  | 前端框架名               |\n| 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            |\n| 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/              | 别名                  |\n| 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/            | 对齐                  |\n| 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服务器软件            |\n| app           | [🔊](https://dict.youdao.com/dictvoice?audio=app&type=1)  /æp/                                                | [🔊](https://dict.youdao.com/dictvoice?audio=app&type=2)  /æp/                                      | ❌ /eipi'pi/             | 应用程序                |\n| 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/              | 归档；存档               |\n| array         | [🔊](https://dict.youdao.com/dictvoice?audio=array&type=1)  /ə'rei/                                           | [🔊](https://dict.youdao.com/dictvoice?audio=array&type=2)  /əˈreɪ/                                 | ❌ /æ'rei/               | 数组                  |\n| ASCII         | [🔊](https://dict.youdao.com/dictvoice?audio=ascii&type=1)  /'æski/                                           | [🔊](https://dict.youdao.com/dictvoice?audio=ascii&type=2)  /ˈæski/                                 | ❌ /ɑːsk/                | 美国信息交换标准代码          |\n| aspect        | [🔊](https://dict.youdao.com/dictvoice?audio=aspect&type=1)  /'æspekt/                                        | [🔊](https://dict.youdao.com/dictvoice?audio=aspect&type=2)  /ˈæspekt/                              | ❌ /ə'spekt/             | 方面；切面               |\n| 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/              | 异步                  |\n| 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ɑ/              | 头像                  |\n| Azure         | [🔊](https://dict.youdao.com/dictvoice?audio=azure&type=1)  /'æʒə/                                            | [🔊](https://dict.youdao.com/dictvoice?audio=azure&type=2)  /ˈæʒər/                                 | ❌ /ˈæzʊʒə/              | 微软云计算平台             |\n| 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/              | 构建工具名               |\n| 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/                | 绑定                  |\n| BIOS          | [🔊](https://dict.youdao.com/dictvoice?audio=bios&type=1)  /ˈbaɪɒs/                                           | /'baɪɑs/                                                                                            | ❌ /ˈbɪɒs/               | 基本输入输出系统            |\n| cache         | [🔊](https://dict.youdao.com/dictvoice?audio=cache&type=1)  /kæʃ/                                             | [🔊](https://dict.youdao.com/dictvoice?audio=cache&type=2)  /kæʃ/                                   | ❌ /kætʃ/                | 缓存                  |\n| 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/               | 阿里分布式数据库同步中间件       |\n| 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/              | 混乱；混沌               |\n| 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/               | 谷歌浏览器               |\n| 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++ 编译器           |\n| 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/           | 上下文                 |\n| Coq           | [🔊](https://upload.wikimedia.org/wikipedia/commons/4/47/Fr-coq.ogg) IPA French ['kɔkʲ] 读若拼音“goq”             |                                                                                                     | ❌ IPA English ['kʰɒk]   | 形式化证明               |\n| 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/               | 后台服务进程              |\n| debt          | [🔊](https://dict.youdao.com/dictvoice?audio=debt&type=1)  /det/                                              | [🔊](https://dict.youdao.com/dictvoice?audio=debt&type=2)  /det/                                    | ❌ /de'bit/              | 债务                  |\n| 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/               | 拒绝；否认               |\n| 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/                         |                         | 弃用                  |\n| deque         | [🔊](https://dict.youdao.com/dictvoice?audio=deque&type=1)  /'dek/                                            | [🔊](https://dict.youdao.com/dictvoice?audio=deque&type=2)  /dɛk/                                   | ❌ /di'kju/              | 双端队列                |\n| 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/             | 摘要                  |\n| 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)                              |                         | 迪杰斯特拉算法/最短路算法       |\n| 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 框架名      |\n| 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/                | 文档                  |\n| 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 平台             |\n| 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/              | 版本                  |\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/           | 临时的                 |\n| 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ʃ/              | 时间起点；训练轮次；纪元        |\n| 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/                           |                         | 执行                  |\n| 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/                         |                         | 执行器                 |\n| event         | [🔊](https://dict.youdao.com/dictvoice?audio=event&type=1)  /ɪ'vent/                                          | [🔊](https://dict.youdao.com/dictvoice?audio=event&type=2)  /ɪˈvent/                                | ❌ /'ɪvənt/              | 事件                  |\n| 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/              | 退出                  |\n| 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/            | 外观                  |\n| 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 发行版名          |\n| 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/              | 格式                  |\n| gauge         | [🔊](https://dict.youdao.com/dictvoice?audio=gauge&type=1) /ɡeɪdʒ/                                            | [🔊](https://dict.youdao.com/dictvoice?audio=gauge&type=2) /ɡeɪdʒ/                                  | ❌ /ɡɑudʒ/               | 仪表盘                 |\n| Git           | [🔊](https://dict.youdao.com/dictvoice?audio=git&type=1)  /ɡɪt/                                               | [🔊](https://dict.youdao.com/dictvoice?audio=git&type=2)  /ɡɪt/                                     | ❌ /dʒɪt/                | 分布式版本控制系统           |\n| 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ː/                  |                         | 操作系统名               |\n| Grafana       | [🔊](http://www.howtopronounce.cc/file/e204a97ed1e440c5ab15ea0117beb955.mp3)   /grəˈfɑːnˌɑː/                  | [🔊](http://www.howtopronounce.cc/file/e204a97ed1e440c5ab15ea0117beb955.mp3 )   /grəˈfɑːnˌɑː/       |                         | 监控可视化平台             |\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 查询语言            |\n| GUI           | [🔊](https://dict.youdao.com/dictvoice?audio=GUI&type=1)  /ˈɡu:i/                                             | [🔊](https://dict.youdao.com/dictvoice?audio=GUI&type=2)  /ˈɡu:i/                                   |                         | 图形用户界面              |\n| 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/             | 编程语言名               |\n| 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/                | 高度；高度属性             |\n| 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/              | 隐藏                  |\n| 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ː/        | 电气电子工程师学会           |\n| 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ʒ/             | 图像；映像               |\n| 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/        | 实现（接口）              |\n| 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ə/            | 整数；整型               |\n| issue         | [🔊](https://dict.youdao.com/dictvoice?audio=issue&type=1)  /'ɪʃuː/                                           | [🔊](https://dict.youdao.com/dictvoice?audio=issue&type=2)  /ˈɪʃuː/                                 | ❌ /ˈaɪʃuː/              | 问题；议题               |\n| Java          | [🔊](https://dict.youdao.com/dictvoice?audio=java&type=1)  /'dʒɑːvə/                                          | [🔊](https://dict.youdao.com/dictvoice?audio=java&type=2)  /ˈdʒɑːvə/                                |                         | 编程语言名               |\n| 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ː/      | 图片格式名               |\n| key           | [🔊](https://dict.youdao.com/dictvoice?audio=key&type=1)  /kiː/                                               | [🔊](https://dict.youdao.com/dictvoice?audio=key&type=2)  /kiː/                                     | ❌ /kei/                 | 键；密钥；主键；关键字         |\n| 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/ |                         | 容器编排平台              |\n| 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ɑ/             | λ；匿名函数表达式           |\n| 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/             | 轻量级目录访问协议           |\n| 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/            | 遗留的                 |\n| 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ɪə/               | 线性的                 |\n| 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 里的集成查询         |\n| 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 系统     |\n| 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/           | 本地化设置               |\n| 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/             | 全文检索引擎库             |\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ʊ/             | 宏；宏定义               |\n| 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/                 | 主函数；主入口             |\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/              | 边距                  |\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/           | 矩阵                  |\n| 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 构建与依赖管理工具      |\n| 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/               | 最大值                 |\n| 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/         | 微软（公司名）             |\n| 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/            | 迁移                  |\n| 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/                  |                         | 杂项；其他               |\n| 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/              | 模块；组件/功能模块          |\n| 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/              | 原生的；本地的             |\n| nginx         | Engine X                                                                                                      | Engine X                                                                                            |                         | Web 服务器名            |\n| null          | [🔊](https://dict.youdao.com/dictvoice?audio=null&type=1)  /nʌl/                                              | [🔊](https://dict.youdao.com/dictvoice?audio=null&type=2)  /nʌl/                                    | ❌ /naʊ/                 | 空；空值；空指针            |\n| 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/                         |                         | 过时的；淘汰的             |\n| OS X          | OS ten                                                                                                        | OS ten                                                                                              | ❌ /ɔs eks/              | 苹果桌面操作系统旧称          |\n| 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/             | 幽灵/虚拟的              |\n| 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ə/           | 参数；形参               |\n| 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/             | 前提；前置条件             |\n| 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ʒ/          | 权限；特权               |\n| 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/              | 探针；探测/探测请求          |\n| 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/                       |                         | 时序数据库监控系统           |\n| 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 客户端 |\n| Qt            | [🔊](https://dict.youdao.com/dictvoice?audio=cute&type=1)  /kjuːt/                                            | [🔊](https://dict.youdao.com/dictvoice?audio=cute&type=2)  /kjuːt/                                  |                         | 跨平台 GUI 框架          |\n| 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/             | 查询                  |\n| Realm         | [🔊](https://dict.youdao.com/dictvoice?audio=realm&type=1)  /relm/                                            | [🔊](https://dict.youdao.com/dictvoice?audio=realm&type=2)  /relm/                                  | ❌ /riəlm/               | 移动端数据库名             |\n| 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/                         |                         | 核对；协调一致             |\n| 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/           | 前端状态管理库名            |\n| 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/           | 恢复/继续；简历            |\n| 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/           | 简历                  |\n| 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/            | 已解决                 |\n| 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/             | 求助于/采取              |\n| 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/             | 苹果显示屏；视网膜           |\n| 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/             | 开源指令集架构             |\n| 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/                | 路由；路由表/路由规则         |\n| 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/            | 圣何塞（地名）             |\n| 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ɪ/              | 苹果浏览器名              |\n| 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ə/              | 方案；协议方案；编程语言名       |\n| 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ɑ/             | 编程语言名               |\n| 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ʒ/               | 过渡/切换               |\n| SQL           | /ˈsiːkwəl/ /ˈesˈkjuːˈel/                                                                                      | /ˈsiːkwəl/ /ˈesˈkjuːˈel/                                                                            | ❌ /sərk(ə)l/            | 结构化查询语言             |\n| sudo          | /'suːduː/                                                                                                     | /'suːduː/                                                                                           |                         | 管理员权限运行             |\n| 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/               | 套件                  |\n| 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/          | 遥测                  |\n| 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 模板引擎名          |\n| 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/                                 |                         | 元组；有序组              |\n| 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/           | 典型的                 |\n| 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 发行版名          |\n| UEFI          | U-E-F-I                                                                                                       | U-E-F-I                                                                                             | ❌ /jufi/ /ɔːfi/         | 统一可扩展固件接口           |\n| 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/              | 虚拟机名                |\n| 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/           | 变量；变量名/变量类型         |\n| 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/           | 冗长的                 |\n| 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/              | 前端框架名               |\n| 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θ/               | 宽度；宽度属性             |\n| 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ɪ/           | 视频网站名；“油管”          |\n| Vite          | [🔊](https://dict.youdao.com/dictvoice?audio=vite&type=1)  /vit/                                              | [🔊](https://dict.youdao.com/dictvoice?audio=vite&type=2)  /vit/                                    | ❌ /vaɪt/                | 前端构建工具              |\n\n\n### 附注\n*  无页面跳转，页面嵌入搜索引擎和实时检索英语发音，请安装[chromium 扩展](tools/chromium_extension/README.md)\n    * [chromium 扩展新增功能截图](tools/chromium_extension/images/README.md)\n* 当使用简名 ‘Kube’ 称呼 ‘Kubernetes’ 时, 发音则与 ‘cube’(/kjuːb/) 一致\n\n### 相关链接\n* 真人发音：https://www.bilibili.com/video/bv1nv411i7z3 (by @hailintao)\n* 简洁的单词列表，正确读音不用再打开新网页：https://cpwp.netlify.app/ (by @antfu7)\n* 国际音标严式记音（纽约音）https://github.com/b1f6c1c4/programming-pronunciations-en_US (by @b1f6c1c4)\n* 单词连读：https://corrector.justsong.cn/ (by [@songquanpeng](https://github.com/songquanpeng/pronunciation-corrector))\n* [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)\n* [chromium系浏览器扩展，无页面跳转，实时检索英语发音](https://github.com/jingjingxyk/chinese-programmer-wrong-pronunciation-chromium-extension.git) (by @jingjingxyk)\n\n### 说明\n1. 本着简单的原则, 又为了避免程序猿们出现选择困难症, '正确音标'采用了最接近有道词典音频的英式DJ音标，不代表其唯一性\n1. 专业在线英语词典请参考: [在线英语词典哪个比较好?](https://www.zhihu.com/question/19707759)\n\n### 参考资料\n1. https://www.zhihu.com/question/19739907\n2. https://www.v2ex.com/t/131094\n3. https://www.v2ex.com/t/309350\n4. https://www.v2ex.com/t/63781\n5. https://www.v2ex.com/t/246033\n6. https://www.v2ex.com/t/342087\n\n### Star History\n\n[![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)\n"
  },
  {
    "path": "tools/addword.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: UTF-8 -*-\n\"\"\"\nCreate the description for a word to be added to the word list\nUsage: addword.py <word>\n\"\"\"\nimport re\nimport sys\nimport urllib.request\nfrom bs4 import BeautifulSoup\n\n\ndef main():\n    \"\"\"Generate the information with pronunciations for a word to be added to the word list\"\"\"\n    if len(sys.argv) != 2:\n        print(__doc__)\n        sys.exit(1)\n    word = sys.argv[1]\n    pronunciations = get_pronunciations(word)\n    britsh_en = '[🔊](' + pronunciations[0][0] + ')' + ' ' + '/' + pronunciations[0][1] + '/'\n    american_en = '[🔊](' + pronunciations[1][0] + ')' + ' ' + '/' + pronunciations[1][1] + '/'\n    line = '| ' + word + ' | ' + britsh_en + ' | ' + american_en + ' | ' + ' ' + '|'\n    print(line)\n\n\ndef get_pronunciations(word):\n    \"\"\"Return the word's pronouciation URLs and phonetic transcriptions\n       from youdao.com if available\"\"\"\n    word = word.strip()\n    word_url = 'https://dict.youdao.com/w/en/' + word\n    pron_url = 'https://dict.youdao.com/dictvoice?audio='+ word + '&'\n    britsh_en = [\" \", \" \"]\n    american_en = [\" \", \" \"]\n    try:\n        response = urllib.request.urlopen(word_url).read()\n        soup = BeautifulSoup(response, 'html.parser')\n        spans = soup.find_all('span', {'class': 'pronounce'})\n        lines = [span.get_text() for span in spans]\n        match = re.findall(r'\\[.+\\]', lines[0])\n        britsh_en[0] = pron_url + 'type=1'\n        britsh_en[1] = match[0].replace('[', '').replace(']', '')\n        match = re.findall(r'\\[.+\\]', lines[1])\n        american_en[0] = pron_url + 'type=2'\n        american_en[1] = match[0].replace('[', '').replace(']', '')\n    except:\n        return britsh_en, american_en\n\n    return britsh_en, american_en\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "tools/chromium_extension/README.md",
    "content": "# 无页面跳转收听正确读音 的 chromium 扩展\n\n## 使用说明\n\n1. 点击第一列，调用的是搜索框页面\n1. 点击第二列和第三列，调用的播放音频功能\n\n## [获得最新版扩展](https://github.com/jingjingxyk/chinese-programmer-wrong-pronunciation-chromium-extension.git)\n\n## 手动安装扩展\n\n> 1. 下载 [chinese-programmer-wrong-pronunciation](https://github.com/shimohq/chinese-programmer-wrong-pronunciation/archive/refs/heads/master.zip) 然后解压，找到 `tools/chromium_extension` 子目录\n> 2. 打开 Chrome，输入: `chrome://extensions/`\n> 3. 勾选 Developer Mode\n> 4. 选择 Load unpacked extension... 然后定位到刚才解压的文件夹里面的 `tools/chromium_extension` 目录，确定\n> 5. 这就安装好了，去掉 Developer Mode 勾选。\n> 6. 打开[`https://github.com/shimohq/chinese-programmer-wrong-pronunciation.git`](https://github.com/shimohq/chinese-programmer-wrong-pronunciation.git)点击单词，即可听正确的单词读音\n\n## 扩展开发参考\n\n1. [content_scripts](https:////developer.chrome.com/docs/extensions/mv3/content_scripts/)\n1. [Declare permissions](https:////developer.chrome.com/docs/extensions/mv3/declare_permissions/)\n1. [ReplaceGoogleCDN](https://github.com/justjavac/ReplaceGoogleCDN.git)\n\n## note\n\n```text\nhttps://dict.youdao.com/dictvoice?audio=parameter&type=1\n\n```\n"
  },
  {
    "path": "tools/chromium_extension/css/app.css",
    "content": "tr:hover {\n  border: 8px solid #ddd !important;\n  border-radius: 8px !important;\n  box-shadow: 5px 5px 15px #daf5fe !important;\n\n  color: #fff !important;\n  background-color: #3ec487 !important;\n  /*\n    font-weight: 200;\n    font-size: 1.1rem;\n    */\n}\n\n#chinese-programmer-wrong-pronunciation-custom-iframe-box {\n  border: 8px solid #ddd !important;\n  border-radius: 8px !important;\n  box-shadow: 5px 5px 15px #daf5fe !important;\n  z-index: 999;\n  position: fixed !important;\n}\n.chinese-programmer-wrong-pronunciation-custom-iframe-box {\n  right: 0 !important;\n  top: 64px !important;\n}\n\n.chinese-programmer-wrong-pronunciation-custom-iframe-box-hidden {\n  display: none;\n}\n\n#chinese-programmer-wrong-pronunciation-custom-iframe {\n  width: 100%;\n  height: 100%;\n  min-width: 700px !important;\n  min-height: 600px !important;\n}\n\n.chinese-programmer-wrong-pronunciation-custom-tool-bar {\n  position: absolute;\n  right: -5px;\n  top: -32px;\n  font-size: 16px;\n}\n\n.chinese-programmer-wrong-pronunciation-custom-window-close-icon {\n  margin-right: 4px;\n  margin-left: 10px;\n}\n.chinese-programmer-wrong-pronunciation-custom-tool-bar-setup {\n  margin-right: 10px;\n  font-size: 20px;\n}\n\n.chinese-programmer-wrong-pronunciation-custom-note-reset {\n  font-size: 16px;\n  color: #c5955d;\n}\n"
  },
  {
    "path": "tools/chromium_extension/format-code.sh",
    "content": "#!/bin/env bash\n\nset -exu\n\n__DIR__=$(cd \"$(dirname \"$0\")\";pwd)\ncd ${__DIR__}\n\nnpm run format-code"
  },
  {
    "path": "tools/chromium_extension/images/README.md",
    "content": "# 新增功能截图\n\n## 嵌入搜索引擎 有道搜索\n\n![](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)\n\n## 嵌入搜索引擎 谷歌搜索\n\n![](https://github.com/jingjingxyk/chinese-programmer-wrong-pronunciation/blob/master/tools/chromium_extension/images/截图2022-06-14-22-10.png?raw=true)\n"
  },
  {
    "path": "tools/chromium_extension/js/app/box.js",
    "content": "import * as utils from \"./utils.js\";\nimport * as components from \"./components.js\";\nimport * as searchEngine from \"./search-engine.js\";\n\nlet goToSearchPronounce = (word) => {\n  let search_engine_name = \"goToGoogleSearch\";\n  search_engine_name = \"goToYouDaoSearch\";\n  // search_engine_name = \"goToBingDictSearch\";\n  // search_engine_name = \"goToBingSearch\";\n  //search_engine_name = \"gotToYouDaoSearch\";\n  let tab = \"current_tab\";\n\n  let opener = components.getSearchEngineOpener();\n  if (opener && opener.expired_date) {\n    if (opener.expired_date > new Date().getTime()) {\n      if (opener.search_engine_name) {\n        search_engine_name = opener.search_engine_name;\n      }\n      if (opener.tab) {\n        tab = opener.tab;\n      }\n    }\n  }\n  if (search_engine_name && searchEngine[search_engine_name]) {\n    console.log(word);\n    let url = searchEngine[search_engine_name](word);\n    console.log(url);\n    if (tab === \"new_tab\") {\n      window.open(url, \"_blank\");\n    } else {\n      let iframe = components.getIframe();\n      iframe.setAttribute(\"src\", url);\n    }\n  } else {\n    console.log(\"search engine no found !\");\n  }\n};\n\nlet box = { ...utils, ...components, ...searchEngine, goToSearchPronounce };\nexport default box;\n"
  },
  {
    "path": "tools/chromium_extension/js/app/components.js",
    "content": "import { prettyBox } from \"./pretty-box.js\";\nimport { hasClass, addClass, removeClass } from \"./utils.js\";\n\nlet styleConfig = () => {\n  let css = document.createElement(\"link\");\n  css.setAttribute(\"rel\", \"stylesheet\");\n  css.setAttribute(\"type\", \"text/css\");\n  css.setAttribute(\"href\", chrome.runtime.getURL(\"css/app.css\"));\n  document.head.appendChild(css);\n};\n\nlet customElement = () => {\n  let link = document.createElement(\"link\");\n  link.setAttribute(\n    \"href\",\n    chrome.runtime.getURL(\"web-components/x-custom-box.html\")\n  );\n  document.head.appendChild(link);\n};\n\nlet getIframe = () => {\n  let box = document.querySelector(\n    \"#chinese-programmer-wrong-pronunciation-custom-iframe-box\"\n  );\n  let iframe = null;\n  if (!box) {\n    let custom_box = document.createElement(\n      \"x-chinese-programmer-wrong-pronunciation-custom-box\"\n    );\n\n    let aside = document.createElement(\"aside\");\n    aside.setAttribute(\n      \"id\",\n      \"chinese-programmer-wrong-pronunciation-custom-iframe-box\"\n    );\n    aside.setAttribute(\n      \"class\",\n      \"chinese-programmer-wrong-pronunciation-custom-iframe-box\"\n    );\n    aside.setAttribute(\"draggable\", \"true\");\n\n    let tool_bar = document.createElement(\"div\");\n    tool_bar.setAttribute(\n      \"class\",\n      \"chinese-programmer-wrong-pronunciation-custom-tool-bar\"\n    );\n    tool_bar.addEventListener(\"click\", (event) => {\n      event.preventDefault();\n      event.stopPropagation();\n    });\n\n    let window_close_icon = document.createElement(\"span\");\n    window_close_icon.innerText = \"❌\";\n    window_close_icon.setAttribute(\n      \"class\",\n      \"chinese-programmer-wrong-pronunciation-custom-window-close-icon\"\n    );\n    window_close_icon.addEventListener(\"click\", closeSearchWindow);\n    tool_bar.appendChild(window_close_icon);\n\n    iframe = document.createElement(\"iframe\");\n    iframe.setAttribute(\n      \"id\",\n      \"chinese-programmer-wrong-pronunciation-custom-iframe\"\n    );\n    iframe.setAttribute(\"security\", \"restricted\");\n    //iframe.setAttribute('sandbox',\"\")\n\n    aside.appendChild(tool_bar);\n    aside.appendChild(iframe);\n    custom_box.appendChild(aside);\n    document.body.appendChild(custom_box);\n\n    //设置 box 可 拖拽\n    prettyBox(aside);\n    //显示设置按键\n    showSetSearchEngine(tool_bar, window_close_icon);\n  } else {\n    if (\n      hasClass(\n        box,\n        \"chinese-programmer-wrong-pronunciation-custom-iframe-box-hidden\"\n      )\n    ) {\n      removeClass(\n        box,\n        \"chinese-programmer-wrong-pronunciation-custom-iframe-box-hidden\"\n      );\n    }\n    iframe = box.querySelector(\n      \"#chinese-programmer-wrong-pronunciation-custom-iframe\"\n    );\n    iframe.setAttribute(\"src\", \"about:blank\");\n    //iframe.contentDocument.close()\n    box.removeChild(iframe);\n\n    iframe = document.createElement(\"iframe\");\n    iframe.setAttribute(\n      \"id\",\n      \"chinese-programmer-wrong-pronunciation-custom-iframe\"\n    );\n    iframe.setAttribute(\"security\", \"restricted\");\n    box.appendChild(iframe);\n  }\n\n  return iframe;\n};\n\nlet opener_key = \"how-to-pronounce-from-search-engine-open-tab-opener\";\nlet getSearchEngineOpener = () => {\n  return JSON.parse(sessionStorage.getItem(opener_key));\n};\n\nlet showSetSearchEngine = (box, window_close_icon) => {\n  let opener = getSearchEngineOpener();\n\n  {\n    let search_engin_provider = {\n      goToYouDaoSearch: \"有道\",\n      goToGoogleSearch: \"谷歌\",\n      goToBingDictSearch: \"必应词典\",\n      goToBingSearch: \"必应\",\n    };\n    let select = document.createElement(\"select\");\n    select.setAttribute(\"name\", \"search_engin_provider\");\n    select.setAttribute(\"class\", \"search_engin_provider\");\n    let htmlContent = \"\";\n    for (let i in search_engin_provider) {\n      let selected = \"\";\n      if (opener && opener.search_engine_name) {\n        selected = i === opener.search_engine_name ? 'selected=\"selected\"' : \"\";\n      }\n      htmlContent += `<option value=\"${i}\" ${selected}>${search_engin_provider[i]}</option>`;\n    }\n\n    select.innerHTML = htmlContent;\n\n    select.addEventListener(\"click\", setSearchEngine);\n    box.insertBefore(select, window_close_icon);\n  }\n  {\n    let search_engin_provider_tab = {\n      current_tab: \"当前标签展示结果\",\n      new_tab: \"新标签展示结果\",\n    };\n    let select = document.createElement(\"select\");\n    select.setAttribute(\"class\", \"search_engin_provider_tab\");\n    select.setAttribute(\"name\", \"search_engin_provider_tab\");\n    let htmlContent = \"\";\n    for (let i in search_engin_provider_tab) {\n      let selected = \"\";\n      if (opener && opener.tab) {\n        selected = i === opener.tab ? 'selected=\"selected\"' : \"\";\n      }\n      htmlContent += `<option value=\"${i}\" ${selected}>${search_engin_provider_tab[i]}</option>`;\n    }\n\n    select.innerHTML = htmlContent;\n\n    select.addEventListener(\"click\", setSearchEngineOpener);\n    box.insertBefore(select, window_close_icon);\n  }\n\n  let div = document.createElement(\"span\");\n  div.setAttribute(\n    \"class\",\n    \"chinese-programmer-wrong-pronunciation-custom-tool-bar-setup\"\n  );\n  div.innerText = `⚙`;\n  // box.insertBefore(div,select)\n};\n\n//关闭窗口\nlet closeSearchWindow = () => {\n  let box = document.querySelector(\n    \"#chinese-programmer-wrong-pronunciation-custom-iframe-box\"\n  );\n  console.log(box);\n  if (\n    box &&\n    !hasClass(\n      box,\n      \"chinese-programmer-wrong-pronunciation-custom-iframe-box-hidden\"\n    )\n  ) {\n    addClass(\n      box,\n      \"chinese-programmer-wrong-pronunciation-custom-iframe-box-hidden\"\n    );\n  }\n  let iframe = box.querySelector(\n    \"#chinese-programmer-wrong-pronunciation-custom-iframe\"\n  );\n  iframe.setAttribute(\"src\", \"about:blank\");\n};\n\nlet setSearchEngine = (event) => {\n  event.preventDefault();\n  event.stopPropagation();\n  console.log(event.target.value);\n  setupConfig(event.target.value, null);\n};\nlet setSearchEngineOpener = (event) => {\n  event.preventDefault();\n  event.stopPropagation();\n  console.log(event.target.value);\n\n  setupConfig(null, event.target.value);\n};\n\nlet setupConfig = (search_engine_name, tab) => {\n  let opener = getSearchEngineOpener();\n  //页面展示方式，默认有效期一天\n  let expired_date = new Date().getTime() + 24 * 60 * 60 * 1000;\n  if (opener) {\n    if (search_engine_name) {\n      opener.search_engine_name = search_engine_name;\n    }\n    if (tab) {\n      opener.tab = tab;\n    }\n  } else {\n    tab = \"current_tab\";\n    search_engine_name = \"goToYouDaoSearch\";\n    opener = {\n      tab: tab,\n      expired_date: expired_date,\n      search_engine_name: search_engine_name,\n    };\n  }\n\n  sessionStorage.setItem(opener_key, JSON.stringify(opener));\n};\nlet showResetCurrentSearchEngineTab = () => {\n  let div = document.createElement(\"div\");\n  div.setAttribute(\n    \"id\",\n    \"#chinese-programmer-wrong-pronunciation-custom-tools-bar\"\n  );\n  div.innerHTML = `\n        <span>关闭搜索页面</span>🥳🥳🥳🥳🥳🥳<span>更换搜索引擎</span>\n    `;\n\n  document\n    .querySelector(\"#chinese-programmer-wrong-pronunciation-custom-iframe-box\")\n    .appendChild(div);\n};\n\nlet cleanOpener = () => {\n  sessionStorage.removeItem(opener_key);\n  console.log(\"恢复扩展默认配置---ok\");\n};\n\nexport {\n  styleConfig,\n  customElement,\n  getIframe,\n  getSearchEngineOpener,\n  setSearchEngineOpener,\n  cleanOpener,\n};\n"
  },
  {
    "path": "tools/chromium_extension/js/app/init.js",
    "content": "import box from \"./box.js\";\n\nlet init = () => {\n  let URLObj = new URL(location.href);\n  console.log(URLObj);\n  if (document.querySelector(\"#readme table tbody\")) {\n    //载入自定义组件样式\n    box.styleConfig();\n    //载入自定义组件\n    box.customElement();\n\n    let audio_player = new Audio();\n    audio_player.setAttribute(\"autoplay\", \"true\");\n    document\n      .querySelector(\"#readme table tbody\")\n      .addEventListener(\"click\", (event) => {\n        //console.log(event.target)\n        // console.log(event.target.nodeType)\n        // console.log(event.target.nodeName);\n        let parentElement = event.target.parentElement;\n        if (parentElement && parentElement.nodeName === \"TR\") {\n          if (parentElement.firstElementChild === event.target) {\n            //使用搜索引擎查询发音\n            box.goToSearchPronounce(event.target.innerText);\n          }\n        }\n        event.preventDefault();\n        event.stopPropagation();\n        let audio_url = null;\n        if (event.target.nodeName === \"TD\") {\n          let aTag = event.target.querySelector(\"a\");\n          if (aTag) {\n            audio_url = aTag.getAttribute(\"href\");\n          }\n        }\n        if (event.target.nodeName === \"IMG\") {\n          let aTag = event.target.parentNode.parentNode;\n          audio_url = aTag.getAttribute(\"href\");\n        }\n        if (event.target.nodeName === \"G-EMOJI\") {\n          let aTag = event.target.parentNode;\n          audio_url = aTag.getAttribute(\"href\");\n        }\n        if (audio_url) {\n          let desURL = new URL(audio_url);\n          //console.log(desURL.protocol);\n          if (desURL.protocol === \"http:\") {\n            //skip http\n            location.href = audio_url;\n          } else {\n            // console.log(\"audio_url:\", audio_url);\n            audio_player.setAttribute(\"src\", audio_url);\n          }\n        }\n      });\n    document\n      .querySelector(\"#readme table tbody\")\n      .addEventListener(\"mouseover\", (event) => {\n        let parentElement = event.target.parentElement;\n        if (parentElement && parentElement.nodeName === \"TR\") {\n          if (parentElement.firstElementChild === event.target) {\n            event.target.setAttribute(\"title\", \"点击我打开搜索引擎检索\");\n            event.target.style.cursor = \"pointer\";\n          }\n        }\n      });\n\n    let table = document.querySelector(\"#readme table\");\n    let parent = table.parentNode;\n    let note = document.createElement(\"span\");\n    note.innerText = `⚪恢复扩展默认配置⚪`;\n    note.setAttribute(\n      \"class\",\n      \"chinese-programmer-wrong-pronunciation-custom-note-reset\"\n    );\n\n    note.addEventListener(\"click\", (event) => {\n      //重置配置\n      event.preventDefault();\n      event.stopPropagation();\n      box.cleanOpener();\n    });\n    parent.insertBefore(note, table);\n  } else {\n    console.log(\"no found README.md table\");\n  }\n};\n\nexport { init };\n"
  },
  {
    "path": "tools/chromium_extension/js/app/pretty-box.js",
    "content": "import { addClass, removeClass } from \"./utils.js\";\n\nlet prettyBox = (box) => {\n  // 参考 https://blog.csdn.net/weixin_41910848/article/details/82218243\n\n  let dragging = false;\n  let diffX = null;\n  let diffY = null;\n  box.onmousedown = function (event) {\n    dragging = true;\n\n    let left = box.offsetLeft;\n    let top = box.offsetTop;\n\n    removeClass(\n      box,\n      \"chinese-programmer-wrong-pronunciation-custom-iframe-box\"\n    );\n\n    box.style.left = left + \"px\";\n    box.style.top = top + \"px\";\n\n    diffX = event.clientX - left;\n    diffY = event.clientY - top;\n  };\n  document.onmousemove = function (event) {\n    if (dragging) {\n      // console.log(event.clientX, event.clientY)\n      //console.log(diffX, diffY)\n\n      let moveX = event.clientX - diffX;\n      let moveY = event.clientY - diffY;\n\n      if (moveX < 0) {\n        moveX = 0;\n      } else if (moveX > window.innerWidth - box.offsetWidth) {\n        moveX = window.innerWidth - box.offsetWidth;\n      }\n      if (moveY < 0) {\n        moveY = 0;\n      } else if (moveY > window.innerHeight - box.offsetHeight) {\n        moveY = window.innerHeight - box.offsetHeight;\n      }\n\n      box.style.left = moveX + \"px\";\n      box.style.top = moveY + \"px\";\n\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  };\n  document.onmouseup = function (event) {\n    dragging = false;\n  };\n\n  box.onmouseup = (event) => {\n    dragging = false;\n  };\n\n  box.ondragstart = function (event) {\n    console.log(box.offsetLeft, box.offsetTop);\n    console.log(\"开始拖拽\");\n  };\n  box.ondrag = function () {\n    console.log(box.offsetLeft, box.offsetTop);\n    console.log(\"拖拽中\");\n  };\n  box.ondragend = function () {\n    console.log(box.offsetLeft, box.offsetTop);\n    console.log(\"拖拽结束\");\n  };\n};\n\nexport { prettyBox };\n"
  },
  {
    "path": "tools/chromium_extension/js/app/search-engine.js",
    "content": "let goToGoogleSearch = (word) => {\n  word = word.replace(/\\s/, \"+\");\n  return `https://www.google.com/search?q=how+to+pronounce+${word}`;\n};\n\nlet goToYouDaoSearch = (word) => {\n  word = word.replace(/\\s/, \"+\");\n  return `https://www.youdao.com/result?word=${word}&lang=en`;\n};\n\nlet goToBingDictSearch = (word) => {\n  return `https://cn.bing.com/dict/${word}`;\n};\nlet goToBingSearch = (word) => {\n  return `https://cn.bing.com/search?q=how%20to%20pronounce%20${word}`;\n};\n\nexport {\n  goToYouDaoSearch,\n  goToGoogleSearch,\n  goToBingDictSearch,\n  goToBingSearch,\n};\n"
  },
  {
    "path": "tools/chromium_extension/js/app/utils.js",
    "content": "function hasClass(el, className) {\n  if (el.classList) return el.classList.contains(className);\n  return !!el.className.match(new RegExp(\"(\\\\s|^)\" + className + \"(\\\\s|$)\"));\n}\n\nfunction addClass(el, className) {\n  if (el.classList) el.classList.add(className);\n  else if (!hasClass(el, className)) el.className += \" \" + className;\n}\n\nfunction removeClass(el, className) {\n  if (el.classList) el.classList.remove(className);\n  else if (hasClass(el, className)) {\n    let reg = new RegExp(\"(\\\\s|^)\" + className + \"(\\\\s|$)\");\n    el.className = el.className.replace(reg, \" \");\n  }\n}\n\nfunction getCookie(name) {\n  let arr,\n    reg = new RegExp(\"(^| )\" + name + \"=([^;]*)(;|$)\");\n  if ((arr = document.cookie.match(reg))) {\n    return decodeURIComponent(arr[2]);\n  } else {\n    return null;\n  }\n  //await cookieStore.get({name:name})\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie\n\nfunction setCookie(name, value, second, path, domain) {\n  var exp = new Date();\n  exp.setTime(exp.getTime() + second * 1000);\n  document.cookie =\n    name +\n    \"=\" +\n    encodeURIComponent(value) +\n    \";expires=\" +\n    exp.toGMTString() +\n    \";path=\" +\n    path +\n    \";domain=\" +\n    domain +\n    \";SameSite=None;Secure\";\n}\nasync function getCookies(domain) {\n  let cookies = await cookieStore.getAll({ domain: domain });\n  return cookies;\n}\n\nfunction encodeBase64(str) {\n  return btoa(encodeURIComponent(str));\n}\n\nfunction decodeBase64(encoded) {\n  return decodeURIComponent(atob(encoded));\n}\n\nfunction getParameterValue(name) {\n  let reg = new RegExp(\"[^?&]?\" + encodeURI(name) + \"=[^&]+\");\n  let arr = location.search.match(reg);\n  if (arr != null) {\n    return decodeURI(arr[0].substring(arr[0].search(\"=\") + 1));\n  }\n  return \"\";\n}\n\nfunction createJSONFile(content, filename) {\n  let blob = new Blob([JSON.stringify(content)], { type: \"application/json\" });\n  let url = window.URL.createObjectURL(blob);\n  let a = document.createElement(\"a\");\n  a.style.display = \"none\";\n  a.href = url;\n  a.download = filename;\n  a.click();\n  setTimeout(function () {\n    window.URL.revokeObjectURL(url);\n  }, 3000);\n}\n\nasync function sleep(time) {\n  return new Promise((resolve) => setTimeout(resolve, time));\n}\n\nasync function getMediaDevices() {\n  return await navigator.mediaDevices.enumerateDevices();\n}\n\n// new URLSearchParams\n// new URL\n// (new Date()).toISOString()\nexport {\n  addClass,\n  removeClass,\n  hasClass,\n  setCookie,\n  getCookie,\n  encodeBase64,\n  decodeBase64,\n  getParameterValue,\n  sleep,\n  getMediaDevices,\n  createJSONFile,\n};\n"
  },
  {
    "path": "tools/chromium_extension/js/content-script.js",
    "content": "(async () => {\n  let app = await import(chrome.runtime.getURL(\"js/app/init.js\"));\n  app.init();\n})();\n"
  },
  {
    "path": "tools/chromium_extension/manifest.json",
    "content": "{\n  \"name\": \"chinese-programmer-wrong-pronunciation-chromium-extension\",\n  \"version\": \"0.1.0\",\n  \"manifest_version\": 3,\n  \"description\": \"页面无跳转 听正确读音\",\n  \"content_scripts\": [\n    {\n      \"matches\": [\n        \"*://*/shimohq/chinese-programmer-wrong-pronunciation/*\",\n        \"*://*/jingjingxyk/chinese-programmer-wrong-pronunciation/*\"\n      ],\n      \"run_at\": \"document_idle\",\n      \"js\": [\"js/content-script.js\"]\n    }\n  ],\n  \"permissions\": [\n    \"declarativeNetRequest\",\n    \"declarativeNetRequestWithHostAccess\"\n  ],\n  \"host_permissions\": [\n    \"*://github.com/*\",\n    \"*://www.google.com/*\",\n    \"*://cn.bing.com/*\",\n    \"*://www.bing.com/*\",\n    \"*://www.youdao.com/*\",\n    \"*://dict.youdao.com/*\"\n  ],\n  \"web_accessible_resources\": [\n    {\n      \"resources\": [\"*.js\", \"*.css\", \"*.html\"],\n      \"matches\": [\"*://*/*\"],\n      \"extension_ids\": [],\n      \"use_dynamic_url\": true\n    }\n  ],\n  \"declarative_net_request\": {\n    \"rule_resources\": [\n      {\n        \"id\": \"remove_content_security_policy\",\n        \"enabled\": true,\n        \"path\": \"rules/remove_content_security_policy.json\"\n      }\n    ]\n  },\n  \"author\": \"https://github.com/jingjingxyk\",\n  \"homepage_url\": \"https://github.com/shimohq/chinese-programmer-wrong-pronunciation.git\"\n}\n"
  },
  {
    "path": "tools/chromium_extension/package.json",
    "content": "{\n  \"name\": \"chinese-programmer-wrong-pronunciation-chromium-extension\",\n  \"version\": \"1.0.0\",\n  \"description\": \"README.md 页面无跳转 即可听正确读音\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"format-code\": \"npx prettier --write . && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"devDependencies\": {\n    \"prettier\": \"2.6.2\"\n  }\n}\n"
  },
  {
    "path": "tools/chromium_extension/rules/remove_content_security_policy.json",
    "content": "[\n  {\n    \"id\": 1,\n    \"priority\": 99,\n    \"action\": {\n      \"type\": \"modifyHeaders\",\n      \"responseHeaders\": [\n        { \"header\": \"content-security-policy\", \"operation\": \"remove\" },\n        {\n          \"header\": \"content-security-policy-report-only\",\n          \"operation\": \"remove\"\n        },\n        { \"header\": \"expect-ct\", \"operation\": \"remove\" },\n        { \"header\": \"report-to\", \"operation\": \"remove\" },\n        { \"header\": \"x-content-security-policy\", \"operation\": \"remove\" },\n        { \"header\": \"x-webkit-csp\", \"operation\": \"remove\" },\n        { \"header\": \"x-xss-protection\", \"operation\": \"remove\" },\n        {\n          \"header\": \"x-permitted-cross-domain-policies\",\n          \"operation\": \"remove\"\n        },\n        { \"header\": \"x-content-type-options\", \"operation\": \"remove\" },\n        { \"header\": \"x-frame-options\", \"operation\": \"remove\" },\n        { \"header\": \"X-Frame-Options\", \"operation\": \"remove\" },\n        { \"header\": \"permissions-policy\", \"operation\": \"remove\" },\n        { \"header\": \"timing-allow-origin\", \"operation\": \"remove\" },\n        { \"header\": \"cross-origin-embedder-policy\", \"operation\": \"remove\" },\n        { \"header\": \"cross-origin-opener-policy\", \"operation\": \"remove\" },\n        {\n          \"header\": \"cross-origin-opener-policy-report-only\",\n          \"operation\": \"remove\"\n        },\n        {\n          \"header\": \"cross-origin-embedder-policy-report-only\",\n          \"operation\": \"remove\"\n        }\n      ]\n    },\n    \"condition\": {\n      \"urlFilter\": \"*\",\n      \"requestDomains\": [\n        \"github.com\",\n        \"githubusercontent.com\",\n        \"www.google.com\",\n        \"cn.bing.com\",\n        \"www.bing.com\",\n        \"fanyi.baidu.com\",\n        \"www.youdao.com\",\n        \"dict.youdao.com\"\n      ],\n      \"resourceTypes\": [\n        \"main_frame\",\n        \"sub_frame\",\n        \"stylesheet\",\n        \"script\",\n        \"image\",\n        \"font\",\n        \"object\",\n        \"xmlhttprequest\",\n        \"ping\",\n        \"csp_report\",\n        \"media\",\n        \"websocket\",\n        \"webtransport\",\n        \"webbundle\",\n        \"other\"\n      ]\n    }\n  }\n]\n"
  },
  {
    "path": "tools/chromium_extension/web-components/README.md",
    "content": "# HTML Imports，HTML Template、Shadow DOM----统称为 Web Components 规范\n\n## Shadow DOM 实现代码隔离\n"
  },
  {
    "path": "tools/chromium_extension/web-components/x-custom-box.html",
    "content": "<x-chinese-programmer-wrong-pronunciation-custom-box>\n  <div>自定义web组件-做代码隔离</div>\n</x-chinese-programmer-wrong-pronunciation-custom-box>\n"
  }
]