|
| 1 | +from os import PathLike |
| 2 | +from pathlib import Path |
| 3 | + |
| 4 | +import jinja2 |
| 5 | +from modflow_devtools.dfn import Dfn, get_blocks, get_fields |
| 6 | + |
| 7 | +from flopy4.mf6.codec.reader.grammar.filters import field_type |
| 8 | + |
| 9 | + |
| 10 | +def _get_template_env(): |
| 11 | + loader = jinja2.PackageLoader("flopy4", "mf6/codec/reader/grammar/templates/") |
| 12 | + env = jinja2.Environment( |
| 13 | + loader=loader, |
| 14 | + trim_blocks=True, |
| 15 | + lstrip_blocks=True, |
| 16 | + keep_trailing_newline=True, |
| 17 | + ) |
| 18 | + env.filters["field_type"] = field_type |
| 19 | + return env |
| 20 | + |
| 21 | + |
| 22 | +def make_grammar(dfn: Dfn, outdir: PathLike): |
| 23 | + """Generate a Lark grammar file for a single component.""" |
| 24 | + outdir = Path(outdir).expanduser().resolve().absolute() |
| 25 | + env = _get_template_env() |
| 26 | + template = env.get_template("component.lark.jinja") |
| 27 | + target_path = outdir / f"{dfn['name']}.lark" |
| 28 | + with open(target_path, "w") as f: |
| 29 | + name = dfn["name"] |
| 30 | + blocks = get_blocks(dfn) |
| 31 | + fields = get_fields(dfn) |
| 32 | + f.write(template.render(name=name, blocks=blocks, fields=fields)) |
| 33 | + |
| 34 | + |
| 35 | +def make_all_grammars(dfns: dict[str, Dfn], outdir: PathLike): |
| 36 | + """Generate grammars for all components.""" |
| 37 | + outdir = Path(outdir).expanduser().resolve().absolute() |
| 38 | + outdir.mkdir(parents=True, exist_ok=True) |
| 39 | + for dfn in dfns.values(): |
| 40 | + make_grammar(dfn, outdir) |
0 commit comments