consolidate tex-accent.* Trans.* KmodInfo.h into Trans.{h,cpp}. All stuff was used at most once and basically implementation details

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@18131 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2007-04-30 21:44:00 +00:00
parent 40e4ab9bf3
commit a939474037
9 changed files with 639 additions and 826 deletions

View File

@ -15,12 +15,11 @@
#ifndef INTL_H
#define INTL_H
#include "TransState.h"
#include "Trans.h"
namespace lyx {
/**
* This class is used for managing keymaps
* for composing characters in LyX.
@ -51,7 +50,7 @@ public:
void initKeyMapper(bool on);
// Get the Translation Manager
TransManager & getTransManager();
inline TransManager & getTransManager() { return trans; }
/// using primary or secondary keymap ?
Keymap keymap;
@ -67,14 +66,6 @@ private:
TransManager trans;
};
inline
TransManager & Intl::getTransManager()
{
return trans;
}
} // namespace lyx
#endif /* INTL_H */

View File

@ -1,55 +0,0 @@
// -*- C++ -*-
/**
* \file KmodInfo.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Lars Gullik Bjønnes
* \author Matthias Ettrich
*
* Full author contact details are available in file CREDITS.
*/
#ifndef KMODINFO_H
#define KMODINFO_H
#include "tex-accent.h"
#include <list>
namespace lyx {
///
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<Keyexc> KmodException;
///
class KmodInfo {
public:
///
docstring data;
///
tex_accent accent;
///
KmodException exception_list;
///
KmodInfo();
};
} // namespace lyx
#endif

View File

@ -232,8 +232,6 @@ lyx_SOURCES = \
Spacing.cpp \
Spacing.h \
SpellBase.h \
tex-accent.cpp \
tex-accent.h \
TexRow.cpp \
TexRow.h \
Text.h \
@ -256,8 +254,6 @@ lyx_SOURCES = \
ToolbarBackend.h \
Trans.cpp \
Trans.h \
TransState.cpp \
TransState.h \
Undo.cpp \
Undo.h \
update_flags.h \

View File

@ -12,44 +12,138 @@
#include <config.h>
#include "Trans.h"
#include "Buffer.h"
#include "BufferView.h"
#include "Cursor.h"
#include "CutAndPaste.h"
#include "debug.h"
#include "Lexer.h"
#include "LyXRC.h"
#include "Text.h"
#include "support/filetools.h"
#include "support/lstrings.h"
#include "Lexer.h"
#include "debug.h"
#include "TransState.h"
#include "support/convert.h"
#include "support/docstream.h"
namespace lyx {
using support::split;
using support::contains;
using support::libFileSearch;
using std::endl;
using std::string;
using std::pair;
using std::map;
// KmodInfo
KmodInfo::KmodInfo()
/////////////////////////////////////////////////////////////////////
//
// TeXAccents
//
/////////////////////////////////////////////////////////////////////
/* the names used by TeX and XWindows for deadkeys/accents are not the same
so here follows a table to clearify the differences. Please correct this
if I got it wrong
|------------------|------------------|------------------|--------------|
| TeX | XWindows | \bind/LFUN | used by intl |
|------------------|------------------|------------------|--------------|
| grave | grave |LFUN_ACCENT_GRAVE | grave
| acute | acute |LFUN_ACCENT_ACUTE | acute
| circumflex | circumflex |LFUN_ACCENT_CIRCUMFLEX | circumflex
| umlaut/dieresis | diaeresis |LFUN_ACCENT_UMLAUT | umlaut
| tilde | tilde |LFUN_ACCENT_TILDE | tilde
| macron | maron |LFUN_ACCENT_MACRON | macron
| dot | abovedot |LFUN_ACCENT_DOT | dot
| cedilla | cedilla |LFUN_ACCENT_CEDILLA | cedilla
| underdot | |LFUN_ACCENT_UNDERDOT | underdot
| underbar | |LFUN_ACCENT_UNDERBAR | underbar
| hácek | caron |LFUN_ACCENT_CARON | caron
| breve | breve |LFUN_ACCENT_BREVE | breve
| tie | |LFUN_ACCENT_TIE | tie
| Hungarian umlaut | doubleacute |LFUN_ACCENT_HUNGARIAN_UMLAUT | hungarian umlaut
| circle | abovering |LFUN_ACCENT_CIRCLE | circle
| | ogonek | |
| | iota | |
| | voiced_sound | |
| | semivoiced_sound | |
| | |LFUN_ACCENT_SPECIAL_CARON| special caron
*/
static tex_accent_struct lyx_accent_table[] = {
{TEX_NOACCENT, 0, "", LFUN_NOACTION},
{TEX_ACUTE, 0x0301, "acute", LFUN_ACCENT_ACUTE},
{TEX_GRAVE, 0x0300, "grave", LFUN_ACCENT_GRAVE},
{TEX_MACRON, 0x0304, "macron", LFUN_ACCENT_MACRON},
{TEX_TILDE, 0x0303, "tilde", LFUN_ACCENT_TILDE},
{TEX_UNDERBAR, 0x0320, "underbar", LFUN_ACCENT_UNDERBAR},
{TEX_CEDILLA, 0x0327, "cedilla", LFUN_ACCENT_CEDILLA},
{TEX_UNDERDOT, 0x0323, "underdot", LFUN_ACCENT_UNDERDOT},
{TEX_CIRCUMFLEX, 0x0302, "circumflex", LFUN_ACCENT_CIRCUMFLEX},
{TEX_CIRCLE, 0x030a, "circle", LFUN_ACCENT_CIRCLE},
{TEX_TIE, 0x0361, "tie", LFUN_ACCENT_TIE},
{TEX_BREVE, 0x0306, "breve", LFUN_ACCENT_BREVE},
{TEX_CARON, 0x030c, "caron", LFUN_ACCENT_CARON},
// {TEX_SPECIAL_CARON, 0x030c, "ooo", LFUN_ACCENT_SPECIAL_CARON},
// Don't fix this typo for compatibility reasons!
{TEX_HUNGUML, 0x030b, "hugarian_umlaut", LFUN_ACCENT_HUNGARIAN_UMLAUT},
{TEX_UMLAUT, 0x0308, "umlaut", LFUN_ACCENT_UMLAUT},
{TEX_DOT, 0x0307, "dot", LFUN_ACCENT_DOT},
{TEX_OGONEK, 0x0328, "ogonek", LFUN_ACCENT_OGONEK}
};
tex_accent_struct get_accent(kb_action action)
{
int i = 0;
while (i <= TEX_MAX_ACCENT) {
if (lyx_accent_table[i].action == action)
return lyx_accent_table[i];
++i;
}
struct tex_accent_struct temp = { static_cast<tex_accent>(0), 0,
0, static_cast<kb_action>(0)};
return temp;
}
// Trans class
Trans::Trans()
static docstring const doAccent(docstring const & s, tex_accent accent)
{
if (s.empty())
return docstring(1, lyx_accent_table[accent].ucs4);
odocstringstream os;
os.put(s[0]);
os.put(lyx_accent_table[accent].ucs4);
if (s.length() > 1) {
if (accent != TEX_TIE || s.length() > 2)
lyxerr << "Warning: Too many characters given for accent "
<< lyx_accent_table[accent].name << '.' << std::endl;
os << s.substr(1);
}
return normalize_kc(os.str());
}
Trans::~Trans()
static docstring const doAccent(char_type c, tex_accent accent)
{
freeKeymap();
return doAccent(docstring(1, c), accent);
}
/////////////////////////////////////////////////////////////////////
//
// Trans
//
/////////////////////////////////////////////////////////////////////
void Trans::insertException(KmodException & exclist, char_type c,
docstring const & data, bool flag, tex_accent accent)
docstring const & data, bool flag, tex_accent accent)
{
Keyexc p;
p.c = c;
@ -81,12 +175,6 @@ bool Trans::isDefined() const
}
string const & Trans::getName() const
{
return name_;
}
enum kmaptags_ {
KCOMB = 1,
KMOD,
@ -191,7 +279,7 @@ int Trans::load(Lexer & lex)
} else
return -1;
tex_accent accent_2= getkeymod(str);
tex_accent accent_2 = getkeymod(str);
if (accent_2 == TEX_NOACCENT) return -1;
map<tex_accent, KmodInfo>::iterator it1 =
@ -333,9 +421,9 @@ int Trans::load(string const & language)
int const res = load(lex);
if (res == 0) {
if (res == 0)
name_ = language;
} else
else
name_.erase();
return res;
@ -361,4 +449,267 @@ tex_accent getkeymod(string const & p)
}
/////////////////////////////////////////////////////////////////////
//
// TransState
//
/////////////////////////////////////////////////////////////////////
// TransFSMData
TransFSMData::TransFSMData()
{
deadkey_ = deadkey2_ = 0;
deadkey_info_.accent = deadkey2_info_.accent = TEX_NOACCENT;
}
// TransState
char_type const TransState::TOKEN_SEP = 4;
// TransInitState
TransInitState::TransInitState()
{
init_state_ = this;
}
docstring const TransInitState::normalkey(char_type c)
{
docstring res;
res = c;
return res;
}
docstring const TransInitState::deadkey(char_type c, KmodInfo d)
{
deadkey_ = c;
deadkey_info_ = d;
currentState = deadkey_state_;
return docstring();
}
// TransDeadkeyState
TransDeadkeyState::TransDeadkeyState()
{
deadkey_state_ = this;
}
docstring const TransDeadkeyState::normalkey(char_type c)
{
docstring res;
KmodException::iterator it = deadkey_info_.exception_list.begin();
KmodException::iterator end = deadkey_info_.exception_list.end();
for (; it != end; ++it) {
if (it->c == c) {
res = it->data;
break;
}
}
if (it == end) {
res = doAccent(c, deadkey_info_.accent);
}
currentState = init_state_;
return res;
}
docstring const TransDeadkeyState::deadkey(char_type c, KmodInfo d)
{
docstring res;
// Check if the same deadkey was typed twice
if (deadkey_ == c) {
res = deadkey_;
deadkey_ = 0;
deadkey_info_.accent = TEX_NOACCENT;
currentState = init_state_;
return res;
}
// Check if it is a combination or an exception
KmodException::const_iterator cit = deadkey_info_.exception_list.begin();
KmodException::const_iterator end = deadkey_info_.exception_list.end();
for (; cit != end; ++cit) {
if (cit->combined == true && cit->accent == d.accent) {
deadkey2_ = c;
deadkey2_info_ = d;
comb_info_ = (*cit);
currentState = combined_state_;
return docstring();
}
if (cit->c == c) {
res = cit->data;
deadkey_ = 0;
deadkey_info_.accent = TEX_NOACCENT;
currentState = init_state_;
return res;
}
}
// Not a combination or an exception.
// Output deadkey1 and keep deadkey2
if (deadkey_!= 0)
res = deadkey_;
deadkey_ = c;
deadkey_info_ = d;
currentState = deadkey_state_;
return res;
}
TransCombinedState::TransCombinedState()
{
combined_state_ = this;
}
docstring const TransCombinedState::normalkey(char_type c)
{
docstring const temp = doAccent(c, deadkey2_info_.accent);
docstring const res = doAccent(temp, deadkey_info_.accent);
currentState = init_state_;
return res;
}
docstring const TransCombinedState::deadkey(char_type c, KmodInfo d)
{
// Third key in a row. Output the first one and
// reenter with shifted deadkeys
docstring res;
if (deadkey_ != 0)
res = deadkey_;
res += TOKEN_SEP;
deadkey_ = deadkey2_;
deadkey_info_ = deadkey2_info_;
res += deadkey_state_->deadkey(c, d);
return res;
}
// TransFSM
TransFSM::TransFSM():
TransFSMData(),
TransInitState(),
TransDeadkeyState(),
TransCombinedState()
{
currentState = init_state_;
}
// TransManager
// Initialize static member.
Trans TransManager::default_;
TransManager::TransManager()
: active_(0), t1_(new Trans), t2_(new Trans)
{}
// For the sake of boost::scoped_ptr.
TransManager::~TransManager()
{}
int TransManager::setPrimary(string const & language)
{
if (t1_->getName() == language)
return 0;
return t1_->load(language);
}
int TransManager::setSecondary(string const & language)
{
if (t2_->getName() == language)
return 0;
return t2_->load(language);
}
void TransManager::enablePrimary()
{
if (t1_->isDefined())
active_ = t1_.get();
LYXERR(Debug::KBMAP) << "Enabling primary keymap" << endl;
}
void TransManager::enableSecondary()
{
if (t2_->isDefined())
active_ = t2_.get();
LYXERR(Debug::KBMAP) << "Enabling secondary keymap" << endl;
}
void TransManager::disableKeymap()
{
active_ = &default_;
LYXERR(Debug::KBMAP) << "Disabling keymap" << endl;
}
void TransManager::translateAndInsert(char_type c, Text * text, Cursor & cur)
{
docstring res = active_->process(c, *this);
// Process with tokens
docstring temp;
while (res.length() > 0) {
res = split(res, temp, TransState::TOKEN_SEP);
insert(temp, text, cur);
}
}
void TransManager::insert(docstring const & str, Text * text, Cursor & cur)
{
for (string::size_type i = 0, n = str.size(); i < n; ++i)
text->insertChar(cur, str[i]);
}
void TransManager::deadkey(char_type c, tex_accent accent, Text * t, Cursor & cur)
{
if (c == 0 && active_ != &default_) {
// A deadkey was pressed that cannot be printed
// or a accent command was typed in the minibuffer
KmodInfo i;
if (active_->isAccentDefined(accent, i) == true) {
docstring const res = trans_fsm_
.currentState->deadkey(c, i);
insert(res, t, cur);
return;
}
}
if (active_ == &default_ || c == 0) {
KmodInfo i;
i.accent = accent;
i.data.erase();
docstring res = trans_fsm_.currentState->deadkey(c, i);
insert(res, t, cur);
} else {
// Go through the translation
translateAndInsert(c, t, cur);
}
}
} // namespace lyx

