mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-09 18:31:04 +00:00
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:
parent
40e4ab9bf3
commit
a939474037
13
src/Intl.h
13
src/Intl.h
@ -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 */
|
||||
|
@ -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
|
@ -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 \
|
||||
|
393
src/Trans.cpp
393
src/Trans.cpp
@ -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
|
||||
|
274
src/Trans.h
274
src/Trans.h
@ -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
|
||||
|
@ -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
|
198
src/TransState.h
198
src/TransState.h
@ -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
|
@ -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
|
119
src/tex-accent.h
119
src/tex-accent.h
@ -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
|
Loading…
Reference in New Issue
Block a user