sicp 的筆記格式
去年暑假讀 sicp 時有邊讀邊寫筆記, 一小節的程式一個檔案,還為自己方便,記筆記有一些規則。 免強能直接在 github 上看,在本機則沒有適合的方法。 今天繼續讀下去,花一天寫了一個 簡單的 web 閱讀器 。
習慣就一個小節的程式寫在同一個 *.sch
檔,
然後每小節、每個 sch 檔也寫一個同名 *.md
,
記錄一下寫了什麼,這小節在講什麼,
程式有什麼心得感想。
然後每章一個目錄,一章有數個小節,
各 sch md 都在同一個目錄裡。
章的目錄再一個 README.md
寫這章的心得當目錄。
功能與實作
- 讀取
*.md
時,如果存在*.sch
就一併顯示。 - 進入目錄時,自動顯示
README.md
。 - 之前有把各檔的檔名用 markdown 超連結語法,寫到 readme 裡, 所以掃描還沒有必要。
實作有考慮二種作法:
寫 script,自動遍歷所有文件和程式,生出一份完整的文件。 好處是生成可以是 html 甚至 readme, 可以從 emacs 或其它 editor 讀。
寫 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://
協定開本機目錄時,
會列出目錄下的所有檔案。
但不能用這個查目錄下有什麼檔案,
如果你在 file:///www/readme.html
,
fetch('./')
是抓不到東西的。
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
,
連 .
和 ..
都能處理,
但注意尾部的斜線有影響。