///|
/// A language of one's own: `csv` turns each line into a table row and
/// reads every cell as the brace syntax, so `{{ }}` works inside cells.
fn read_csv(
  source : String,
  reading : @moonpug.Reading,
) -> Array[@syntax.Node] raise @moonpug.Refused {
  let nodes : Array[@syntax.Node] = [Text("")]
  for line in source.split("\n") {
    let cells = line.trim().to_owned()
    if cells.is_empty() {
      continue
    }
    nodes.push(Text(""))
    for cell in cells.split(",") {
      nodes.push(Text(""))
    }
    nodes.push(Text(""))
  }
  nodes.push(Text("
")) nodes.append( reading.block(cell.trim().to_owned(), "html", None, reading.line), ) nodes.push(Text("
")) nodes } ///| fn main { let env = @moonpug.Env::new() env.add_lang({ name: "csv", aliases: ["table"], options: @syntax.options, read: read_csv, }) let source = #|

Stock

#|{% block lang=csv %} #|item, count #|ink, {{ ink }} #|paper, {{ paper * 2 }} #|{% endblock %} println(env.compile(source).render({ "ink": 3, "paper": 50 })) catch { e => println("refused: \{e}") } }