sicp 的筆記格式

去年暑假讀 sicp 時有邊讀邊寫筆記, 一小節的程式一個檔案,還為自己方便,記筆記有一些規則。 免強能直接在 github 上看,在本機則沒有適合的方法。 今天繼續讀下去,花一天寫了一個 簡單的 web 閱讀器

習慣就一個小節的程式寫在同一個 *.sch 檔, 然後每小節、每個 sch 檔也寫一個同名 *.md , 記錄一下寫了什麼,這小節在講什麼, 程式有什麼心得感想。

然後每章一個目錄,一章有數個小節, 各 sch md 都在同一個目錄裡。 章的目錄再一個 README.md 寫這章的心得當目錄。

功能與實作

實作有考慮二種作法:

  1. 寫 script,自動遍歷所有文件和程式,生出一份完整的文件。 好處是生成可以是 html 甚至 readme, 可以從 emacs 或其它 editor 讀。

  2. 寫 web,用 ajax 載入 local 或 github page 上的 readme, 用 marked 生成 html。 好處是可以直從瀏覽器讀,壞處也是得用瀏覽器讀。

總之目前是寫出一個 reader , 用 fetch api 讀文件, 還可以用 firefox file:// 讀喔, 或 github page 上也可以。

之後也許轉成 js lib 之類的? 感覺有這樣的需要, 能讀散落在各子目錄的 markdown 和程式。 之前 ccns 的 kevin cyu 有做過類似的, 是生出一個 html 文件。

fetch policy

在用firefox file:// 協定開本機目錄時, 會列出目錄下的所有檔案。

firefox local directory

但不能用這個查目錄下有什麼檔案, 如果你在 file:///www/readme.htmlfetch('./') 是抓不到東西的。

firefox在 file: 下是能ajax同一層和所有子目錄內容, 但在瀏覽目錄時的自動列出功能,是不能被ajax的。 而chrome是全部鎖起來, 在file協定下沒有地方是same origin。

實作困難

我本來想用iframe直接看readme, 在onload事件後, 再用 marked 把iframe的內容轉成html。 結果發現iframe開 *.md 會彈出下載視窗, 不像 *.txt 是能直接看。

後來改用 history.pushState() , 直接把現在的路徑push成所閱讀的markdown的路徑。 但這有個問題,原始程式和url是 file:///home/gholk/sicp/index.html , 讀個幾次後變成 file:///home/gholk/sicp/exercise/1/fast-expt.md , 之後F5重新整理,或從其它地方直接開這個url, 會跳出叫你下載的視窗,或就看到原始的markdown, 而不是 index.html 渲染的markdown。

後來改成把path存在query string, 但會有相對路徑的問題, 像 1/README.md 裡名為 fast-expt.md 的超連結 是指向同一層的 1/fast-expt.md , 但如果直接 fetch('fast-expt.md') 會指向 index.html 所在的目錄下的 fast-expt.md

我是用html的新的URL 物件解決,能計算相對路徑。 像 new URL('helo/world', 'file:///home/gholk/index.html') 就會是 file:///home/gholk/helo/world , 連 ... 都能處理, 但注意尾部的斜線有影響。