(local util (require :lua.util))
(local indent-level " ")
(fn copy-range [t from to]
(assert (util.array? t) (.. "Table is not an array" (_G.fennel.view t)))
(let [r {}]
(for [idx from to]
(tset r (+ 1 (- idx from)) (. t idx)))
r))
(lambda escape-html [writer str]
(for [idx 1 (length str)]
(case (str:byte idx)
(where [b] (= b (str:byte "&"))) (writer:write "&")
(where [b] (= b (str:byte "<"))) (writer:write "<")
(where [b] (= b (str:byte ">"))) (writer:write ">")
(where [b] (= b (str:byte "\""))) (writer:write """)
(where [b] (= b (str:byte "'"))) (writer:write "'")
_ (writer:write-byte (string.byte str idx)))))
(lambda write-level [writer level]
(for [_idx 1 level]
(writer:write indent-level))
)
(fn render-attrs [writer attrs]
(if attrs
(each [key value (pairs attrs)]
(writer:write " ")
(writer:write key)
(writer:write "=\"")
; TODO should attrs be escaped differently?
(escape-html writer (tostring value))
(writer:write "\""))))
(local render-containers
{:doc {:kind :function
:begin (fn [_writer _attrs])
:end (fn [_writer _attrs])}
:heading {:kind :function
:begin (fn [writer attrs]
(writer:write "
"))
:end (fn [writer _attrs]
(writer:write ""))}
:unordered-list {:kind :function
:begin (fn [writer attrs]
(writer:write "")) :end (fn [writer _attrs] (writer:write "
"))} :section {:kind :function :begin (fn [writer attrs] (writer:write "