Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Handle indents when appending or inserting ordered lines #1478

Draft
wants to merge 1 commit into
base: jeremypw/fix-markdown-numberedlist
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 47 additions & 27 deletions plugins/markdown-actions/markdown-actions.vala
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public class Code.Plugins.MarkdownActions : Peas.ExtensionBase, Peas.Activatable

if (evt.keyval == Gdk.Key.Return) {
char ul_marker;
int ol_number = 1;
int indent_spaces, ol_number;
string item_text;
var line = get_current_line ();
if (parse_unordered_list_item (line, out ul_marker)) {
Expand All @@ -88,13 +88,13 @@ public class Code.Plugins.MarkdownActions : Peas.ExtensionBase, Peas.Activatable
current_source.buffer.insert_at_cursor (to_insert, to_insert.length);
}
return true;
} else if (parse_ordered_list_item (line, ref ol_number, out item_text)) {
} else if (parse_ordered_list_item (line, out ol_number, out item_text, out indent_spaces)) {
if (item_text.length == 0) {
delete_empty_item ();
} else {
string to_insert = "\n%d. ".printf (ol_number + 1);
string to_insert = "\n%s%d. ".printf (string.nfill (indent_spaces, ' '), ol_number + 1);
current_source.buffer.insert_at_cursor (to_insert, to_insert.length);
fix_ordered_list_numbering ();
fix_ordered_list_numbering (indent_spaces);
}
return true;
}
Expand All @@ -111,36 +111,44 @@ public class Code.Plugins.MarkdownActions : Peas.ExtensionBase, Peas.Activatable
end.forward_to_line_end ();
current_buffer.delete (ref start, ref end);
current_buffer.insert_at_cursor ("\n", 1);
current_buffer.get_iter_at_offset (out start, current_buffer.cursor_position);
}

private void fix_ordered_list_numbering () {
private void fix_ordered_list_numbering (int indent_spaces) {
Gtk.TextIter next;
var count = 1;
var item_text = "";
var current_buffer = current_source.buffer;

current_buffer.get_iter_at_offset (out next, current_buffer.cursor_position);
var line = get_current_line (next).strip ();
var line = get_current_line (next);
// Get list item number from current line
parse_ordered_list_item (line, ref count, out item_text);
int next_indent_spaces, count, next_count;
string item_text;
parse_ordered_list_item (line, out count, out item_text, out next_indent_spaces);
// Start checking following lines
next.forward_line ();
line = get_current_line (next).strip ();
while (parse_ordered_list_item (line, ref count, out item_text)) {
count++;
var next_mark = current_buffer.create_mark (null, next, true);
var point_offset = line.index_of_char ('.');
var start = next;
var end = start;
end.forward_chars (point_offset);

current_buffer.delete (ref start, ref end);
current_buffer.get_iter_at_mark (out next, next_mark);

var to_insert = "%d".printf (count);
current_buffer.insert (ref next, to_insert, to_insert.length);
line = get_current_line (next); // Next now at line start
// Search for ordered list lines at the same level until level falls below
while (parse_ordered_list_item (line, out next_count, out item_text, out next_indent_spaces) &&
next_indent_spaces >= indent_spaces) {

// Only update lines at same indent within same block
if (next_indent_spaces == indent_spaces) {
count++;
next.forward_chars (indent_spaces);
var next_mark = current_buffer.create_mark (null, next, true);
var point_offset = line.strip ().index_of_char ('.');
var start = next;
var end = start;
end.forward_chars (point_offset);

current_buffer.delete (ref start, ref end);
current_buffer.get_iter_at_mark (out next, next_mark);

var to_insert = "%d".printf (count);
current_buffer.insert (ref next, to_insert, to_insert.length);
}

next.forward_line ();
line = get_current_line (next).strip ();
line = get_current_line (next);
}
}

Expand All @@ -159,8 +167,16 @@ public class Code.Plugins.MarkdownActions : Peas.ExtensionBase, Peas.Activatable
return current_buffer.get_text (start, end, false);
}

private bool parse_ordered_list_item (string line, ref int current_number, out string item_text) {
private bool parse_ordered_list_item (
string line,
out int current_number,
out string item_text,
out int indent_spaces) {

item_text = "";
indent_spaces = -1;
current_number = -1;

int first_point_character = line.index_of_char ('.');
if (first_point_character < 0) {
return false;
Expand All @@ -169,17 +185,21 @@ public class Code.Plugins.MarkdownActions : Peas.ExtensionBase, Peas.Activatable
item_text = line.substring (first_point_character + 1).strip ();

var line_start = line.substring (0, first_point_character);
indent_spaces = line_start.last_index_of_char (' ') + 1;
if (!int.try_parse (line_start, out current_number)) {
return false;
}
return true;

return indent_spaces >= 0 && current_number >= 1;
}

private bool parse_unordered_list_item (string line, out char ul_marker) {
line.chug (); // Remove leading spaces
if ((line[0] == '*' || line[0] == '-') && line[1] == ' ') {
ul_marker = line[0];
return true;
}

ul_marker = '\0';
return false;
}
Expand Down