法規自動化(?)開發筆記 === ![](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