From 216c7e3a0a595457e7b25874a47937519b94c1e0 Mon Sep 17 00:00:00 2001 From: eidheim Date: Wed, 4 Aug 2021 08:18:38 +0200 Subject: [PATCH] Added support for docstring :: code blocks --- src/tooltips.cpp | 32 ++++++++++++++++++++++++-------- tests/tooltips_test.cpp | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 8 deletions(-) diff --git a/src/tooltips.cpp b/src/tooltips.cpp index 2863cb1..8091239 100644 --- a/src/tooltips.cpp +++ b/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; diff --git a/tests/tooltips_test.cpp b/tests/tooltips_test.cpp index ba10d53..5f4d6bf 100644 --- a/tests/tooltips_test.cpp +++ b/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);