|
|
|
@ -639,7 +639,8 @@ void Source::View::setup_signals() { |
|
|
|
void Source::View::setup_format_style(bool is_generic_view) { |
|
|
|
void Source::View::setup_format_style(bool is_generic_view) { |
|
|
|
static auto prettier = filesystem::find_executable("prettier"); |
|
|
|
static auto prettier = filesystem::find_executable("prettier"); |
|
|
|
if(!prettier.empty() && language && |
|
|
|
if(!prettier.empty() && language && |
|
|
|
(language->get_id() == "js" || language->get_id() == "json" || language->get_id() == "css" || language->get_id() == "html")) { |
|
|
|
(language->get_id() == "js" || language->get_id() == "json" || language->get_id() == "css" || language->get_id() == "html" || |
|
|
|
|
|
|
|
language->get_id() == "markdown" || language->get_id() == "yaml")) { |
|
|
|
if(is_generic_view) { |
|
|
|
if(is_generic_view) { |
|
|
|
goto_next_diagnostic = [this] { |
|
|
|
goto_next_diagnostic = [this] { |
|
|
|
place_cursor_at_next_diagnostic(); |
|
|
|
place_cursor_at_next_diagnostic(); |
|
|
|
@ -877,137 +878,6 @@ void Source::View::setup_format_style(bool is_generic_view) { |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
|
} |
|
|
|
} |
|
|
|
else if(language && language->get_id() == "markdown") { |
|
|
|
|
|
|
|
// The style file currently has no options, but checking if it exists
|
|
|
|
|
|
|
|
format_style = [this](bool continue_without_style_file) { |
|
|
|
|
|
|
|
bool has_style_file = false; |
|
|
|
|
|
|
|
auto style_file_search_path = this->file_path.parent_path(); |
|
|
|
|
|
|
|
while(true) { |
|
|
|
|
|
|
|
if(boost::filesystem::exists(style_file_search_path / ".markdown-format")) { |
|
|
|
|
|
|
|
has_style_file = true; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if(style_file_search_path == style_file_search_path.root_directory()) |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
style_file_search_path = style_file_search_path.parent_path(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if(!has_style_file && !continue_without_style_file) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
auto special_character = [](Gtk::TextIter iter) { |
|
|
|
|
|
|
|
if(*iter == '*' || *iter == '#' || *iter == '<' || *iter == '>' || *iter == ' ' || |
|
|
|
|
|
|
|
*iter == '=' || *iter == '`' || *iter == '-' || *iter == '|') |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
// Tests if a line starts with for instance: 2.
|
|
|
|
|
|
|
|
if(*iter >= '0' && *iter <= '9' && iter.forward_char() && |
|
|
|
|
|
|
|
*iter == '.' && iter.forward_char() && |
|
|
|
|
|
|
|
*iter == ' ') |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
get_buffer()->begin_user_action(); |
|
|
|
|
|
|
|
disable_spellcheck = true; |
|
|
|
|
|
|
|
cleanup_whitespace_characters(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
auto iter = get_buffer()->begin(); |
|
|
|
|
|
|
|
size_t last_space_offset = -1; |
|
|
|
|
|
|
|
bool headline = false; |
|
|
|
|
|
|
|
bool monospace = false; |
|
|
|
|
|
|
|
bool script = false; |
|
|
|
|
|
|
|
bool html_tag = false; |
|
|
|
|
|
|
|
bool table = false; |
|
|
|
|
|
|
|
int square_brackets = 0; |
|
|
|
|
|
|
|
do { |
|
|
|
|
|
|
|
if(iter.starts_line()) { |
|
|
|
|
|
|
|
last_space_offset = -1; |
|
|
|
|
|
|
|
auto next_line_iter = iter; |
|
|
|
|
|
|
|
if(*iter == '#' || (next_line_iter.forward_line() && *next_line_iter == '=')) |
|
|
|
|
|
|
|
headline = true; |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
headline = false; |
|
|
|
|
|
|
|
auto test_iter = iter; |
|
|
|
|
|
|
|
if(*test_iter == '`' && test_iter.forward_char() && |
|
|
|
|
|
|
|
*test_iter == '`' && test_iter.forward_char() && |
|
|
|
|
|
|
|
*test_iter == '`') { |
|
|
|
|
|
|
|
script = !script; |
|
|
|
|
|
|
|
iter.forward_chars(3); |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// Test for YAML headers
|
|
|
|
|
|
|
|
test_iter = iter; |
|
|
|
|
|
|
|
if(*test_iter == '-' && test_iter.forward_char() && |
|
|
|
|
|
|
|
*test_iter == '-' && test_iter.forward_char() && |
|
|
|
|
|
|
|
*test_iter == '-' && test_iter.forward_char() && |
|
|
|
|
|
|
|
test_iter.ends_line()) { |
|
|
|
|
|
|
|
auto previous_line = iter; |
|
|
|
|
|
|
|
auto next_line = test_iter; |
|
|
|
|
|
|
|
if((previous_line.backward_char() && !previous_line.starts_line()) || |
|
|
|
|
|
|
|
(next_line.forward_char() && !next_line.ends_line())) { |
|
|
|
|
|
|
|
script = !script; |
|
|
|
|
|
|
|
iter.forward_chars(3); |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
table = *iter == '|'; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if(!script && *iter == '`') |
|
|
|
|
|
|
|
monospace = !monospace; |
|
|
|
|
|
|
|
if(!script && !monospace) { |
|
|
|
|
|
|
|
if(*iter == '<') |
|
|
|
|
|
|
|
html_tag = true; |
|
|
|
|
|
|
|
else if(*iter == '>') |
|
|
|
|
|
|
|
html_tag = false; |
|
|
|
|
|
|
|
else if(*iter == '[') |
|
|
|
|
|
|
|
++square_brackets; |
|
|
|
|
|
|
|
else if(*iter == ']') |
|
|
|
|
|
|
|
--square_brackets; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if(!headline && !script && !monospace && !html_tag && !table && square_brackets == 0) { |
|
|
|
|
|
|
|
if(*iter == ' ' && iter.get_line_offset() <= 80) |
|
|
|
|
|
|
|
last_space_offset = iter.get_offset(); |
|
|
|
|
|
|
|
// Insert newline on long lines
|
|
|
|
|
|
|
|
else if((*iter == ' ' || iter.ends_line()) && iter.get_line_offset() > 80 && last_space_offset != static_cast<size_t>(-1)) { |
|
|
|
|
|
|
|
auto stored_iter = iter; |
|
|
|
|
|
|
|
iter = get_buffer()->get_iter_at_offset(last_space_offset); |
|
|
|
|
|
|
|
auto next_iter = iter; |
|
|
|
|
|
|
|
next_iter.forward_char(); |
|
|
|
|
|
|
|
// Do not add newline if the next iter is a special character
|
|
|
|
|
|
|
|
if(special_character(next_iter)) { |
|
|
|
|
|
|
|
iter = stored_iter; |
|
|
|
|
|
|
|
if(*iter == ' ') |
|
|
|
|
|
|
|
last_space_offset = iter.get_offset(); |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
iter = get_buffer()->erase(iter, next_iter); |
|
|
|
|
|
|
|
iter = get_buffer()->insert(iter, "\n"); |
|
|
|
|
|
|
|
iter.backward_char(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// Remove newline on short lines
|
|
|
|
|
|
|
|
else if(iter.ends_line() && !iter.starts_line() && iter.get_line_offset() <= 80) { |
|
|
|
|
|
|
|
auto next_line_iter = iter; |
|
|
|
|
|
|
|
// Do not remove newline if the next line for instance is a header
|
|
|
|
|
|
|
|
if(next_line_iter.forward_char() && !next_line_iter.ends_line() && !special_character(next_line_iter)) { |
|
|
|
|
|
|
|
auto end_word_iter = next_line_iter; |
|
|
|
|
|
|
|
// Do not remove newline if the word on the next line is too long
|
|
|
|
|
|
|
|
size_t diff = 0; |
|
|
|
|
|
|
|
while(*end_word_iter != ' ' && !end_word_iter.ends_line() && end_word_iter.forward_char()) |
|
|
|
|
|
|
|
++diff; |
|
|
|
|
|
|
|
if(iter.get_line_offset() + diff + 1 <= 80) { |
|
|
|
|
|
|
|
iter = get_buffer()->erase(iter, next_line_iter); |
|
|
|
|
|
|
|
iter = get_buffer()->insert(iter, " "); |
|
|
|
|
|
|
|
iter.backward_char(); |
|
|
|
|
|
|
|
if(iter.get_line_offset() <= 80) |
|
|
|
|
|
|
|
last_space_offset = iter.get_offset(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} while(iter.forward_char()); |
|
|
|
|
|
|
|
disable_spellcheck = false; |
|
|
|
|
|
|
|
get_buffer()->end_user_action(); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Source::View::~View() { |
|
|
|
Source::View::~View() { |
|
|
|
|