]> git.lyx.org Git - lyx.git/blobdiff - src/Encoding.cpp
More general fix for part of 5403.
[lyx.git] / src / Encoding.cpp
index 0620a149cc56816f81a4778638fd63356b22d78f..34cee34bae69beb56e95e4543d17ac1504232115 100644 (file)
@@ -14,6 +14,8 @@
 
 #include "Encoding.h"
 
+#include "Buffer.h"
+#include "InsetIterator.h"
 #include "LaTeXFeatures.h"
 #include "Lexer.h"
 #include "LyXRC.h"
@@ -254,6 +256,9 @@ CharInfoMap unicodesymbols;
 typedef std::set<char_type> CharSet;
 CharSet forced;
 
+typedef std::set<char_type> MathAlphaSet;
+MathAlphaSet mathalpha;
+
 
 /// The highest code point in UCS4 encoding (1<<20 + 1<<16)
 char_type const max_ucs4 = 0x110000;
@@ -405,7 +410,8 @@ bool Encodings::latexMathChar(char_type c, bool mathmode,
                if (!encoding || command.empty()) {
                        command = it->second.textcommand;
                        addTextCmd(c);
-               } else if (mathmode)
+               }
+               if (mathmode)
                        addMathSym(c);
        }
        return use_math;
@@ -416,7 +422,7 @@ char_type Encodings::fromLaTeXCommand(docstring const & cmd, bool & combining)
 {
        CharInfoMap::const_iterator const end = unicodesymbols.end();
        CharInfoMap::const_iterator it = unicodesymbols.begin();
-       for (; it != end; ++it) {
+       for (combining = false; it != end; ++it) {
                docstring const math = it->second.mathcommand;
                docstring const text = it->second.textcommand;
                if (math == cmd || text == cmd) {
@@ -505,6 +511,21 @@ docstring Encodings::fromLaTeXCommand(docstring const & cmd, docstring & rem)
 }
 
 
+void Encodings::initUnicodeMath(Buffer const & buffer)
+{
+       mathcmd.clear();
+       textcmd.clear();
+       mathsym.clear();
+
+       Inset & inset = buffer.inset();
+       InsetIterator it = inset_iterator_begin(inset);
+       InsetIterator const end = inset_iterator_end(inset);
+
+       for (; it != end; ++it)
+               it->initUnicodeMath();
+}
+
+
 void Encodings::validate(char_type c, LaTeXFeatures & features, bool for_mathed)
 {
        CharInfoMap::const_iterator const it = unicodesymbols.find(c);
@@ -516,17 +537,27 @@ void Encodings::validate(char_type c, LaTeXFeatures & features, bool for_mathed)
                                      (!for_mathed && !it->second.textcommand.empty());
                if (use_math) {
                        if (!it->second.mathpreamble.empty()) {
-                               if (it->second.mathfeature)
-                                       features.require(it->second.mathpreamble);
-                               else
+                               if (it->second.mathfeature) {
+                                       string feats = it->second.mathpreamble;
+                                       while (!feats.empty()) {
+                                               string feat;
+                                               feats = split(feats, feat, ',');
+                                               features.require(feat);
+                                       }
+                               } else
                                        features.addPreambleSnippet(it->second.mathpreamble);
                        }
                }
                if (use_text) {
                        if (!it->second.textpreamble.empty()) {
-                               if (it->second.textfeature)
-                                       features.require(it->second.textpreamble);
-                               else
+                               if (it->second.textfeature) {
+                                       string feats = it->second.textpreamble;
+                                       while (!feats.empty()) {
+                                               string feat;
+                                               feats = split(feats, feat, ',');
+                                               features.require(feat);
+                                       }
+                               } else
                                        features.addPreambleSnippet(it->second.textpreamble);
                        }
                }
@@ -608,6 +639,12 @@ bool Encodings::isForced(char_type c)
 }
 
 
+bool Encodings::isMathAlpha(char_type c)
+{
+       return mathalpha.count(c);
+}
+
+
 Encoding const * Encodings::fromLyXName(string const & name) const
 {
        EncodingList::const_iterator const it = encodinglist.find(name);
@@ -677,16 +714,19 @@ void Encodings::read(FileName const & encfile, FileName const & symbolsfile)
                while (!flags.empty()) {
                        string flag;
                        flags = split(flags, flag, ',');
-                       if (flag == "combining")
+                       if (flag == "combining") {
                                info.combining = true;
-                       else if (flag == "force") {
+                       else if (flag == "force") {
                                info.force = true;
                                forced.insert(symbol);
-                       } else
+                       } else if (flag == "mathalpha") {
+                               mathalpha.insert(symbol);
+                       } else {
                                lyxerr << "Ignoring unknown flag `" << flag
                                       << "' for symbol `0x"
                                       << hex << symbol << dec
                                       << "'." << endl;
+                       }
                }
                // mathcommand and mathpreamble have been added for 1.6.0.
                // make them optional so that old files still work.