forked from mia/Aegisub
parent
74ac2ab1fe
commit
3c55d4fde4
2 changed files with 48 additions and 5 deletions
|
@ -61,7 +61,7 @@ void parse_blocks(std::vector<std::pair<size_t, size_t>>& blocks, std::string co
|
||||||
if (c == '{' && ovr_start == bad_pos)
|
if (c == '{' && ovr_start == bad_pos)
|
||||||
ovr_start = i;
|
ovr_start = i;
|
||||||
else if (c == '}' && ovr_start != bad_pos) {
|
else if (c == '}' && ovr_start != bad_pos) {
|
||||||
blocks.emplace_back(ovr_start, i);
|
blocks.emplace_back(ovr_start, i + 1);
|
||||||
ovr_start = bad_pos;
|
ovr_start = bad_pos;
|
||||||
}
|
}
|
||||||
++i;
|
++i;
|
||||||
|
@ -152,10 +152,10 @@ std::string tagless_find_helper::strip_tags(std::string const& str, size_t s) {
|
||||||
|
|
||||||
size_t last = s;
|
size_t last = s;
|
||||||
for (auto const& block : blocks) {
|
for (auto const& block : blocks) {
|
||||||
if (block.second < s) continue;
|
if (block.second <= s) continue;
|
||||||
if (block.first > last)
|
if (block.first > last)
|
||||||
out.append(str.begin() + last, str.begin() + block.first);
|
out.append(str.begin() + last, str.begin() + block.first);
|
||||||
last = block.second + 1;
|
last = block.second;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (last < str.size())
|
if (last < str.size())
|
||||||
|
@ -178,7 +178,7 @@ void tagless_find_helper::map_range(size_t &s, size_t &e) {
|
||||||
// < should only happen if the cursor was within an override block
|
// < should only happen if the cursor was within an override block
|
||||||
// when the user started a search
|
// when the user started a search
|
||||||
if (block.first <= s) {
|
if (block.first <= s) {
|
||||||
size_t len = block.second - std::max(block.first, s) + 1;
|
size_t len = block.second - std::max(block.first, start);
|
||||||
s += len;
|
s += len;
|
||||||
e += len;
|
e += len;
|
||||||
continue;
|
continue;
|
||||||
|
@ -190,7 +190,7 @@ void tagless_find_helper::map_range(size_t &s, size_t &e) {
|
||||||
|
|
||||||
// Extend the match to include blocks within the match
|
// Extend the match to include blocks within the match
|
||||||
// Note that blocks cannot be partially within the match
|
// Note that blocks cannot be partially within the match
|
||||||
e += block.second - block.first + 1;
|
e += block.second - block.first;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // namespace util
|
} // namespace util
|
||||||
|
|
|
@ -73,3 +73,46 @@ TEST(lagi_ifind, correct_index_with_shrunk_character_before_match) {
|
||||||
// U+FB00 turns into "ff", which is one byte shorter in UTF-8
|
// U+FB00 turns into "ff", which is one byte shorter in UTF-8
|
||||||
EXPECT_IFIND(" \xEF\xAC\x80 a ", "a", 5, 6);
|
EXPECT_IFIND(" \xEF\xAC\x80 a ", "a", 5, 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(lagi_skip_tags, tag_stripping) {
|
||||||
|
agi::util::tagless_find_helper helper;
|
||||||
|
|
||||||
|
EXPECT_EQ("", helper.strip_tags("", 0));
|
||||||
|
EXPECT_EQ("", helper.strip_tags("{}", 0));
|
||||||
|
EXPECT_EQ("abc", helper.strip_tags("{}abc", 0));
|
||||||
|
EXPECT_EQ("abc", helper.strip_tags("a{}bc", 0));
|
||||||
|
EXPECT_EQ("abc", helper.strip_tags("abc{}", 0));
|
||||||
|
EXPECT_EQ("abc", helper.strip_tags("{}a{}bc{}", 0));
|
||||||
|
|
||||||
|
EXPECT_EQ("abc", helper.strip_tags("{}abc", 1));
|
||||||
|
EXPECT_EQ("abc", helper.strip_tags("{}abc", 2));
|
||||||
|
EXPECT_EQ("bc", helper.strip_tags("{}abc", 3));
|
||||||
|
EXPECT_EQ("c", helper.strip_tags("{}abc", 4));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_range_map(const char *str, size_t start, size_t& s, size_t& e) {
|
||||||
|
agi::util::tagless_find_helper helper;
|
||||||
|
helper.strip_tags(str, start);
|
||||||
|
helper.map_range(s, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define EXPECT_RANGE(str, start, match_start, match_end, result_start, result_end) \
|
||||||
|
do { \
|
||||||
|
size_t s = match_start, e = match_end; \
|
||||||
|
test_range_map(str, start, s, e); \
|
||||||
|
EXPECT_EQ(result_start, s); \
|
||||||
|
EXPECT_EQ(result_end, e); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
TEST(lagi_skip_tags, range_mapping) {
|
||||||
|
EXPECT_RANGE("", 0, 0, 0, 0, 0);
|
||||||
|
EXPECT_RANGE("a", 0, 0, 1, 0, 1);
|
||||||
|
EXPECT_RANGE("{}a", 0, 0, 1, 2, 3);
|
||||||
|
EXPECT_RANGE("{cc}ab", 0, 1, 2, 5, 6);
|
||||||
|
EXPECT_RANGE("{cc}ab{cc}b", 0, 1, 2, 5, 6);
|
||||||
|
EXPECT_RANGE("{cc}ab{cc}b", 0, 1, 3, 5, 11);
|
||||||
|
|
||||||
|
EXPECT_RANGE("{cc}ab{cc}b", 3, 1, 3, 5, 11);
|
||||||
|
EXPECT_RANGE("{cc}ab{cc}b", 4, 1, 3, 5, 11);
|
||||||
|
EXPECT_RANGE("{cc}ab{cc}b", 5, 0, 2, 5, 11);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue