|
@@ -6,14 +6,16 @@ namespace GtkCommonMark {
|
|
|
|
|
|
private TagManager tags;
|
|
|
private Gtk.TextBuffer buffer;
|
|
|
+ private Gtk.TextView text_view;
|
|
|
|
|
|
private CMark.Iter cm_iter = null;
|
|
|
private Gtk.TextIter tb_iter;
|
|
|
private List<NodeActions.NodeAction> node_actions;
|
|
|
|
|
|
- public Reader(Gtk.TextBuffer buffer, TagManager tag_manager) {
|
|
|
+ public Reader(Gtk.TextBuffer buffer, Gtk.TextView text_view, TagManager tag_manager) {
|
|
|
this.tags = tag_manager;
|
|
|
this.buffer = buffer;
|
|
|
+ this.text_view = text_view;
|
|
|
}
|
|
|
|
|
|
public void append_node(CMark.Node root) {
|
|
@@ -29,8 +31,9 @@ namespace GtkCommonMark {
|
|
|
}
|
|
|
|
|
|
unowned var node = cm_iter.get_node();
|
|
|
- var start_mark = buffer.create_mark(null, tb_iter, true);
|
|
|
- var action = build_action_for_node(node, start_mark);
|
|
|
+
|
|
|
+ var action = build_action_for_node(node);
|
|
|
+
|
|
|
node_actions.prepend(action);
|
|
|
|
|
|
prepare_for_child();
|
|
@@ -55,12 +58,16 @@ namespace GtkCommonMark {
|
|
|
}
|
|
|
|
|
|
private void prepare_for_child() {
|
|
|
+ var child_action = node_actions.nth_data(0);
|
|
|
if(node_actions.length() < 2) {
|
|
|
+ child_action.start_mark = buffer.create_mark(null, tb_iter, true);
|
|
|
return;
|
|
|
}
|
|
|
- var child_action = node_actions.nth_data(0);
|
|
|
+
|
|
|
var parent_action = node_actions.nth_data(1);
|
|
|
parent_action.at_before_child(buffer, ref tb_iter, child_action.node);
|
|
|
+ child_action.start_mark = buffer.create_mark(null, tb_iter, true);
|
|
|
+ parent_action.at_child_start(buffer, ref tb_iter, child_action.node);
|
|
|
}
|
|
|
|
|
|
private void finalise_after_child() {
|
|
@@ -133,136 +140,143 @@ namespace GtkCommonMark {
|
|
|
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_node(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_node(CMark.Node node) {
|
|
|
var type = node.get_type();
|
|
|
+ print(@"Building type $type\n");
|
|
|
switch (type) {
|
|
|
case CMark.NODE_TYPE.BLOCK_QUOTE:
|
|
|
- return build_action_for_block_quote(node, start_mark);
|
|
|
+ return build_action_for_block_quote(node);
|
|
|
case CMark.NODE_TYPE.LIST:
|
|
|
- return build_action_for_list(node, start_mark);
|
|
|
+ return build_action_for_list(node);
|
|
|
case CMark.NODE_TYPE.ITEM:
|
|
|
- return build_action_for_item(node, start_mark);
|
|
|
+ return build_action_for_item(node);
|
|
|
case CMark.NODE_TYPE.CODE_BLOCK:
|
|
|
- return build_action_for_code_block(node, start_mark);
|
|
|
+ return build_action_for_code_block(node);
|
|
|
case CMark.NODE_TYPE.HTML_BLOCK:
|
|
|
- return build_action_for_html_block(node, start_mark);
|
|
|
+ return build_action_for_html_block(node);
|
|
|
case CMark.NODE_TYPE.CUSTOM_BLOCK:
|
|
|
- return build_action_for_custom_block(node, start_mark);
|
|
|
+ return build_action_for_custom_block(node);
|
|
|
case CMark.NODE_TYPE.PARAGRAPH:
|
|
|
- return build_action_for_paragraph(node, start_mark);
|
|
|
+ return build_action_for_paragraph(node);
|
|
|
case CMark.NODE_TYPE.HEADING:
|
|
|
- return build_action_for_heading(node, start_mark);
|
|
|
+ return build_action_for_heading(node);
|
|
|
case CMark.NODE_TYPE.THEMATIC_BREAK:
|
|
|
- return build_action_for_thematic_break(node, start_mark);
|
|
|
+ return build_action_for_thematic_break(node);
|
|
|
case CMark.NODE_TYPE.TEXT:
|
|
|
- return build_action_for_text(node, start_mark);
|
|
|
+ return build_action_for_text(node);
|
|
|
case CMark.NODE_TYPE.SOFTBREAK:
|
|
|
- return build_action_for_soft_break(node, start_mark);
|
|
|
+ return build_action_for_soft_break(node);
|
|
|
case CMark.NODE_TYPE.LINEBREAK:
|
|
|
- return build_action_for_line_break(node, start_mark);
|
|
|
+ return build_action_for_line_break(node);
|
|
|
case CMark.NODE_TYPE.CODE:
|
|
|
- return build_action_for_code(node, start_mark);
|
|
|
+ return build_action_for_code(node);
|
|
|
case CMark.NODE_TYPE.HTML_INLINE:
|
|
|
- return build_action_for_inline_html(node, start_mark);
|
|
|
+ return build_action_for_inline_html(node);
|
|
|
case CMark.NODE_TYPE.CUSTOM_INLINE:
|
|
|
- return build_action_for_inline_custom(node, start_mark);
|
|
|
+ return build_action_for_inline_custom(node);
|
|
|
case CMark.NODE_TYPE.EMPH:
|
|
|
- return build_action_for_emphisis(node, start_mark);
|
|
|
+ return build_action_for_emphisis(node);
|
|
|
case CMark.NODE_TYPE.STRONG:
|
|
|
- return build_action_for_bold(node, start_mark);
|
|
|
+ return build_action_for_bold(node);
|
|
|
case CMark.NODE_TYPE.LINK:
|
|
|
- return build_action_for_link(node, start_mark);
|
|
|
+ return build_action_for_link(node);
|
|
|
case CMark.NODE_TYPE.IMAGE:
|
|
|
- return build_action_for_embed(node, start_mark);
|
|
|
+ return build_action_for_embed(node);
|
|
|
|
|
|
default:
|
|
|
- return build_default_action(node, start_mark);
|
|
|
+ return build_default_action(node);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_block_quote(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return build_default_action(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_block_quote(CMark.Node node) {
|
|
|
+ return new NodeActions.Quote(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_list(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return new NodeActions.List(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_list(CMark.Node node) {
|
|
|
+ return new NodeActions.List(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_item(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return build_default_action(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_item(CMark.Node node) {
|
|
|
+ return new NodeActions.Item(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_code_block(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return build_default_action(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_code_block(CMark.Node node) {
|
|
|
+ return new NodeActions.CodeBlock(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_html_block(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return build_default_action(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_html_block(CMark.Node node) {
|
|
|
+ return build_default_action(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_custom_block(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return build_default_action(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_custom_block(CMark.Node node) {
|
|
|
+ return build_default_action(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_paragraph(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return build_default_action(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_paragraph(CMark.Node node) {
|
|
|
+ return new NodeActions.Paragraph(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_heading(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return new NodeActions.Heading(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_heading(CMark.Node node) {
|
|
|
+ return new NodeActions.Heading(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_thematic_break(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return build_default_action(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_thematic_break(CMark.Node node) {
|
|
|
+ return new NodeActions.ThematicBreak(node, text_view);
|
|
|
}
|
|
|
|
|
|
// Inline Elements
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_text(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return build_default_action(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_text(CMark.Node node) {
|
|
|
+ return new NodeActions.Text(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_soft_break(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return build_default_action(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_soft_break(CMark.Node node) {
|
|
|
+ return build_default_action(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_line_break(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return build_default_action(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_line_break(CMark.Node node) {
|
|
|
+ return new NodeActions.Break(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_code(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return build_default_action(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_code(CMark.Node node) {
|
|
|
+ return new NodeActions.Code(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_inline_html(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return build_default_action(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_inline_html(CMark.Node node) {
|
|
|
+ return build_default_action(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_inline_custom(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return build_default_action(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_inline_custom(CMark.Node node) {
|
|
|
+ return build_default_action(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_emphisis(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return new NodeActions.Emphisis(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_emphisis(CMark.Node node) {
|
|
|
+ return new NodeActions.Emphisis(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_bold(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return new NodeActions.Strong(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_bold(CMark.Node node) {
|
|
|
+ return new NodeActions.Strong(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_link(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return build_default_action(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_link(CMark.Node node) {
|
|
|
+ return build_default_action(node);
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_action_for_embed(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
- return build_default_action(node, start_mark);
|
|
|
+ protected virtual NodeActions.NodeAction build_action_for_embed(CMark.Node node) {
|
|
|
+ return new NodeActions.Embed(node, text_view, build_embed_widget(node));
|
|
|
}
|
|
|
|
|
|
- protected virtual NodeActions.NodeAction build_default_action(CMark.Node node, Gtk.TextMark start_mark) {
|
|
|
+ protected virtual NodeActions.NodeAction build_default_action(CMark.Node node) {
|
|
|
if(is_block(node.get_type())) {
|
|
|
- return new NodeActions.BlockNodeAction(node, start_mark);
|
|
|
+ return new NodeActions.NewlineTerminatedNodeAction(node);
|
|
|
}
|
|
|
- return new NodeActions.SimpleNodeAction(node, start_mark);
|
|
|
+ return new NodeActions.SimpleNodeAction(node);
|
|
|
+ }
|
|
|
+
|
|
|
+ protected virtual Gtk.Widget build_embed_widget(CMark.Node node) {
|
|
|
+ var widget = new Gtk.Image.from_file(node.get_url());
|
|
|
+ widget.set_size_request(500, 500);
|
|
|
+ return widget;
|
|
|
}
|
|
|
|
|
|
}
|