X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FTrans.h;h=92cad9b0dcde38272effea467e4f1a80f4d4aafd;hb=6a8b25ba5110a1d4e19206f9f42d3b04312e6728;hp=8677df4f0753ec71c0aa7737f885c1234b48c59a;hpb=39e79d8602920eefe36e898c9f415afb979521b2;p=lyx.git diff --git a/src/Trans.h b/src/Trans.h index 8677df4f07..92cad9b0dc 100644 --- a/src/Trans.h +++ b/src/Trans.h @@ -14,34 +14,125 @@ #ifndef TRANS_H #define TRANS_H -#include "KmodInfo.h" +#include "lfuns.h" +#include "support/docstring.h" +#include + +#include #include namespace lyx { - +class Cursor; +class Text; class Lexer; - class TransManager; -/** - Trans: holds a .kmap file - */ +/// +enum tex_accent { + /// + TEX_NOACCENT = 0, + /// + TEX_ACUTE, + /// + TEX_GRAVE, + /// + TEX_MACRON, + /// + TEX_TILDE, + /// + TEX_UNDERBAR, + /// + TEX_CEDILLA, + /// + TEX_UNDERDOT, + /// + TEX_CIRCUMFLEX, + /// + TEX_CIRCLE, + /// + TEX_TIE, + /// + TEX_BREVE, + /// + TEX_CARON, +// TEX_SPECIAL_CARON, + /// + TEX_HUNGUML, + /// + TEX_UMLAUT, + /// + TEX_DOT, + /// + TEX_OGONEK, + /// + TEX_MAX_ACCENT = TEX_OGONEK +}; + + +struct tex_accent_struct { + /// + tex_accent accent; + /// UCS4 code point of this accent + char_type ucs4; + /// + char const * name; + /// + kb_action action; +}; + +/// +extern tex_accent_struct get_accent(kb_action action); + + +/// +struct Keyexc { + /// character to make exception + char_type c; + /// exception data + docstring data; + /// Combination with another deadkey + bool combined; + /// The accent comined with + tex_accent accent; +}; + +/// +typedef std::list KmodException; + +/// +class KmodInfo { +public: + /// + docstring data; + /// + tex_accent accent; + /// + KmodException exception_list; +}; + + +///////////////////////////////////////////////////////////////////// +// +// Trans: holds a .kmap file +// +///////////////////////////////////////////////////////////////////// + class Trans { public: /// - Trans(); + Trans() {} /// - ~Trans(); + ~Trans() { freeKeymap(); } /// int load(std::string const & language); /// bool isDefined() const; /// - std::string const & getName() const; + std::string const & getName() const { return name_; } /// docstring const process(char_type, TransManager &); /// @@ -58,7 +149,7 @@ private: docstring const & match(char_type c); /// void insertException(KmodException & exclist, char_type c, - docstring const & data, bool = false, + docstring const & data, bool = false, tex_accent = TEX_NOACCENT); /// void freeException(KmodException & exclist); @@ -85,6 +176,171 @@ docstring const & Trans::match(char_type c) } +///////////////////////////////////////////////////////////////////// +// +// TransState +// +///////////////////////////////////////////////////////////////////// + +/// Translation state +class TransState { +public: + /// + virtual ~TransState() {} + /// + virtual docstring const normalkey(char_type) = 0; + /// + virtual bool backspace() = 0; + /// + virtual docstring const deadkey(char_type, KmodInfo) = 0; + /// + static char_type const TOKEN_SEP; +}; + + +/// Translation FSM +class TransFSMData { +protected: + /// + virtual ~TransFSMData() {} + /// + char_type deadkey_; + /// + KmodInfo deadkey_info_; + /// + char_type deadkey2_; + /// + KmodInfo deadkey2_info_; + /// + Keyexc comb_info_; + /// + TransState * init_state_; + /// + TransState * deadkey_state_; + /// + TransState * combined_state_; + /// +public: + /// + TransFSMData(); + /// + TransState * currentState; +}; + + +/// Init State +class TransInitState : virtual public TransFSMData, public TransState { +public: + /// + TransInitState(); + /// + virtual docstring const normalkey(char_type); + /// + virtual bool backspace() { return true; } + /// + virtual docstring const deadkey(char_type, KmodInfo); +}; + + +/// Deadkey State +class TransDeadkeyState : virtual public TransFSMData, public TransState { +public: + /// + TransDeadkeyState(); + /// + virtual docstring const normalkey(char_type); + /// + virtual bool backspace() { + currentState = init_state_; + return false; + } + /// + virtual docstring const deadkey(char_type, KmodInfo); +}; + + +/// Combined State +class TransCombinedState : virtual public TransFSMData, public TransState { +public: + /// + TransCombinedState(); + /// + virtual docstring const normalkey(char_type); + /// + virtual bool backspace() { + // cancel the second deadkey + deadkey2_ = 0; + deadkey2_info_.accent = TEX_NOACCENT; + currentState = deadkey_state_; + + return false; + } + /// + virtual docstring const deadkey(char_type, KmodInfo); +}; + + +/// +class TransFSM : virtual public TransFSMData, + public TransInitState, + public TransDeadkeyState, + public TransCombinedState { +public: + /// + TransFSM(); +}; + + + +///////////////////////////////////////////////////////////////////// +// +// TransManager +// +///////////////////////////////////////////////////////////////////// + +class TransManager { +private: + /// + TransFSM trans_fsm_; + /// + Trans * active_; + /// + boost::scoped_ptr t1_; + /// + boost::scoped_ptr t2_; + /// + static Trans default_; + /// + void insert(docstring const &, Text *, Cursor & cur); +public: + /// + TransManager(); + /// + ~TransManager(); + /// + int setPrimary(std::string const &); + /// + int setSecondary(std::string const &); + /// + void enablePrimary(); + /// + void enableSecondary(); + /// + void disableKeymap(); + /// + bool backspace() { return trans_fsm_.currentState->backspace(); } + /// + void translateAndInsert(char_type, Text *, Cursor &); + /// + docstring const deadkey(char_type c, KmodInfo t) + { return trans_fsm_.currentState->deadkey(c, t); } + /// + docstring const normalkey(char_type c) + { return trans_fsm_.currentState->normalkey(c); } + /// + void deadkey(char_type, tex_accent, Text *, Cursor &); +}; + } // namespace lyx #endif // TRANS_H