View File

@ -14,34 +14,125 @@
#ifndef TRANS_H
#define TRANS_H
#include "KmodInfo.h"
#include "lfuns.h"
#include "support/docstring.h"
#include <boost/scoped_ptr.hpp>
#include <list>
#include <map>
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<Keyexc> 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 &);
///
@ -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<Trans> t1_;
///
boost::scoped_ptr<Trans> 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

View File

@ -1,293 +0,0 @@
/**
* \file TransState.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Lars Gullik Bjønnes
* \author Matthias Ettrich
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "TransState.h"
#include "Buffer.h"
#include "BufferView.h"
#include "CutAndPaste.h"
#include "Cursor.h"
#include "debug.h"
#include "LyXRC.h"
#include "Text.h"
#include "Trans.h"
#include "support/lstrings.h"
namespace lyx {
using support::split;
using std::endl;
using std::string;
using std::pair;
// TransFSMData
TransFSMData::TransFSMData()
{
deadkey_ = deadkey2_ = 0;
deadkey_info_.accent = deadkey2_info_.accent = TEX_NOACCENT;
}
// TransState
char_type const TransState::TOKEN_SEP = 4;
// TransInitState
TransInitState::TransInitState()
{
init_state_ = this;
}
docstring const TransInitState::normalkey(char_type c)
{
docstring res;
res = c;
return res;
}
docstring const TransInitState::deadkey(char_type c, KmodInfo d)
{
deadkey_ = c;
deadkey_info_ = d;
currentState = deadkey_state_;
return docstring();
}
// TransDeadkeyState
TransDeadkeyState::TransDeadkeyState()
{
deadkey_state_ = this;
}
docstring const TransDeadkeyState::normalkey(char_type c)
{
docstring res;
KmodException::iterator it = deadkey_info_.exception_list.begin();
KmodException::iterator end = deadkey_info_.exception_list.end();
for (; it != end; ++it) {
if (it->c == c) {
res = it->data;
break;
}
}
if (it == end) {
res = DoAccent(c, deadkey_info_.accent);
}
currentState = init_state_;
return res;
}
docstring const TransDeadkeyState::deadkey(char_type c, KmodInfo d)
{
docstring res;
// Check if the same deadkey was typed twice
if (deadkey_ == c) {
res = deadkey_;
deadkey_ = 0;
deadkey_info_.accent = TEX_NOACCENT;
currentState = init_state_;
return res;
}
// Check if it is a combination or an exception
KmodException::const_iterator cit = deadkey_info_.exception_list.begin();
KmodException::const_iterator end = deadkey_info_.exception_list.end();
for (; cit != end; ++cit) {
if (cit->combined == true && cit->accent == d.accent) {
deadkey2_ = c;
deadkey2_info_ = d;
comb_info_ = (*cit);
currentState = combined_state_;
return docstring();
}
if (cit->c == c) {
res = cit->data;
deadkey_ = 0;
deadkey_info_.accent = TEX_NOACCENT;
currentState = init_state_;
return res;
}
}
// Not a combination or an exception.
// Output deadkey1 and keep deadkey2
if (deadkey_!= 0)
res = deadkey_;
deadkey_ = c;
deadkey_info_ = d;
currentState = deadkey_state_;
return res;
}
TransCombinedState::TransCombinedState()
{
combined_state_ = this;
}
docstring const TransCombinedState::normalkey(char_type c)
{
docstring const temp = DoAccent(c, deadkey2_info_.accent);
docstring const res = DoAccent(temp, deadkey_info_.accent);
currentState = init_state_;
return res;
}
docstring const TransCombinedState::deadkey(char_type c, KmodInfo d)
{
// Third key in a row. Output the first one and
// reenter with shifted deadkeys
docstring res;
if (deadkey_ != 0)
res = deadkey_;
res += TOKEN_SEP;
deadkey_ = deadkey2_;
deadkey_info_ = deadkey2_info_;
res += deadkey_state_->deadkey(c, d);
return res;
}
// TransFSM
TransFSM::TransFSM():
TransFSMData(),
TransInitState(),
TransDeadkeyState(),
TransCombinedState()
{
currentState = init_state_;
}
// TransManager
// Initialize static member.
Trans TransManager::default_;
TransManager::TransManager()
: active_(0), t1_(new Trans), t2_(new Trans)
{}
// For the sake of boost::scoped_ptr.
TransManager::~TransManager()
{}
int TransManager::setPrimary(string const & language)
{
if (t1_->getName() == language)
return 0;
return t1_->load(language);
}
int TransManager::setSecondary(string const & language)
{
if (t2_->getName() == language)
return 0;
return t2_->load(language);
}
void TransManager::enablePrimary()
{
if (t1_->isDefined())
active_ = t1_.get();
LYXERR(Debug::KBMAP) << "Enabling primary keymap" << endl;
}
void TransManager::enableSecondary()
{
if (t2_->isDefined())
active_ = t2_.get();
LYXERR(Debug::KBMAP) << "Enabling secondary keymap" << endl;
}
void TransManager::disableKeymap()
{
active_ = &default_;
LYXERR(Debug::KBMAP) << "Disabling keymap" << endl;
}
void TransManager::translateAndInsert(char_type c, Text * text, Cursor & cur)
{
docstring res = active_->process(c, *this);
// Process with tokens
docstring temp;
while (res.length() > 0) {
res = split(res, temp, TransState::TOKEN_SEP);
insert(temp, text, cur);
}
}
void TransManager::insert(docstring const & str, Text * text, Cursor & cur)
{
for (string::size_type i = 0, n = str.size(); i < n; ++i)
text->insertChar(cur, str[i]);
}
void TransManager::deadkey(char_type c, tex_accent accent, Text * t, Cursor & cur)
{
if (c == 0 && active_ != &default_) {
// A deadkey was pressed that cannot be printed
// or a accent command was typed in the minibuffer
KmodInfo i;
if (active_->isAccentDefined(accent, i) == true) {
docstring const res = trans_fsm_
.currentState->deadkey(c, i);
insert(res, t, cur);
return;
}
}
if (active_ == &default_ || c == 0) {
KmodInfo i;
i.accent = accent;
i.data.erase();
docstring res = trans_fsm_.currentState->deadkey(c, i);
insert(res, t, cur);
} else {
// Go through the translation
translateAndInsert(c, t, cur);
}
}
} // namespace lyx

View File

@ -1,198 +0,0 @@
// -*- C++ -*-
/**
* \file TransState.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Lars Gullik Bjønnes
* \author Matthias Ettrich
* \author John Levon
*
* Full author contact details are available in file CREDITS.
*/
#ifndef TRANS_MANAGER_H
#define TRANS_MANAGER_H
#include "KmodInfo.h"
#include <boost/scoped_ptr.hpp>
namespace lyx {
class Cursor;
class Text;
class Trans;
/// 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();
};
///
class TransManager {
private:
///
TransFSM trans_fsm_;
///
Trans * active_;
///
boost::scoped_ptr<Trans> t1_;
///
boost::scoped_ptr<Trans> 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, KmodInfo);
///
docstring const normalkey(char_type);
///
void deadkey(char_type, tex_accent, Text *, Cursor &);
};
inline
docstring const TransManager::normalkey(char_type c)
{
return trans_fsm_.currentState->normalkey(c);
}
inline
docstring const TransManager::deadkey(char_type c, KmodInfo t)
{
return trans_fsm_.currentState->deadkey(c, t);
}
} // namespace lyx
#endif // TRANS_MANAGER_H

