!7 cmodule FluidTextFileSpike > DynPrintLog { srecord Entry(S header, S text) { SS params() { ret parseEqualsCommaProperties(header); } } transient S demoContent = autoUnindent_mls([=[ refs="at *", name="index" [[ entry 1 at abc entry 2 at def ]] idx=abc [[hello]] idx=def [[world]] ]=]); start-thread { print(demoContent); Producer p = javaTok_onReader(stringReader(demoContent)); new StringBuilder buf; new L entries; S t; p.next(); // skip initial white space while ((t = p.next()) != null) { if (isMLS(t)) { entries.add(new Entry(getAndClearStringBuilder(buf), t)); p.next(); // skip white space } else buf.append(t); // part of entry header } pnlStruct(entries); for (Entry e : entries) { SS params = e.params(); params.put("l", l(e.text)); print(renderEqualsCommaProperties(params) + " " + e.text); } } }