---
# System prepended metadata

title: 法規自動化（？）開發筆記
tags: [development note, '2020-02-19']

---

法規自動化（？）開發筆記
===
![](https://i.imgur.com/NMMX8No.png)

前言（廢話）
---
如果 DNA 是驅動生物的腳本，那麼法規就是驅動法治社會的腳本，根據需求我們經常需要新增、修改乃至刪除法規與條文。在我參與學生自治的過程中，學生對法規有著十分遙遠的距離感，哪怕只是適用於學生自治組織內部的自治章規，都必須經過下述過程（理想情況）：

1. 起草草案
2. 討論與修正
3. 決議通過
4. 製作文件
5. 發佈或歸檔

目前主流的法規載體仍以辦公文書軟體生成的檔案為主（.doc, .docx, .odt），生手經常需要花費許多時間在處理排版，學生（筆者觀察到的對象）普遍文書處理能力低落，而這將成為學生接觸法規的障礙之一。聲明一點，我對學生文書處理能力的描述並不是指控，這個部份我會在文章其他部份做解釋。

建立與修改法規的成本過高，就會造成沒有人在執行「法治」了，組織運作會回歸人治，如果經驗會累積還好說，學生自治組織會把人員流動的缺點放大數倍。如果把一個學生組織整體視作一個[巨靈 (Leviathan)](https://zh.wikipedia.org/wiki/利維坦)，那它將患有有嚴重的失意症，好一點的情況（學長姊繼續參與組織經營）它會忘記四年前發生的事，糟一點的情況（學長姊卸幹之後就蒸發）它會忘記去年發生的事。如果一個沒有本能卻有嚴重的失憶症的生物，它很快就會死在自然環境之中，學生組織的死亡...當然就是解散了。然而，校方為了維持學生自治的假象，無所不用其極的讓已經「腦死」的學生組織「插管」勉強撐著的情況也不是沒有，不過那已經不是本文的重點了。

這便是為什麼我認為「使用法律」這個前提對學生自治組織格外重要，當然這個論述有延伸的空間；我相信「使用法律」對法治社會中的每一位公民同樣重要，只是不使用法律的後果在學生自治組織上會被放大數倍。

另外一個切入點：文件開放的程度。辦公文書軟體生成的檔案僅有兩顆星的開放程度，這代表：
> 資料仍被鎖在文件裡，為了取得資料，必須使用專屬的軟體[^open-star]

目前辦公文書軟體多為適應桌上型電腦的環境而誕生，然而隨著時代變遷，年輕一代平均使用智慧型手機的時間遠比桌上型電腦來得長，而智慧型手機的產品定位本來就不包含辦公文書工作，這造成學生製作法規文件的機會成本變得更高。

文件的開放程度更會間接影響管理法規文件的容易程度，結構化的資料電腦處理起來才能事半工倍。能夠容易被電腦處理的資料，就越容易改變資料載體，比如：APP, 網頁...，也越容易被整理與管理。

然而事實是，法規是一種抽象概念，其載體其實並沒有十分硬性的規定。考慮法規的彈性，它是一種半結構化資料，JSON 似乎是一種合理的格式，但是它不夠容易被閱讀與編輯。容易被機器翻譯，人類也方便撰寫和閱讀的格式，Markdown 似乎符合這樣的描述。(⊙▽⊙)

讓我們來整理一下：
- 目標：讓使用法律 ~~跟呼吸一樣簡單~~ 更簡單。
- 具體一點的目標：
  1. 起草法規容易
  2. 討論時編輯條文容易
  3. 文件容易往來（不發生跑版）
  4. 能夠轉換成辦公文書格式兼容學校行政體系

簡單約束一下 markdown 的使用習慣，其實就能滿足前三項了，但是在學校的生態中必須能夠與校方的行政系統溝通，不然沒有太大的意義，於是這個環節便扮演了重要的角色。

Markdown 法規
---
描述法規不需要用到 Markdown 的所有語法，因此給出了一些用 markdown 描述法規的建議。嘛，總之我的軟體會照這個 feature 設計就對了。

### 一階標題
定義法規的名稱，請不要重複使用，第二個一階標題會直接被忽略。

```markdown
# 上廁所管理辦法
```
or
```markdown
上廁所管理辦法
===
```
※開個小玩笑，不少人有一群人去上廁所的習慣，讓我們規範一下這個習慣吧～（x

### 三階標題
如果有需要的話，可以分章節，因為只是寫給輕量級的法規使用，因此暫時不支援編、節、款、目這些法規結構。

```markdown
### 總則
```

### 六階標題
紀錄法規制定、修訂與廢止的歷程。

```markdown
###### 西元2020年2月2號制定
###### 西元220年2月22號修正
```

### 清單
描述條文條、項、款、目，不同類型的清單語法在解析後並不會有所差異，主要用縮排來區分條文層級，一個定位字元等同四個空格，反之亦然。

```markdown
1. 這是一條法規。
	- 這是它的項，而且還有款：
		1. 這是第一條第一項第一款。
```

Markdown 法規轉辦公文書文件
---
這個任務可以拆成兩個子任務：
1. 解析 Markdown 法規（轉 JSON ）
2. 生成文件（將 JSON 填入文件）

### Markdown to JSON
在這個任務中，又有幾個主要的流程：
1. 正規化
    - 將標題統一成 `#` 的格式
    - 將清單符號統一成無序清單
    - 刪除多餘的換行
2. 抽出法規資料
    - 將法規名稱、法規歷程與條文分別抽出
3. 建構 JSON
    - 將法規資料打包成 JSON 格式

#### 法規資料（半）結構化
如何以 JSON 表示一部法規是一個問題。讓我們簡單思考兩種情況：
```json
"條"
```

```json
"條":[]
```

差異在於**有沒有**子項目，假設這兩個條款是同級的，我們應該怎麼放到 json 內？因為法規條文不會重複，所以我選擇直接把條文放在鍵值，為了維持巢狀結構的對稱性，沒有子項目的條文就放一個空物件：

```json
{
  "第1條":{},
  "第2條":{"第1款":{}}
}
```

#### 實做
https://github.com/FlySkyPie/markdown-regulation-parser

### 生成文件
方便修改的辦公文書文件就屬 OpenDocumentText 了。odt 文件就是一個 ZIP 壓縮檔，裡面最關鍵的兩個檔案： `content.xml` 和 `styles.xml` 分別描述了內文和樣式。

因為大部分是看著 spec 實做的，也就沒什麼好描述的。

#### 實做
https://github.com/FlySkyPie/regulation-odt

#### OpenDocument (text) Specifications
也許有人對 spec 有興趣（？），在這裡留個註腳。

- [OpenOffice.org XML File Format 1.0](http://www.openoffice.org/xml/xml_specification.pdf)[^ooxml]
- [Open Document Format v1.0 ](https://www.oasis-open.org/committees/download.php/12572/OpenDocument-v1.0-os.pdf)[^oasis-open-1]
- Open Document Format for OfficeApplications (OpenDocument)Version 1.2[^oasis-open-1-2]
  - [Master Table of Contents](http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2.pdf)
  - [Part 1: OpenDocument Schema](http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part1.pdf
)
  - [Part 2: Recalculated Formula (OpenFormula) Format](http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part2.pdf)
  - [Part 3: Packages](http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2-part3.pdf)
- Open Document Format for Office Applications (OpenDocument) Version 1.3[^oasis-open-1-3]
  - [Part 1: Introduction](https://docs.oasis-open.org/office/OpenDocument/v1.3/cs01/part1-introduction/OpenDocument-v1.3-cs01-part1-introduction.pdf)
  - [Part 2: Packages](https://docs.oasis-open.org/office/OpenDocument/v1.3/cs01/part2-packages/OpenDocument-v1.3-cs01-part2-packages.pdf)
  - [Part 3: OpenDocument Schema](https://docs.oasis-open.org/office/OpenDocument/v1.3/cs01/part3-schema/OpenDocument-v1.3-cs01-part3-schema.pdf)
  - [Part 4: Recalculated Formula (OpenFormula) Format](https://docs.oasis-open.org/office/OpenDocument/v1.3/cs01/part4-formula/OpenDocument-v1.3-cs01-part4-formula.pdf)

成品
---
{%youtube 6k2gvw3NZw0 %}

###### tags: `development note` `2020-02-19`



[^open-star]: 開放資料的五顆星. (n.d.). Retrieved 2020-02-19, from https://5stardata.info/zh-TW/#addendum2

[^ooxml]:  OpenOffice.org XML File Format. (n.d.). Retrieved 2020-02-19, from https://www.openoffice.org/xml/general.html
[^oasis-open-1]:  OASIS Open Document Format for Office Applications (OpenDocument) TC | OASIS. (n.d.). Retrieved 2020-02-19, from https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=office
[^oasis-open-1-2]:  (ANN) Open Document V1.2 OASIS Standard published. (Chet Ensign). Retrieved 2020-02-19, from https://lists.oasis-open.org/archives/tc-announce/201201/msg00001.html
[^oasis-open-1-3]: Open Document Format for Office Applications (OpenDocument) v1.3 from the OpenDocument TC approved as a Committee Specification | OASIS. (n.d.). Retrieved 2020-02-19, from https://www.oasis-open.org/news/announcements/open-document-format-for-office-applications-opendocument-v1-3-from-the-opendocum
