|
|
|
@ -185,6 +185,13 @@ Source::SpellCheckView::SpellCheckView() : Gsv::View() { |
|
|
|
delayed_spellcheck_suggestions_connection.disconnect(); |
|
|
|
delayed_spellcheck_suggestions_connection.disconnect(); |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
get_buffer()->get_tag_table()->signal_tag_added().connect([this](const Glib::RefPtr<Gtk::TextTag> &tag) { |
|
|
|
|
|
|
|
if(tag->property_name()=="gtksourceview:context-classes:comment") |
|
|
|
|
|
|
|
comment_tag=tag; |
|
|
|
|
|
|
|
else if(tag->property_name()=="gtksourceview:context-classes:string") |
|
|
|
|
|
|
|
string_tag=tag; |
|
|
|
|
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Source::SpellCheckView::~SpellCheckView() { |
|
|
|
Source::SpellCheckView::~SpellCheckView() { |
|
|
|
@ -301,46 +308,15 @@ void Source::SpellCheckView::goto_next_spellcheck_error() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool Source::SpellCheckView::is_code_iter(const Gtk::TextIter &iter) { |
|
|
|
bool Source::SpellCheckView::is_code_iter(const Gtk::TextIter &iter) { |
|
|
|
auto is_comment=[this](const Gtk::TextIter &iter) { |
|
|
|
|
|
|
|
return get_source_buffer()->iter_has_context_class(iter, "comment"); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
auto is_string=[this](const Gtk::TextIter &iter) { |
|
|
|
|
|
|
|
return get_source_buffer()->iter_has_context_class(iter, "string"); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(*iter=='\'') { |
|
|
|
if(*iter=='\'') { |
|
|
|
auto previous_iter=iter; |
|
|
|
auto previous_iter=iter; |
|
|
|
if(!iter.starts_line() && previous_iter.backward_char() && *previous_iter=='\'') |
|
|
|
if(!iter.starts_line() && previous_iter.backward_char() && *previous_iter=='\'') |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
if(is_comment(iter)) |
|
|
|
if(comment_tag && ((iter.has_tag(comment_tag) && !iter.begins_tag(comment_tag)) || iter.ends_tag(comment_tag))) |
|
|
|
return false; |
|
|
|
|
|
|
|
if(is_string(iter)) { |
|
|
|
|
|
|
|
//Add exception for in front of " and '
|
|
|
|
|
|
|
|
if(*iter=='\'' || *iter=='"') { |
|
|
|
|
|
|
|
auto previous_iter=iter; |
|
|
|
|
|
|
|
if(previous_iter.backward_char()) { |
|
|
|
|
|
|
|
if(!is_string(previous_iter)) |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
//Iters after '...' and "..." should be code iters at the end of line
|
|
|
|
|
|
|
|
if(iter.ends_line() && !iter.starts_line()) { |
|
|
|
|
|
|
|
auto previous_iter=iter; |
|
|
|
|
|
|
|
if(previous_iter.backward_char()) { |
|
|
|
|
|
|
|
if(is_comment(previous_iter)) |
|
|
|
|
|
|
|
return false; |
|
|
|
return false; |
|
|
|
if(is_string(previous_iter) && *previous_iter!='\'' && *previous_iter!='"') { |
|
|
|
if(string_tag && iter.has_tag(string_tag) && !iter.begins_tag(string_tag)) |
|
|
|
auto next_iter=iter; |
|
|
|
|
|
|
|
if(next_iter.forward_char() && !is_string(next_iter)) |
|
|
|
|
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|