X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FEncoding.cpp;h=ad380d78039d69f83ffa048bb14b3ed9a54c51b5;hb=2e433654c7f3db02bfd0e4dd09eb04cd8ab44bb9;hp=e0b3b70789e144a7c80a69507615d3c4f3e45ad2;hpb=c8d1d0d33c0c899f17eca14c52a26e781cdc0204;p=lyx.git diff --git a/src/Encoding.cpp b/src/Encoding.cpp index e0b3b70789..ad380d7803 100644 --- a/src/Encoding.cpp +++ b/src/Encoding.cpp @@ -25,8 +25,9 @@ #include -#include +#include #include +#include using namespace std; using namespace lyx::support; @@ -58,7 +59,7 @@ MathAlphaSet mathalpha; /// The highest code point in UCS4 encoding (1<<20 + 1<<16) char_type const max_ucs4 = 0x110000; -} // namespace anon +} // namespace EncodingException::EncodingException(char_type c) @@ -188,9 +189,16 @@ bool Encoding::encodable(char_type c) const { // assure the used encoding is properly initialized init(); - if (iconvName_ == "UTF-8" && package_ == none) return true; + // platex does not load inputenc: force conversion of supported characters + if (package_ == Encoding::japanese + && ((0xb7 <= c && c <= 0x05ff) // Latin-1 Supplement ... Hebrew + || (0x1d00 <= c && c <= 0x218f) // Phonetic Extensions ... Number Forms + || (0x2193 <= c && c <= 0x2aff) // Arrows ... Supplemental Mathematical Operators + || (0xfb00 <= c && c <= 0xfb4f) // Alphabetic Presentation Forms + || (0x1d400 <= c && c <= 0x1d7ff))) // Mathematical Alphanumeric Symbols + return false; if (c < start_encodable_ && !isForced(c)) return true; if (encodable_.find(c) != encodable_.end()) @@ -222,8 +230,8 @@ pair Encoding::latexString(docstring const & input, bool d docstring uncodable; bool terminate = false; for (size_t n = 0; n < input.size(); ++n) { + char_type const c = input[n]; try { - char_type const c = input[n]; pair latex_char = latexChar(c); docstring const latex = latex_char.first; if (terminate && !prefixIs(latex, '\\') @@ -240,7 +248,8 @@ pair Encoding::latexString(docstring const & input, bool d result += latex; terminate = latex_char.second; } catch (EncodingException & /* e */) { - LYXERR0("Uncodable character in latexString!"); + LYXERR0("Uncodable character <" << docstring(1, c) + << "> in latexString!"); if (dryrun) { result += "<" + _("LyX Warning: ") + _("uncodable character") + " '"; @@ -263,11 +272,15 @@ vector Encoding::symbolsList() const vector symbols; for (char_type c = 0; c < start_encodable_; ++c) symbols.push_back(c); - //add all encodable characters + // add all encodable characters copy(encodable_.begin(), encodable_.end(), back_inserter(symbols)); - // now the ones from the unicodesymbols file - for (pair const & elem : unicodesymbols) - symbols.push_back(elem.first); + // now the ones from the unicodesymbols file that are not already there + for (pair const & elem : unicodesymbols) { + if (find(symbols.begin(), symbols.end(), elem.first) == symbols.end()) + symbols.push_back(elem.first); + } + // finally, sort the vector + sort(symbols.begin(), symbols.end()); return symbols; } @@ -301,10 +314,11 @@ bool Encodings::latexMathChar(char_type c, bool mathmode, if (!encoding || command.empty()) { command = it->second.textcommand(); needsTermination = !it->second.textnotermination(); - addTextCmd(c); } if (mathmode) addMathSym(c); + else + addTextCmd(c); } return use_math; } @@ -576,21 +590,29 @@ string const Encodings::TIPAShortcut(char_type c) } -bool Encodings::isKnownScriptChar(char_type const c, string & preamble) +string const Encodings::isKnownScriptChar(char_type const c) { CharInfoMap::const_iterator const it = unicodesymbols.find(c); if (it == unicodesymbols.end()) - return false; + return string(); + // FIXME: parse complex textpreamble (may be list or alternatives, + // e.g., "subscript,textgreek" or "textcomp|textgreek") + if (it->second.textpreamble() == "textgreek" + || it->second.textpreamble() == "textcyrillic") + return it->second.textpreamble(); + return string(); +} - if (it->second.textpreamble() != "textgreek" && it->second.textpreamble() != "textcyr") - return false; - if (preamble.empty()) { - preamble = it->second.textpreamble(); - return true; - } - return it->second.textpreamble() == preamble; +bool Encodings::fontencSupportsScript(string const & fontenc, string const & script) +{ + if (script == "textgreek") + return (fontenc == "LGR" || fontenc == "TU"); + if (script == "textcyrillic") + return (fontenc == "T2A" || fontenc == "T2B" || fontenc == "T2C" + || fontenc == "X2" || fontenc == "TU"); + return false; } @@ -710,16 +732,16 @@ void Encodings::read(FileName const & encfile, FileName const & symbolsfile) flags |= CharInfoForce; forced.insert(symbol); } else if (prefixIs(flag, "force=")) { - vector encodings = + vector encs = getVectorFromString(flag.substr(6), ";"); - for (size_t i = 0; i < encodings.size(); ++i) - forcedselected[encodings[i]].insert(symbol); + for (size_t i = 0; i < encs.size(); ++i) + forcedselected[encs[i]].insert(symbol); flags |= CharInfoForceSelected; } else if (prefixIs(flag, "force!=")) { - vector encodings = + vector encs = getVectorFromString(flag.substr(7), ";"); - for (size_t i = 0; i < encodings.size(); ++i) - forcednotselected[encodings[i]].insert(symbol); + for (size_t i = 0; i < encs.size(); ++i) + forcednotselected[encs[i]].insert(symbol); flags |= CharInfoForceSelected; } else if (flag == "mathalpha") { mathalpha.insert(symbol);