3.3 程式碼區塊
NoteCraftApp 使用文件 第 3 章・撰寫筆記

3.3 撰寫筆記

程式碼區塊

圍欄程式碼會渲染成帶語言標籤、行號與複製鈕的程式碼塊。這頁說明檔名標題、整行高亮、上色規則,以及程式碼註解、提示框與分頁等擴充語法。

本頁目錄
  1. 基本寫法
  2. 複製鈕
  3. 檔名與整行高亮
  4. 上色規則
  5. 行內 code
  6. 程式碼註解
  7. 提示框與分頁
  8. 提示框
  9. 分頁
  10. 其他

程式碼塊在 build 階段就渲染成靜態 HTML,.md 與 .mdx 寫法相同。

基本寫法

用三個反引號圍起來,後面接語言名稱。下圖的「原文」框可以直接改,「筆記頁」框是 NoteCraftApp 筆記頁實際渲染出來的樣子,會跟著重算;上方的按鈕切換幾組現成的例子。這頁之後的圖都是同一種操作方式。

原文guides/cache.md可以直接改
筆記頁NoteCraftApp 的實際渲染
TS
export const ttl = 60;
圍欄程式碼的渲染:語言標籤、行號與複製鈕(按下去真的會複製)。

每個程式碼塊都有:

  • 標題列:左邊是語言標籤(語言名稱轉大寫,例如 TS;沒寫語言時顯示 TEXT),右邊是複製鈕
  • 行號欄:固定顯示,沒有關閉的選項
  • 長的行不會自動換行,程式碼區可以橫向捲動

複製鈕

按下後複製整段原始碼,按鈕顯示「已複製」約 1.6 秒。下方程式碼註解的 (1)! 標記不會被複製進去。

用 --host 0.0.0.0 讓區網其他電腦以 http://<IP> 連進來時,瀏覽器不提供剪貼簿 API,複製鈕會改用舊的複製方式,一般瀏覽器照樣能複製。真的複製不了時,按鈕顯示「無法複製」並把整段程式碼選取起來,再自己按複製鍵(macOS 是 ⌘C)即可。

檔名與整行高亮

語言後面可以再加兩種設定,可以並用:

寫法效果
title="src/lib/auth.ts"在標題列語言標籤旁顯示檔名。單引號、雙引號,或不含空白的值不加引號都可以
{2}、{1,3-5}整行高亮。行號從 1 起算,逗號分隔,3-5 表示第 3 到 5 行
原文guides/auth.md可以直接改
筆記頁NoteCraftApp 的實際渲染
TSsrc/lib/auth.ts
import { createSession } from "./session";
const token = readToken();
export const session = createSession(token);
語言後面加檔名與要高亮的行號,兩者可以並用。

上色規則

NoteCraftApp 不使用 Shiki 這類依語言切換的高亮器,而是用一套內建的規則替所有語言上色。語言名稱只影響標籤文字,任何名稱都能寫;也沒有可以切換的配色主題。

類別認得的寫法
註解// 到行尾、同一行內的 /* … */
字串同一行內以 "、' 或反引號包住的文字
數字整數、小數、0x 開頭的十六進位
關鍵字JavaScript/TypeScript 的關鍵字,例如 const、function、return、import、async、true、null
函式後面接 ( 的名稱
型別大寫字母開頭的名稱
屬性後面接 =,或前面是 . 的名稱
標點括號、運算子等符號

因此 JavaScript、TypeScript、JSX、JSON 的效果最完整。其他語言只有字串、數字、函式呼叫這些共通的部分會上色:

  • # 開頭的註解(Python、Bash、YAML)與 -- 開頭的註解(SQL)不會顯示成註解色
  • 跨行的 /* … */ 與跨行字串,只有逐行能配對的部分會上色
原文guides/languages.md可以直接改
筆記頁NoteCraftApp 的實際渲染
TS
// 讀取設定,沒有就用預設值
interface Options { ttl?: number }
export async function load(path: string): Promise<Options> {
const raw = await readFile(path, "utf8");
return { ttl: 0x3c, ...JSON.parse(raw) };
}
同一套上色規則套在不同語言上:JavaScript 系最完整,其他語言只有共通的部分上色。

```mermaid 這類圍欄只會顯示成一般程式碼,不會畫成圖。要畫圖請用 @ai-visualize 標記。

行內 code

用一對反引號:`Cache-Control`。行內 code 以等寬字、淺灰底顯示,不上色。

在 .mdx 裡,{、< 放在行內 code 或程式碼塊裡都不用跳脫,見 Markdown 與 MDX。另外 .md 裡縮排四格的程式碼也會變成程式碼塊(標籤是 TEXT),.mdx 不會。

程式碼註解

用 :::annotate 包住「一個程式碼塊+一個編號清單」,在程式碼裡寫 (1)!、(2)! 當標記。讀者點標記,就會浮出清單裡對應的那一項:

原文guides/handler.md可以直接改
筆記頁NoteCraftApp 的實際渲染
TS
function handler(req: Request) { // 1
validate(req);
return ok(req); // 2
}
  1. 進入點,先檢查請求格式。
  2. 回傳統一格式的成功回應。
程式碼註解:點程式碼裡的編號,浮出清單裡對應的那一項。
  • (n)! 對應清單的第 n 項
  • 再點一次標記、點別處或按 Esc 關閉說明
  • 標記數和清單項數不同時,build log 會出現警告
  • 容器裡少了程式碼塊或編號清單,會退回一般區塊顯示,同樣在 build log 警告

提示框與分頁

下面這些語法在 .md 與 .mdx 都能用。名稱打錯的 :::xxx 會原樣顯示成文字。

提示框

原文guides/upgrade.md可以直接改
筆記頁NoteCraftApp 的實際渲染
提示框的六種類型,以及自訂標題與可收合。
類型預設標題
note提示
info資訊
tip小技巧
success完成
warning警告
danger注意
  • 自訂標題::::warning{title="升級前"} 或 :::warning[升級前]
  • 可收合::::tip{collapsible} 預設收起,:::tip{collapsible open} 預設展開

分頁

外層 tabs 要比內層 tab 多一個冒號:

原文getting-started/install.md可以直接改
筆記頁NoteCraftApp 的實際渲染
BASH
npm install -g notecraftapp
BASH
pnpm add -g notecraftapp
分頁:點分頁按鈕切換,按鈕取得焦點時也能用方向鍵。

label 沒寫時,分頁會被命名為「分頁 1」「分頁 2」……,並在 build log 警告。分頁按鈕取得焦點時,可以用 ← →、Home、End 鍵切換。

其他

語法用途選項
:tip[OAuth]{content="一種授權框架"}行內提示,滑鼠移上或聚焦時顯示說明content 必填
:badge[Beta]{variant="warning"}行內標籤variant:note、info、tip、success、warning、danger、neutral(預設);outline;size="sm";icon;href
::::steps 包多個 :::step{title="…" status="done"}步驟清單steps:layout="horizontal"、start=3;step:status 為 done、current 或 todo(預設)
原文guides/oauth.md可以直接改
筆記頁NoteCraftApp 的實際渲染

用 OAuth一種授權框架,讓第三方應用程式不必拿到密碼 取得授權,再換成 PKCEProof Key for Code Exchange 保護的存取權杖。

行內提示、行內標籤與步驟清單。

:badge 的 icon 可用 sparkle、check、star、bolt、flag、info、warning、danger、note、success。和分頁一樣,steps 的冒號要比 step 多一個。

在 GitHub 上修改這一頁