X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathString.cpp;h=44aad43c805075d3176fa88d4fe670ba1e1222a0;hb=872c71ffa61e52918a12c847ef7f87b10741d75a;hp=0599ef79dea557e74817023ae1a3b6e3b8a9872f;hpb=a694de895effa49df79cb9b2fd00d6dce03fd0b2;p=lyx.git diff --git a/src/mathed/InsetMathString.cpp b/src/mathed/InsetMathString.cpp index 0599ef79de..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,12 +11,19 @@ #include #include "InsetMathString.h" +#include "MathFactory.h" #include "MathStream.h" #include "MathSupport.h" #include "Encoding.h" +#include "support/debug.h" #include "support/gettext.h" +#include "support/lassert.h" +#include "support/lstrings.h" +#include "support/textutils.h" + +using lyx::support::escape; namespace lyx { @@ -84,73 +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 { - if (!os.latex()) { - os << str_; + if (!os.latex() || os.lockedMode()) { + os << (os.asciiOnly() ? escape(str_) : str_); return; } - // We need the latex macros defined in the unicodesymbols file. - // As they do not depend on the encoding, simply use the first - // available encoding. - Encodings::const_iterator encit = encodings.begin(); - bool can_encode = encit != encodings.end(); - docstring::const_iterator cit = str_.begin(); docstring::const_iterator end = str_.end(); - bool in_mathsym = false; + // 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 { - if (c < 0x80) { - if (in_mathsym) { + 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 << '}'; - in_mathsym = false; - } - os << docstring(1, c); - } else if (can_encode) { - if (!in_mathsym) { - os << "\\mathsym{"; - in_mathsym = true; + os.textMode(true); + in_forced_mode = false; } - os << encit->latexChar(c, true); - } else { - throw EncodingException(c); + } 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); } - } catch (EncodingException & e) { - if (os.dryrun()) { - // FIXME: this is OK for View->Source - // but math preview will likely fail. + 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 << "'>"; - } else { + 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_mathsym) + + if (in_forced_mode && os.textMode()) { + // We have to care for closing \lyxmathsym os << '}'; + os.textMode(false); + } else { + os.pendingBrace(in_forced_mode); + } }