From a8bf9dd5b45f7dbd1fcc0f715faabdc4026a413b Mon Sep 17 00:00:00 2001 From: Emmanuel Engelhart Date: Mon, 18 Jan 2021 11:18:53 +0100 Subject: [PATCH] Better Kiwix Serve Taskbar insertion (after charset definition) --- include/tools/regexTools.h | 3 +++ src/server/response.cpp | 4 ++-- src/tools/regexTools.cpp | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/include/tools/regexTools.h b/include/tools/regexTools.h index ef7a3a52b..50ce28647 100644 --- a/include/tools/regexTools.h +++ b/include/tools/regexTools.h @@ -29,5 +29,8 @@ std::string replaceRegex(const std::string& content, std::string appendToFirstOccurence(const std::string& content, const std::string& regex, const std::string& replacement); +std::string prependToFirstOccurence(const std::string& content, + const std::string& regex, + const std::string& replacement); #endif diff --git a/src/server/response.cpp b/src/server/response.cpp index fbb3728db..a25f107d9 100644 --- a/src/server/response.cpp +++ b/src/server/response.cpp @@ -203,9 +203,9 @@ void ContentResponse::introduce_taskbar() data.set("title", m_bookTitle); data.set("withlibrarybutton", m_withLibraryButton); auto head_content = render_template(RESOURCE::templates::head_part_html, data); - m_content = appendToFirstOccurence( + m_content = prependToFirstOccurence( m_content, - "]*>", + "]*>", head_content); auto taskbar_part = render_template(RESOURCE::templates::taskbar_part_html, data); diff --git a/src/tools/regexTools.cpp b/src/tools/regexTools.cpp index 1b70198f1..72fc29aa8 100644 --- a/src/tools/regexTools.cpp +++ b/src/tools/regexTools.cpp @@ -95,3 +95,22 @@ std::string appendToFirstOccurence(const std::string& content, return content; } + +std::string prependToFirstOccurence(const std::string& content, + const std::string& regex, + const std::string& replacement) +{ + ucnv_setDefaultName("UTF-8"); + icu::UnicodeString ucontent(content.c_str()); + icu::UnicodeString ureplacement(replacement.c_str()); + auto matcher = buildMatcher(regex, ucontent); + if (matcher->find()) { + UErrorCode status = U_ZERO_ERROR; + ucontent.insert(matcher->start(status), ureplacement); + std::string tmp; + ucontent.toUTF8String(tmp); + return tmp; + } + + return content; +}