From 09139128e143c187194a63079901c06cb07e1f6d Mon Sep 17 00:00:00 2001 From: Twan van Laarhoven Date: Tue, 19 May 2020 22:59:38 +0200 Subject: [PATCH] Fix in_tag and is_tag calls, fixes #47 --- src/data/action/value.cpp | 2 +- src/data/keyword.cpp | 6 +++--- src/gui/value/text.cpp | 2 +- src/util/tagged_string.cpp | 19 ++++++++++++++----- src/util/tagged_string.hpp | 6 ++++++ 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/data/action/value.cpp b/src/data/action/value.cpp index 9becad61..af85203a 100644 --- a/src/data/action/value.cpp +++ b/src/data/action/value.cpp @@ -203,7 +203,7 @@ unique_ptr typing_action(const TextValueP& value, size_t start_ TextToggleReminderAction::TextToggleReminderAction(const TextValueP& value, size_t pos_in) : ValueAction(value) { - pos = in_tag(value->value(), _("value(), _(" const& mat } else { bool is_close = (it+1) != end && *(it+1) == '/'; if (is_close && !close || !is_close && !open) return; - if (is_substr(it, end, " "reminder text" option - size_t kwpos = in_tag(value().value(), _(" as , only , and are considered +bool is_tag_end_char(Char c) { + return c == '>' || c == '-' || c == ':' || c == ' '; +} + String untag(const String& str) { bool in_tag = false; @@ -156,6 +162,14 @@ String fix_old_tags(const String& str) { return skip_all_tags(it, end, after_open, after_close); } +[[nodiscard]] bool is_tag(String::const_iterator it, String::const_iterator end, const char* tag) { + for (; *tag; ++it, ++tag) { + if (it == end || *it != *tag) return false; + } + if (it == end || !is_tag_end_char(*it)) return false; + return true; +} + /* // Does the string [it..end) contain the matching close tag for [tag..tag_end)? bool is_close_tag(String::const_iterator it, String::const_iterator end, String::const_iterator tag, String::const_iterator tag_end) { @@ -253,11 +267,6 @@ String::const_iterator find_close_tag(String::const_iterator tag, String::const_ return String::npos; } -// don't mistake as , only , and are considered -bool is_tag_end_char(Char c) { - return c == '>' || c == '-' || c == ':' || c == ' '; -} - bool is_tag(const String& str, size_t pos, const String& tag) { return is_substr(str, pos, tag) && pos+tag.size() < str.size() && is_tag_end_char(str[pos+tag.size()]); } diff --git a/src/util/tagged_string.hpp b/src/util/tagged_string.hpp index d6c6cb07..9f152ee1 100644 --- a/src/util/tagged_string.hpp +++ b/src/util/tagged_string.hpp @@ -119,6 +119,12 @@ String anti_tag(const String& tag); // If not found, returns end [[nodiscard]] String::const_iterator find_close_tag(String::const_iterator it, String::const_iterator end); +/// Does a string contain a tag at the given location? +/** Only matches if the tag in the text ends one of ">-: " + * tag should be "abc",_) = 3 [[nodiscard]] size_t untagged_length(String::const_iterator it, String::const_iterator end);