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) {
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 = [&] {
@ -1613,18 +1615,32 @@ void Tooltip::insert_docstring(const std::string &input_) {
auto insert_code_block = [&] {
auto i_saved = i;
static std::string utf8_space = " ";
while(starts_with(input, i, utf8_space))
i += utf8_space.size();
while(i < input.size() && (input[i] == ' ' || input[i] == '\t'))
if(input[i] == '\n' && i >= 3 && input[i - 1] == '\n' && input[i - 2] == ':' && input[i - 3] == ':' && i + 1 < input.size()) {
++i;
insert_with_links_tagged(partial.substr(0, partial.size() - 2)); // Remove one ':'
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;
if(starts_with(input, i, ">>>")) {
i += 3;
insert_with_links_tagged(partial);
partial.clear();
auto pos = input.find("\n\n", i + 3);
insert_code(input.substr(i_saved, pos != std::string::npos ? pos - i_saved : pos), {}, true);
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(i_saved, i - i_saved), "python", true);
buffer->insert_at_cursor("\n");
i = pos != std::string::npos ? pos : input.size() - 1;
return true;
}
i = i_saved;

32
tests/tooltips_test.cpp

@ -789,6 +789,18 @@ Section
>>> test
test
Example
>>> test
test
test
Example::
test
test
Subsection
----
@ -798,6 +810,18 @@ Section
>>> test
test
Example
>>> test
test
test
Example:
test
test
Subsection
A link)");
@ -825,6 +849,14 @@ A link)");
g_assert(it.starts_tag(tooltip->code_block_tag));
it.forward_chars(13);
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);
g_assert(it.starts_tag(tooltip->h2_tag));
it.forward_chars(10);

Loading…
Cancel
Save