@@ -95,6 +95,73 @@ func convertFromASTNode(rawNode ast.Node) *apiv2pb.Node {
9595 return node
9696}
9797
98+ func convertToASTNodes (nodes []* apiv2pb.Node ) []ast.Node {
99+ rawNodes := []ast.Node {}
100+ for _ , node := range nodes {
101+ rawNode := convertToASTNode (node )
102+ rawNodes = append (rawNodes , rawNode )
103+ }
104+ return rawNodes
105+ }
106+
107+ func convertToASTNode (node * apiv2pb.Node ) ast.Node {
108+ switch n := node .Node .(type ) {
109+ case * apiv2pb.Node_LineBreakNode :
110+ return & ast.LineBreak {}
111+ case * apiv2pb.Node_ParagraphNode :
112+ children := convertToASTNodes (n .ParagraphNode .Children )
113+ return & ast.Paragraph {Children : children }
114+ case * apiv2pb.Node_CodeBlockNode :
115+ return & ast.CodeBlock {Language : n .CodeBlockNode .Language , Content : n .CodeBlockNode .Content }
116+ case * apiv2pb.Node_HeadingNode :
117+ children := convertToASTNodes (n .HeadingNode .Children )
118+ return & ast.Heading {Level : int (n .HeadingNode .Level ), Children : children }
119+ case * apiv2pb.Node_HorizontalRuleNode :
120+ return & ast.HorizontalRule {Symbol : n .HorizontalRuleNode .Symbol }
121+ case * apiv2pb.Node_BlockquoteNode :
122+ children := convertToASTNodes (n .BlockquoteNode .Children )
123+ return & ast.Blockquote {Children : children }
124+ case * apiv2pb.Node_OrderedListNode :
125+ children := convertToASTNodes (n .OrderedListNode .Children )
126+ return & ast.OrderedList {Number : n .OrderedListNode .Number , Children : children }
127+ case * apiv2pb.Node_UnorderedListNode :
128+ children := convertToASTNodes (n .UnorderedListNode .Children )
129+ return & ast.UnorderedList {Symbol : n .UnorderedListNode .Symbol , Children : children }
130+ case * apiv2pb.Node_TaskListNode :
131+ children := convertToASTNodes (n .TaskListNode .Children )
132+ return & ast.TaskList {Symbol : n .TaskListNode .Symbol , Complete : n .TaskListNode .Complete , Children : children }
133+ case * apiv2pb.Node_MathBlockNode :
134+ return & ast.MathBlock {Content : n .MathBlockNode .Content }
135+ case * apiv2pb.Node_TextNode :
136+ return & ast.Text {Content : n .TextNode .Content }
137+ case * apiv2pb.Node_BoldNode :
138+ children := convertToASTNodes (n .BoldNode .Children )
139+ return & ast.Bold {Symbol : n .BoldNode .Symbol , Children : children }
140+ case * apiv2pb.Node_ItalicNode :
141+ return & ast.Italic {Symbol : n .ItalicNode .Symbol , Content : n .ItalicNode .Content }
142+ case * apiv2pb.Node_BoldItalicNode :
143+ return & ast.BoldItalic {Symbol : n .BoldItalicNode .Symbol , Content : n .BoldItalicNode .Content }
144+ case * apiv2pb.Node_CodeNode :
145+ return & ast.Code {Content : n .CodeNode .Content }
146+ case * apiv2pb.Node_ImageNode :
147+ return & ast.Image {AltText : n .ImageNode .AltText , URL : n .ImageNode .Url }
148+ case * apiv2pb.Node_LinkNode :
149+ return & ast.Link {Text : n .LinkNode .Text , URL : n .LinkNode .Url }
150+ case * apiv2pb.Node_AutoLinkNode :
151+ return & ast.AutoLink {URL : n .AutoLinkNode .Url }
152+ case * apiv2pb.Node_TagNode :
153+ return & ast.Tag {Content : n .TagNode .Content }
154+ case * apiv2pb.Node_StrikethroughNode :
155+ return & ast.Strikethrough {Content : n .StrikethroughNode .Content }
156+ case * apiv2pb.Node_EscapingCharacterNode :
157+ return & ast.EscapingCharacter {Symbol : n .EscapingCharacterNode .Symbol }
158+ case * apiv2pb.Node_MathNode :
159+ return & ast.Math {Content : n .MathNode .Content }
160+ default :
161+ return & ast.Text {}
162+ }
163+ }
164+
98165func traverseASTNodes (nodes []ast.Node , fn func (ast.Node )) {
99166 for _ , node := range nodes {
100167 fn (node )
0 commit comments