X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FEncoding.cpp;h=71ea8c63e49a944691d5c760bbbc2c7cfa372bbd;hb=6b651f2ad9f698c01993dcc6e340682c279f1c55;hp=ae03c09b4869006f41363bf09f4bdca4e2112c66;hpb=5ae54ddafb0f8a9dd1a71d7a26549b31b6516e14;p=lyx.git diff --git a/src/Encoding.cpp b/src/Encoding.cpp index ae03c09b48..71ea8c63e4 100644 --- a/src/Encoding.cpp +++ b/src/Encoding.cpp @@ -14,28 +14,24 @@ #include "Encoding.h" -#include "debug.h" #include "LaTeXFeatures.h" #include "Lexer.h" #include "LyXRC.h" +#include "support/debug.h" #include "support/FileName.h" #include "support/lstrings.h" #include "support/unicode.h" -#include +#include -#ifndef CXX_GLOBAL_CSTD -using std::strtol; -#endif -using std::endl; -using std::string; +#include +using namespace std; +using namespace lyx::support; namespace lyx { -using support::FileName; - Encodings encodings; namespace { @@ -241,7 +237,7 @@ struct CharInfo { }; -typedef std::map CharInfoMap; +typedef map CharInfoMap; CharInfoMap unicodesymbols; @@ -251,6 +247,18 @@ char_type const max_ucs4 = 0x110000; } // namespace anon +EncodingException::EncodingException(char_type c) + : failed_char(c), par_id(0), pos(0) +{ +} + + +const char * EncodingException::what() const throw() +{ + return "Could not find LaTeX command for a character"; +} + + Encoding::Encoding(string const & n, string const & l, string const & i, bool f, Encoding::Package p) : Name_(n), LatexName_(l), iconvName_(i), fixedwidth_(f), package_(p) @@ -278,8 +286,8 @@ void Encoding::init() const // We do not need to check all UCS4 code points, it is enough // if we check all 256 code points of this encoding. for (unsigned short j = 0; j < 256; ++j) { - char const c = j; - std::vector const ucs4 = eightbit_to_ucs4(&c, 1, iconvName_); + char const c = char(j); + vector const ucs4 = eightbit_to_ucs4(&c, 1, iconvName_); if (ucs4.size() == 1) { char_type const c = ucs4[0]; CharInfoMap::const_iterator const it = unicodesymbols.find(c); @@ -293,7 +301,7 @@ void Encoding::init() const // therefore we need to check all UCS4 code points. // This is expensive! for (char_type c = 0; c < max_ucs4; ++c) { - std::vector const eightbit = ucs4_to_eightbit(&c, 1, iconvName_); + vector const eightbit = ucs4_to_eightbit(&c, 1, iconvName_); if (!eightbit.empty()) { CharInfoMap::const_iterator const it = unicodesymbols.find(c); if (it == unicodesymbols.end() || !it->second.force) @@ -325,10 +333,7 @@ docstring const Encoding::latexChar(char_type c) const // c cannot be encoded in this encoding CharInfoMap::const_iterator const it = unicodesymbols.find(c); if (it == unicodesymbols.end()) - lyxerr << "Could not find LaTeX command for character 0x" - << std::hex << c << std::dec - << ".\nLaTeX export will fail." - << endl; + throw EncodingException(c); else return it->second.command; } @@ -401,6 +406,25 @@ bool Encodings::isCombiningChar(char_type c) } +bool Encodings::isKnownScriptChar(char_type const c, string & preamble) +{ + CharInfoMap::const_iterator const it = unicodesymbols.find(c); + + if (it == unicodesymbols.end()) + return false; + + if (it->second.preamble != "textgreek" && + it->second.preamble != "textcyr") + return false; + + if (preamble.empty()) { + preamble = it->second.preamble; + return true; + } + return it->second.preamble == preamble; +} + + Encoding const * Encodings::getFromLyXName(string const & name) const { EncodingList::const_iterator it = encodinglist.find(name); @@ -413,7 +437,7 @@ Encoding const * Encodings::getFromLyXName(string const & name) const Encoding const * Encodings::getFromLaTeXName(string const & name) const { - // We don't use std::find_if because it makes copies of the pairs in + // 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. // Users could even optimize it by putting the encodings they use @@ -443,11 +467,11 @@ void Encodings::read(FileName const & encfile, FileName const & symbolsfile) string flags; if (symbolslex.next(true)) { - std::istringstream is(symbolslex.getString()); + istringstream is(symbolslex.getString()); // reading symbol directly does not work if - // char_type == std::wchar_t. + // char_type == wchar_t. boost::uint32_t tmp; - if(!(is >> std::hex >> tmp)) + if(!(is >> hex >> tmp)) break; symbol = tmp; } else @@ -470,7 +494,7 @@ void Encodings::read(FileName const & encfile, FileName const & symbolsfile) info.force = false; while (!flags.empty()) { string flag; - flags = support::split(flags, flag, ','); + flags = split(flags, flag, ','); if (flag == "combining") info.combining = true; else if (flag == "force") @@ -478,18 +502,16 @@ void Encodings::read(FileName const & encfile, FileName const & symbolsfile) else lyxerr << "Ignoring unknown flag `" << flag << "' for symbol `0x" - << std::hex << symbol << std::dec + << hex << symbol << dec << "'." << endl; } if (!info.preamble.empty()) info.feature = info.preamble[0] != '\\'; - LYXERR(Debug::INFO) - << "Read unicode symbol " << symbol << " '" + LYXERR(Debug::INFO, "Read unicode symbol " << symbol << " '" << to_utf8(info.command) << "' '" << info.preamble - << "' " << info.combining << ' ' << info.feature - << endl; + << "' " << info.combining << ' ' << info.feature); unicodesymbols[symbol] = info; } @@ -519,20 +541,19 @@ void Encodings::read(FileName const & encfile, FileName const & symbolsfile) string const iconvname = lex.getString(); lex.next(); string const width = lex.getString(); - bool fixedwidth;; + bool fixedwidth = false; if (width == "fixed") fixedwidth = true; else if (width == "variable") fixedwidth = false; else { - fixedwidth = false; lex.printError("Encodings::read: " "Unknown width: `$$Token'"); } lex.next(); string const p = lex.getString(); - Encoding::Package package; + Encoding::Package package = Encoding::none; if (p == "none") package = Encoding::none; else if (p == "inputenc") @@ -540,12 +561,11 @@ void Encodings::read(FileName const & encfile, FileName const & symbolsfile) else if (p == "CJK") package = Encoding::CJK; else { - package = Encoding::none; lex.printError("Encodings::read: " "Unknown package: `$$Token'"); } - LYXERR(Debug::INFO) << "Reading encoding " << name << endl; + LYXERR(Debug::INFO, "Reading encoding " << name); encodinglist[name] = Encoding(name, latexname, iconvname, fixedwidth, package);