{hesc(nsname)}
{hesc(e.sig)}{hesc(e.tip)}`)
}
sb_puts(b, `diff --git a/tools/atlas.ludic b/tools/atlas.ludic index e12791c9..20006f40 100644 --- a/tools/atlas.ludic +++ b/tools/atlas.ludic @@ -1,56 +1,41 @@ -# ============================================================================ # atlas.ludic — render a Kenney tile pack as one index-labeled sheet, so you can # see which sprite id is which before referring to it in a game. # -# ludicc tools/atlas.ludic --headless -o build/atlas -# ./build/atlas && sips -s format png out.ppm --out atlas.png +# bin/ludicc --headless tools/atlas.ludic -o build/atlas +# ./build/atlas < /dev/null && sips -s format png build/out.ppm --out atlas.png # -# Replaces the old tools/atlas.c, which used the C runtime that no longer -# exists. It is the same program, in the language it is a tool for. -# ============================================================================ -game Atlas { - const DIR: str = "assets/kenney/tiny-dungeon/Tiles" - const N: int = 132 - const COLS: int = 12 +# A tool written in the language it is a tool for: one Start handler draws every +# tile with its number underneath and quits, and the headless build leaves the +# frame in build/out.ppm. +program Atlas { + const DIR: string = "assets/kenney/tiny-dungeon/Tiles" + const TILE_COUNT: int = 132 # tile_0000.png … tile_0131.png + const COLUMNS: int = 12 const CELL: int = 24 + const SPRITE_INSET_X: int = 4 # centre a 16px sprite in a 24px cell + const SPRITE_INSET_Y: int = 2 + const LABEL_INSET_X: int = 1 + const LABEL_INSET_Y: int = 18 + const BACKDROP: int = 0x101018 + const LABEL_COLOR: int = 0x8090b0 - system Sheet phase Start { - clear(0x101018) - for i in 0 .. N { - let col = i % COLS - let row = i / COLS - let x = col * CELL - let y = row * CELL - # tile_0000.png … tile_0131.png — the id is the file's number - let id = load_png(tile_path(i)) - if id >= 0 { - draw_sprite(id, x + 4, y + 2) - } - text_int(x + 1, y + 18, i, 0x8090b0, 1) + # "
")
var k = i + 1
- while k < j { sb_putc(b, s[k]); k = k + 1 }
+ while k < j { sb_putc(b, s[k]); k += 1 }
sb_puts(b, "")
i = j + 1
} else {
- sb_putc(b, 96)
- i = i + 1
+ sb_putc(b, '`')
+ i += 1
}
} else {
sb_putc(b, s[i])
- i = i + 1
+ i += 1
}
}
return sb_str(b)
@@ -204,7 +204,7 @@ function jva() -> JVal { return jval_new(JV_ARR) }
# token collides across kinds (e.g. `exit`/`string`/`fixed`) in sym["tips"].
function jvput(o: JVal, k: pointer, v: JVal) -> void {
var i = 0
- while i < len(o.keys) { if o.keys[i] == k { o.kids[i] = v; return }; i = i + 1 }
+ while i < len(o.keys) { if o.keys[i] == k { o.kids[i] = v; return }; i += 1 }
push(o.keys, k)
push(o.kids, v)
}
@@ -215,7 +215,7 @@ function hex_lower(n: int) -> int {
return 87 + n
}
function jemit_u(b: Sb, cp: int) -> void {
- sb_putc(b, 92); sb_putc(b, 117) # \u
+ sb_putc(b, '\\'); sb_putc(b, 'u') # \u
sb_putc(b, hex_lower((cp >> 12) & 15))
sb_putc(b, hex_lower((cp >> 8) & 15))
sb_putc(b, hex_lower((cp >> 4) & 15))
@@ -228,20 +228,20 @@ function json_escape_into(b: Sb, s: pointer, ensure_ascii: bool) -> void {
var i = 0
while i < n {
let c = s[i] & 255
- if c == 34 { sb_putc(b, 92); sb_putc(b, 34); i = i + 1 }
- else if c == 92 { sb_putc(b, 92); sb_putc(b, 92); i = i + 1 }
- else if c == 8 { sb_putc(b, 92); sb_putc(b, 98); i = i + 1 }
- else if c == 9 { sb_putc(b, 92); sb_putc(b, 116); i = i + 1 }
- else if c == 10 { sb_putc(b, 92); sb_putc(b, 110); i = i + 1 }
- else if c == 12 { sb_putc(b, 92); sb_putc(b, 102); i = i + 1 }
- else if c == 13 { sb_putc(b, 92); sb_putc(b, 114); i = i + 1 }
- else if c < 32 {
- sb_putc(b, 92); sb_putc(b, 117); sb_putc(b, 48); sb_putc(b, 48)
+ if c == '"' { sb_putc(b, '\\'); sb_putc(b, '"'); i += 1 }
+ else if c == '\\' { sb_putc(b, '\\'); sb_putc(b, '\\'); i += 1 }
+ else if c == 8 { sb_putc(b, '\\'); sb_putc(b, 'b'); i += 1 }
+ else if c == '\t' { sb_putc(b, '\\'); sb_putc(b, 't'); i += 1 }
+ else if c == '\n' { sb_putc(b, '\\'); sb_putc(b, 'n'); i += 1 }
+ else if c == 12 { sb_putc(b, '\\'); sb_putc(b, 'f'); i += 1 }
+ else if c == '\r' { sb_putc(b, '\\'); sb_putc(b, 'r'); i += 1 }
+ else if c < ' ' {
+ sb_putc(b, '\\'); sb_putc(b, 'u'); sb_putc(b, '0'); sb_putc(b, '0')
sb_putc(b, hex_lower((c >> 4) & 15)); sb_putc(b, hex_lower(c & 15))
- i = i + 1
+ i += 1
}
- else if c < 128 { sb_putc(b, c); i = i + 1 }
- else if not ensure_ascii { sb_putc(b, c); i = i + 1 }
+ else if c < 128 { sb_putc(b, c); i += 1 }
+ else if not ensure_ascii { sb_putc(b, c); i += 1 }
else {
var cp = 0
var nb = 1
@@ -249,8 +249,8 @@ function json_escape_into(b: Sb, s: pointer, ensure_ascii: bool) -> void {
else if c < 240 { cp = c - 224; nb = 3 }
else { cp = c - 240; nb = 4 }
var k = 1
- while k < nb and i + k < n { cp = cp * 64 + ((s[i + k] & 255) - 128); k = k + 1 }
- i = i + nb
+ while k < nb and i + k < n { cp = cp * 64 + ((s[i + k] & 255) - 128); k += 1 }
+ i += nb
if cp <= 65535 { jemit_u(b, cp) }
else {
let c2 = cp - 65536
@@ -262,7 +262,7 @@ function json_escape_into(b: Sb, s: pointer, ensure_ascii: bool) -> void {
}
function json_indent(b: Sb, depth: int) -> void {
var i = 0
- while i < depth { sb_putc(b, 32); sb_putc(b, 32); i = i + 1 }
+ while i < depth { sb_putc(b, ' '); sb_putc(b, ' '); i += 1 }
}
# pretty=true reproduces json.dumps(indent=2); pretty=false the compact default
# (item sep ", ", key sep ": "). ensure_ascii toggles \uXXXX for non-ASCII.
@@ -273,36 +273,36 @@ function jwrite(b: Sb, v: JVal, pretty: bool, depth: int, ea: bool) -> void {
return
}
if v.t == JV_NUM { sb_puts(b, string(v.num)); return }
- if v.t == JV_STR { sb_putc(b, 34); json_escape_into(b, v.s, ea); sb_putc(b, 34); return }
+ if v.t == JV_STR { sb_putc(b, '"'); json_escape_into(b, v.s, ea); sb_putc(b, '"'); return }
if v.t == JV_ARR {
let m = len(v.kids)
if m == 0 { sb_puts(b, "[]"); return }
- sb_putc(b, 91)
+ sb_putc(b, '[')
var i = 0
while i < m {
- if pretty { sb_putc(b, 10); json_indent(b, depth + 1) }
+ if pretty { sb_putc(b, '\n'); json_indent(b, depth + 1) }
jwrite(b, v.kids[i], pretty, depth + 1, ea)
- if i < m - 1 { sb_putc(b, 44); if not pretty { sb_putc(b, 32) } }
- i = i + 1
+ if i < m - 1 { sb_putc(b, ','); if not pretty { sb_putc(b, ' ') } }
+ i += 1
}
- if pretty { sb_putc(b, 10); json_indent(b, depth) }
- sb_putc(b, 93)
+ if pretty { sb_putc(b, '\n'); json_indent(b, depth) }
+ sb_putc(b, ']')
return
}
let m = len(v.keys)
if m == 0 { sb_puts(b, "{}"); return }
- sb_putc(b, 123)
+ sb_putc(b, '{')
var i = 0
while i < m {
- if pretty { sb_putc(b, 10); json_indent(b, depth + 1) }
- sb_putc(b, 34); json_escape_into(b, v.keys[i], ea); sb_putc(b, 34)
- sb_putc(b, 58); sb_putc(b, 32)
+ if pretty { sb_putc(b, '\n'); json_indent(b, depth + 1) }
+ sb_putc(b, '"'); json_escape_into(b, v.keys[i], ea); sb_putc(b, '"')
+ sb_putc(b, ':'); sb_putc(b, ' ')
jwrite(b, v.kids[i], pretty, depth + 1, ea)
- if i < m - 1 { sb_putc(b, 44); if not pretty { sb_putc(b, 32) } }
- i = i + 1
+ if i < m - 1 { sb_putc(b, ','); if not pretty { sb_putc(b, ' ') } }
+ i += 1
}
- if pretty { sb_putc(b, 10); json_indent(b, depth) }
- sb_putc(b, 125)
+ if pretty { sb_putc(b, '\n'); json_indent(b, depth) }
+ sb_putc(b, '}')
}
function json_dumps(v: JVal, pretty: bool, ea: bool) -> pointer {
let b = sb_new()
@@ -571,11 +571,10 @@ function palette_emit_ludic(path: pointer) -> bool {
var i = 0
while i < len(pal_names) {
sb_puts(b, ` if (name == "{pal_names[i]}") {{ return 0x{pal_hexes[i]} }}\n`)
- i = i + 1
+ i += 1
}
sb_puts(b, " return -1\n")
sb_puts(b, "}\n")
- sb_puts(b, "\n")
return write_file(path, sb_str(b))
}
@@ -609,19 +608,23 @@ function palette_emit_json(path: pointer) -> bool {
sb_puts(b, ` "hex": "{pal_hexes[ci]}"\n`)
sb_puts(b, " }")
}
- ci = ci + 1
+ ci += 1
}
sb_puts(b, "\n ]\n")
sb_puts(b, " }")
}
- gi = gi + 1
+ gi += 1
}
sb_puts(b, "\n ]\n")
sb_puts(b, "}")
return write_file(path, sb_str(b))
}
+# `x docs-palette` rewrites the two tracked outputs; `x docs-palette --check`
+# regenerates into scratch files and compares them to the tracked ones instead,
+# so the drift guard judges the working tree, not git HEAD.
function cmd_docs_palette() -> int {
+ let check = arg_count() > 2 and arg(2) == "--check"
palette_init()
# guard: duplicate names
let seen = new []pointer
@@ -629,10 +632,17 @@ function cmd_docs_palette() -> int {
while i < len(pal_names) {
if set_has(seen, pal_names[i]) { err(`DUPLICATE NAME: {pal_names[i]}\n`); return 1 }
push(seen, pal_names[i])
- i = i + 1
+ i += 1
+ }
+ var ludic_out = "selfhost/backend/stdlib/emit_color.ludic"
+ var json_out = "docs/language/colors/palette.json"
+ if check { ludic_out = tmp_path("pal_emit_color.ludic"); json_out = tmp_path("pal_palette.json") }
+ if not palette_emit_ludic(ludic_out) { err("cannot write emit_color.ludic\n"); return 1 }
+ if not palette_emit_json(json_out) { err("cannot write palette.json\n"); return 1 }
+ if check {
+ if not shq(`cmp -s {ludic_out} selfhost/backend/stdlib/emit_color.ludic`) { err("emit_color.ludic drifted from the palette table (run: x docs-palette)\n"); return 1 }
+ if not shq(`cmp -s {json_out} docs/language/colors/palette.json`) { err("palette.json drifted from the palette table (run: x docs-palette)\n"); return 1 }
}
- if not palette_emit_ludic("selfhost/backend/stdlib/emit_color.ludic") { err("cannot write emit_color.ludic\n"); return 1 }
- if not palette_emit_json("docs/language/colors/palette.json") { err("cannot write palette.json\n"); return 1 }
print(`OK {string(len(pal_names))} colors`)
return 0
}
diff --git a/tools/x/docgen_check.ludic b/tools/x/docgen_check.ludic
index 46096a59..913a613f 100644
--- a/tools/x/docgen_check.ludic
+++ b/tools/x/docgen_check.ludic
@@ -11,7 +11,7 @@ function bucket_get(bs: []Bucket, k1: pointer, k2: pointer) -> Bucket {
var i = 0
while i < len(bs) {
if bs[i].k1 == k1 and bs[i].k2 == k2 { return bs[i] }
- i = i + 1
+ i += 1
}
let b = new Bucket
b.k1 = k1
@@ -23,7 +23,7 @@ function bucket_get(bs: []Bucket, k1: pointer, k2: pointer) -> Bucket {
function bucket_add(bs: []Bucket, k1: pointer, k2: pointer, v: pointer) -> void {
let b = bucket_get(bs, k1, k2)
var i = 0
- while i < len(b.vals) { if b.vals[i] == v { return }; i = i + 1 }
+ while i < len(b.vals) { if b.vals[i] == v { return }; i += 1 }
push(b.vals, v)
}
# ", ".join(sorted(vals))
@@ -34,7 +34,7 @@ function join_sorted(vals: []pointer) -> pointer {
while i < len(vals) {
if i > 0 { sb_puts(b, ", ") }
sb_puts(b, vals[i])
- i = i + 1
+ i += 1
}
return sb_str(b)
}
@@ -70,7 +70,7 @@ function cp_len(s: pointer) -> int {
let n = slen(s)
var c = 0
var i = 0
- while i < n { if (s[i] & 192) != 128 { c = c + 1 }; i = i + 1 }
+ while i < n { if (s[i] & 192) != 128 { c += 1 }; i += 1 }
return c
}
function replace_all(hay: pointer, needle: pointer, repl: pointer) -> pointer {
@@ -80,8 +80,8 @@ function replace_all(hay: pointer, needle: pointer, repl: pointer) -> pointer {
let n = slen(hay)
var i = 0
while i < n {
- if s_starts_at(hay, i, needle) { sb_puts(b, repl); i = i + nl }
- else { sb_putc(b, hay[i]); i = i + 1 }
+ if s_starts_at(hay, i, needle) { sb_puts(b, repl); i += nl }
+ else { sb_putc(b, hay[i]); i += 1 }
}
return sb_str(b)
}
@@ -110,14 +110,14 @@ function cmd_docs_check() -> int {
var ci = 0
while ci < len(cats) {
let cat = cats[ci]
- ci = ci + 1
+ ci += 1
let cdir = "docs/language/" + cat
if not is_dir(cdir) { continue }
let files = list_sorted(cdir)
var fi = 0
while fi < len(files) {
let fn = files[fi]
- fi = fi + 1
+ fi += 1
if not s_ends(fn, ".md") { continue }
if fn == "_section.md" { continue }
let d = parse_front(cdir + "/" + fn)
@@ -143,12 +143,12 @@ function cmd_docs_check() -> int {
while k < len(inv.keys) {
let cat = inv.keys[k]
let ids = inv.kids[k]
- k = k + 1
+ k += 1
if ids.t != JV_ARR { continue }
var m = 0
while m < len(ids.kids) {
let sid = ids.kids[m].s
- m = m + 1
+ m += 1
if meta_get(id2src, sid, "") == "" { push(problems, `no source file for inventory symbol: {sid} ({cat})`) }
else if not file_exists(`{site}/{sid}.html`) { push(problems, `no generated page for symbol: {sid}.html`) }
}
@@ -160,11 +160,11 @@ function cmd_docs_check() -> int {
let tok2ids = new []Bucket # k1=kind, k2=tok -> ids
let ns2dirs = new []Bucket # k1="", k2=ns -> dirs
let id2dirs = new []Bucket # k1="", k2=section id -> dirs
- let title2dirs = new []Bucket # k1="", k2=lower(title) -> dirs
+ let title2dirs = new []Bucket # k1="", k2=lower(title) -> dirs
ci = 0
while ci < len(cats) {
let cat = cats[ci]
- ci = ci + 1
+ ci += 1
let cdir = "docs/language/" + cat
if not is_dir(cdir) { continue }
let secp = cdir + "/_section.md"
@@ -177,7 +177,7 @@ function cmd_docs_check() -> int {
var fi = 0
while fi < len(files) {
let fn = files[fi]
- fi = fi + 1
+ fi += 1
if not s_ends(fn, ".md") { continue }
if fn == "_section.md" { continue }
let d = parse_front(cdir + "/" + fn)
@@ -185,7 +185,7 @@ function cmd_docs_check() -> int {
let id = meta_get(d.m, "id", "")
let toks = split_ws(meta_get(d.m, "tokens", ""))
var ti = 0
- while ti < len(toks) { bucket_add(tok2ids, kind, toks[ti], id); ti = ti + 1 }
+ while ti < len(toks) { bucket_add(tok2ids, kind, toks[ti], id); ti += 1 }
let ns = meta_get(d.m, "ns", "")
if slen(ns) > 0 { bucket_add(ns2dirs, "", ns, cat) }
}
@@ -193,25 +193,25 @@ function cmd_docs_check() -> int {
var bi = 0
while bi < len(tok2ids) {
let b = tok2ids[bi]
- bi = bi + 1
+ bi += 1
if len(b.vals) > 1 { push(problems, `token '{b.k2}' ({b.k1}) documented on multiple pages: {join_sorted(b.vals)}`) }
}
bi = 0
while bi < len(ns2dirs) {
let b = ns2dirs[bi]
- bi = bi + 1
+ bi += 1
if len(b.vals) > 1 { push(problems, `namespace '{b.k2}' documented from multiple dirs: {join_sorted(b.vals)}`) }
}
bi = 0
while bi < len(id2dirs) {
let b = id2dirs[bi]
- bi = bi + 1
+ bi += 1
if len(b.vals) > 1 { push(problems, `section id '{b.k2}' declared by multiple dirs: {join_sorted(b.vals)}`) }
}
bi = 0
while bi < len(title2dirs) {
let b = title2dirs[bi]
- bi = bi + 1
+ bi += 1
if slen(b.k2) > 0 and len(b.vals) > 1 { push(problems, `section title '{b.k2}' shared by multiple dirs: {join_sorted(b.vals)}`) }
}
@@ -223,7 +223,7 @@ function cmd_docs_check() -> int {
while i < len(thin) and i < 12 {
if i > 0 { sb_puts(b, ", ") }
sb_puts(b, thin[i])
- i = i + 1
+ i += 1
}
var tail = ""
if len(thin) > 12 { tail = " …" }
@@ -247,18 +247,18 @@ function cmd_docs_check() -> int {
var i = 0
while i < len(targets) {
let tgt = targets[i]
- i = i + 1
+ i += 1
if not file_exists(`{site}/{tgt}.html`) { push(problems, `highlighter links to {tgt}.html but it was not generated`) }
}
}
# report
var wi = 0
- while wi < len(warnings) { print(` warning: {warnings[wi]}`); wi = wi + 1 }
+ while wi < len(warnings) { print(` warning: {warnings[wi]}`); wi += 1 }
if len(problems) > 0 {
print("docs check FAILED:")
var pi = 0
- while pi < len(problems) { print(` - {problems[pi]}`); pi = pi + 1 }
+ while pi < len(problems) { print(` - {problems[pi]}`); pi += 1 }
return 1
}
print(`docs check OK: {site} ({string(len(id2src.keys))} symbols documented)`)
@@ -271,7 +271,7 @@ function collect_targets_str(o: JVal, out: []pointer) -> void {
var i = 0
while i < len(o.kids) {
let v = o.kids[i]
- i = i + 1
+ i += 1
if v.t == JV_STR { set_add(out, v.s) }
}
}
@@ -281,7 +281,7 @@ function collect_targets_id(o: JVal, out: []pointer) -> void {
var i = 0
while i < len(o.kids) {
let v = o.kids[i]
- i = i + 1
+ i += 1
let id = j_get(v, "id")
if id.t == JV_STR { set_add(out, id.s) }
}
diff --git a/tools/x/docgen_gen.ludic b/tools/x/docgen_gen.ludic
index 63f429ce..4d0aeff8 100644
--- a/tools/x/docgen_gen.ludic
+++ b/tools/x/docgen_gen.ludic
@@ -33,13 +33,13 @@ function meta_new() -> Meta {
}
function meta_put(m: Meta, k: pointer, v: pointer) -> void {
var i = 0
- while i < len(m.keys) { if m.keys[i] == k { m.vals[i] = v; return }; i = i + 1 }
+ while i < len(m.keys) { if m.keys[i] == k { m.vals[i] = v; return }; i += 1 }
push(m.keys, k)
push(m.vals, v)
}
function meta_get(m: Meta, k: pointer, dflt: pointer) -> pointer {
var i = 0
- while i < len(m.keys) { if m.keys[i] == k { return m.vals[i] }; i = i + 1 }
+ while i < len(m.keys) { if m.keys[i] == k { return m.vals[i] }; i += 1 }
return dflt
}
@@ -54,7 +54,7 @@ function read_snippet(rel: pointer) -> pointer {
let s = read_file(rel)
if s == null { return "" }
var n = slen(s)
- while n > 0 and s[n - 1] == 10 { n = n - 1 }
+ while n > 0 and s[n - 1] == '\n' { n -= 1 }
return sslice(s, 0, n)
}
@@ -90,23 +90,23 @@ function parse_doc(path: pointer) -> Doc {
function param_match(line: pointer, p: Param) -> bool {
let n = slen(line)
var i = 0
- if i < n and line[i] == 45 { i = i + 1 } else { return false }
- while i < n and is_ws(line[i]) { i = i + 1 }
- if i < n and line[i] == 96 { i = i + 1 }
+ if i < n and line[i] == '-' { i += 1 } else { return false }
+ while i < n and is_ws(line[i]) { i += 1 }
+ if i < n and line[i] == '`' { i += 1 }
let ws = i
- while i < n and is_word(line[i]) { i = i + 1 }
+ while i < n and is_word(line[i]) { i += 1 }
if i == ws { return false }
let name = sslice(line, ws, i)
- if i < n and line[i] == 96 { i = i + 1 }
- while i < n and is_ws(line[i]) { i = i + 1 }
+ if i < n and line[i] == '`' { i += 1 }
+ while i < n and is_ws(line[i]) { i += 1 }
var sep = 0
while i < n {
- if line[i] == 45 { i = i + 1; sep = sep + 1 }
- else if (line[i] & 255) == 226 and i + 2 < n and (line[i + 1] & 255) == 128 and (line[i + 2] & 255) == 148 { i = i + 3; sep = sep + 1 }
+ if line[i] == '-' { i += 1; sep += 1 }
+ else if (line[i] & 255) == 226 and i + 2 < n and (line[i + 1] & 255) == 128 and (line[i + 2] & 255) == 148 { i += 3; sep += 1 }
else { break }
}
if sep == 0 { return false }
- while i < n and is_ws(line[i]) { i = i + 1 }
+ while i < n and is_ws(line[i]) { i += 1 }
p.name = name
p.desc = codeify(s_trim(sslice(line, i, n)))
return true
@@ -119,10 +119,10 @@ function split_paras(desc: pointer) -> []pointer {
var start = 0
var i = 0
while i < n {
- if desc[i] == 10 {
+ if desc[i] == '\n' {
var jj = i
var nl = 0
- while jj < n and is_space_all(desc[jj]) { if desc[jj] == 10 { nl = nl + 1 }; jj = jj + 1 }
+ while jj < n and is_space_all(desc[jj]) { if desc[jj] == '\n' { nl += 1 }; jj += 1 }
if nl >= 2 {
let part = s_trim(sslice(desc, start, i))
if slen(part) > 0 { push(out, part) }
@@ -132,7 +132,7 @@ function split_paras(desc: pointer) -> []pointer {
}
i = jj
} else {
- i = i + 1
+ i += 1
}
}
let last = s_trim(sslice(desc, start, n))
@@ -152,16 +152,16 @@ function split_body(body: pointer) -> Split {
let p = s_index(body, "```ludic\n", i)
if p < 0 {
var k = i
- while k < n { sb_putc(wo, body[k]); k = k + 1 }
+ while k < n { sb_putc(wo, body[k]); k += 1 }
i = n
} else {
var k = i
- while k < p { sb_putc(wo, body[k]); k = k + 1 }
+ while k < p { sb_putc(wo, body[k]); k += 1 }
let cs = p + 9
let q = s_index(body, "\n```", cs)
if q < 0 {
var k2 = p
- while k2 < cs { sb_putc(wo, body[k2]); k2 = k2 + 1 }
+ while k2 < cs { sb_putc(wo, body[k2]); k2 += 1 }
i = cs
} else {
push(r.examples, sslice(body, cs, q))
@@ -191,10 +191,10 @@ function split_body(body: pointer) -> Split {
if param_match(t2, pp) { push(r.params, pp) }
}
} else {
- if not firstkeep { sb_putc(keep, 10) }
+ if not firstkeep { sb_putc(keep, '\n') }
firstkeep = false
var kk = 0
- while kk < lnlen { sb_putc(keep, ln[kk]); kk = kk + 1 }
+ while kk < lnlen { sb_putc(keep, ln[kk]); kk += 1 }
}
}
# 3) desc -> paragraphs joined , each codeified @@ -205,7 +205,7 @@ function split_body(body: pointer) -> Split { while pi < len(paras) { if pi > 0 { sb_puts(ob, "
") } sb_puts(ob, codeify(paras[pi])) - pi = pi + 1 + pi += 1 } r.desc = sb_str(ob) return r @@ -217,26 +217,26 @@ function plain_text(s: pointer) -> pointer { let n = slen(s) var i = 0 while i < n { - if s[i] == 60 { - while i < n and s[i] != 62 { i = i + 1 } - if i < n { i = i + 1 } + if s[i] == '<' { + while i < n and s[i] != '>' { i += 1 } + if i < n { i += 1 } } else { sb_putc(sb, s[i]) - i = i + 1 + i += 1 } } let t0 = s_trim(sb_str(sb)) let tn = slen(t0) - var cut = 0 - 1 + var cut = -1 var j = 0 while j < tn { let c = t0[j] - if c == 10 { break } - if (c == 46 or c == 33 or c == 63) and j >= 1 { + if c == '\n' { break } + if (c == '.' or c == '!' or c == '?') and j >= 1 { if j + 1 >= tn { cut = j + 1; break } if is_space_all(t0[j + 1]) { cut = j + 1; break } } - j = j + 1 + j += 1 } var t = t0 if cut >= 0 { t = sslice(t0, 0, cut) } @@ -245,18 +245,18 @@ function plain_text(s: pointer) -> pointer { let tl = slen(t) var cpc = 0 var bi = 0 - while bi < tl { if (t[bi] & 192) != 128 { cpc = cpc + 1 }; bi = bi + 1 } + while bi < tl { if (t[bi] & 192) != 128 { cpc += 1 }; bi += 1 } if cpc <= 160 { return t } var idx = 0 var seen = 0 while idx < tl and seen < 160 { - idx = idx + 1 - while idx < tl and (t[idx] & 192) == 128 { idx = idx + 1 } - seen = seen + 1 + idx += 1 + while idx < tl and (t[idx] & 192) == 128 { idx += 1 } + seen += 1 } let pre = sslice(t, 0, idx) var sp = slen(pre) - 1 - while sp >= 0 and pre[sp] != 32 { sp = sp - 1 } + while sp >= 0 and pre[sp] != ' ' { sp -= 1 } var head = pre if sp >= 0 { head = sslice(pre, 0, sp) } return head + "…" @@ -305,9 +305,9 @@ function entries_sort(es: []Entry) -> void { while i < len(es) { let cur = es[i] var j = i - 1 - while j >= 0 and entry_gt(es[j], cur) { es[j + 1] = es[j]; j = j - 1 } + while j >= 0 and entry_gt(es[j], cur) { es[j + 1] = es[j]; j -= 1 } es[j + 1] = cur - i = i + 1 + i += 1 } } function section_gt(a: Section, b: Section) -> bool { @@ -319,9 +319,9 @@ function sections_sort(ss: []Section) -> void { while i < len(ss) { let cur = ss[i] var j = i - 1 - while j >= 0 and section_gt(ss[j], cur) { ss[j + 1] = ss[j]; j = j - 1 } + while j >= 0 and section_gt(ss[j], cur) { ss[j + 1] = ss[j]; j -= 1 } ss[j + 1] = cur - i = i + 1 + i += 1 } } @@ -331,7 +331,7 @@ function load_sections() -> []Section { var ci = 0 while ci < len(cats) { let cat = cats[ci] - ci = ci + 1 + ci += 1 let cdir = "docs/language/" + cat if not is_dir(cdir) { continue } var sid = cat @@ -351,7 +351,7 @@ function load_sections() -> []Section { var fi = 0 while fi < len(files) { let fn = files[fi] - fi = fi + 1 + fi += 1 if not s_ends(fn, ".md") { continue } if fn == "_section.md" { continue } push(entries, build_entry(cdir + "/" + fn)) @@ -362,7 +362,7 @@ function load_sections() -> []Section { while ei < len(entries) { let e = entries[ei] if e.kind == "namespace-method" and slen(e.ns) > 0 { nsname = e.ns; break } - ei = ei + 1 + ei += 1 } let sec = new Section sec.id = sid @@ -384,7 +384,7 @@ function ns_tip(nn: pointer, sections: []Section) -> pointer { var i = 0 while i < len(sections) { if sections[i].ns_name == nn { return plain_text(sections[i].blurb) } - i = i + 1 + i += 1 } return "" } @@ -414,11 +414,11 @@ function build_symbols(sections: []Section) -> Symbols { var si = 0 while si < len(sections) { let s = sections[si] - si = si + 1 + si += 1 var ei = 0 while ei < len(s.entries) { let e = s.entries[ei] - ei = ei + 1 + ei += 1 let eid = e.id let kind = e.kind let tip = e.tip @@ -444,7 +444,7 @@ function build_symbols(sections: []Section) -> Symbols { var ti = 0 while ti < len(e.tokens_list) { let tok = e.tokens_list[ti] - ti = ti + 1 + ti += 1 if kind == "keyword" { jvput(kw, tok, jvs(eid)) } else if kind == "type" { jvput(types, tok, jvs(eid)) } else if kind == "phase" { jvput(phases, tok, jvs(eid)) } @@ -453,7 +453,7 @@ function build_symbols(sections: []Section) -> Symbols { jvput(o, "id", jvs(eid)) let pa = jva() var qi = 0 - while qi < len(e.params) { jvpush(pa, jvs(e.params[qi].name)); qi = qi + 1 } + while qi < len(e.params) { jvpush(pa, jvs(e.params[qi].name)); qi += 1 } jvput(o, "params", pa) jvput(builtins, tok, o) } @@ -462,7 +462,7 @@ function build_symbols(sections: []Section) -> Symbols { jvput(o, "id", jvs(eid)) let pa = jva() var qi = 0 - while qi < len(e.params) { jvpush(pa, jvs(e.params[qi].name)); qi = qi + 1 } + while qi < len(e.params) { jvpush(pa, jvs(e.params[qi].name)); qi += 1 } jvput(o, "params", pa) jvput(nsm, tok, o) } @@ -475,7 +475,7 @@ function build_symbols(sections: []Section) -> Symbols { var ki = 0 while ki < len(nsm.keys) { let tok = nsm.keys[ki] - ki = ki + 1 + ki += 1 let dot = s_index(tok, ".", 0) if dot >= 0 { set_add(nsnames, sslice(tok, 0, dot)) } } @@ -484,7 +484,7 @@ function build_symbols(sections: []Section) -> Symbols { var ni = 0 while ni < len(nsnames) { let nn = nsnames[ni] - ni = ni + 1 + ni += 1 let pg = "ns-" + lower_ascii(nn) jvput(namespaces, nn, jvs(pg)) let cd = jvo() @@ -511,7 +511,7 @@ function js_get(v: JVal, key: pointer) -> pointer { function j_has(v: JVal, key: pointer) -> bool { if v.t != JV_OBJ { return false } var i = 0 - while i < len(v.keys) { if v.keys[i] == key { return true }; i = i + 1 } + while i < len(v.keys) { if v.keys[i] == key { return true }; i += 1 } return false } @@ -527,7 +527,7 @@ function nav_html(b: Sb, links: JVal, cta_href: pointer) -> void { var i = 0 while i < len(links.kids) { let nlk = links.kids[i] - i = i + 1 + i += 1 let href = js_get(nlk, "href") let label = js_get(nlk, "label") if href == cta_href { sb_puts(b, `{hesc(label)}`) } @@ -551,7 +551,7 @@ function render_params(e: Entry) -> pointer { var i = 0 while i < len(e.params) { let p = e.params[i] - i = i + 1 + i += 1 sb_puts(b, `
{hesc(p.name)}{p.desc}{hesc(e.examples[i])}`)
- i = i + 1
+ i += 1
}
sb_puts(b, ``)
return sb_str(b)
@@ -575,11 +575,11 @@ function render_related(e: Entry, items: JVal) -> pointer {
var i = 0
while i < len(e.related_list) {
let r = e.related_list[i]
- i = i + 1
+ i += 1
let it = j_get(items, r)
if it.t == JV_NULL { continue }
if cnt == 0 { sb_puts(b, `