|
@@ -12,7 +12,7 @@ namespace GtkCommonMark {
|
|
|
private Gtk.TextIter tb_iter;
|
|
|
private List<NodeActions.NodeAction> node_actions;
|
|
|
|
|
|
- public signal void widget_embedded(MarkdownViewEmbeddedWidgetHost widget_host, CMark.Node node);
|
|
|
+ public signal void widget_embedded(MarkdownViewEmbeddedWidgetHost widget_host, NodeInfo node);
|
|
|
|
|
|
public Reader(Gtk.TextBuffer buffer, Gtk.TextView text_view, TagManager tag_manager) {
|
|
|
this.tags = tag_manager;
|
|
@@ -20,7 +20,18 @@ namespace GtkCommonMark {
|
|
|
this.text_view = text_view;
|
|
|
}
|
|
|
|
|
|
- public void append_node(CMark.Node root) {
|
|
|
+
|
|
|
+ public void read_file(FileStream stream) {
|
|
|
+ var root = CMark.Node.parse_file (stream, CMark.OPT.DEFAULT);
|
|
|
+ append_node(root);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void read_data(uint8[] document) {
|
|
|
+ var root = CMark.Node.parse_document(document, CMark.OPT.DEFAULT);
|
|
|
+ append_node (root);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void append_node(CMark.Node root) {
|
|
|
cm_iter = new CMark.Iter(root);
|
|
|
buffer.get_end_iter(out tb_iter);
|
|
|
node_actions = new List<NodeActions.NodeAction>();
|
|
@@ -34,14 +45,15 @@ namespace GtkCommonMark {
|
|
|
|
|
|
unowned var node = cm_iter.get_node();
|
|
|
|
|
|
- var action = build_action_for_node(node);
|
|
|
+ var node_info = new NodeInfo.from_node(node);
|
|
|
+ var action = build_action_for_node(node_info);
|
|
|
|
|
|
node_actions.prepend(action);
|
|
|
|
|
|
prepare_for_child();
|
|
|
action.at_start(buffer, ref tb_iter);
|
|
|
|
|
|
- if(is_leaf(node.get_type())) {
|
|
|
+ if(node_info.is_leaf) {
|
|
|
pop_and_finalise_node_action();
|
|
|
}
|
|
|
}
|
|
@@ -81,107 +93,46 @@ namespace GtkCommonMark {
|
|
|
parent_action.at_after_child(buffer, ref tb_iter, child_action.node);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- private bool is_block(CMark.NODE_TYPE type) {
|
|
|
- switch (type) {
|
|
|
- case CMark.NODE_TYPE.DOCUMENT:
|
|
|
- case CMark.NODE_TYPE.BLOCK_QUOTE:
|
|
|
- case CMark.NODE_TYPE.LIST:
|
|
|
- case CMark.NODE_TYPE.ITEM:
|
|
|
- case CMark.NODE_TYPE.CODE_BLOCK:
|
|
|
- case CMark.NODE_TYPE.HTML_BLOCK:
|
|
|
- case CMark.NODE_TYPE.CUSTOM_BLOCK:
|
|
|
- case CMark.NODE_TYPE.PARAGRAPH:
|
|
|
- case CMark.NODE_TYPE.HEADING:
|
|
|
- case CMark.NODE_TYPE.THEMATIC_BREAK:
|
|
|
- return true;
|
|
|
- case CMark.NODE_TYPE.TEXT:
|
|
|
- case CMark.NODE_TYPE.SOFTBREAK:
|
|
|
- case CMark.NODE_TYPE.LINEBREAK:
|
|
|
- case CMark.NODE_TYPE.CODE:
|
|
|
- case CMark.NODE_TYPE.HTML_INLINE:
|
|
|
- case CMark.NODE_TYPE.CUSTOM_INLINE:
|
|
|
- case CMark.NODE_TYPE.EMPH:
|
|
|
- case CMark.NODE_TYPE.STRONG:
|
|
|
- case CMark.NODE_TYPE.LINK:
|
|
|
- case CMark.NODE_TYPE.IMAGE:
|
|
|
- case CMark.NODE_TYPE.NONE:
|
|
|
- default:
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- private bool is_leaf(CMark.NODE_TYPE type) {
|
|
|
- switch (type) {
|
|
|
- case CMark.NODE_TYPE.HTML_BLOCK:
|
|
|
- case CMark.NODE_TYPE.THEMATIC_BREAK:
|
|
|
- case CMark.NODE_TYPE.CODE_BLOCK:
|
|
|
- case CMark.NODE_TYPE.TEXT:
|
|
|
- case CMark.NODE_TYPE.SOFTBREAK:
|
|
|
- case CMark.NODE_TYPE.LINEBREAK:
|
|
|
- case CMark.NODE_TYPE.CODE:
|
|
|
- case CMark.NODE_TYPE.HTML_INLINE:
|
|
|
- return true;
|
|
|
- case CMark.NODE_TYPE.DOCUMENT:
|
|
|
- case CMark.NODE_TYPE.BLOCK_QUOTE:
|
|
|
- case CMark.NODE_TYPE.LIST:
|
|
|
- case CMark.NODE_TYPE.ITEM:
|
|
|
- case CMark.NODE_TYPE.CUSTOM_BLOCK:
|
|
|
- case CMark.NODE_TYPE.PARAGRAPH:
|
|
|
- case CMark.NODE_TYPE.HEADING:
|
|
|
- case CMark.NODE_TYPE.CUSTOM_INLINE:
|
|
|
- case CMark.NODE_TYPE.EMPH:
|
|
|
- case CMark.NODE_TYPE.STRONG:
|
|
|
- case CMark.NODE_TYPE.LINK:
|
|
|
- case CMark.NODE_TYPE.IMAGE:
|
|
|
- case CMark.NODE_TYPE.NONE:
|
|
|
- default:
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_node(CMark.Node node) {
|
|
|
- var type = node.get_type();
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_node(NodeInfo node) {
|
|
|
+ var type = node.node_type;
|
|
|
switch (type) {
|
|
|
- case CMark.NODE_TYPE.BLOCK_QUOTE:
|
|
|
+ case NodeType.BLOCK_QUOTE:
|
|
|
return build_action_for_block_quote(node);
|
|
|
- case CMark.NODE_TYPE.LIST:
|
|
|
+ case NodeType.LIST:
|
|
|
return build_action_for_list(node);
|
|
|
- case CMark.NODE_TYPE.ITEM:
|
|
|
+ case NodeType.ITEM:
|
|
|
return build_action_for_item(node);
|
|
|
- case CMark.NODE_TYPE.CODE_BLOCK:
|
|
|
+ case NodeType.CODE_BLOCK:
|
|
|
return build_action_for_code_block(node);
|
|
|
- case CMark.NODE_TYPE.HTML_BLOCK:
|
|
|
+ case NodeType.HTML_BLOCK:
|
|
|
return build_action_for_html_block(node);
|
|
|
- case CMark.NODE_TYPE.CUSTOM_BLOCK:
|
|
|
+ case NodeType.CUSTOM_BLOCK:
|
|
|
return build_action_for_custom_block(node);
|
|
|
- case CMark.NODE_TYPE.PARAGRAPH:
|
|
|
+ case NodeType.PARAGRAPH:
|
|
|
return build_action_for_paragraph(node);
|
|
|
- case CMark.NODE_TYPE.HEADING:
|
|
|
+ case NodeType.HEADING:
|
|
|
return build_action_for_heading(node);
|
|
|
- case CMark.NODE_TYPE.THEMATIC_BREAK:
|
|
|
+ case NodeType.THEMATIC_BREAK:
|
|
|
return build_action_for_thematic_break(node);
|
|
|
- case CMark.NODE_TYPE.TEXT:
|
|
|
+ case NodeType.TEXT:
|
|
|
return build_action_for_text(node);
|
|
|
- case CMark.NODE_TYPE.SOFTBREAK:
|
|
|
+ case NodeType.SOFTBREAK:
|
|
|
return build_action_for_soft_break(node);
|
|
|
- case CMark.NODE_TYPE.LINEBREAK:
|
|
|
+ case NodeType.LINEBREAK:
|
|
|
return build_action_for_line_break(node);
|
|
|
- case CMark.NODE_TYPE.CODE:
|
|
|
+ case NodeType.CODE:
|
|
|
return build_action_for_code(node);
|
|
|
- case CMark.NODE_TYPE.HTML_INLINE:
|
|
|
+ case NodeType.HTML_INLINE:
|
|
|
return build_action_for_inline_html(node);
|
|
|
- case CMark.NODE_TYPE.CUSTOM_INLINE:
|
|
|
+ case NodeType.CUSTOM_INLINE:
|
|
|
return build_action_for_inline_custom(node);
|
|
|
- case CMark.NODE_TYPE.EMPH:
|
|
|
+ case NodeType.EMPH:
|
|
|
return build_action_for_emphisis(node);
|
|
|
- case CMark.NODE_TYPE.STRONG:
|
|
|
+ case NodeType.STRONG:
|
|
|
return build_action_for_bold(node);
|
|
|
- case CMark.NODE_TYPE.LINK:
|
|
|
+ case NodeType.LINK:
|
|
|
return build_action_for_link(node);
|
|
|
- case CMark.NODE_TYPE.IMAGE:
|
|
|
+ case NodeType.IMAGE:
|
|
|
return build_action_for_embed(node);
|
|
|
|
|
|
default:
|
|
@@ -190,96 +141,96 @@ namespace GtkCommonMark {
|
|
|
}
|
|
|
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_block_quote(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_block_quote(NodeInfo node) {
|
|
|
return new NodeActions.Quote(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_list(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_list(NodeInfo node) {
|
|
|
return new NodeActions.List(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_item(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_item(NodeInfo node) {
|
|
|
return new NodeActions.Item(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_code_block(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_code_block(NodeInfo node) {
|
|
|
return new NodeActions.CodeBlock(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_html_block(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_html_block(NodeInfo node) {
|
|
|
GLib.warning("An HTML block was detected while reading the markdown file which is unsupported, it will be omitted");
|
|
|
return build_default_action(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_custom_block(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_custom_block(NodeInfo node) {
|
|
|
GLib.warning("A custom block was detected while reading the markdown file which is unsupported, it will be omitted");
|
|
|
return build_default_action(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_paragraph(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_paragraph(NodeInfo node) {
|
|
|
return new NodeActions.Paragraph(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_heading(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_heading(NodeInfo node) {
|
|
|
return new NodeActions.Heading(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_thematic_break(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_thematic_break(NodeInfo node) {
|
|
|
var host = build_embed_widget(node);
|
|
|
return new NodeActions.ThematicBreak(node, text_view, host);
|
|
|
}
|
|
|
|
|
|
// Inline Elements
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_text(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_text(NodeInfo node) {
|
|
|
return new NodeActions.Text(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_soft_break(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_soft_break(NodeInfo node) {
|
|
|
return build_default_action(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_line_break(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_line_break(NodeInfo node) {
|
|
|
return new NodeActions.Break(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_code(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_code(NodeInfo node) {
|
|
|
return new NodeActions.Code(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_inline_html(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_inline_html(NodeInfo node) {
|
|
|
GLib.warning("An HTML inline segment was detected while reading the markdown file which is unsupported, it will be omitted");
|
|
|
return build_default_action(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_inline_custom(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_inline_custom(NodeInfo node) {
|
|
|
GLib.warning("A custom inline segment was detected while reading the markdown file which is unsupported, it will be omitted");
|
|
|
return build_default_action(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_emphisis(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_emphisis(NodeInfo node) {
|
|
|
return new NodeActions.Emphisis(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_bold(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_bold(NodeInfo node) {
|
|
|
return new NodeActions.Strong(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_link(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_link(NodeInfo node) {
|
|
|
return new NodeActions.Link(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_embed(CMark.Node node) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_embed(NodeInfo node) {
|
|
|
return new NodeActions.Embed(node, text_view, build_embed_widget(node));
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_default_action(CMark.Node node) {
|
|
|
- if(is_block(node.get_type())) {
|
|
|
+ protected virtual NodeActions.NodeAction build_default_action(NodeInfo node) {
|
|
|
+ if(node.is_block) {
|
|
|
return new NodeActions.NewlineTerminatedNodeAction(node);
|
|
|
}
|
|
|
return new NodeActions.SimpleNodeAction(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual MarkdownViewEmbeddedWidgetHost build_embed_widget(CMark.Node node) {
|
|
|
+ protected virtual MarkdownViewEmbeddedWidgetHost build_embed_widget(NodeInfo node) {
|
|
|
var widget = new MarkdownViewEmbeddedWidgetHost();
|
|
|
widget_embedded(widget, node);
|
|
|
widget.show();
|