X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FEncoding.h;h=33919281d1322c7d42061c9c7757c6774c83a106;hb=f7418758ab6501171f732552c4f5d8eec3d11fe8;hp=7b0fa8ec19a30a0fb8134d8d12b28e38d78b3d80;hpb=2cf5de28a9ebd192da359777d9bcc1019cab4ad9;p=lyx.git diff --git a/src/Encoding.h b/src/Encoding.h index 7b0fa8ec19..33919281d1 100644 --- a/src/Encoding.h +++ b/src/Encoding.h @@ -24,9 +24,6 @@ namespace lyx { namespace support { class FileName; } -class Buffer; -class LaTeXFeatures; - class EncodingException : public std::exception { public: EncodingException(char_type c); @@ -39,22 +36,96 @@ public: }; +enum CharInfoFlags { + /// + CharInfoCombining = 1, + /// + CharInfoTextFeature = 2, + /// + CharInfoMathFeature = 4, + /// + CharInfoForce = 8, + /// + CharInfoTextNoTermination = 16, + /// + CharInfoMathNoTermination = 32, + /// + CharInfoForceSelected = 64, +}; + + +/// 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 const textcommand() const { return textcommand_; } + /// LaTeX command (math mode) for this character + docstring mathcommand() const { return mathcommand_; } + /// Needed LaTeX preamble (or feature) for text mode + std::string textpreamble() const { return textpreamble_; } + /// Needed LaTeX preamble (or feature) for math mode + std::string mathpreamble() const { return mathpreamble_; } + /// Is this a combining character? + 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; } + /// Is \c mathpreamble a feature known by LaTeXFeatures, or a raw LaTeX + /// command? + 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; } + /// Force the LaTeX command for some encodings? + bool forceselected() const { return flags_ & CharInfoForceSelected ? true : false; } + /// TIPA shortcut + std::string const tipashortcut() const { return tipashortcut_; } + /// \c textcommand needs no termination (such as {} or space). + 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; } + /// +private: + /// LaTeX command (text mode) for this character + docstring textcommand_; + /// LaTeX command (math mode) for this character + docstring mathcommand_; + /// Needed LaTeX preamble (or feature) for text mode + std::string textpreamble_; + /// Needed LaTeX preamble (or feature) for math mode + std::string mathpreamble_; + /// TIPA shortcut + std::string tipashortcut_; + /// feature flags + unsigned int flags_; +}; + + /// class Encoding { public: /// Which LaTeX package handles this encoding? enum Package { - none, - inputenc, - CJK, - japanese + none = 1, + inputenc = 2, + CJK = 4, + japanese = 8 }; + /// Represent any of the above packages + static int const any; /// - Encoding() {} + Encoding() : fixedwidth_(true), unsafe_(false), complete_(false) {} /// Encoding(std::string const & n, std::string const & l, std::string const & g, std::string const & i, - bool f, Package p); + bool f, bool u, Package p); /// void init() const; /// @@ -66,7 +137,11 @@ public: /// std::string const & iconvName() const { return iconvName_; } /// - bool const & hasFixedWidth() const { return fixedwidth_; } + bool hasFixedWidth() const { return fixedwidth_; } + /// + bool unsafe() const { return unsafe_; } + /// \p c is representable in this encoding without a LaTeX macro + bool encodable(char_type c) const; /** * Convert \p c to something that LaTeX can understand. * This is either the character itself (if it is representable @@ -74,13 +149,34 @@ public: * 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. + * \return the converted character and a flag indicating whether + * the command needs to be terminated by {} or a space. + */ + std::pair latexChar(char_type c) const; + /** + * Convert \p input to something that LaTeX can understand. + * This is either the string itself (if it is representable + * in this encoding), or a LaTeX macro. + * If a character is not representable in this encoding, but no + * LaTeX macro is known, a warning is given of lyxerr, and the + * character is returned in the second string of the pair and + * omitted in the first. + * \p dryrun specifies whether the string is used within source + * preview (which yields a special warning). */ - docstring latexChar(char_type c, bool no_commands = false) const; + std::pair latexString(docstring const & input, + bool dryrun = 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: + /** + * Do we have to output this character as LaTeX command in any case? + * This is true if the "force" flag is set. + * We need this if the inputencoding does not support a certain glyph. + */ + bool isForced(char_type c) const; /// std::string name_; /// @@ -91,11 +187,16 @@ private: std::string iconvName_; /// Is this a fixed width encoding? bool fixedwidth_; + /// Is this encoding TeX unsafe, e.g. control characters like {, } + /// and \\ may appear in high bytes? + bool unsafe_; /// typedef std::set CharSet; /// Set of UCS4 characters that we can encode (for singlebyte /// encodings only) mutable 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. @@ -140,36 +241,22 @@ public: void read(support::FileName const & encfile, support::FileName const & symbolsfile); /// Get encoding from LyX name \p name - Encoding const * fromLyXName(std::string const & name) const; - /// Get encoding from LaTeX name \p name - Encoding const * fromLaTeXName(std::string const & name) const; + Encoding const * + fromLyXName(std::string const & name, bool allowUnsafe = false) const; + /// Get encoding from LaTeX name \p name and package \p package + Encoding const * fromLaTeXName(std::string const & name, + int const & package = Encoding::any, bool allowUnsafe = false) const; + /// Get encoding from iconv name \p name and package \p package + Encoding const * fromIconvName(std::string const & name, + int const & package = Encoding::any, bool allowUnsafe = false) const; /// const_iterator begin() const { return encodinglist.begin(); } /// 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 @@ -183,23 +270,12 @@ public: * \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 "force" flag is set. - * We need this if the inputencoding does not support a certain glyph. - */ - static bool isForced(char_type c); /** * 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 need to terminate this command (by {} or space)? - * This is true if the "notermination" flag is not set. - */ - static bool needsTermination(char_type c); /** * Register \p c as a mathmode command. */ @@ -224,23 +300,25 @@ 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. + * \p needsTermination indicates whether the command needs to be + * terminated by {} or a space. * \return whether \p command is a mathmode command */ static bool latexMathChar(char_type c, bool mathmode, - Encoding const * encoding, docstring & command); + Encoding const * encoding, docstring & command, + bool & needsTermination); /** * Convert the LaTeX command in \p cmd to the corresponding unicode - * point and set \p combining to true if it is a combining symbol + * point and set \p combining to true if it is a combining symbol. + * \p needsTermination indicates whether the command needs to be + * terminated by {} or a space. */ static char_type fromLaTeXCommand(docstring const & cmd, int cmdtype, - bool & combining, std::set * req = 0); + bool & combining, bool & needsTermination, + std::set * req = 0); /// enum LatexCmd { /// @@ -255,19 +333,14 @@ public: * unconverted commands are returned in \p rem. * The \p cmdtype parameter can be used to limit recognized * commands to math or text mode commands only. + * \p needsTermination indicates whether the command needs to be + * terminated by {} or a space. */ static docstring fromLaTeXCommand(docstring const & cmd, int cmdtype, - 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); + bool & needsTermination, docstring & rem, + std::set * req = 0); -private: +protected: /// EncodingList encodinglist; ///