mirror of
https://github.com/urbit/shrub.git
synced 2024-12-12 18:48:14 +03:00
60 lines
2.2 KiB
Plaintext
60 lines
2.2 KiB
Plaintext
::
|
|
:::: 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)))
|
|
::
|
|
--
|