Browse Source

Use prettier to style format markdown and YAML files

merge-requests/399/head
eidheim 6 years ago
parent
commit
16876d7695
  1. 134
      src/source.cc

134
src/source.cc

@ -639,7 +639,8 @@ void Source::View::setup_signals() {
void Source::View::setup_format_style(bool is_generic_view) {
static auto prettier = filesystem::find_executable("prettier");
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) {
goto_next_diagnostic = [this] {
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() {

Loading…
Cancel
Save