From b2fdc04f9638c7def8f74f0af1c3e480431b28a6 Mon Sep 17 00:00:00 2001 From: Thibaut Cuvelier Date: Mon, 26 Dec 2022 20:50:48 +0100 Subject: [PATCH] InsetIPAMacro: implement the XHTML conversion, refactor plaintext and DocBook to share more code. --- src/insets/InsetIPAMacro.cpp | 37 +++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/insets/InsetIPAMacro.cpp b/src/insets/InsetIPAMacro.cpp index 5aeaf8432a..2d4b1fb13c 100644 --- a/src/insets/InsetIPAMacro.cpp +++ b/src/insets/InsetIPAMacro.cpp @@ -283,14 +283,27 @@ void InsetIPADeco::latex(otexstream & os, OutputParams const & runparams) const } -int InsetIPADeco::plaintext(odocstringstream & os, - OutputParams const & runparams, size_t max_length) const +namespace { +std::pair splitPlainTextInHalves( + const InsetIPADeco * inset, OutputParams const & runparams, + size_t max_length = INT_MAX) { odocstringstream ods; - int h = InsetCollapsible::plaintext(ods, runparams, max_length) / 2; + int h = inset->InsetCollapsible::plaintext(ods, runparams, max_length) / 2; docstring result = ods.str(); docstring const before = result.substr(0, h); docstring const after = result.substr(h, result.size()); + return {before, after}; +} +} + + +int InsetIPADeco::plaintext(odocstringstream & os, + OutputParams const & runparams, size_t max_length) const +{ + docstring before; + docstring after; + tie(before, after) = splitPlainTextInHalves(this, runparams, max_length); if (params_.type == InsetIPADecoParams::Toptiebar) { os << before; @@ -302,7 +315,7 @@ int InsetIPADeco::plaintext(odocstringstream & os, os.put(0x035c); os << after; } - return result.size(); + return before.size() + after.size(); } @@ -310,11 +323,9 @@ void InsetIPADeco::docbook(XMLStream & xs, OutputParams const & runparams) const { // The special combining character must be put in the middle, between the two other characters. // It will not work if there is anything else than two pure characters, so going back to plaintext. - odocstringstream ods; - int h = InsetText::plaintext(ods, runparams) / 2; - docstring result = ods.str(); - docstring const before = result.substr(0, h); - docstring const after = result.substr(h, result.size()); + docstring before; + docstring after; + tie(before, after) = splitPlainTextInHalves(this, runparams); xs << XMLStream::ESCAPE_NONE << before; if (params_.type == InsetIPADecoParams::Toptiebar) @@ -327,10 +338,10 @@ void InsetIPADeco::docbook(XMLStream & xs, OutputParams const & runparams) const docstring InsetIPADeco::xhtml(XMLStream & xs, OutputParams const & runparams) const { - // FIXME: Like in plaintext, the combining characters "͡" (toptiebar) - // or "͜" (bottomtiebar) would need to be inserted just in the mid - // of the text string. (How) can this be done with the xhtml stream? - return InsetCollapsible::xhtml(xs, runparams); + // The DocBook encoding for this inset has no DocBook tag, but sheer XML (relying on a plaintext + // transformation of the inset). + docbook(xs, runparams); + return docstring(); } -- 2.39.5