View File

@ -1,116 +0,0 @@
/**
* \file tex-accent.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Lars Gullik Bjønnes
* \author Matthias Ettrich
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "tex-accent.h"
#include "debug.h"
#include "support/convert.h"
#include "support/docstream.h"
namespace lyx {
// FIXME This file has nothing to do with TeX anymore
/* the names used by TeX and XWindows for deadkeys/accents are not the same
so here follows a table to clearify the differences. Please correct this
if I got it wrong
|------------------|------------------|------------------|--------------|
| TeX | XWindows | \bind/LFUN | used by intl |
|------------------|------------------|------------------|--------------|
| grave | grave |LFUN_ACCENT_GRAVE | grave
| acute | acute |LFUN_ACCENT_ACUTE | acute
| circumflex | circumflex |LFUN_ACCENT_CIRCUMFLEX | circumflex
| umlaut/dieresis | diaeresis |LFUN_ACCENT_UMLAUT | umlaut
| tilde | tilde |LFUN_ACCENT_TILDE | tilde
| macron | maron |LFUN_ACCENT_MACRON | macron
| dot | abovedot |LFUN_ACCENT_DOT | dot
| cedilla | cedilla |LFUN_ACCENT_CEDILLA | cedilla
| underdot | |LFUN_ACCENT_UNDERDOT | underdot
| underbar | |LFUN_ACCENT_UNDERBAR | underbar
| hácek | caron |LFUN_ACCENT_CARON | caron
| breve | breve |LFUN_ACCENT_BREVE | breve
| tie | |LFUN_ACCENT_TIE | tie
| Hungarian umlaut | doubleacute |LFUN_ACCENT_HUNGARIAN_UMLAUT | hungarian umlaut
| circle | abovering |LFUN_ACCENT_CIRCLE | circle
| | ogonek | |
| | iota | |
| | voiced_sound | |
| | semivoiced_sound | |
| | |LFUN_ACCENT_SPECIAL_CARON| special caron
*/
// I am not sure how some of the XWindows names coresponds to the TeX ones.
tex_accent_struct lyx_accent_table[] = {
{TEX_NOACCENT, 0, "", LFUN_NOACTION},
{TEX_ACUTE, 0x0301, "acute", LFUN_ACCENT_ACUTE},
{TEX_GRAVE, 0x0300, "grave", LFUN_ACCENT_GRAVE},
{TEX_MACRON, 0x0304, "macron", LFUN_ACCENT_MACRON},
{TEX_TILDE, 0x0303, "tilde", LFUN_ACCENT_TILDE},
{TEX_UNDERBAR, 0x0320, "underbar", LFUN_ACCENT_UNDERBAR},
{TEX_CEDILLA, 0x0327, "cedilla", LFUN_ACCENT_CEDILLA},
{TEX_UNDERDOT, 0x0323, "underdot", LFUN_ACCENT_UNDERDOT},
{TEX_CIRCUMFLEX, 0x0302, "circumflex", LFUN_ACCENT_CIRCUMFLEX},
{TEX_CIRCLE, 0x030a, "circle", LFUN_ACCENT_CIRCLE},
{TEX_TIE, 0x0361, "tie", LFUN_ACCENT_TIE},
{TEX_BREVE, 0x0306, "breve", LFUN_ACCENT_BREVE},
{TEX_CARON, 0x030c, "caron", LFUN_ACCENT_CARON},
// {TEX_SPECIAL_CARON, 0x030c, "ooo", LFUN_ACCENT_SPECIAL_CARON},
// Don't fix this typo for compatibility reasons!
{TEX_HUNGUML, 0x030b, "hugarian_umlaut", LFUN_ACCENT_HUNGARIAN_UMLAUT},
{TEX_UMLAUT, 0x0308, "umlaut", LFUN_ACCENT_UMLAUT},
{TEX_DOT, 0x0307, "dot", LFUN_ACCENT_DOT},
{TEX_OGONEK, 0x0328, "ogonek", LFUN_ACCENT_OGONEK}
};
tex_accent_struct get_accent(kb_action action)
{
int i = 0;
while (i <= TEX_MAX_ACCENT) {
if (lyx_accent_table[i].action == action)
return lyx_accent_table[i];
++i;
}
struct tex_accent_struct temp = { static_cast<tex_accent>(0), 0,
0, static_cast<kb_action>(0)};
return temp;
}
docstring const DoAccent(docstring const & s, tex_accent accent)
{
if (s.empty())
return docstring(1, lyx_accent_table[accent].ucs4);
odocstringstream os;
os.put(s[0]);
os.put(lyx_accent_table[accent].ucs4);
if (s.length() > 1) {
if (accent != TEX_TIE || s.length() > 2)
lyxerr << "Warning: Too many characters given for accent "
<< lyx_accent_table[accent].name << '.' << std::endl;
os << s.substr(1);
}
return normalize_kc(os.str());
}
docstring const DoAccent(char_type c, tex_accent accent)
{
return DoAccent(docstring(1, c), accent);
}
} // namespace lyx

