:: :::: hoon/cram/gen :: :: test generator for the cram markdown syntax :: :: todo: integrate with ++sail and embed in hoon compiler :: :: ++cram is a simple markdown-inspired parser that makes :: common html tropes easy to type. you can think of ++cram :: as "rational markdown" or "markdown with syntax errors." :: a document format should be easy to type and read, but :: that doesn't mean it can't or have rigorous syntax. :: :: tldr: ++cram is indent-oriented. indent 2 spaces for :: a dynamic interpolation, 4 spaces for example code, 6 :: spaces for a blockquote and 8 spaces for verse. separate :: every semantic block by a blank line. use - for :: unordered lists, + for ordered lists. :: :: markdown link syntax works. * means bold, _ means :: italics, "" inserts smart quotes. all enclosed :: strings are reparsed; escape the terminator within :: the string, eg, *star \* in bold text*. :: :: markdown `literal` syntax is supported, but all hoon :: constants are automatically marked as code. also, any :: hoon expression prefixed with # is a code literal. :: :: (++cram is a valid hoon parsing rule, but it does a lot :: of custom processing internally, since the language is :: context-sensitive. we use a context-sensitive parser :: to cut the lines into blocks, then reparse flow blocks :: with normal hoon rules. multipass parsing is the tax :: humans have to pay for simple but human-friendly syntax.) :: ::|= inp/cord ::=< (steam-marl (rash inp apex:(sail &))) =< |=(pax/path (test pax)) |% :: ++ test :: test text parsing |= pax/path ^- tape :: :: src: text file as (list cord) :: txt: source as tape with newlines :: vex: parsing result :: =/ src .^(wain %cx pax) =. src ['---' src] =/ txt (zing (turn src |=(@t (weld (rip 3 +<) `tape`~[`@`10])))) =/ vex (cram:vast [1 1] txt) :: :: print result as error or xml text ?~ q.vex "syntax error: line {(scow %ud p.p.vex)}, column {(scow %ud q.p.vex)}" ?: [freeze=|] (poxo (snag 1 ~(shut ap p.u.q.vex))) (poxo ;;(manx q:(slap !>(..zuse) p.u.q.vex))) :: --