[LyX/master] InsetIPAMacro: implement the XHTML conversion, refactor plaintext and DocBook to share more code.
Thibaut Cuvelier
tcuvelier at lyx.org
Mon Dec 26 18:57:23 UTC 2022
commit b2fdc04f9638c7def8f74f0af1c3e480431b28a6
Author: Thibaut Cuvelier <tcuvelier at lyx.org>
Date: Mon Dec 26 20:50:48 2022 +0100
InsetIPAMacro: implement the XHTML conversion, refactor plaintext and DocBook to share more code.
---
src/insets/InsetIPAMacro.cpp | 37 ++++++++++++++++++++++++-------------
1 files changed, 24 insertions(+), 13 deletions(-)
diff --git a/src/insets/InsetIPAMacro.cpp b/src/insets/InsetIPAMacro.cpp
index 5aeaf84..2d4b1fb 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<docstring, docstring> 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();
}
More information about the lyx-cvs
mailing list