Browse Source

Added support for docstring :: code blocks

pipelines/353213535
eidheim 4 years ago
parent
commit
216c7e3a0a
  1. 32
      src/tooltips.cpp
  2. 32
      tests/tooltips_test.cpp

32
src/tooltips.cpp

@ -1452,7 +1452,9 @@ void Tooltip::insert_docstring(const std::string &input_) {
}; };
auto is_whitespace_character = [&](size_t i) { auto is_whitespace_character = [&](size_t i) {
return input[i] == ' ' || input[i] == '\t' || input[i] == '\n' || input[i] == '\r' || input[i] == '\f'; const static std::string utf8_space = " "; // Python docstring sometimes uses this...
return input[i] == ' ' || input[i] == '\t' || input[i] == '\n' || input[i] == '\r' || input[i] == '\f' ||
((input[i] == utf8_space[0] && i + 1 < input.size() && input[i + 1] == utf8_space[1]) || (i >= 1 && input[i - 1] == utf8_space[0] && input[i] == utf8_space[1]));
}; };
auto insert_header = [&] { auto insert_header = [&] {
@ -1613,18 +1615,32 @@ void Tooltip::insert_docstring(const std::string &input_) {
auto insert_code_block = [&] { auto insert_code_block = [&] {
auto i_saved = i; auto i_saved = i;
static std::string utf8_space = " "; if(input[i] == '\n' && i >= 3 && input[i - 1] == '\n' && input[i - 2] == ':' && input[i - 3] == ':' && i + 1 < input.size()) {
while(starts_with(input, i, utf8_space)) ++i;
i += utf8_space.size(); insert_with_links_tagged(partial.substr(0, partial.size() - 2)); // Remove one ':'
while(i < input.size() && (input[i] == ' ' || input[i] == '\t')) partial.clear();
buffer->insert_at_cursor("\n\n");
auto start = i;
for(; i < input.size(); ++i) {
if(starts_with(input, i, "\n\n") && i + 2 < input.size() && !is_whitespace_character(i + 2))
break;
}
insert_code(input.substr(start, i - start), "python", true);
buffer->insert_at_cursor("\n");
return true;
}
while(i < input.size() && input[i] != '\n' && is_whitespace_character(i))
++i; ++i;
if(starts_with(input, i, ">>>")) { if(starts_with(input, i, ">>>")) {
i += 3;
insert_with_links_tagged(partial); insert_with_links_tagged(partial);
partial.clear(); partial.clear();
auto pos = input.find("\n\n", i + 3); for(; i < input.size(); ++i) {
insert_code(input.substr(i_saved, pos != std::string::npos ? pos - i_saved : pos), {}, true); if(starts_with(input, i, "\n\n") && i + 2 < input.size() && !is_whitespace_character(i + 2))
break;
}
insert_code(input.substr(i_saved, i - i_saved), "python", true);
buffer->insert_at_cursor("\n"); buffer->insert_at_cursor("\n");
i = pos != std::string::npos ? pos : input.size() - 1;
return true; return true;
} }
i = i_saved; i = i_saved;

32
tests/tooltips_test.cpp

@ -789,6 +789,18 @@ Section
>>> test >>> test
test test
Example
>>> test
test
test
Example::
test
test
Subsection Subsection
---- ----
@ -798,6 +810,18 @@ Section
>>> test >>> test
test test
Example
>>> test
test
test
Example:
test
test
Subsection Subsection
A link)"); A link)");
@ -825,6 +849,14 @@ A link)");
g_assert(it.starts_tag(tooltip->code_block_tag)); g_assert(it.starts_tag(tooltip->code_block_tag));
it.forward_chars(13); it.forward_chars(13);
g_assert(it.ends_tag(tooltip->code_block_tag)); g_assert(it.ends_tag(tooltip->code_block_tag));
it.forward_chars(10);
g_assert(it.starts_tag(tooltip->code_block_tag));
it.forward_chars(25);
g_assert(it.ends_tag(tooltip->code_block_tag));
it.forward_chars(12);
g_assert(it.starts_tag(tooltip->code_block_tag));
it.forward_chars(14);
g_assert(it.ends_tag(tooltip->code_block_tag));
it.forward_chars(2); it.forward_chars(2);
g_assert(it.starts_tag(tooltip->h2_tag)); g_assert(it.starts_tag(tooltip->h2_tag));
it.forward_chars(10); it.forward_chars(10);

Loading…
Cancel
Save