X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetIPAMacro.cpp;h=2d4b1fb13c2d25e516f66fb462f5862c2dde3bd1;hb=8124e6c02ea1fd6779bb6c47ffe2bca2c8bd2d97;hp=f96ee7a5e878fcc62944c51cf7f63c2b75bfaf30;hpb=3883b85f49054c109cb8a9a293721a5e41edb68d;p=lyx.git diff --git a/src/insets/InsetIPAMacro.cpp b/src/insets/InsetIPAMacro.cpp index f96ee7a5e8..2d4b1fb13c 100644 --- a/src/insets/InsetIPAMacro.cpp +++ b/src/insets/InsetIPAMacro.cpp @@ -16,9 +16,10 @@ #include "BufferParams.h" #include "Dimension.h" #include "Encoding.h" -#include "Font.h" +#include "FontInfo.h" #include "FuncRequest.h" #include "FuncStatus.h" +#include "InsetLayout.h" #include "LaTeXFeatures.h" #include "Lexer.h" #include "MetricsInfo.h" @@ -282,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 = (int)(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; @@ -301,7 +315,7 @@ int InsetIPADeco::plaintext(odocstringstream & os, os.put(0x035c); os << after; } - return result.size(); + return before.size() + after.size(); } @@ -309,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 = (int)(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) @@ -326,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(); } @@ -393,7 +405,7 @@ bool InsetIPADeco::insetAllowed(InsetCode code) const InsetIPAChar::InsetIPAChar(Kind k) - : Inset(0), kind_(k) + : Inset(nullptr), kind_(k) {} @@ -552,59 +564,34 @@ int InsetIPAChar::plaintext(odocstringstream & os, OutputParams const &, size_t) } +namespace { +std::string ipaCharToXMLEntity(InsetIPAChar::Kind kind) { + switch (kind) { + case InsetIPAChar::Kind::TONE_FALLING: + return "˥˩"; + case InsetIPAChar::Kind::TONE_RISING: + return "˩˥"; + case InsetIPAChar::Kind::TONE_HIGH_RISING: + return "˧˥"; + case InsetIPAChar::Kind::TONE_LOW_RISING: + return "˩˧"; + case InsetIPAChar::Kind::TONE_HIGH_RISING_FALLING: + return "˨˥˨"; + } + return ""; +} +} + + void InsetIPAChar::docbook(XMLStream & xs, OutputParams const &) const { - switch (kind_) { - case TONE_FALLING: - xs << XMLStream::ESCAPE_NONE << "˥"; - xs << XMLStream::ESCAPE_NONE << "˩"; - break; - case TONE_RISING: - xs << XMLStream::ESCAPE_NONE << "˩"; - xs << XMLStream::ESCAPE_NONE << "˥"; - break; - case TONE_HIGH_RISING: - xs << XMLStream::ESCAPE_NONE << "˧"; - xs << XMLStream::ESCAPE_NONE << "˥"; - break; - case TONE_LOW_RISING: - xs << XMLStream::ESCAPE_NONE << "˩"; - xs << XMLStream::ESCAPE_NONE << "˧"; - break; - case TONE_HIGH_RISING_FALLING: - xs << XMLStream::ESCAPE_NONE << "˨"; - xs << XMLStream::ESCAPE_NONE << "˥"; - xs << XMLStream::ESCAPE_NONE << "˨"; - break; - } + xs << XMLStream::ESCAPE_NONE << from_ascii(ipaCharToXMLEntity(kind())); } docstring InsetIPAChar::xhtml(XMLStream & xs, OutputParams const &) const { - switch (kind_) { - case TONE_FALLING: - xs << XMLStream::ESCAPE_NONE << "˥" - << XMLStream::ESCAPE_NONE << "˩"; - break; - case TONE_RISING: - xs << XMLStream::ESCAPE_NONE << "˩" - << XMLStream::ESCAPE_NONE << "˥"; - break; - case TONE_HIGH_RISING: - xs << XMLStream::ESCAPE_NONE << "˧" - << XMLStream::ESCAPE_NONE << "˥"; - break; - case TONE_LOW_RISING: - xs << XMLStream::ESCAPE_NONE << "˩" - << XMLStream::ESCAPE_NONE << "˧"; - break; - case TONE_HIGH_RISING_FALLING: - xs << XMLStream::ESCAPE_NONE << "˨" - << XMLStream::ESCAPE_NONE << "˥" - << XMLStream::ESCAPE_NONE << "˨"; - break; - } + xs << XMLStream::ESCAPE_NONE << from_ascii(ipaCharToXMLEntity(kind())); return docstring(); }