!7 cmodule SmartParser > DynTextArea { transient SingleComponentPanel scp; transient L parsed; visual jvsplit(super, jCenteredSection("Parsed", scp = singleComponentPanel(makeComponent()))); start { dm_watchFieldAndNow text(r parse); } void parse { setField(parsed := smartParser1_generic(text)); if (scp != null) scp.setComponent(makeComponent()); } JComponent makeComponent() { pnl(+parsed); ret jscroll(jTree_hideRoot(jDynamicTree( (O) parsed, o -> makeChildren(o), makeChildrenIsFast := true))); } Cl makeChildren(O o) { o = getVarOpt(o); if (o cast Cl) ret o; if (o cast S) ret subParse(o); null; } L subParse(S s) { // drop outer brackets, keep first spacing if it's pythonesque s = tok_deRoundOrCurlyBracket_keepFirstSpacing(s); s = withoutLeadingLinesEmptyAfterTrim(s); bool lineByLine = ai_isLineByLine(s); ret lineByLine ? tlftj(s) : wordTokC(s); } }