mirror of
https://github.com/janet-lang/janet
synced 2024-12-01 04:19:55 +00:00
Fix some typos and update style.
Add bars.janet tool for templating arbitrary strings, especially HTML.
This commit is contained in:
parent
4bcf6565cd
commit
367c9da856
@ -228,7 +228,7 @@ static double convert(
|
|||||||
bignat_lshift_n(mant, shamt);
|
bignat_lshift_n(mant, shamt);
|
||||||
exponent2 -= shamt * BIGNAT_NBIT;
|
exponent2 -= shamt * BIGNAT_NBIT;
|
||||||
for (;exponent < -3; exponent += 4) bignat_div(mant, base * base * base * base);
|
for (;exponent < -3; exponent += 4) bignat_div(mant, base * base * base * base);
|
||||||
for (;exponent < -2; exponent += 2) bignat_div(mant, base * base);
|
for (;exponent < -1; exponent += 2) bignat_div(mant, base * base);
|
||||||
for (;exponent < 0; exponent += 1) bignat_div(mant, base);
|
for (;exponent < 0; exponent += 1) bignat_div(mant, base);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,8 +65,8 @@
|
|||||||
# as the version being generated
|
# as the version being generated
|
||||||
(print "#define JANET_BUILD \"" janet/build "\"")
|
(print "#define JANET_BUILD \"" janet/build "\"")
|
||||||
|
|
||||||
(print ```#define JANET_AMALG
|
(print ```#define JANET_AMALG```)
|
||||||
#include "janet.h"```)
|
(print ```#include "janet.h"```)
|
||||||
|
|
||||||
(each h headers (dofile h))
|
(each h headers (dofile h))
|
||||||
(each s sources (dofile s))
|
(each s sources (dofile s))
|
||||||
|
55
tools/bars.janet
Normal file
55
tools/bars.janet
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
# A flexible templater for janet. Compiles
|
||||||
|
# templates to janet functions that produce buffers.
|
||||||
|
|
||||||
|
(defn template
|
||||||
|
"Compile a template string into a function"
|
||||||
|
[source]
|
||||||
|
|
||||||
|
# State for compilation machine
|
||||||
|
(def p (parser/new))
|
||||||
|
(def forms @[])
|
||||||
|
|
||||||
|
(defn parse-chunk
|
||||||
|
"Parse a string and push produced values to forms."
|
||||||
|
[chunk]
|
||||||
|
(parser/consume p chunk)
|
||||||
|
(while (parser/has-more p)
|
||||||
|
(array/push forms (parser/produce p)))
|
||||||
|
(if (= :error (parser/status p))
|
||||||
|
(error (parser/error p))))
|
||||||
|
|
||||||
|
(defn code-chunk
|
||||||
|
"Parse all the forms in str and return them
|
||||||
|
in a tuple prefixed with 'do."
|
||||||
|
[str]
|
||||||
|
(parse-chunk str)
|
||||||
|
true)
|
||||||
|
|
||||||
|
(defn string-chunk
|
||||||
|
"Insert string chunk into parser"
|
||||||
|
[str]
|
||||||
|
(parser/insert p str)
|
||||||
|
(parse-chunk "")
|
||||||
|
true)
|
||||||
|
|
||||||
|
# Run peg
|
||||||
|
(def grammar
|
||||||
|
~{:code-chunk (* "{%" (drop (cmt '(any (if-not "%}" 1)) ,code-chunk)) "%}")
|
||||||
|
:main-chunk (drop (cmt '(any (if-not "{%" 1)) ,string-chunk))
|
||||||
|
:main (any (+ :code-chunk :main-chunk (error "")))})
|
||||||
|
(def parts (peg/match grammar source))
|
||||||
|
|
||||||
|
# Check errors in template and parser
|
||||||
|
(unless parts (error "invalid template syntax"))
|
||||||
|
(parse-chunk "\n")
|
||||||
|
(case (parser/status p)
|
||||||
|
:pending (error (string "unfinished parser state " (parser/state p)))
|
||||||
|
:error (error (parser/error p)))
|
||||||
|
|
||||||
|
# Make ast from forms
|
||||||
|
(def ast ~(fn [params &] (default params @{}) (,buffer ;forms)))
|
||||||
|
|
||||||
|
(def ctor (compile ast *env* source))
|
||||||
|
(if-not (function? ctor)
|
||||||
|
(error (string "could not compile template")))
|
||||||
|
(ctor))
|
Loading…
Reference in New Issue
Block a user