View File

@ -1,119 +0,0 @@
// -*- C++ -*-
/**
* \file tex-accent.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Lars Gullik Bjønnes
* \author Matthias Ettrich
*
* Full author contact details are available in file CREDITS.
*/
#ifndef TEX_ACCENT
#define TEX_ACCENT
#include "lfuns.h"
#include "support/docstring.h"
namespace lyx {
// FIXME This file has nothing to do with TeX anymore
/* the names used by TeX and XWindows for deadkeys/accents are not the same
so here follows a table to clearify the differences. Please correct this
if I got it wrong
|------------------|------------------|------------------|--------------|
| TeX | XWindows | \bind/LFUN | used by intl |
|------------------|------------------|------------------|--------------|
| grave | grave |LFUN_ACCENT_GRAVE | grave
| acute | acute |LFUN_ACCENT_ACUTE | acute
| circumflex | circumflex |LFUN_ACCENT_CIRCUMFLEX | circumflex
| umlaut/dieresis | diaeresis |LFUN_ACCENT_UMLAUT | umlaut
| tilde | tilde |LFUN_ACCENT_TILDE | tilde
| macron | maron |LFUN_ACCENT_MACRON | macron
| dot | abovedot |LFUN_ACCENT_DOT | dot
| cedilla | cedilla |LFUN_ACCENT_CEDILLA | cedilla
| underdot | |LFUN_ACCENT_UNDERDOT | underdot
| underbar | |LFUN_ACCENT_UNDERBAR | underbar
| hácek | caron |LFUN_ACCENT_CARON | caron
| breve | breve |LFUN_ACCENT_BREVE | breve
| tie | |LFUN_ACCENT_TIE | tie
| Hungarian umlaut | doubleacute |LFUN_ACCENT_HUNGARIAN_UMLAUT | hungarian umlaut
| circle | abovering |LFUN_ACCENT_CIRCLE | circle
| | ogonek | |
| | iota | |
| | voiced_sound | |
| | semivoiced_sound | |
| | |LFUN_ACCENT_SPECIAL_CARON| special caron
*/
// I am not sure how some of the XWindows names coresponds to the TeX ones.
///
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 lyx_accent_table[];
///
extern docstring const DoAccent(docstring const &, tex_accent);
///
extern docstring const DoAccent(char_type, tex_accent);
///
extern tex_accent_struct get_accent(kb_action action);
} // namespace lyx
#endif