X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fencoding.h;h=f07fb645a47090ea27c9622a6d8bbdbb7c6177c1;hb=e53e4d06726919c0fbf386bbe8f9d62a640b74d7;hp=c64a84517ac7f5e22dfdef7d3631e41c0face36d;hpb=80d7f70dc340e8b1ab29d38284b8327d13757196;p=lyx.git diff --git a/src/encoding.h b/src/encoding.h index c64a84517a..f07fb645a4 100644 --- a/src/encoding.h +++ b/src/encoding.h @@ -1,24 +1,29 @@ // -*- C++ -*- -/* This file is part of - * ====================================================== +/** + * \file encoding.h + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * - * LyX, The Document Processor + * \author Lars Gullik Bjønnes + * \author Jean-Marc Lasgouttes * - * Copyright 1995 Matthias Ettrich - * Copyright 1995-2001 The LyX Team. - * - * ====================================================== */ + * Full author contact details are available in file CREDITS. + */ #ifndef ENCODING_H #define ENCODING_H -#include "LString.h" -#include "lyxrc.h" +#include "support/docstring.h" #include +#include + +namespace lyx { + +namespace support { class FileName; } + +class LaTeXFeatures; -/// -typedef unsigned short int Uchar; /// class Encoding { @@ -26,48 +31,74 @@ public: /// Encoding() {} /// - Encoding(string const & n, string const & l, Uchar const * e) - : Name_(n), LatexName_(l) { - for (int i = 0; i < 256; ++i) - encoding_table[i] = e[i]; - } - /// - string const & Name() const { - return Name_; - } - /// - string const & LatexName() const { - return LatexName_; - } - /// - Uchar ucs(unsigned char c) const { - return encoding_table[c]; - } + Encoding(std::string const & n, std::string const & l, + std::string const & i); + /// + std::string const & name() const { return Name_; } + /// + std::string const & latexName() const { return LatexName_; } + /// + std::string const & iconvName() const { return iconvName_; } + /** + * Convert \p c to something that LaTeX can understand. + * This is either the character itself (if it is representable + * in this encoding), or a LaTeX macro. + * If the character is not representable in this encoding, but no + * LaTeX macro is known, a warning is given of lyxerr, and the + * character is returned. + */ + docstring const latexChar(char_type c) const; + /// Add the preamble snippet needed for the output of latexChar(c) + /// to \p features. + void validate(char_type c, LaTeXFeatures & features) const; private: /// - string Name_; + std::string Name_; /// - string LatexName_; + std::string LatexName_; /// - Uchar encoding_table[256]; + std::string iconvName_; + /// + typedef std::set CharSet; + /// Set of UCS4 characters that we can encode (for singlebyte + /// encodings only) + 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_; }; -extern Encoding symbol_encoding; - class Encodings { public: /// - typedef std::map EncodingList; + typedef std::map EncodingList; + /// iterator to iterate over all encodings. + /// We hide the fact that our encoding list is implemented as a map. + class const_iterator : public EncodingList::const_iterator { + typedef EncodingList::const_iterator base; + public: + const_iterator() : base() {} + const_iterator(base const & b) : base(b) {} + Encoding const & operator*() const { return base::operator*().second; } + Encoding const * operator->() const { return &(base::operator*().second); } + }; /// Encodings(); + /// Read the encodings. + /// \param encfile encodings definition file + /// \param symbolsfile unicode->LaTeX mapping file + void read(support::FileName const & encfile, + 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 + Encoding const * getFromLaTeXName(std::string const & name) const; + /// - void read(string const & filename); - /// - Encoding const * getEncoding(string const & encoding) const; + const_iterator begin() const { return encodinglist.begin(); } /// - Encoding const * symbol_encoding() { - return &symbol_encoding_; - } + const_iterator end() const { return encodinglist.end(); } /// enum Letter_Form { @@ -81,28 +112,26 @@ public: FORM_MEDIAL }; /// - static - bool IsComposeChar_hebrew(unsigned char c); + static bool isComposeChar_hebrew(char_type c); /// - static - bool IsComposeChar_arabic(unsigned char c); + static bool isComposeChar_arabic(char_type c); /// - static - bool is_arabic_special(unsigned char c); + static bool is_arabic_special(char_type c); /// - static - bool is_arabic(unsigned char c); + static bool is_arabic(char_type c); /// - static - unsigned char TransformChar(unsigned char c, Letter_Form form); + static char_type transformChar(char_type c, Letter_Form form); + /// Is this a combining char? + static bool isCombiningChar(char_type c); private: /// EncodingList encodinglist; - /// - Encoding symbol_encoding_; }; extern Encodings encodings; + +} // namespace lyx + #endif