# 內容與檔案

本頁說明如何讀寫 `MDEditor` 的內容：初始化、取得文字、清空、開啟 Markdown 檔、匯出檔案與儲存回呼。

## 方法

| 方法 | 說明 |
|---|---|
| `init(text?, withFocus = true, set = true)` | 以 `text`（或尚未使用的 `defaultContent`）重建所有列；`set` 為真時寫入一筆復原紀錄 |
| `text` | 唯讀屬性，回傳各列 `innerText` 以 `\n` 串接的結果 |
| `clear()` | 呼叫 `init()` 清空並更新預覽 |
| `selectAll()` | 選取從第一列到最後一列的全部文字 |
| `openfile(file)` | 以 `FileReader` 讀取 `File` 物件並載入，完成後更新預覽；未傳入時跳出 `alert("請選擇檔案")` |
| `download(type = "md")` | 匯出檔案，`type` 為 `"md"` 或 `"html"`，其他值直接忽略 |
| `save()` | 觸發儲存流程，見下節 |
| `unsave()` | 把編輯器與綁定預覽器的 `data-saved` 設為 `0` |
| `changeMode(mode = "light")` | 切換主題，見 [主題](/theming) |

`init()` 會先把容器 `innerHTML` 清空再重建，也會重新建立工具列。直接呼叫時不會更新預覽，需要時接著呼叫 `editor.viewer.init()`。

## 開啟檔案

```html
<input type="file" accept=".md" onchange="editor.openfile(this.files[0])">
```

讀入的文字會 `trim()`，並把一般空白與不換行空白統一為一般空白。`openfile()` 先呼叫 `clear()`，所以原內容會留在復原紀錄中。

## 匯出

| `type` | 檔名 | 內容 |
|---|---|---|
| `"md"` | `NanoMD-<timestamp>.md` | `editor.text.trim()` |
| `"html"` | `NanoMD-<timestamp>.html` | 完整 HTML 文件：`<section class="pd-md-viewer">` 包住擴充模式轉換結果，並引用 CDN 上的 `NanoMD-output.css`（固定 1.11.6 版）、Material Symbols 與 code-prettify |

匯出的 HTML 沒有載入 Mermaid，Mermaid 區塊會以原始碼文字呈現。檔案以 `application/octet-stream` Blob 下載。

## 儲存流程

`save()`（也由 `Cmd/Ctrl+S` 觸發）依 `autosave` 與 `event.save` 決定行為：

| `autosave` | `event.save` | 行為 |
|---|---|---|
| 真 | 有函式 | 呼叫 `event.save(editor.text)` |
| 真 | 未設定 | 跳出匯出視窗（Markdown／HTML／Cancel） |
| 假 | 有函式 | 先更新預覽，再呼叫 `event.save(editor.text)` |
| 假 | 未設定 | 只更新預覽 |
| 任一 | 明確設為 `null` | 回傳 `false`，不做其他事（`autosave` 為假時預覽仍會先更新） |

```javascript
const editor = new MDEditor({
    id: "editor",
    event: {
        save: (text) => fetch("/api/save", { method: "POST", body: text })
    }
});
```
