X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FEncoding.cpp;h=64bb3c0b64a4a9c4a5361596d5b51cd5d5afb09e;hb=da8b5de97;hp=acb91f656fbed521208fb55ffe868444ef2cd6ef;hpb=cb7094696095236b9a7133f41901e90aee767544;p=lyx.git diff --git a/src/Encoding.cpp b/src/Encoding.cpp index acb91f656f..64bb3c0b64 100644 --- a/src/Encoding.cpp +++ b/src/Encoding.cpp @@ -23,10 +23,10 @@ #include "support/textutils.h" #include "support/unicode.h" -#include - -#include #include +#include +#include +#include using namespace std; using namespace lyx::support; @@ -58,7 +58,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) @@ -67,7 +67,7 @@ EncodingException::EncodingException(char_type c) } -const char * EncodingException::what() const throw() +const char * EncodingException::what() const noexcept { return "Could not find LaTeX command for a character"; } @@ -188,9 +188,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()) @@ -221,9 +228,8 @@ pair Encoding::latexString(docstring const & input, bool d docstring result; docstring uncodable; bool terminate = false; - for (size_t n = 0; n < input.size(); ++n) { + for (char_type const c : input) { try { - char_type const c = input[n]; pair latex_char = latexChar(c); docstring const latex = latex_char.first; if (terminate && !prefixIs(latex, '\\') @@ -240,14 +246,15 @@ 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") + " '"; - result += docstring(1, input[n]); + result += docstring(1, c); result += "'>"; } else - uncodable += input[n]; + uncodable += c; } } return make_pair(result, uncodable); @@ -259,16 +266,19 @@ vector Encoding::symbolsList() const // assure the used encoding is properly initialized init(); - // first all encodable characters - vector symbols(encodable_.begin(), encodable_.end()); - // add those below start_encodable_ + // first all those below start_encodable_ + vector symbols; for (char_type c = 0; c < start_encodable_; ++c) symbols.push_back(c); - // now the ones from the unicodesymbols file - CharInfoMap::const_iterator const end = unicodesymbols.end(); - CharInfoMap::const_iterator it = unicodesymbols.begin(); - for (; it != end; ++it) - symbols.push_back(it->first); + // add all encodable characters + copy(encodable_.begin(), encodable_.end(), back_inserter(symbols)); + // now the ones from the unicodesymbols file that are not already there + for (auto 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; } @@ -302,10 +312,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; } @@ -577,21 +588,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; } @@ -616,9 +635,9 @@ Encodings::fromLyXName(string const & name, bool allowUnsafe) const { EncodingList::const_iterator const it = encodinglist.find(name); if (it == encodinglist.end()) - return 0; + return nullptr; if (!allowUnsafe && it->second.unsafe()) - return 0; + return nullptr; return &it->second; } @@ -642,7 +661,7 @@ Encodings::fromLaTeXName(string const & n, int const & p, bool allowUnsafe) cons if ((it->second.latexName() == name) && (it->second.package() & p) && (!it->second.unsafe() || allowUnsafe)) return &it->second; - return 0; + return nullptr; } @@ -654,7 +673,7 @@ Encodings::fromIconvName(string const & n, int const & p, bool allowUnsafe) cons if ((it->second.iconvName() == n) && (it->second.package() & p) && (!it->second.unsafe() || allowUnsafe)) return &it->second; - return 0; + return nullptr; } @@ -682,7 +701,7 @@ void Encodings::read(FileName const & encfile, FileName const & symbolsfile) istringstream is(symbolslex.getString()); // reading symbol directly does not work if // char_type == wchar_t. - boost::uint32_t tmp; + uint32_t tmp; if(!(is >> hex >> tmp)) break; symbol = tmp; @@ -711,16 +730,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 (auto const & enc : encs) + forcedselected[enc].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 (auto const & enc : encs) + forcednotselected[enc].insert(symbol); flags |= CharInfoForceSelected; } else if (flag == "mathalpha") { mathalpha.insert(symbol);