X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathString.cpp;h=44aad43c805075d3176fa88d4fe670ba1e1222a0;hb=872c71ffa61e52918a12c847ef7f87b10741d75a;hp=ab4a13704ef65759e1c440ed79146021008999f5;hpb=f497296c30e6da2f97b16da8ad1c9e96feffb16b;p=lyx.git diff --git a/src/mathed/InsetMathString.cpp b/src/mathed/InsetMathString.cpp index ab4a13704e..44aad43c80 100644 --- a/src/mathed/InsetMathString.cpp +++ b/src/mathed/InsetMathString.cpp @@ -3,7 +3,7 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author André Pönitz + * \author André Pönitz * * Full author contact details are available in file CREDITS. */ @@ -11,35 +11,37 @@ #include #include "InsetMathString.h" -#include "MathStream.h" +#include "MathFactory.h" #include "MathStream.h" #include "MathSupport.h" +#include "Encoding.h" -namespace lyx { +#include "support/debug.h" +#include "support/gettext.h" +#include "support/lassert.h" +#include "support/lstrings.h" +#include "support/textutils.h" -using std::auto_ptr; -using std::vector; +using lyx::support::escape; +namespace lyx { + InsetMathString::InsetMathString(docstring const & s) : str_(s) {} -auto_ptr InsetMathString::doClone() const +Inset * InsetMathString::clone() const { - return auto_ptr(new InsetMathString(*this)); + return new InsetMathString(*this); } -bool InsetMathString::metrics(MetricsInfo & mi, Dimension & dim) const +void InsetMathString::metrics(MetricsInfo & mi, Dimension & dim) const { mathed_string_dim(mi.base.font, str_, dim); - if (dim_ == dim) - return false; - dim_ = dim; - return true; } @@ -89,24 +91,104 @@ void InsetMathString::octave(OctaveStream & os) const } -void InsetMathString::mathmlize(MathStream & os) const +void InsetMathString::mathmlize(MathStream & /*os*/) const { -/* - if (code_ == LM_TC_VAR) - os << " " << str_ << " "; - else if (code_ == LM_TC_CONST) - os << " " << str_ << " "; - else if (code_ == LM_TC_RM || code_ == LM_TC_TEXTRM) - os << " " << str_ << " "; - else -*/ - os << str_; + // useless, no doubt, but we should not be here + LASSERT(false, /* */); } void InsetMathString::write(WriteStream & os) const { - os << str_; + if (!os.latex() || os.lockedMode()) { + os << (os.asciiOnly() ? escape(str_) : str_); + return; + } + + docstring::const_iterator cit = str_.begin(); + docstring::const_iterator end = str_.end(); + + // We may already be inside an \ensuremath command. + bool in_forced_mode = os.pendingBrace(); + + // We will take care of matching braces. + os.pendingBrace(false); + + while (cit != end) { + bool mathmode = in_forced_mode ? os.textMode() : !os.textMode(); + char_type const c = *cit; + docstring command(1, c); + try { + bool termination = false; + if (isASCII(c) || + Encodings::latexMathChar(c, mathmode, os.encoding(), command, termination)) { + if (os.textMode()) { + if (in_forced_mode) { + // we were inside \lyxmathsym + os << '}'; + os.textMode(false); + in_forced_mode = false; + } + if (!isASCII(c) && os.textMode()) { + os << "\\ensuremath{"; + os.textMode(false); + in_forced_mode = true; + } + } else if (isASCII(c) && in_forced_mode) { + // we were inside \ensuremath + os << '}'; + os.textMode(true); + in_forced_mode = false; + } + } else if (!os.textMode()) { + if (in_forced_mode) { + // we were inside \ensuremath + os << '}'; + in_forced_mode = false; + } else { + os << "\\lyxmathsym{"; + in_forced_mode = true; + } + os.textMode(true); + } + os << command; + // We may need a space if the command contains a macro + // and the last char is ASCII. + if (termination) + os.pendingSpace(true); + } catch (EncodingException const & e) { + switch (os.output()) { + case WriteStream::wsDryrun: { + os << "<" << _("LyX Warning: ") + << _("uncodable character") << " '"; + os << docstring(1, e.failed_char); + os << "'>"; + break; + } + case WriteStream::wsPreview: { + // indicate the encoding error by a boxed '?' + os << "{\\fboxsep=1pt\\fbox{?}}"; + LYXERR0("Uncodable character" << " '" + << docstring(1, e.failed_char) + << "'"); + break; + } + case WriteStream::wsDefault: + default: + // throw again + throw(e); + } + } + ++cit; + } + + if (in_forced_mode && os.textMode()) { + // We have to care for closing \lyxmathsym + os << '}'; + os.textMode(false); + } else { + os.pendingBrace(in_forced_mode); + } }