X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FEncoding.h;h=c78972a1c8b71e0a341f0e9e4a57cce9ec2ec633;hb=4056f0ddb150d0e5d60bc5941d51e365eed0ac86;hp=6d10d3bf67c41d46f910c5c2459ed7ea94f9de00;hpb=f630be890494c849981e4fb52ea4740506e92bed;p=lyx.git diff --git a/src/Encoding.h b/src/Encoding.h index 6d10d3bf67..c78972a1c8 100644 --- a/src/Encoding.h +++ b/src/Encoding.h @@ -14,6 +14,7 @@ #define ENCODING_H #include "support/docstring.h" +#include "support/types.h" #include #include @@ -24,15 +25,34 @@ 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 & i, bool f, Package p); + /// + void init() const; /// std::string const & name() const { return Name_; } /// @@ -48,6 +68,10 @@ public: * character is returned. */ docstring const latexChar(char_type c) const; + /// Which LaTeX package handles this encoding? + Package package() const { return package_; } + /// A list of all characters usable in this encoding + std::set getSymbolsList() const; private: /// std::string Name_; @@ -55,15 +79,27 @@ private: std::string LatexName_; /// 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,7 +122,7 @@ 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; /// Get encoding from LaTeX name \p name @@ -120,6 +156,15 @@ public: static char_type transformChar(char_type c, Letter_Form 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); /** * Add the preamble snippet needed for the output of \p c to * \p features.