# Changelog

## v10.2.0 / 2026-09-19

### [pangu.js](https://www.npmjs.com/package/pangu)

- `mo 店+` 後面的 `+` 不會被分開了

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 彈出視窗和設定頁改用跟 [pangu.space](https://github.com/vinta/pangu.space) 一樣的設計
  - 加深成功和錯誤訊息的顏色，文字對比符合 WCAG AA
  - 用鍵盤操作時，按鈕和開關會顯示一致的焦點外框
  - 系統開啟「減少動態效果」時不再播放動畫
- 拿掉了用不到的 `activeTab` 權限

## v10.1.1 / 2026-09-14

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 修正在設定頁編輯黑名單或白名單的網址時，內容沒改就按「好了」會沒反應的問題
- 修正在設定頁把網址編輯成名單裡已經有的網址時會存成重複網址的問題
- 修正在設定頁按「新增網址」或「恢復原廠設定」時頁面會捲到最上面的問題
- 設定頁一次只會有一列網址在編輯狀態，點其他網址或「新增網址」會關掉原本那一列

## v10.1.0 / 2026-09-13

### [pangu.js](https://www.npmjs.com/package/pangu)

- CLI 的 `-h` 會在說明的開頭顯示版本號

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 空格之神 AI
  - 數字後面緊接著 `+` 再接中文時，由模型判斷 `+` 是連接兩個東西還是「以上」的意思
    - 同一句只有一個 `+` 時才會交給模型判斷
  - 改進 `-` 是負號還是分隔符號的判斷，編號、年齡、年期前面的 `-` 比較不會被誤判成負號

## v10.0.0 / 2026-09-11

### [pangu.js](https://www.npmjs.com/package/pangu)

- 各位觀眾！Paranoid Text Spacing 演算法 v10 強勢登場！
  - 中文和 `/` 之間不會加空格，除非是 `/src/index.ts` 之類的檔案路徑
    - 本來就有空格的 `A / B` 則維持不變
  - 所有 `http://`、`https://` 開頭的網址裡面都不會加空格，包含中文的網址會維持原樣
  - 英文單字後面緊接著 `+` 再接中文時，`+` 不再當成單字的後綴，而是當成分隔符號
    - 同一行只要有 `+` 直接碰到中文，這一行其他的 `+` 也會一起加空格；`+` 碰到全形標點符號的那一邊則不加空格
    - 同一行有兩個以上的 `+` 時，右括號後面的 `+` 就算緊接著全形引號或括號也會當成分隔符號，只在右括號那一邊加空格
  - `⁺`、`²`、`³`、`™`、`℠`、`®` 這類上標字元會跟前面的文字黏在一起，後面接中文時只在上標後面加空格
    - 網頁裡的 `<sup>` 元素也一樣，跟前面的文字之間不加空格，空格只加在 `</sup>` 後面
  - `℃`、`℉`、`№` 這類 Letterlike Symbols 區段的字元碰到中文時會加空格，而 `©` 後面緊接著數字時也會加空格
- 所有 `spacingXxx()` methods 改名為 `spaceXxx()`
  - `spacingText()` -> `spaceText()`
  - `spacingFile()` -> `spaceFile()`
  - `spacingFileSync()` -> `spaceFileSync()`
  - `spacingPage()` -> `spacePage()`
  - `spacingNode()` -> `spaceNode()`
  - `autoSpacingPage()` -> `autoSpacePage()`
  - `stopAutoSpacingPage()` -> `stopAutoSpacePage()`

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 新功能：使用 Chrome 的 [Prompt API](https://developer.chrome.com/docs/ai/prompt-api) 來處理 pangu.js 的規則難以判斷的加空格情境
  - 中文後面緊接著 `-` 再接數字時，由模型判斷 `-` 是負號還是分隔符號：`氣溫是-5度` 會變成 `氣溫是 -5 度`
  - `Disney+`、`Apple TV+`、`公視+`、`AA+`、`AB+` 這類名字後面的 `+` 和 `-` 會黏回去
  - 所有的操作只在你的電腦上運行（完全離線，沒有任何資料會被上傳到雲端）
  - 缺點是 Prompt API 只能用 on-device 模型：Gemini Nano，現階段的效果差強人意。不過總比沒有好，而且免錢的東西就不要要求太多了
- 修正動態填入內容的元素（例如原本是空的 `<span>` 後來才由 JavaScript 塞進數字）跟旁邊已經加過空格的文字之間會漏加空格的問題
- 修正在 GitHub 這類不重新載入頁面就換網址的網站上的黑名單和白名單不會跟著網址生效的問題
- Chrome extension 支援的最低版本改成 Chrome 102
  - 為了用 `window.navigation` API

## v9.1.1 / 2026-08-31

### [pangu.js](https://www.npmjs.com/package/pangu)

- 修正右括號 `)`、`]`、`}` 後面緊接著 `-` 再接中文時，`-` 前面會漏加空格的問題（`*`、`=`、`&` 也一樣）
- 修正中文後面緊接著 `-` 再接數字時，`-` 不再預設當成負號，而是預設當成分隔符號
- 修正 `dist/browser/pangu.js` 會 import 其他檔案的問題，現在是獨立的單一檔案了，可以直接用 `<script type="module">` 載入
  - v8.1.0 到 v9.1.0 都有這個問題，在只複製 `dist/browser/` 目錄的 CDN 上（例如 cdnjs）會因為找不到檔案而載入失敗

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- Chrome extension 支援的最低版本改成 Chrome 99
  - 為了用 Promise 版的 `chrome.tabs.sendMessage()`

## v9.1.0 / 2026-08-01

### [pangu.js](https://www.npmjs.com/package/pangu)

- CLI 的 `-v` 會在版本號前面加上 `pangu.js`，本來只印版本號
- CLI 的 `-t`、`-f`、`-c` 不能再混用，同時給多個會出現錯誤訊息
- CLI 支援從 stdin 讀取文字，`echo "他們在release的前一天爆炸" | pangu` 會直接印出加好空格的結果，`-c` 也可以這樣用
- 修正 CLI 的輸出被導向 pipe 時，超過 64KB 的部分會被截斷的問題
- 修正 CLI 的 `-f` 現在會原封不動輸出加完空格的檔案內容，不會多加一個換行，檔案結尾本來有幾個換行就是幾個
- 修正引號的加空格規則，內容以 `+` 或 `|` 結尾時，結尾引號前面不會再多一個空格，同樣的文字加第二次空格也不會變，排版完馬上用 `-c` 檢查也會通過
- 新增 `pangu-js` 這個 CLI command，不管 PATH 順序如何都會執行到 pangu.js

## v9.0.0 / 2026-07-28

### [pangu.js](https://www.npmjs.com/package/pangu)

- 各位觀眾！Paranoid Text Spacing 演算法 v9！
- 修正 `<wbr>` 這類元素把 `/` 兩邊拆成不同文字節點時，斜線前面會漏加空格的問題
- 拿掉了 `package.json` 的 `module` 欄位
- 拿掉了 `package.json` 的 `browser` 欄位
  - 瀏覽器端請改用 `import pangu from 'pangu/browser'`，本來就是文件建議的用法，型別也一直是對的
  - 之前用 bundler 直接 `import pangu from 'pangu'`，執行時會拿到瀏覽器版本，但是 TypeScript 給的型別是 Node.js 版本
  - 用 `<script>` 載入 UMD 檔案、或是已經在用 `pangu/browser` 的話都不受影響
- 支援的 Node.js 版本改成 v20 以上

## v8.2.0 / 2026-07-26

### [pangu.js](https://www.npmjs.com/package/pangu)

- 修正引號的加空格規則，當引號的內容跨越換行時，不會再把引號外面本來就有的空格吃掉

## v8.1.0 / 2026-07-26

### [pangu.js](https://www.npmjs.com/package/pangu)

- 修正 `-` `*` `=` `<` `>` `_` `+` 這些符號的加空格規則，夾在半形字元中間時會跟兩邊黏成同一個詞，不會再被拆開
- 修正 `+` 在字尾的加空格規則
- 修正 `|` 的加空格規則，同一行只要有 `|` 直接貼著中文，整行的 `|` 都會當成分隔符來加空格，例如 `標題|網站名稱` 會變成 `標題 | 網站名稱`
- 修正 `+` 直接貼著中文時會當成分隔符來加空格，跟 `|` 一樣以行為單位來判斷
- 修正 `!` `;` `,` `?` 後面直接貼著中文時的加空格規則，現在不管這些符號前面是什麼字元，都會在符號後面加空格
- 修正純文字中的 `<tag>` 現在會被當成一個詞來加空格，但是一般網頁中的 HTML 標籤不受影響
- 修正文字節點的開頭或結尾是 `&nbsp;`、旁邊又緊接著連結之類的元素時，會多加一個半形空格的問題
- 不再把單獨出現的 `&nbsp;` 改寫成半形空格，這是 v8.0.0 的行為，現在會原封不動保留你打的 `&nbsp;`，只在真的缺空格的地方補上空格
- `pangu/browser` 改成只提供 ESM，拿掉了 `require` 條件，`require('pangu/browser')` 會出現 `ERR_PACKAGE_PATH_NOT_EXPORTED`
  - 用 bundler 的話 `import` 照舊，不受影響
  - 在瀏覽器裡直接用 `<script>` 載入 UMD 檔案的方式也不受影響

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- Chrome extension 的工具列圖示新增了 OFF 狀態，切到手動模式、或是目前網址被黑白名單排除時，圖示會換成頭戴紙袋的圖示
- Chrome extension 會在所有網頁啟用瀏覽器原生的 [`text-autospace: normal;`](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/text-autospace) 排版
  - 預設啟用，可以在設定裡關掉
  - 需要 Chrome v140 以上版本
- Chrome extension 支援的最低版本改成 Chrome 96
  - 為了用 `chrome.scripting.registerContentScripts()`

## v8.0.0 / 2026-07-19

### [pangu.js](https://www.npmjs.com/package/pangu)

- 各位觀眾！Paranoid Text Spacing 演算法 v8！
  - 修正有些網頁加空格會抖動的問題
  - 修正 `/` 和 `&` 的加空格規則
  - 修正單獨出現的 `&nbsp;` 會造成空格判斷錯誤的問題，現在會先把它當成一般的半形空格
  - 修正引號緊鄰日文時，空格規則跟中文不一致的問題
  - 修正同一批動態新增的相鄰節點之間會正確加空格了
  - 修正兩個變動的節點中間如果隔著沒變動的內容，不會再把它們誤判成相鄰節點而加錯空格
  - 修正連結被其他元素包住、後面又接著其他文字時，連結前後漏加空格的問題
  - 修正兩段文字中間本來就有空白時，不會再多加一個空格，之前隔著 `<a>` 這類元素、或空白被包在 `<span>` 這類元素裡時會看不到那個空白

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 再一次史詩級性能提升！

## v7.2.1 / 2026-03-02

### [pangu.js](https://www.npmjs.com/package/pangu)

- 修正在 CSS Grid 和 Flexbox 容器裡插入 `<pangu>` 元素會破壞排版的問題

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 移除 Chrome extension 的 `file://` host permission

## v7.2.0 / 2025-07-05

### [pangu.js](https://www.npmjs.com/package/pangu)

- 趁末日前更新一下，不然以後就沒機會了
- 修正在 Google Calendar 會不小心在 CSS 隱藏元素與中文之間加空格的問題

## v7.0.0 / 2025-07-02

### [pangu.js](https://www.npmjs.com/package/pangu)

- 各位觀眾！Paranoid Text Spacing 演算法 v7！
  - 會自動判斷某些元素是不是被 CSS 隱藏來決定要不要加空格
  - 不會把半形的標點符號轉成全形了

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 史詩級性能提升！
  - 把 XPath 換成 [TreeWalker](https://developer.mozilla.org/en-US/docs/Web/API/TreeWalker)，快他媽 5 倍！
  - 比較慢的操作都丟到 [requestIdleCallback()](https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback)，內容太多的網站終於不卡了！
    - Chrome/Firefox 都有支援 `requestIdleCallback()`，但是 Safari 不支援

## v6.1.3 / 2025-07-01

### [pangu.js](https://www.npmjs.com/package/pangu)

- 修正 Asana 的 comments 會被重複加空格的問題

## v6.1.2 / 2025-06-30

### [pangu.js](https://www.npmjs.com/package/pangu)

- 修正 Node.js imports

## v6.1.0 / 2025-06-30

### [pangu.js](https://www.npmjs.com/package/pangu)

- 好啦好啦，我要去玩死亡擱淺 2 了

## v6.0.0 / 2025-06-28

### [pangu.js](https://www.npmjs.com/package/pangu)

- 各位觀眾！Paranoid Text Spacing 演算法 v6！
  - 特別處理了各種括號 `()` `[]` `{}` `<>` 和 `/` 的問題，仁至義盡了

## v5.3.2 / 2025-06-27

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 在 popup 加了一個方便把目前的網址加到黑名單的按鈕

## v5.2.0 / 2025-06-26

### [pangu.js](https://www.npmjs.com/package/pangu)

- 各位觀眾！Paranoid Text Spacing 演算法 v5！

## v5.1.1 / 2025-06-24

### [pangu.js](https://www.npmjs.com/package/pangu)

- 偉哉 Claude Code，精雕細琢的 v5.1.1 終於推出啦！

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 雖然看起來好像只是換了一個新 UI，但是爽啦！

## v5.0.0 / 2025-06-17

### [pangu.js](https://www.npmjs.com/package/pangu)

- 請 Claude Code 幫我把 codebase 改寫成 TypeScript 了

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 請 Claude Code 幫我把 Chrome extension 升級成 Manifest v3 了

## v4.0.7 / 2019-02-15

### [pangu.js](https://www.npmjs.com/package/pangu)

- 修正 `“ ”` 的問題

## v4.0.6 / 2019-02-04

### [pangu.js](https://www.npmjs.com/package/pangu)

- 修正 `,` 的問題
- 新增 `pangu` 指令

## v4.0.5 / 2019-01-30

### [pangu.js](https://www.npmjs.com/package/pangu)

- 修正 `<pre>` 的問題

## v4.0.4 / 2019-01-29

### [pangu.js](https://www.npmjs.com/package/pangu)

- 修正 Bilibili 影片會消失的問題

## v4.0.3 / 2019-01-29

### [pangu.js](https://www.npmjs.com/package/pangu)

- 修正 `node.isContentEditable` 的問題

## v4.0.2 / 2019-01-29

### [pangu.js](https://www.npmjs.com/package/pangu)

- 修正 `<code>` 的問題
- 修正 `<i>` 的問題
- 修正 `・` 的問題

## v4.0.0 / 2019-01-27

### [pangu.js](https://www.npmjs.com/package/pangu)

- 各位觀眾！Paranoid Text Spacing 演算法 v4！
- 修正 `Pangu.spacingText()` 的 error callback
- 新增 `BrowserPangu.autoSpacingPage()`

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 大幅地改進 Chrome extension 的效能，使用 `MutationObserver` 和 `debounce`
- 忍痛拿掉「空格之神顯靈了」

## v3.3.0 / 2016-12-28

- 修個 bug 好過年

### [pangu.js](https://www.npmjs.com/package/pangu)

- 修正在 Twitter 上跟 Buffer 一起使用時會隨機出現的錯誤問題

## v3.2.1 / 2016-06-26

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 又他媽改善效能問題

## v3.2.0 / 2016-06-26

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 修正效能問題

## v3.1.1 / 2016-06-26

### [pangu.js](https://www.npmjs.com/package/pangu)

- 各位觀眾！Paranoid Text Spacing 演算法 v3！

## v3.1.0 / 2016-06-25

### [pangu.js](https://www.npmjs.com/package/pangu)

- `NodePangu` 新增 `spacingFile()`，支援 callback 與 promise
- `NodePangu` 新增 `spacingFileSync()`

## v3.0.0 / 2016-01-10

### [pangu.js](https://www.npmjs.com/package/pangu)

- Isomorphic!

## v2.5.6 / 2015-05-13

- 大家好，很抱歉這麼快又跟大家見面了

## v2.5.5 / 2015-05-13

### [pangu.js](https://www.npmjs.com/package/pangu)

- 持續改進 Paranoid Text Spacing 演算法

## v2.5.1 / 2015-05-11

### [pangu.js](https://www.npmjs.com/package/pangu)

- 再次改進 Paranoid Text Spacing 演算法

## v2.5.0 / 2015-05-11

### [pangu.js](https://www.npmjs.com/package/pangu)

- 改進 Paranoid Text Spacing 演算法

## v2.4.2 / 2014-12-10

### [pangu.js](https://www.npmjs.com/package/pangu)

- 修正 Facebook 留言框的空格錯位

## v2.4.1 / 2014-12-10

### [pangu.js](https://www.npmjs.com/package/pangu)

- 修正 `<title>` 網頁標題的加空格
- 修正 `'` 單引號的加空格

## v2.4.0 / 2014-12-08

### [pangu.js](https://www.npmjs.com/package/pangu)

- 完善對雙引號的處理

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 改進效能
- 修正 Popup Page 的 CSS 問題

## v2.3.4 / 2014-03-01

### [pangu.js](https://www.npmjs.com/package/pangu)

- 再度完善 Paranoid Text Spacing 演算法

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 修正 Options Page 的小錯誤

## v2.3.3 / 2014-02-16

### [pangu.js](https://www.npmjs.com/package/pangu)

- 完善 Paranoid Text Spacing 演算法

## v2.3.2 / 2014-02-12

- 心血來潮，加個版本號！

## v2.3.1 / 2014-02-10

### [pangu.js](https://www.npmjs.com/package/pangu)

- 真的不會對 `<code>` 和 `<pre>` 裡的文字加空格了

## v2.3.0 / 2014-02-08

### [pangu.js](https://www.npmjs.com/package/pangu)

- 威力加強版！
- 解決特定情況下在同一個地方會一直加空格的問題

## v2.2.3 / 2014-02-07

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 記事本不懂 Vim 的黑
- 不會在 Google+ 的輸入框裡加空格

## v2.2.2 / 2014-02-07

- 銀河大客車指南！

## v2.2.1 / 2014-02-05

### [pangu.js](https://www.npmjs.com/package/pangu)

- 各位觀眾！Paranoid Text Spacing 演算法 v2！

## v2.1.2 / 2014-02-01

### [pangu.js](https://www.npmjs.com/package/pangu)

- 不會對 `<textarea>` 裡的文字加空格！

## v2.1.1 / 2014-01-31

### [pangu.js](https://www.npmjs.com/package/pangu)

- 不對 `_` 加空格
- 對 `|` 加空格

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 新增 Popup Page
- 空格之神 姍姍來遲

## v2.1.0 / 2014-01-29

### [pangu.js](https://www.npmjs.com/package/pangu)

- 解決在 Facebook、Twitter、QQ 空间、百度贴吧等網站輸入文字時游標會亂衝的問題

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 支援 `file:///` 開頭的網頁

## v2.0.2 / 2014-01-26

### [pangu.js](https://www.npmjs.com/package/pangu)

- 遇到 `<br>` 就不加空格

## v2.0.1 / 2014-01-25

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 拿掉 `console.log()`
- 修正 Option Page footer 裡的超連結

## v2.0.0 / 2014-01-24

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 新年新氣象，翻新 Option Page 的 UI 和 Icon
- 網址黑白名單可以使用 Chrome 的同步功能（Chrome Storage API）
- 修正在 Gmail 中加空格的問題
- 改善效率問題

## v1.8 / 2013-09-17

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 修正在 Google Docs 中游標錯位的問題
- 網址黑、白名單支援 `//` 前綴

## v1.7 / 2012-04-08

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 減少 Chrome extension 的大小

## v1.6 / 2012-04-04

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 感謝 [@jiefoxi](https://github.com/jiefoxi)，現在英文超連結和中文之間也會加上空格了

## v1.5 / 2012-04-04

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 新增 Firefox 版本
- 目前支援「中文（繁體、簡體）」、「日文（漢字、平假名、片假名）」加空格
- 修正網址黑白名單沒有作用的問題

## v1.3 / 2012-03-20

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- 感謝 [@Fenng](https://github.com/Fenng) 的回報，修正了「新浪微博的 `@` 符號之後不要加空格」的問題
- 新增「簡體中文」語系

## v1.0 / 第一份工作的某一個下班日

### [為什麼你們就是不能加個空格呢？](https://chromewebstore.google.com/detail/paphcfdffjnbcgkokihcdjliihicmbpd)

- Paranoid Text Spacing 演算法，橫空出世！
