diff --git a/plugins/tiddlywiki/internals/editpreviews/parse-tree.tid b/plugins/tiddlywiki/internals/editpreviews/parse-tree.tid
index aafa30ecf..97da36a40 100644
--- a/plugins/tiddlywiki/internals/editpreviews/parse-tree.tid
+++ b/plugins/tiddlywiki/internals/editpreviews/parse-tree.tid
@@ -3,13 +3,120 @@ tags: $:/tags/EditPreview
list-after: $:/core/ui/EditTemplate/body/preview/output
caption: parse tree
-\define preview(mode)
-<$wikify name="preview-text" text={{!!text}} type={{!!type}} mode="$mode$" output="parsetree">
-
-
-<$text text=<>/>
-
-
+\procedure preview-node-properties(node)
+<$let excludeProperties="text type tag children attributes orderedAttributes">
+<$list filter="[jsonindexes[]] -[subfilter] +[limit[1]]" variable="ignore">
+
+
+<$list filter="[jsonindexes[]] -[subfilter] +[sort[]]" variable="index">
+
+
+<$text text=<>/>
+ |
+
+<$text text={{{ [jsonget] }}}/>
+ |
+
+$list>
+
+
+$list>
+$let>
+\end
+
+\procedure preview-node-attribute-string(attribute)
+<$text text={{{ [jsonget[value]] }}}/>
+\end
+
+\procedure preview-node-attribute-indirect(attribute)
+{{<$text text={{{ [jsonget[textReference]] }}}/>}}
+\end
+
+\procedure preview-node-attribute-macro(attribute)
+\whitespace trim
+<<
+<$text text={{{ [jsonget[value],[name]] }}}/>
+<$list filter="[jsonindexes[value],[params]]" variable="index">
+
+<$list filter="[jsonget[value],[params],,[name]]" variable="ignore">
+<$text text={{{ [jsonget[value],[params],,[name]] }}}/>
+:
+$list>
+<$text text={{{ [jsonget[value],[params],,[value]] }}}/>
+$list>
+>>
+\end
+
+\procedure preview-node-attributes(node)
+<$list filter="[jsonindexes[attributes]limit[1]]" variable="ignore">
+
+
+<$list filter="[jsonindexes[attributes]sort[]]" variable="index">
+
+
+<$text text=<>/>
+ |
+
+<$let type={{{ [jsonget[attributes],,[type]] }}}>
+<$transclude $variable={{{ [match[string]then[preview-node-attribute-string]] :else[match[indirect]then[preview-node-attribute-indirect]] :else[match[macro]then[preview-node-attribute-macro]] }}} attribute={{{ [jsonextract[attributes],] }}}/>
+$let>
+ |
+
+$list>
+
+
+$list>
+\end
+
+\procedure preview-node-children(node)
+
+<$transclude $variable="preview-node-properties" node=<>/>
+<$transclude $variable="preview-node-attributes" node=<>/>
+<$transclude $variable="preview-node-list" nodeList={{{ [jsonextract[children]] }}}/>
+
+\end
+
+\procedure preview-node-title-widget(node)
+
+
+<$<$text text={{{ [jsonget[type]] }}}/>>
+
+<$transclude $variable="preview-node-children" node=<
>/>
+
+\end
+
+\procedure preview-node-title-element(node)
+
+
+<<$text text={{{ [jsonget[tag]] }}}/>>
+
+<$transclude $variable="preview-node-children" node=<
>/>
+
+\end
+
+\procedure preview-node-title-text(node)
+
+
+"<$text text={{{ [jsonget[text]] }}}/>"
+
+
+\end
+
+\procedure preview-node(node)
+<$let type={{{ [jsonget[type]] }}}>
+<$transclude $variable={{{ [match[element]then[preview-node-title-element]] :else[match[text]then[preview-node-title-text]] :else[[preview-node-title-widget]] }}} node=<>/>
+$let>
+\end
+
+\procedure preview-node-list(nodeList)
+<$list filter="[jsonindexes[]]" variable="index">
+<$transclude $variable="preview-node" node={{{ [jsonextract] }}}/>
+$list>
+\end
+
+\procedure preview(mode)
+<$wikify name="preview-json" text={{!!text}} type={{!!type}} mode=<> output="parsetree">
+<$transclude $variable="preview-node-list" nodeList=<>/>
$wikify>
\end