X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FEncoding.cpp;h=7900aed06f631fd85cf572c2857b5d29ef6cdbc8;hb=2d7cf039351fba0d91746dce8cbf1f9e31cdc224;hp=69437bf2f5192adb260084690ea2f2f272cada16;hpb=98114f5a8290f15c9ddcf9bb94954b6dbace37b9;p=lyx.git diff --git a/src/Encoding.cpp b/src/Encoding.cpp index 69437bf2f5..7900aed06f 100644 --- a/src/Encoding.cpp +++ b/src/Encoding.cpp @@ -15,6 +15,7 @@ #include "Encoding.h" #include "Buffer.h" +#include "BufferList.h" #include "InsetIterator.h" #include "LaTeXFeatures.h" #include "Lexer.h" @@ -343,7 +344,7 @@ void Encoding::init() const } -docstring Encoding::latexChar(char_type c, bool for_mathed) const +docstring Encoding::latexChar(char_type c, bool no_commands) const { // assure the used encoding is properly initialized init(); @@ -354,7 +355,7 @@ docstring Encoding::latexChar(char_type c, bool for_mathed) const return docstring(1, c); if (encodable_.find(c) != encodable_.end()) return docstring(1, c); - if (for_mathed) + if (no_commands) return docstring(); // c cannot (or should not) be encoded in this encoding @@ -435,8 +436,11 @@ char_type Encodings::fromLaTeXCommand(docstring const & cmd, bool & combining) } -docstring Encodings::fromLaTeXCommand(docstring const & cmd, docstring & rem) +docstring Encodings::fromLaTeXCommand(docstring const & cmd, docstring & rem, + int cmdtype) { + bool const mathmode = cmdtype & MATH_CMD; + bool const textmode = cmdtype & TEXT_CMD; docstring symbols; size_t i = 0; size_t const cmdend = cmd.size(); @@ -467,8 +471,10 @@ docstring Encodings::fromLaTeXCommand(docstring const & cmd, docstring & rem) size_t unicmd_size = 0; char_type c = 0; for (; it != uniend; ++it) { - docstring const math = it->second.mathcommand; - docstring const text = it->second.textcommand; + docstring const math = mathmode ? it->second.mathcommand + : docstring(); + docstring const text = textmode ? it->second.textcommand + : docstring(); size_t cur_size = max(math.size(), text.size()); // The current math or text unicode command cannot // match, or we already matched a longer one @@ -494,11 +500,23 @@ docstring Encodings::fromLaTeXCommand(docstring const & cmd, docstring & rem) tmp.resize(tmp.size() - 1); // If this is an exact match, we found a (longer) - // matching command in the unicodesymbols file + // matching entry in the unicodesymbols file. + // If the entry doesn't start with '\', we take note + // of the match and continue (this is not a ultimate + // acceptance, as some other entry may match a longer + // portion of the cmd string). However, if the entry + // does start with '\', we accept the match only if + // this is a valid macro, i.e., either it is a single + // (nonletter) char macro, or nothing else follows, + // or what follows is a nonletter char, or the last + // character is a }. if ((math == tmp || text == tmp) && (tmp[0] != '\\' || (tmp.size() == 2 && !isAlphaASCII(tmp[1])) - || k == cmdend || !isAlphaASCII(cmd[k]))) { + || k == cmdend + || !isAlphaASCII(cmd[k]) + || tmp[tmp.size() - 1] == '}') + ) { c = it->first; j = k - 1; i = j + 1; @@ -515,22 +533,32 @@ docstring Encodings::fromLaTeXCommand(docstring const & cmd, docstring & rem) } -void Encodings::initUnicodeMath(Buffer const & buffer) +void Encodings::initUnicodeMath(Buffer const & buffer, bool clear_sets) { #ifdef TEX2LYX // The code below is not needed in tex2lyx and requires additional stuff (void)buffer; + (void)clear_sets; #else - mathcmd.clear(); - textcmd.clear(); - mathsym.clear(); + if (clear_sets) { + mathcmd.clear(); + textcmd.clear(); + mathsym.clear(); + } + // Check master Inset & inset = buffer.inset(); InsetIterator it = inset_iterator_begin(inset); InsetIterator const end = inset_iterator_end(inset); - for (; it != end; ++it) it->initUnicodeMath(); + + // Check children + BufferList::iterator bit = theBufferList().begin(); + BufferList::iterator const bend = theBufferList().end(); + for (; bit != bend; ++bit) + if (buffer.isChild(*bit)) + initUnicodeMath(**bit, false); #endif } @@ -578,7 +606,7 @@ void Encodings::validate(char_type c, LaTeXFeatures & features, bool for_mathed) } } if (for_mathed && isMathSym(c)) { - features.require("relsize"); + features.require("amstext"); features.require("lyxmathsym"); } #endif @@ -668,8 +696,14 @@ Encoding const * Encodings::fromLyXName(string const & name) const } -Encoding const * Encodings::fromLaTeXName(string const & name) const +Encoding const * Encodings::fromLaTeXName(string const & n) const { + string name = n; + // FIXME: if we have to test for too many of these synonyms, + // we should instead extend the format of lib/encodings + if (n == "ansinew") + name = "cp1252"; + // We don't use find_if because it makes copies of the pairs in // the map. // This linear search is OK since we don't have many encodings. @@ -791,7 +825,7 @@ void Encodings::read(FileName const & encfile, FileName const & symbolsfile) // Now read the encodings enum { et_encoding = 1, - et_end, + et_end }; LexerKeyword encodingtags[] = {