X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FEncoding.h;h=52bfc95692190fc1aecb6a1be8bf3b3bc9a9fc52;hb=c6f262a5b74e7bf595efd6a02ca26a2900e5e6eb;hp=f0266eb1f78bbac53a4b5b7d85386fe5e14fe1dc;hpb=01e94f5e038602ac29ee9c4e9afbca268a4a1f98;p=lyx.git diff --git a/src/Encoding.h b/src/Encoding.h index f0266eb1f7..52bfc95692 100644 --- a/src/Encoding.h +++ b/src/Encoding.h @@ -14,6 +14,7 @@ #define ENCODING_H #include "support/docstring.h" +#include "support/trivstring.h" #include "support/types.h" #include @@ -24,15 +25,12 @@ namespace lyx { namespace support { class FileName; } -class Buffer; -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; @@ -54,45 +52,72 @@ enum CharInfoFlags { CharInfoMathNoTermination = 32, /// CharInfoForceSelected = 64, + /// + CharInfoDeprecated = 128 }; /// Information about a single UCS4 character class CharInfo { public: + CharInfo() : flags_(0) {} + CharInfo( + docstring const & textcommand, docstring const & mathcommand, + std::string const & textpreamble, std::string const & mathpreamble, + std::string const & tipashortcut, unsigned int flags); + // we assume that at least one command is nonempty when using unicodesymbols + bool isUnicodeSymbol() const { return !textcommand_.empty() || !mathcommand_.empty(); } /// LaTeX command (text mode) for this character - docstring textcommand; + docstring const textcommand() const { return textcommand_; } /// LaTeX command (math mode) for this character - docstring mathcommand; + docstring mathcommand() const { return mathcommand_; } /// Needed LaTeX preamble (or feature) for text mode - std::string textpreamble; + std::string textpreamble() const { return textpreamble_; } /// Needed LaTeX preamble (or feature) for math mode - std::string mathpreamble; + std::string mathpreamble() const { return mathpreamble_; } /// Is this a combining character? - bool combining() const { return flags & CharInfoCombining ? true : false; } + bool combining() const { return flags_ & CharInfoCombining ? true : false; } /// Is \c textpreamble a feature known by LaTeXFeatures, or a raw LaTeX /// command? - bool textfeature() const { return flags & CharInfoTextFeature ? true : false; } + bool textfeature() const { return flags_ & CharInfoTextFeature ? true : false; } /// Is \c mathpreamble a feature known by LaTeXFeatures, or a raw LaTeX /// command? - bool mathfeature() const { return flags & CharInfoMathFeature ? true : false; } + bool mathfeature() const { return flags_ & CharInfoMathFeature ? true : false; } /// Always force the LaTeX command, even if the encoding contains /// this character? - bool force() const { return flags & CharInfoForce ? true : false; } + bool force() const { return flags_ & CharInfoForce ? true : false; } /// Force the LaTeX command for some encodings? - bool forceselected() const { return flags & CharInfoForceSelected ? true : false; } + bool forceselected() const { return flags_ & CharInfoForceSelected ? true : false; } + /// Disable LaTeX command => char_type conversion for this deprecated symbol? + bool deprecated() const { return flags_ & CharInfoDeprecated ? true : false; } /// TIPA shortcut - std::string tipashortcut; + std::string const tipashortcut() const { return tipashortcut_; } /// \c textcommand needs no termination (such as {} or space). - bool textnotermination() const { return flags & CharInfoTextNoTermination ? true : false; } + bool textnotermination() const { return flags_ & CharInfoTextNoTermination ? true : false; } /// \c mathcommand needs no termination (such as {} or space). - bool mathnotermination() const { return flags & CharInfoMathNoTermination ? true : false; } + bool mathnotermination() const { return flags_ & CharInfoMathNoTermination ? true : false; } /// - unsigned int flags; +private: + /// LaTeX command (text mode) for this character + trivdocstring textcommand_; + /// LaTeX command (math mode) for this character + trivdocstring mathcommand_; + /// Needed LaTeX preamble (or feature) for text mode + trivstring textpreamble_; + /// Needed LaTeX preamble (or feature) for math mode + trivstring mathpreamble_; + /// TIPA shortcut + trivstring tipashortcut_; + /// feature flags + unsigned int flags_; }; -/// +/** + * An encoding as defined in lib/encodings. + * All const methods are thread-safe, so the caller does not need any locking. + * This property must be kept when changing the class. + */ class Encoding { public: /// Which LaTeX package handles this encoding? @@ -105,7 +130,8 @@ public: /// Represent any of the above packages static int const any; /// - Encoding() {} + Encoding() : fixedwidth_(true), unsafe_(false), forced_(0), + start_encodable_(0), package_(none), complete_(false) {} /// Encoding(std::string const & n, std::string const & l, std::string const & g, std::string const & i, @@ -113,13 +139,13 @@ public: /// 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 guiName() const { return guiName_; } /// - std::string const & iconvName() const { return iconvName_; } + std::string const iconvName() const { return iconvName_; } /// bool hasFixedWidth() const { return fixedwidth_; } /// @@ -148,7 +174,7 @@ public: * \p dryrun specifies whether the string is used within source * preview (which yields a special warning). */ - std::pair latexString(docstring const input, + std::pair latexString(docstring const & input, bool dryrun = false) const; /// Which LaTeX package handles this encoding? Package package() const { return package_; } @@ -162,13 +188,13 @@ private: */ bool isForced(char_type c) const; /// - std::string name_; + trivstring name_; /// - std::string latexName_; + trivstring latexName_; /// - std::string guiName_; + trivstring guiName_; /// - std::string iconvName_; + trivstring iconvName_; /// Is this a fixed width encoding? bool fixedwidth_; /// Is this encoding TeX unsafe, e.g. control characters like {, } @@ -178,13 +204,13 @@ private: typedef std::set CharSet; /// Set of UCS4 characters that we can encode (for singlebyte /// encodings only) - mutable CharSet encodable_; + CharSet encodable_; /// Set of UCS4 characters that we can't encode CharSet const * forced_; /// 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. - mutable char_type start_encodable_; + char_type start_encodable_; /// Which LaTeX package handles this encoding? Package package_; /** @@ -194,7 +220,7 @@ private: * This is needed especially for the multibyte encodings, if we * complete all encoding info on startup it takes 2-3 minutes. */ - mutable bool complete_; + bool complete_; }; class Encodings { @@ -206,7 +232,7 @@ public: /// typedef std::set MathSymbolSet; /// - 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 { @@ -239,46 +265,32 @@ public: /// const_iterator end() const { return encodinglist.end(); } - /// - enum LetterForm { - /// - FORM_ISOLATED, - /// - FORM_FINAL, - /// - FORM_INITIAL, - /// - FORM_MEDIAL - }; - /// - static bool isHebrewComposeChar(char_type c); - /// - static bool isArabicComposeChar(char_type c); - /// - static bool isArabicSpecialChar(char_type c); - /// - static bool isArabicChar(char_type c); - /// - static char_type transformChar(char_type c, LetterForm form); + /// Accessor for the unicode information table. + static CharInfo const & unicodeCharInfo(char_type c); /// Is this a combining char? static bool isCombiningChar(char_type c); /// Return the TIPA shortcut static std::string const TIPAShortcut(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. + * Test, if \p c is a supported Greek or Cyrillic letter. + * Return script macro name or empty string. */ - static bool isKnownScriptChar(char_type const c, std::string & preamble); + static std::string const isKnownScriptChar(char_type const c); + /// Does \p fontenc support characters in \p script? + static bool fontencSupportsScript(std::string const & fontenc, + std::string const & script); /** * Do we have to display in italics this character when in mathmode? * This is true if the "mathalpha" flag is set. We use this for * letters and accented characters that are output as math commands. */ static bool isMathAlpha(char_type c); + /** + * Do we have to wrap in \text this character when in mathmode? + * This is true if \p c is not ascii and the "mathalpha" flag is not + * set and a mathcommand is not defined in the unicodesymbols file. + */ + static bool isUnicodeTextOnly(char_type c); /** * Register \p c as a mathmode command. */ @@ -303,10 +315,6 @@ public: * Tell whether \p c is registered as a mathmode symbol. */ static bool isMathSym(char_type c) { return mathsym.count(c); } - /** - * Initialize mathcmd, textcmd, and mathsym sets. - */ - static void initUnicodeMath(Buffer const & buffer, bool for_master = true); /** * If \p c cannot be encoded in the given \p encoding, convert * it to something that LaTeX can understand in mathmode. @@ -346,16 +354,8 @@ public: static docstring fromLaTeXCommand(docstring const & cmd, int cmdtype, bool & needsTermination, docstring & rem, std::set * req = 0); - /** - * Add the preamble snippet needed for the output of \p c to - * \p features. - * This does not depend on the used encoding, since the inputenc - * 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, bool for_mathed = false); -private: +protected: /// EncodingList encodinglist; ///