From 6e5b22378f6b77110640bf8de6be74e3ce2bb2b9 Mon Sep 17 00:00:00 2001 From: Nathan Cooper Date: Fri, 31 Jul 2026 19:55:47 -0400 Subject: [PATCH 1/2] support iteration and scopes --- python/mdhtml/jinja.py | 15 ++-- python/mdhtml/md.py | 144 +++++++++++++++++++++++++++++--------- python/mdhtml/mustache.py | 9 +-- tests/test_export.py | 29 +++++++- 4 files changed, 154 insertions(+), 43 deletions(-) diff --git a/python/mdhtml/jinja.py b/python/mdhtml/jinja.py index 3613567..248244f 100644 --- a/python/mdhtml/jinja.py +++ b/python/mdhtml/jinja.py @@ -37,14 +37,19 @@ def _classify(body, syntax): if b.startswith("if not "): return ("open", b.removeprefix("if not ").strip(), True) if b.startswith("if "): return ("open", b.removeprefix("if ").strip(), False) if b == "endif": return ("close", "") - raise ValueError(f"unsupported jinja statement {body!r}: only if/if not/endif sections are fillable (render real jinja templates with jinja2)") + if b.startswith("for "): + v, _, it = b.removeprefix("for ").partition(" in ") + return ("open", it.strip(), False, v.strip()) + if b == "endfor": return ("close", "") + raise ValueError(f"unsupported jinja statement {body!r}: only if/if not/endif and for/endfor sections are fillable (render real jinja templates with jinja2)") def fill_md(src, values, dest=None, templates=None, strict=True): """Fill jinja-style template tokens in Markdown source with `values`, leaving all other - source (refs, attributes, everything symbolic) byte-identical. Variables take `str(values[name])`; - `{% if name %}`/`{% if not name %}`...`{% endif %}` sections keep or drop their whole span by the - truthiness of `values[name]` (no iteration; a kept section just loses its markers). `templates` - defaults to `JINJA`. With `strict`, fields missing in either direction raise; otherwise they are + source (refs, attributes, everything symbolic) byte-identical. Names are dotted paths; + `{% if name %}`/`{% if not name %}`...`{% endif %}` keeps or drops its span by truthiness, and + `{% for x in name %}`...`{% endfor %}` repeats its span per item of the list `name`, binding + the item to `x` inside (an `if` binds nothing: names stay lexical). `templates` defaults to + `JINJA`. With `strict`, fields missing in either direction raise; otherwise they are reported in `.warnings` and unfilled variables stay in place, ready for a later pass.""" return fill_tokens(src, values, _classify, JINJA if templates is None else templates, dest=dest, strict=strict) diff --git a/python/mdhtml/md.py b/python/mdhtml/md.py index 7015e95..c10401b 100644 --- a/python/mdhtml/md.py +++ b/python/mdhtml/md.py @@ -222,13 +222,32 @@ def _token_spans(normalized, tmpls, starts, srcb): return sorted(toks, key=lambda t: t["start"]) +def _resolve(scopes, name): + "Innermost-first lookup of dotted `name` through the frame stack (`.` names the innermost frame)" + if name == ".": return True, scopes[-1] + for s in reversed(scopes): + v = s + for part in name.split("."): + if not (isinstance(v, dict) and part in v): break + v = v[part] + else: return True, v + return False, None + + def fill_tokens(src, values, classify, templates, dest=None, strict=True) -> Md: """Fill template tokens in Markdown source from the `values` dict, leaving all other source (refs, attributes, everything symbolic) byte-identical. `classify` defines the grammar: it maps - a token `(body, syntax)` to `('var', name)`, `('open', name, inverted)`, or `('close', name)` (an empty - close name matches the innermost open section, for grammars whose close marker is unnamed). - Variables take `str(values[name])`; sections keep or drop their whole span by the truthiness of - `values[name]` (`inverted` flips it; no iteration - a kept section just loses its markers). + a token `(body, syntax)` to `('var', name)`, `('open', name, inverted)` or + `('open', name, inverted, bind)`, or `('close', name)` (an empty close name matches the + innermost open section, for grammars whose close marker is unnamed). + + Names are dotted paths resolved through a stack of frames, innermost first; the root frame is + `values`. What a kept section pushes is the grammar's choice, carried by `bind`: absent or None + pushes nothing (a pure conditional, jinja's `if`); `'.'` pushes the section's value itself + (mustache: the value's fields become visible, and `{{.}}` names the value); any other string + `b` pushes `{b: value}` (jinja's `for b in name`). A section whose value is a list, under a + binding open, repeats its span once per item with the item's frame pushed; other truthy values + keep the span once, falsy values (and empty lists) drop it, and `inverted` flips the decision. With `strict`, fields missing in either direction raise; otherwise they are reported in `.warnings` and unfilled variables stay in place, ready for a later pass. `mdhtml.mustache.fill_md` is the mustache instantiation, and the worked example for @@ -238,41 +257,100 @@ def fill_tokens(src, values, classify, templates, dest=None, strict=True) -> Md: srcb = normalized.encode() starts = [0] for line in normalized.split("\n"): starts.append(starts[-1] + len(line.encode()) + 1) - edits, removals, stack, seen, unfilled = [], [], [], set(), [] - - def rm(cs, ce): - "Remove `cs..ce`, consuming following blank lines when the removal sits at a paragraph boundary." - if cs < 2 or srcb[cs - 2:cs] == b"\n\n": - while srcb[ce:ce + 1] == b"\n": ce += 1 - edits.append((cs, ce, "")) - return cs, ce - + def standalone(t): + "A marker token alone on its line owns the whole line, newline included" + if t["block"]: return t + i = bisect_right(starts, t["start"]) + ls, le = starts[i - 1], starts[i] + if srcb[ls:t["start"]].strip() or srcb[t["end"]:le].strip(): return t + return dict(t, start=ls, end=le) + + root, stack = [], [] for t in _token_spans(normalized, tmpls, starts, srcb): kind, name, *rest = classify(t["body"], t["syntax"]) - if kind == "open": stack.append((name, rest[0], t)) + if kind in ("open", "close"): t = standalone(t) + if kind == "open": stack.append(dict(name=name, inv=rest[0], bind=rest[1] if len(rest) > 1 else None, ot=t, kids=[])) elif kind == "close": - if not stack or (name and stack[-1][0] != name): raise ValueError(f"unmatched section close {t['body'].strip()!r}") - oname, inverted, ot = stack.pop() - seen.add(oname) - if oname not in values: unfilled.append((oname, ot["start"])) - if bool(values.get(oname)) != inverted: - rm(ot["start"], ot["end"]) - rm(t["start"], t["end"]) - else: removals.append(rm(ot["start"], t["end"])) - else: - seen.add(name) - if name in values: - v = str(values[name]) - edits.append((t["start"], t["end"], v + "\n" if t["block"] else v)) - else: unfilled.append((name, t["start"])) - if stack: raise ValueError(f"unclosed section {stack[-1][0]!r}") - gone = lambda s, e=None: any(rs <= s and (e or s) <= re for rs, re in removals) + if not stack or (name and stack[-1]["name"] != name): raise ValueError(f"unmatched section close {t['body'].strip()!r}") + node = stack.pop() + node["ct"] = t + (stack[-1]["kids"] if stack else root).append(node) + else: (stack[-1]["kids"] if stack else root).append(dict(name=name, t=t)) + if stack: raise ValueError(f"unclosed section {stack[-1]['name']!r}") + edits, seen, unfilled = [], set(), [] + + def mark(name): seen.update((name, name.split(".")[0])) + + def past_blanks(cs, ce): + "Extend removal `cs..ce` over following blank lines when it sits at a paragraph boundary" + if cs < 2 or srcb[cs - 2:cs] == b"\n\n": + while srcb[ce:ce + 1] == b"\n": ce += 1 + return ce + + def sect(node, scopes): + "Section decision `(keep, items, frame)`; a missing name warns only when its section keeps" + mark(node["name"]) + ok, v = _resolve(scopes, node["name"]) + keep = bool(v) != node["inv"] + if not ok and keep: unfilled.append(node["name"]) + if not keep or node["inv"] or node["bind"] is None: return keep, None, None + if isinstance(v, list): return keep, v, None + return keep, None, _bound(node, v) + + def _bound(node, v): return v if node["bind"] == "." else {node["bind"]: v} + + def var(n, scopes): + "A variable node's replacement text, or None to leave the token in place" + mark(n["name"]) + ok, v = _resolve(scopes, n["name"]) + if not ok: + unfilled.append(n["name"]) + return None + return str(v) + "\n" if n["t"]["block"] else str(v) + + def build(s, e, kids, scopes): + "Render `srcb[s:e]` against `scopes` as a string, for spans repeated per item" + out, pos = [], s + for n in kids: + if "kids" not in n: + if (v := var(n, scopes)) is None: continue + out.append(srcb[pos:n["t"]["start"]].decode()) + out.append(v) + pos = n["t"]["end"] + continue + keep, items, fr = sect(n, scopes) + out.append(srcb[pos:n["ot"]["start"]].decode()) + if not keep: pos = past_blanks(n["ot"]["start"], n["ct"]["end"]) + else: + s2, e2 = n["ot"]["end"], n["ct"]["start"] + if items is not None: out += [build(s2, e2, n["kids"], scopes + [_bound(n, it)]) for it in items] + else: out.append(build(s2, e2, n["kids"], scopes + ([fr] if fr is not None else []))) + pos = n["ct"]["end"] + out.append(srcb[pos:e].decode()) + return "".join(out) + + def walk(kids, scopes): + "Emit edits for `kids` against `scopes`; a repeated span becomes one edit built by `build`" + for n in kids: + if "kids" not in n: + if (v := var(n, scopes)) is not None: edits.append((n["t"]["start"], n["t"]["end"], v)) + continue + keep, items, fr = sect(n, scopes) + ot, ct = n["ot"], n["ct"] + if not keep: edits.append((ot["start"], past_blanks(ot["start"], ct["end"]), "")) + elif items is not None: + body = "".join(build(ot["end"], ct["start"], n["kids"], scopes + [_bound(n, it)]) for it in items) + edits.append((ot["start"], ct["end"], body)) + else: + edits.append((ot["start"], past_blanks(ot["start"], ot["end"]), "")) + edits.append((ct["start"], past_blanks(ct["start"], ct["end"]), "")) + walk(n["kids"], scopes + ([fr] if fr is not None else [])) + + walk(root, [values]) warnings = [] - if missing := list(dict.fromkeys(n for n, pos in unfilled if not gone(pos))): - warnings.append("fields not in values: " + ", ".join(missing)) + if missing := list(dict.fromkeys(unfilled)): warnings.append("fields not in values: " + ", ".join(missing)) if unused := [k for k in values if k not in seen]: warnings.append("values not in document: " + ", ".join(unused)) if warnings and strict: raise ValueError("; ".join(warnings)) - edits = [e for e in edits if e[2] == "" and (e[0], e[1]) in removals or not gone(e[0], e[1])] for cs, ce, repl in sorted(edits, reverse=True): src = src[:offsets[cs]] + repl + src[offsets[ce]:] res = Md(src, warnings) if dest is not None: Path(dest).write_text(res, encoding="utf-8") diff --git a/python/mdhtml/mustache.py b/python/mdhtml/mustache.py index 04752e5..1c5a6ad 100644 --- a/python/mdhtml/mustache.py +++ b/python/mdhtml/mustache.py @@ -37,16 +37,17 @@ def _classify(body, syntax): "The mustache sigil grammar as a `fill_tokens` classifier." body = body.strip() sig, name = body[:1], body[1:].strip() - if sig in "#^": return ("open", name, sig == "^") + if sig in "#^": return ("open", name, sig == "^", ".") if sig == "/": return ("close", name) return ("var", body) def fill_md(src, values, dest=None, templates=None, strict=True): """Fill mustache-style template tokens in Markdown source with `values`, leaving all other - source (refs, attributes, everything symbolic) byte-identical. Variables take `str(values[name])`; - `{{#name}}`/`{{^name}}`...`{{/name}}` sections keep or drop their whole span by the truthiness of - `values[name]` (no iteration; a kept section just loses its markers). `templates` defaults to + source (refs, attributes, everything symbolic) byte-identical. Names are dotted paths resolved + mustache-style through the enclosing sections' values, innermost first. `{{#name}}`...`{{/name}}` + keeps or drops its span by truthiness; a list repeats the span per item, with the item's fields + visible inside and `{{.}}` naming the item; `{{^name}}` inverts. `templates` defaults to `MUSTACHE`. With `strict`, fields missing in either direction raise; otherwise they are reported in `.warnings` and unfilled variables stay in place, ready for a later pass.""" return fill_tokens(src, values, _classify, MUSTACHE if templates is None else templates, dest=dest, strict=strict) diff --git a/tests/test_export.py b/tests/test_export.py index bc223db..adf380e 100644 --- a/tests/test_export.py +++ b/tests/test_export.py @@ -283,7 +283,7 @@ def test_jinja_module(): md = 'Hi {{ who }}.\n\n{% if not skip %}\n\nShown.\n\n{% endif %}\n' assert fill_md(md, dict(who='Sam', skip=False)) == 'Hi Sam.\n\nShown.\n\n' assert fill_md(md, dict(who='Sam', skip=True)) == 'Hi Sam.\n\n' # `if not` inverts - with pytest.raises(ValueError, match='unsupported'): fill_md('{% for x in y %}\n', dict()) + with pytest.raises(ValueError, match='unsupported'): fill_md('{% while x %}\n', dict()) h = to_html(to_mdhtml('V {{ v }} S {% if x %}', templates=JINJA, callbacks={'template_token': jinja_pill})) assert '{{ v }}' in h # classed by syntax, not sigils assert '{% if x %}' in h @@ -291,6 +291,33 @@ def test_jinja_module(): assert jinja_literal('if x', 'jinja-stmt', 'block') == '{% if x %}' +def test_fill_iteration_and_scopes(): + from mdhtml.mustache import fill_md + md = 'Contingencies:\n\n{{#items}}\n- {{.}}\n{{/items}}\n\nDone.\n' + assert fill_md(md, dict(items=['a', 'b'])) == 'Contingencies:\n\n- a\n- b\n\nDone.\n' + assert fill_md(md, dict(items=[])) == 'Contingencies:\n\nDone.\n' # empty list drops like falsy + out = fill_md('{{#grants}}\n{{n}} shares of {{co}}.\n{{/grants}}\n', dict(grants=[dict(n=1), dict(n=2)], co='J&J')) + assert out == '1 shares of J&J.\n2 shares of J&J.\n' # item fields implicit; root stays visible + out = fill_md('{{#equity.options}}\nGranted {{shares}} at {{strike}}.\n{{/equity.options}}\n', + dict(equity=dict(options=dict(shares=5, strike='$1')))) + assert out == 'Granted 5 at $1.\n' # dotted paths traverse; a dict section pushes its fields + assert fill_md('{{#opt}}G {{n}}.{{/opt}}\n', dict(opt=dict(n=9), n=7)) == 'G 9.\n' # innermost frame wins + part = fill_md('{{#xs}}\n- {{.}} for {{who}}\n{{/xs}}\n', dict(xs=['a']), strict=False) + assert part == '- a for {{who}}\n' # staged fill inside an iterated span + assert part.warnings == ['fields not in values: who'] + tbl = '|A|B|\n|---|---|\n{{#rows}}\n| {{a}} | {{b}} |\n{{/rows}}\nEnd.\n' + out = fill_md(tbl, dict(rows=[dict(a=1, b=2), dict(a=3, b=4)])) + assert out == '|A|B|\n|---|---|\n| 1 | 2 |\n| 3 | 4 |\nEnd.\n' # standalone marker lines vanish inside table context too + + +def test_jinja_for(): + from mdhtml.jinja import fill_md + md = '{% for g in grants %}\n{{ g.n }} shares to {{ who }}.\n{% endfor %}\n' + assert fill_md(md, dict(grants=[dict(n=1), dict(n=2)], who='Sam')) == '1 shares to Sam.\n2 shares to Sam.\n' + md2 = '{% if opt %}\nGranted {{ n }}.\n{% endif %}\n' + assert fill_md(md2, dict(opt=dict(n=9), n=7)) == 'Granted 7.\n' # jinja `if` pushes no frame: names stay lexical + + def test_resolver_registries_are_read_only(): from mdhtml.export import Resolver r = Resolver() From a85773d146f5da1ddbe66aa4d776849dffcfa7e8 Mon Sep 17 00:00:00 2001 From: Nathan Cooper Date: Wed, 5 Aug 2026 15:12:07 -0400 Subject: [PATCH 2/2] docs and examples --- README.md | 2 +- examples/README.md | 8 ++++++-- examples/filldemo.py | 9 +++++++-- examples/legal_demo-bound.docx | Bin 16577 -> 17137 bytes examples/legal_demo-filled.md | 15 +++++++++++++++ examples/legal_demo-filled.pdf | Bin 35779 -> 41401 bytes examples/legal_demo-form.docx | Bin 15323 -> 15858 bytes examples/legal_demo-render.md | 22 +++++++++++++++++++--- examples/legal_demo.docx | Bin 15172 -> 15693 bytes examples/legal_demo.html | 25 +++++++++++++++++++++---- examples/legal_demo.ipynb | 22 ++++++++++++++++++++++ examples/legal_demo.md | 16 ++++++++++++++++ examples/legal_demo.pdf | Bin 45994 -> 52857 bytes examples/legal_demo.typ | 20 ++++++++++++++++++++ examples/render_demo.py | 8 ++++---- python/mdhtml/jinja.py | 10 +++++----- python/mdhtml/mustache.py | 2 +- 17 files changed, 137 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 1cd9eb8..c87e7ad 100644 --- a/README.md +++ b/README.md @@ -331,7 +331,7 @@ Cross-references become plain text ("See Section 1.(a)"), with the same `reftype Inline constructs are recognized at any nesting depth with the parser's own grammar, so code spans, links, and escapes are honored, and `use {braces} freely` stays literal. Block constructs are rewritten wherever their lines carry no container marker, which includes fenced divs; a heading or table caption inside a blockquote or list passes through unchanged, with a warning when it needed numbering or stripping. -`fill_tokens(src, values, classify, templates)` is the companion filler: it resolves template tokens from a plain dict and touches nothing else, so the result is still-symbolic Markdown ready for any exporter. The `classify` callable defines the grammar, mapping a token's `(body, syntax)` to `('var', name)`, `('open', name, inverted)`, or `('close', name)`. Variables take `str(values[name])`; sections keep or drop their span by the value's truthiness (kept sections just lose their markers; no iteration). By default a field missing in either direction raises; with `strict=False` the mismatches land in `.warnings` and unfilled variables stay in place, so a document can be filled in stages. `mdhtml.mustache.fill_md` and `mdhtml.jinja.fill_md` are the shipped instantiations - mustache's classifier reads `#`/`^`/`/` sigils from bodies, jinja's discriminates by delimiter pair (`{% if x %}`/`{% if not x %}`/`{% endif %}`) - and `examples/filldemo.py` shows the mustache one in use. +`fill_tokens(src, values, classify, templates)` is the companion filler: it resolves template tokens from a plain dict and touches nothing else, so the result is still-symbolic Markdown ready for any exporter. The `classify` callable defines the grammar, mapping a token's `(body, syntax)` to `('var', name)`, `('open', name, inverted)` or `('open', name, inverted, bind)`, or `('close', name)`. Variables take `str(values[name])`, with names as dotted paths resolved innermost-first through the enclosing sections' frames; sections keep or drop their span by the value's truthiness. `bind` says what a kept section pushes as the innermost frame: nothing for a pure conditional (jinja's `if`), `'.'` for the section's own value (mustache, so its fields are visible and `{{.}}` names it), or a name for `{bind: value}` (jinja's `for bind in name`). Under a binding open, a list value repeats the span once per item with that item's frame pushed, and an empty list drops it like any other falsy value. By default a field missing in either direction raises; with `strict=False` the mismatches land in `.warnings` and unfilled variables stay in place, so a document can be filled in stages. `mdhtml.mustache.fill_md` and `mdhtml.jinja.fill_md` are the shipped instantiations - mustache's classifier reads `#`/`^`/`/` sigils from bodies, jinja's discriminates by delimiter pair (`{% if x %}`/`{% if not x %}`/`{% endif %}` and `{% for x in xs %}`/`{% endfor %}`) - and `examples/filldemo.py` shows the mustache one in use, iterating a grant table and a list of contingencies. Command-line usage (the `mdhtml` script is installed with the package): diff --git a/examples/README.md b/examples/README.md index 332d1eb..98ef9dd 100644 --- a/examples/README.md +++ b/examples/README.md @@ -10,8 +10,12 @@ notes in an `.ipynb`). It exercises the dialect features that matter across conv - Headings with ids (`## Compensation {#sec-comp}`) referenced from *other* notes: single refs (`[@sec-offer]`), a group (`[@sec-comp; @sec-equity; @sec-atwill]`), and custom text (`[your cash compensation @sec-comp]`). -- Mustache template tokens: inline variables (`{{base_salary}}`) and block section markers - (`{{#equity.options}}` ... `{{/equity.options}}`). +- Mustache template tokens: inline variables (`{{base_salary}}`), conditional section markers + (`{{#equity.options}}` ... `{{/equity.options}}`), and list sections that repeat their span once + per item: a table of `{{#grants}}` rows, and `{{#contingencies}}` bullets naming each item with + `{{.}}`. Names inside a repeated span resolve innermost-first, so a row sees the grant's own + fields, falls back to the letter-wide `{{vesting_schedule}}`, and a grant carrying its own + `class_of_stock` shadows the outer one. - A footnote, for id-namespacing to exercise. ## The build script diff --git a/examples/filldemo.py b/examples/filldemo.py index ed53ef3..8aa3101 100644 --- a/examples/filldemo.py +++ b/examples/filldemo.py @@ -8,8 +8,13 @@ from mdhtml.mustache import MUSTACHE, fill_md values = {'company_common_name': 'Acme Robotics, Inc.', 'candidate_name': 'Alex Rivera', 'job_title': 'Senior Research Engineer', - 'base_salary': '$185,000', 'equity.options': True, 'shares_subject_to_option': '25,000', 'class_of_stock': 'Common Stock', - 'vesting_schedule': 'four years, with a one-year cliff', 'equity.restricted_stock': False, + 'base_salary': '$185,000', 'equity': {'options': True, 'restricted_stock': False}, + 'shares_subject_to_option': '25,000', 'class_of_stock': 'Common Stock', + 'vesting_schedule': 'four years, with a one-year cliff', + 'grants': [{'grant_date': 'September 1, 2026', 'shares': '25,000'}, + {'grant_date': 'March 1, 2027', 'shares': '5,000', 'class_of_stock': 'Series A Preferred'}], + 'contingencies': ['satisfactory completion of a background check', 'your signed confidentiality agreement', + 'documentation of your eligibility to work'], 'offer_expiration_date': 'August 1, 2026', 'hiring_manager_name': 'Sam Devlin', 'offer_date': 'July 23, 2026'} d = Path(__file__).parent diff --git a/examples/legal_demo-bound.docx b/examples/legal_demo-bound.docx index 1675de4a3bad51acaeb294855dec082c6e756f96..18cd3966673dae94f36febc2b71c8045b94bd0b2 100644 GIT binary patch delta 3885 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 delta 3341 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 P(;_#a;q2MkzbO9$Oa7NQcrXEhQ=lNQ0DgN+bV) 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 Z2^2o@yzRN(qEjh?p%`PKiVEA@=r6sTq|5*S delta 20914 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 diff --git a/examples/legal_demo-form.docx b/examples/legal_demo-form.docx index 1dac91900d3a5b146f863a2e3a5e06ecc3746add..ee30a618d87531e21f3b1ce7b3ab7cf91bcc2d89 100644 GIT binary patch delta 3476 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 diff --git a/examples/legal_demo-render.md b/examples/legal_demo-render.md index c265a1b..0440725 100644 --- a/examples/legal_demo-render.md +++ b/examples/legal_demo-render.md @@ -1,6 +1,6 @@ # 1. Offer of Employment -`{{company_common_name}}` (the "Company") is pleased to offer `{{candidate_name}}` the position of `{{job_title}}`. This letter summarizes the key terms: Sections 1.(a), 1.(b) and 1.(c). +`{{company_common_name}}` (the "Company") is pleased to offer `{{candidate_name}}` the position of `{{job_title}}`. This letter summarizes the key terms: Sections 1.(a), 1.(b) and 1.(d). ## (a) Compensation @@ -18,9 +18,25 @@ Subject to approval by `{{company_common_name}}`'s Board of Directors, you will Subject to Board approval, you will be granted the right to purchase `{{number_shares}}` shares of `{{class_of_stock}}` under a Restricted Stock Purchase Agreement, vesting over `{{vesting_schedule}}`. `{{/equity.restricted_stock}}` +Your grants under this offer are: + +| Grant date | Shares | Class | Vesting | +|---|---|---|---| +`{{#grants}}` +| `{{grant_date}}` | `{{shares}}` | `{{class_of_stock}}` | `{{vesting_schedule}}` | +`{{/grants}}` + Tax treatment is your responsibility; see also your cash compensation 1.(a). -## (c) At-Will Employment +## (c) Contingencies + +This offer is contingent on each of the following: + +`{{#contingencies}}` +- `{{.}}` +`{{/contingencies}}` + +## (d) At-Will Employment Your employment with `{{company_common_name}}` is at will: either you or the Company may end it at any time, with or without cause. Nothing in Section 1.(a) or Section 1.(b) changes that. @@ -36,4 +52,4 @@ To accept, sign below by `{{offer_expiration_date}}`. Date: `{{offer_date}}`Date: `{{signature_date}}` -Please retain a copy of this letter for your records; the terms in Sections 1.(a), 1.(b) and 1.(c) are the entire agreement. +Please retain a copy of this letter for your records; the terms in Sections 1.(a), 1.(b) and 1.(d) are the entire agreement. diff --git a/examples/legal_demo.docx b/examples/legal_demo.docx index 340902b14ef30ae7e070000120b44a4fb4b515e5..396eda08c4d4582e031857e0f7ba031bdb7c1f0f 100644 GIT binary patch delta 3160 zcmZ8jc{tQ<7oK4(V;f`}WT&a@`{0$aFOi*WV<$6~Y$5rPeHq&jSt4svgk&xIzOQ93 zHA0d#B>I&1{od>Qo`24{&vT#ioImd8y6#T@p&%N49byOr2m~SrNd%BsSJ7mHA-|KF z=U^Hz@H-Q0&bqrm1_B9*fk1R;#5?%1!E?w)hfw5M;-sCv$7 za9MhtbC_jQFUB(e>wQ^_Sbiu<=Vg}~y;N#kA=8Q4G4yyE{Yu`jTF5L`$Wm{jfW%&l z&o4OfpuMT^$HtK^OEN})k=fv`LsLU7fHMC?k)+Y_y*n?%B?%@SGcLK~%EdFisQGX< zVDX4B^MnAEf!-{F>c<#kCOr-DZ(hP ztd`6s9sSTcU!I$Kd{+J``4gVLN&)vi6bImjMj9kDD)fle)t_TnU$Tk7)%f3e$mY5X z2V6(TlqdI>SCklb=x^4t%~99Ky7taecg=GQ4)DE^a(igz`x%DiwpY^Ykfpucj!K=S z6;A#O*DN-MU2HOVbh~U1neGc9Zf!7E(GXP**r~G*@)o0Nd$T9vnM++N_0V~=W)Whz zaSkgLy8UGEc&73RVJVdkeR`GaPKoow<~T#QvdqR8JXMZyeVFOhWOOY|g59zJw?u9R zu_=rTRHd|kfE#=^pup5B+@K+KRSmsrMIyVL7`g0fgXnhS`o(neXa$hV?2_?7gDvn@ zKVBq&Cs>(o@N*;Re)Xn>1$P+|4Lx=n;&~JAn9Yu{V@3+Us zgWXLZ=APiaa;N34ffve%!q(|v_xZVfvueUuSnjQ4`L8sU9I0_hr{JwT6G@q((E$VlwZ~HzMo-%C;^KsUU3#NUIxi?= z?)2}lxTeh$6Is@6|Ohp){K7j6{lnZaGW+4JhW2kIL ziE<|^#pb-kS;X|DT@B<^->EFB3H?@Xf8;+GiM#^(9k+}I-7oR z>t2vH<$;?iOXRT0djnkrACQWEj0tnRAIcg|+GYVmWI%)>ZxLyyi_VjclGwGzQo*5i z0o~qE_>8p#$>MsWcTxPeFv3CiX>;!`_P~Bl&Ex=(=;_U6#08@`iFUv#_4%i!?X|-a zZ*k@WgSlD_CIuXtihKJMrf`0{ygnOeZnay?KSFGeb$DP@k*V=jomy|N2Ry1=`=Bo# zb+qT~!F{dq_H&bCcPfubbEoo3v6h!8npN#`U-1Q4bv!?*Oyp&eTi0ww_ztijqJ?jd zbxOs6m}~(H+h^i#GOxN9D!Hlp(2KM3^X*__DzI=TqP#9Nb*5D7a}{~2XurjamQmW+ z3=LXHQr_ZBsRB(dX_Ef7Ke<`H-PqTSO(zh>)t_S5RlbUyxK%c(4{No!F}vimHZNpr zWP5wyQ?|i68_|h_3HhYoXOjK}tS!HxzW_NfjVr`7kJoj1CFpI;DF?VL41eXyiCvkD z=*8Ad|I|6r7McghirlPckl9H$Hy=US;^&5oJ`Pitn!dI|m>_hiIHD%3$%gS z0b1{}9owFP>q@ZLr-+P@TDnIqr4B0<$Icj@uPzVI)$>@`WpHi3bb!u1=Gk@p;Y zy5Z8yTOsA2Zk9hEUAFj9^rZMZq%0pOivF>E_nDxvtW=0MOhXb&)sw@euw{Q`7Cu#? zI>AG=wY-MYj7jbut)6hDA5RlCSFg~Wf>}tyW=aUO-ODC?tn*F<=J;mDWM++yeNK_d zkm|U>XUscti4N9z_qCR*q^Bsc>>4)CoEGt-W!Z>u{fm8~Aa^Hd9N87Q?(u3m*p)6Ox?5n7oB5~Rr<1Al)UZoB-eU4UL1$Vx=SoXTy%>asbHMVUI+kCRc)I$Bm z!?F=3495q3%wG<#=~jAjAmHwzBlxt)lD}RJ(m5NjUc$n&@>c3bh<(y1JMC2sqf~sN zeRiF{e+rU!!Zfy8P2-9n1Eq7LfH^cp7u;LOSc2dzg*$t1DiRo=fdd(~**mfyZ$<1{ zRTM##26n(|Pzh(l3qsy)27HSZYpWZZChV-!Zz3vUH8;0N@khcP)o$T2!8;yp_(NSW zjW{GRL#?BVBZ^0)XKKf!URJmoFzaJ(C?>qO*Cl5n{6K~vN<%_UO%s8Z#Kc0#5@&zS zL32Hy-~*p7FW2k&PQBTT_5=1B)ID`^7G4O_yU$w;+^L_STgnS&E9Sx&-E2>GRMHt| zL&!{BXenE{R$JF;mcg;pVN-0K#1#_+>`{0?YfWR$^FA()EdlFcQ_&c*;DhQKlHv9u zsaqRBs-##VeViu2#tNAE`0I+BW@Fb+8p^OhDG}q9uQHzBTR9Em%%v&|2j@IjB(vH~ zqQ6S{S}eT3Oni{7;O?=N9(b&qr!I3n&F&bNXDS0(Z+-2opUq~2*!`ZS@`5}1$tI*< zG4A4J0@~gDs=FGL#`7uHq(-LJ`qeI`S9xL#Wd#X{LZ4z-rec*u&vth!yO2B(C^Yj9pThS@S%si3&2l zPX;%wqM8<|(SCA=ZIGY=s&K2nVoS1kTS=C3~@#w*H7{Za0}E*T#tE5`L(%x@A*h^WCJkP-w0 zVm~v^|C~_pYYO}vlmovdOZ8_+Dw355LWO5X^8V=qm`!XzXFcC2&kgs#eWDleXe8$! zlJfp$>oyYzR7e5_!Tw>K#ZWMs8UF}*@qD|Mv&r{_@pDL?a}1VaC1MiAUzFoI$EY)0 zCXTn3<2=WqXINYkpCiX{zR7>TBM3zQKaX@t;b;FDa(dQuTNckM&qw+l`J440-}{hH delta 2705 zcmZ9Oc|6qH8^^yhG#Hv@Ft*6r*b*aSGz^9?B9SC*gKTxh*vT^Xon%zjvTu!&wat1B zWnZ#~Vr+>PO7vtw;UHQeRLXChHuvu zh`bjb4^(pPJ;wfiM5k9`F|dk#(vcnrhRF5s9F97#FB5%fCF&>Z#-QY=ko55Vg{J$9 zxrArnN{K|=__w7EZ@uZ^OJ0>?1GA?faEX^95+G@IdCQQHuhE0JQ>tc0)9#X#74KS2s3ECLeO7|4myil=G;6 zKE@EPH}3Sf@(VpFMpsljlfuj!hEs~ZdjDXKG*DVJe^UT*z%-2 zi9$4otK1?rZXqS=FQd$8+?-Ee61(}8Uw(KU#NqlH^>fy6*r1Dn5VzQf*3D>^)kU*< z3S3)F!5%r0@Le(gQ<;6CqCyf&Mzax<6LXwJK~~B{gilIiby<}^-F>H?M=XLNVI-E4 zgOlpL*noT{DaOYxH&b)9&Gbpd$(-nTZpxX);wOJf&AB8aSlqG>hVuBhxo&@FtgKQ8 zTbdrYXz7ec{BcZ2_@GFfbV=Rz3Hzo&ifpQ{X}RGw9r;QRE&q#mPoX>BA^&iH+l30{ zzowEEM`9ghzLt}EpowVxAg-O(CdLIkP|FPO=&$X45kFbzC5F-S&N{pxy+(koho?~- zF4Vbf2o&F<#=!5Rt()s7=as@mCLbkN$&kv@HQi{VMtiG_;>+vgIM{pLY8i!7NQyoG95Ia8 z5S(s2q@^$tlq9GBiWbIfxDkEGQevlB)qqSAV!XPw&;Z)eNB)WzlkL`cc7~m>V{@`w zn4s>_@T5cSxt9hdfWaN8)UhN-s(q*AXJ#~iM#m4_18P*L7lvBS${v(bPdtBsufHWw ze}b4-O+4O*KH8|rdOb+_vlMG|rqv_%Tfg>L}o;HY$m zgdgyHd)i9Ek1=Fl{RQ*N6IcBXB}@n}`}EHYFHKj)yj&><7~`oT6jGvgy~YPl;l>Fc z@0{ghxrm7NM8laJ&MD1rCJqCddBiD@=@wYj%-MWBz;ZKB49GNgRsX3nKg`zEiopv? zHZIML?hK%HEl@9W(3BW1@;0`DMs>CzsP|`$ zU2oH3Je28DZLj@FDIR|C7$!SBnB}txv&dK?}@ksN99C9osj*`d#fad{KUR+;h_ z?CM+2SwN2)rCO$SvW3_(nwRFft-af;(!&&Zo+@JCkwtc+j1nbL&bJv4V23p@gzHNe zreCSt1fh7veQk6)I1|*MP(MELDaE;OnK$=HjUeqS<8CR)?O={Z{23hS zjZ~aYPcUWc9z>KRWP*r&wC#F!TJ+BfHhJWsub#~22_Gv)M>V9l(?>s>jVl=?eF^AF z^75U#DDb@l(lry4b1x{v`>U2Y?8=2Ki&+vy<(xtz%?dZ?V`M-7wz4!ju#e93 z05}HJATk+>1K)p073ko1=}I2Ue37=Uu<9@9$MLeia%iy@>(s`+I_c{+E7LsBnY_$F z^BnLjz#1tf9>{-^8j>-5r`@lHkE3iyh#OJjasi8KM1<;v6q|P&48_Kb zu`ztw^>FgeLc_JY7*r0Ho20B5^b?P5Is!5}a+R*=6F)>Q#@cWv&KpftUwyEA`bPc{ zy`pD#=PMhe^#v+_WMjz=?)0CH*3{lJ-sd< z01$#u$1r@9lB5ZzUqToRjxf>7+Dt9i9or62=%=0OFyxh{q7MjS(Ftin?E)ln zGIZE23*N;bib}}7NmK|9|Ceu6JsjpQv;F}iYBUbLe^-YS z0N1fmM{zPDdwzDCc_yyyveQ8^06^}t)88u)1YxI&aPU&qR5|tw4OIoeikwsjRpI?S zW;eIup%$nL$?gdq8YvRA-)#&zW&qfuwZB&&h$8nJ$-Hc>O{rwn{f47L)dawN@>G@2Q3Dt{xo>0Pw%XcK1M#(g^_Ar8{F+XR@2T6`8z8c*X`G xFgMdbl=x4Z0s!Z~s#}z(A2Hm={#&q0&qtf>ey7az-vS3^syJQ(vWVT2`5#yhwmbj; diff --git a/examples/legal_demo.html b/examples/legal_demo.html index c9c3fa8..f0a4ae2 100644 --- a/examples/legal_demo.html +++ b/examples/legal_demo.html @@ -1,12 +1,29 @@

1. Offer of Employment

-

(the "Company") is pleased to offer the position of . This letter summarizes the key terms: Sections 1.(a), 1.(b) and 1.(c).

+

(the "Company") is pleased to offer the position of . This letter summarizes the key terms: Sections 1.(a), 1.(b) and 1.(d).

(a) Compensation

Your base salary will be per year, paid on 's normal payroll schedule and subject to all withholdings required by law.1 Salary is reviewed annually as part of the process described in Section 1..

(b) Equity

{{#equity.options}}

Subject to approval by 's Board of Directors, you will be granted an option to purchase shares of at a strike price equal to fair market value on the date of grant. The option will vest over .

{{/equity.options}}{{#equity.restricted_stock}}

Subject to Board approval, you will be granted the right to purchase shares of under a Restricted Stock Purchase Agreement, vesting over .

-{{/equity.restricted_stock}}

Tax treatment is your responsibility; see also your cash compensation 1.(a).

-

(c) At-Will Employment

+{{/equity.restricted_stock}}

Your grants under this offer are:

+ + + + + + + + + +
Grant dateSharesClassVesting
{{#grants}}
{{/grants}}
+

Tax treatment is your responsibility; see also your cash compensation 1.(a).

+

(c) Contingencies

+

This offer is contingent on each of the following:

+{{#contingencies}}
    +
  • +
  • +
+{{/contingencies}}

(d) At-Will Employment

Your employment with is at will: either you or the Company may end it at any time, with or without cause. Nothing in Section 1.(a) or Section 1.(b) changes that.


To accept, sign below by .

@@ -17,7 +34,7 @@

(c) At-Will EmploymentName: Name: Date: Date: -

Please retain a copy of this letter for your records; the terms in Sections 1.(a), 1.(b) and 1.(c) are the entire agreement.

+

Please retain a copy of this letter for your records; the terms in Sections 1.(a), 1.(b) and 1.(d) are the entire agreement.

  1. diff --git a/examples/legal_demo.ipynb b/examples/legal_demo.ipynb index 5e09473..3cb7959 100644 --- a/examples/legal_demo.ipynb +++ b/examples/legal_demo.ipynb @@ -37,9 +37,31 @@ "Subject to Board approval, you will be granted the right to purchase {{number_shares}} shares of {{class_of_stock}} under a Restricted Stock Purchase Agreement, vesting over {{vesting_schedule}}.\n", "{{/equity.restricted_stock}}\n", "\n", + "Your grants under this offer are:\n", + "\n", + "| Grant date | Shares | Class | Vesting |\n", + "|---|---|---|---|\n", + "{{#grants}}\n", + "| {{grant_date}} | {{shares}} | {{class_of_stock}} | {{vesting_schedule}} |\n", + "{{/grants}}\n", + "\n", "Tax treatment is your responsibility; see also [your cash compensation @sec-comp]." ] }, + { + "cell_type": "markdown", + "id": "8647cece", + "metadata": {}, + "source": [ + "## Contingencies {#sec-conting}\n", + "\n", + "This offer is contingent on each of the following:\n", + "\n", + "{{#contingencies}}\n", + "- {{.}}\n", + "{{/contingencies}}" + ] + }, { "cell_type": "markdown", "id": "bb626ab6", diff --git a/examples/legal_demo.md b/examples/legal_demo.md index df8d608..f91f3c3 100644 --- a/examples/legal_demo.md +++ b/examples/legal_demo.md @@ -18,8 +18,24 @@ Subject to approval by {{company_common_name}}'s Board of Directors, you will be Subject to Board approval, you will be granted the right to purchase {{number_shares}} shares of {{class_of_stock}} under a Restricted Stock Purchase Agreement, vesting over {{vesting_schedule}}. {{/equity.restricted_stock}} +Your grants under this offer are: + +| Grant date | Shares | Class | Vesting | +|---|---|---|---| +{{#grants}} +| {{grant_date}} | {{shares}} | {{class_of_stock}} | {{vesting_schedule}} | +{{/grants}} + Tax treatment is your responsibility; see also [your cash compensation @sec-comp]. +## Contingencies {#sec-conting} + +This offer is contingent on each of the following: + +{{#contingencies}} +- {{.}} +{{/contingencies}} + ## At-Will Employment {#sec-atwill} Your employment with {{company_common_name}} is at will: either you or the Company may end it at any time, with or without cause. Nothing in [@sec-comp] or [@sec-equity] changes that. diff --git a/examples/legal_demo.pdf b/examples/legal_demo.pdf index c349d9f4e860bc109fb644bc8c170fb7258c05d4..5bd668514da97eb473ffec462b680fc9a25efafc 100644 GIT binary patch delta 27085 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μA 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 AO#lD@ delta 21745 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 RcA, supplement: [your cash compensation]). +== Contingencies + +This offer is contingent on each of the following: + +#raw("{{#contingencies}}") + +- #raw("{{.}}") + +#raw("{{/contingencies}}") + == At-Will Employment Your employment with #raw("{{company_common_name}}") is at will: either you or the Company may end it at any time, with or without cause. Nothing in #ref(, supplement: [Section]) or #ref(, supplement: [Section]) changes that. diff --git a/examples/render_demo.py b/examples/render_demo.py index 14c4c45..f6c585a 100644 --- a/examples/render_demo.py +++ b/examples/render_demo.py @@ -18,16 +18,16 @@ def _tok(n, h): def _control(body, syntax, form): - "Interactive form register: variables become click-and-type content controls, section markers stay literal" - if mustache_kind(body) == 'section': return '{{' + body + '}}' + "Interactive form register: variables become click-and-type content controls, section markers and the `{{.}}` item placeholder stay literal" + if mustache_kind(body) == 'section' or body.strip() == '.': return '{{' + body + '}}' return 'control', body convert(to_mdhtml(src, templates=MUSTACHE), d/'legal_demo-form.docx', tmpl=_control, number_headings='legal') def _bound(body, syntax, form): - "Synced form register: every control for a variable is a live view of one shared XML node" - if mustache_kind(body) == 'section': return '{{' + body + '}}' + "Synced form register: every control for a variable is a live view of one shared XML node; the `{{.}}` item placeholder has no named node to bind to, so it stays literal" + if mustache_kind(body) == 'section' or body.strip() == '.': return '{{' + body + '}}' return 'bound', body convert(to_mdhtml(src, templates=MUSTACHE), d/'legal_demo-bound.docx', tmpl=_bound, number_headings='legal') diff --git a/python/mdhtml/jinja.py b/python/mdhtml/jinja.py index 248244f..5d2a147 100644 --- a/python/mdhtml/jinja.py +++ b/python/mdhtml/jinja.py @@ -3,10 +3,10 @@ mdhtml's neutral seams. Where mustache's classifier reads sigils from token bodies, jinja's discriminates by delimiter pair: `{{ }}` (syntax `jinja`) is always a variable, `{% %}` (syntax `jinja-stmt`) always a statement. The filler covers `{% if x %}`/`{% if not x %}`... -`{% endif %}` sections only, by design: a document using real jinja features (`for`, `else`, -filters, expressions) should be rendered by jinja2 itself, which also leaves non-template text -intact. This module is for the fill-while-symbolic workflow: strict bidirectional checking, -staged fills, and results that remain valid mdhtml source.""" +`{% endif %}` sections and `{% for x in xs %}`...`{% endfor %}` iteration, by design: a document +using any other jinja feature (`else`, `elif`, filters, expressions) should be rendered by jinja2 +itself, which also leaves non-template text intact. This module is for the fill-while-symbolic +workflow: strict bidirectional checking, staged fills, and results that remain valid mdhtml source.""" from html import escape from . import TemplateDelimiter @@ -31,7 +31,7 @@ def jinja_literal(body, syntax, form): return f'{o} {body.strip()} {c}' def _classify(body, syntax): - "The jinja if-grammar as a `fill_tokens` classifier: statements by delimiter pair, not body sigils." + "The jinja statement grammar as a `fill_tokens` classifier: `if`/`for` told apart by delimiter pair, not body sigils; `for x in xs` binds `x` as the item name inside its span." if syntax != "jinja-stmt": return ("var", body.strip()) b = body.strip() if b.startswith("if not "): return ("open", b.removeprefix("if not ").strip(), True) diff --git a/python/mdhtml/mustache.py b/python/mdhtml/mustache.py index 1c5a6ad..85ac6fa 100644 --- a/python/mdhtml/mustache.py +++ b/python/mdhtml/mustache.py @@ -34,7 +34,7 @@ def mustache_code(body, syntax, form): def _classify(body, syntax): - "The mustache sigil grammar as a `fill_tokens` classifier." + "The mustache sigil grammar as a `fill_tokens` classifier: a section binds `.`, so a kept section pushes its own value as the innermost frame." body = body.strip() sig, name = body[:1], body[1:].strip() if sig in "#^": return ("open", name, sig == "^", ".")