X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FEncoding.h;h=b57ad7aa08f1aca65959ebbd5ea0b45bdaf96218;hb=5170489b983c08c8be8d878996710eb0f6db2679;hp=d7e1dded23a1524030a36e4acff5ea4b473e96e4;hpb=f8afb491657fed0851133490d74117dad448848a;p=lyx.git diff --git a/src/Encoding.h b/src/Encoding.h index d7e1dded23..b57ad7aa08 100644 --- a/src/Encoding.h +++ b/src/Encoding.h @@ -4,7 +4,7 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Lars Gullik Bjønnes + * \author Lars Gullik Bjønnes * \author Jean-Marc Lasgouttes * * Full author contact details are available in file CREDITS. @@ -24,6 +24,7 @@ namespace lyx { namespace support { class FileName; } +class Buffer; class LaTeXFeatures; class EncodingException : public std::exception { @@ -45,21 +46,29 @@ public: enum Package { none, inputenc, - CJK + CJK, + japanese }; /// Encoding() {} /// Encoding(std::string const & n, std::string const & l, - std::string const & i, bool f, Package p); + 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_; } + /// \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 @@ -67,17 +76,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) 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: /// - std::string Name_; + std::string name_; /// - std::string LatexName_; + std::string latexName_; + /// + std::string guiName_; /// std::string iconvName_; /// Is this a fixed width encoding? @@ -105,6 +131,12 @@ private: class Encodings { public: + /// + typedef std::set MathCommandSet; + /// + typedef std::set TextCommandSet; + /// + typedef std::set MathSymbolSet; /// typedef std::map EncodingList; /// iterator to iterate over all encodings. @@ -125,9 +157,9 @@ public: 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; + 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(); } @@ -135,7 +167,7 @@ public: const_iterator end() const { return encodinglist.end(); } /// - enum Letter_Form { + enum LetterForm { /// FORM_ISOLATED, /// @@ -146,17 +178,19 @@ 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); + /// 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 @@ -166,6 +200,85 @@ 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); + /** + * Register \p c as a mathmode command. + */ + static void addMathCmd(char_type c) { mathcmd.insert(c); } + /** + * Register \p c as a textmode command. + */ + static void addTextCmd(char_type c) { textcmd.insert(c); } + /** + * Register \p c as a mathmode symbol. + */ + static void addMathSym(char_type c) { mathsym.insert(c); } + /** + * Tell whether \p c is registered as a mathmode command. + */ + static bool isMathCmd(char_type c) { return mathcmd.count(c); } + /** + * Tell whether \p c is registered as a textmode command. + */ + static bool isTextCmd(char_type c) { return textcmd.count(c); } + /** + * 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, + 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. + * \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, bool & needsTermination, + std::set * req = 0); + /// + enum LatexCmd { + /// + MATH_CMD = 1, + /// + TEXT_CMD = 2 + }; + /** + * 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. + * 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, + bool & needsTermination, docstring & rem, + std::set * req = 0); /** * Add the preamble snippet needed for the output of \p c to * \p features. @@ -173,11 +286,17 @@ 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: /// EncodingList encodinglist; + /// + static MathCommandSet mathcmd; + /// + static TextCommandSet textcmd; + /// + static MathSymbolSet mathsym; }; extern Encodings encodings;