Skip to content

Instantly share code, notes, and snippets.

@CosmicToast
Created June 4, 2023 20:21
Show Gist options
  • Save CosmicToast/a620f7ed40fbac87e2d4d3ed4fab892f to your computer and use it in GitHub Desktop.
Save CosmicToast/a620f7ed40fbac87e2d4d3ed4fab892f to your computer and use it in GitHub Desktop.

Revisions

  1. CosmicToast created this gist Jun 4, 2023.
    29 changes: 29 additions & 0 deletions jamplate.janet
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,29 @@
    (def- opener "<?janet")
    (def- closer "?>")
    (def- file ~{:main (some (+ :code :text))
    :text '(to (+ ,opener -1))
    :code (/ :code* ,parse-all)
    :code* (* ,opener '(to ,closer) ,closer)})

    (defn template-string
    [s]
    (def out @"")
    (def env (make-env))
    (put env :out out)
    (def mch (peg/match file s))
    (each v mch
    (if (array? v)
    (do (def fib (fiber/new (fn [] ((compile v env))) :a))
    (fiber/setenv fib env)
    (resume fib))
    (buffer/push out v)))
    out)

    # example
    (print (template-string ```
    before
    <?janet (def bye "bye") (prin "hi") ?>
    middle
    <?janet (prin bye) ?>
    after
    ```))