X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FEncoding.h;h=704e3ed6113afdfd6fc8b1f0b92b6685c2e24864;hb=2455bc258f3b62c29ec4a41cb88070ff8518e842;hp=6d10d3bf67c41d46f910c5c2459ed7ea94f9de00;hpb=f630be890494c849981e4fb52ea4740506e92bed;p=lyx.git diff --git a/src/Encoding.h b/src/Encoding.h index 6d10d3bf67..704e3ed611 100644 --- a/src/Encoding.h +++ b/src/Encoding.h @@ -14,9 +14,11 @@ #define ENCODING_H #include "support/docstring.h" +#include "support/types.h" #include #include +#include namespace lyx { @@ -24,21 +26,45 @@ namespace support { class FileName; } class LaTeXFeatures; +class EncodingException : public std::exception { +public: + EncodingException(char_type c); + virtual ~EncodingException() throw() {} + virtual const char * what() const throw(); + + char_type failed_char; + int par_id; + pos_type pos; +}; + /// class Encoding { public: + /// Which LaTeX package handles this encoding? + enum Package { + none, + inputenc, + CJK + }; /// Encoding() {} /// Encoding(std::string const & n, std::string const & l, - std::string const & i); + std::string const & g, std::string const & i, + bool f, Package p); + /// + void init() const; + /// + std::string const & name() const { return name_; } /// - std::string const & name() const { return Name_; } + std::string const & latexName() const { return latexName_; } /// - std::string const & latexName() const { return LatexName_; } + std::string const & guiName() const { return guiName_; } /// std::string const & iconvName() const { return iconvName_; } + /// + bool const & hasFixedWidth() const { return fixedwidth_; } /** * Convert \p c to something that LaTeX can understand. * This is either the character itself (if it is representable @@ -47,23 +73,41 @@ public: * LaTeX macro is known, a warning is given of lyxerr, and the * character is returned. */ - docstring const latexChar(char_type c) const; + docstring latexChar(char_type c, bool for_mathed = false) const; + /// Which LaTeX package handles this encoding? + Package package() const { return package_; } + /// A list of all characters usable in this encoding + std::vector symbolsList() const; private: /// - std::string Name_; + std::string name_; + /// + std::string latexName_; /// - std::string LatexName_; + std::string guiName_; /// std::string iconvName_; + /// Is this a fixed width encoding? + bool fixedwidth_; /// typedef std::set CharSet; /// Set of UCS4 characters that we can encode (for singlebyte /// encodings only) - CharSet encodable_; + mutable CharSet encodable_; /// All code points below this are encodable. This helps us to avoid /// lokup of ASCII characters in encodable_ and gives about 1 sec /// speedup on export of the Userguide. - char_type start_encodable_; + mutable char_type start_encodable_; + /// Which LaTeX package handles this encoding? + Package package_; + /** + * If this is true the stored information about the encoding covers + * all encodable characters. We set this to false initially so that + * we only need to query iconv for the actually used encodings. + * This is needed especially for the multibyte encodings, if we + * complete all encoding info on startup it takes 2-3 minutes. + */ + mutable bool complete_; }; class Encodings { @@ -86,11 +130,11 @@ public: /// \param encfile encodings definition file /// \param symbolsfile unicode->LaTeX mapping file void read(support::FileName const & encfile, - support::FileName const & symbolsfile); + support::FileName const & symbolsfile); /// Get encoding from LyX name \p name - Encoding const * getFromLyXName(std::string const & name) const; + Encoding const * fromLyXName(std::string const & name) const; /// Get encoding from LaTeX name \p name - Encoding const * getFromLaTeXName(std::string const & name) const; + Encoding const * fromLaTeXName(std::string const & name) const; /// const_iterator begin() const { return encodinglist.begin(); } @@ -98,7 +142,7 @@ public: const_iterator end() const { return encodinglist.end(); } /// - enum Letter_Form { + enum LetterForm { /// FORM_ISOLATED, /// @@ -109,17 +153,51 @@ public: FORM_MEDIAL }; /// - static bool isComposeChar_hebrew(char_type c); + static bool isHebrewComposeChar(char_type c); /// - static bool isComposeChar_arabic(char_type c); + static bool isArabicComposeChar(char_type c); /// - static bool is_arabic_special(char_type c); + static bool isArabicSpecialChar(char_type c); /// - static bool is_arabic(char_type c); + static bool isArabicChar(char_type c); /// - static char_type transformChar(char_type c, Letter_Form form); + static char_type transformChar(char_type c, LetterForm form); /// Is this a combining char? static bool isCombiningChar(char_type c); + /** + * Is this a known char from some language? + * If \p preamble is empty and code point \p c is known to belong + * to a supported script, true is returned and \p preamble is set + * to the corresponding entry in the unicodesymbols file. + * If \p preamble is not empty, a check is made whether code point + * \p c is a known character matching the preamble entry. + */ + static bool isKnownScriptChar(char_type const c, std::string & preamble); + /** + * Do we have to output this character as LaTeX command in any case? + * This is true if the "forced" flag is set. + * We need this if the inputencoding does not support a certain glyph. + */ + static bool isForced(char_type c); + /** + * If \p c cannot be encoded in the given \p encoding, convert + * it to something that LaTeX can understand in math mode. + * \return whether \p command is a math mode command + */ + static bool latexMathChar(char_type c, Encoding const * encoding, docstring & command); + + /** + * Convert the LaTeX command in \p cmd to the corresponding unicode + * point and set \p combining to true if it is a combining symbol + */ + static char_type fromLaTeXCommand(docstring const & cmd, bool & combining); + /** + * Convert the LaTeX commands in \p cmd and \return a docstring + * of corresponding unicode points. The conversion stops at the + * first command which could not be converted, and the remaining + * unconverted commands are returned in \p rem + */ + static docstring fromLaTeXCommand(docstring const & cmd, docstring & rem); /** * Add the preamble snippet needed for the output of \p c to * \p features. @@ -127,7 +205,7 @@ public: * package only maps the code point \p c to a command, it does not * make this command available. */ - static void validate(char_type c, LaTeXFeatures & features); + static void validate(char_type c, LaTeXFeatures & features, bool for_mathed = false); private: ///