]> git.lyx.org Git - lyx.git/blobdiff - src/trans_mgr.C
Add string << operators for the other streams as well, and removes
[lyx.git] / src / trans_mgr.C
index 10bdc4655c14b45322e6119489188af2c6bd9c84..c6f5bd7ab6158f531710ab96d043d447f50736a4 100644 (file)
 #include "lyxrc.h"
 #include "support/lstrings.h"
 
-extern LyXRC * lyxrc;
-extern string DoAccent(string const &, tex_accent);
-extern void InsertCorrectQuote();
-extern string DoAccent(char, tex_accent);
+using std::endl;
+using std::pair;
+
+extern string const DoAccent(string const &, tex_accent);
+extern string const DoAccent(char, tex_accent);
 extern BufferView * current_view;
 
 
 // TransFSMData
 TransFSMData::TransFSMData()
 {
-    deadkey_ = deadkey2_ = 0;
-    deadkey_info_.accent = deadkey2_info_.accent = TEX_NOACCENT;
-    comb_info_ = 0;
+       deadkey_ = deadkey2_ = 0;
+       deadkey_info_.accent = deadkey2_info_.accent = TEX_NOACCENT;
+#if 0
+       comb_info_ = 0;
+#endif
 }
 
 
@@ -39,315 +42,395 @@ char const TransState::TOKEN_SEP = 4;
 // TransInitState
 TransInitState::TransInitState()
 {
-    init_state_ = this;
+       init_state_ = this;
 }
 
 
-string TransInitState::normalkey(char c, char * t)
+#if 0
+string const TransInitState::normalkey(char c, string const & t)
 {
-    string res;
-    if (t != 0)
-       res = t;
-    else
-       res = c;
+       string res;
+       if (!t.empty()) res = t;
+       else res = c;
        
-    return res;
+       return res;
+}
+#else
+string const TransInitState::normalkey(char c)
+{
+       string res;
+       res = c;
+       return res;
 }
+#endif
 
 
-string TransInitState::deadkey(char c, KmodInfo d)
+string const TransInitState::deadkey(char c, KmodInfo d)
 {
-    deadkey_ = c;
-    deadkey_info_ = d;
-    currentState = deadkey_state_;
-    return string();
+       deadkey_ = c;
+       deadkey_info_ = d;
+       currentState = deadkey_state_;
+       return string();
 }
 
 
 // TransDeadkeyState
 TransDeadkeyState::TransDeadkeyState()
 {
-    deadkey_state_ = this;
+       deadkey_state_ = this;
 }
 
 
-string TransDeadkeyState::normalkey(char c, char * trans)
+#if 0
+string const TransDeadkeyState::normalkey(char c, string const & trans)
 {
-    string res;
-    
-    // Check if it is an exception
-    KmodException l = deadkey_info_.exception_list;
-    while(l != 0) {
-       if (l->c == c) {
-           res = l->data;
-           break;
+       string res;
+       
+       // Check if it is an exception
+       KmodException l = deadkey_info_.exception_list;
+       while (l != 0) {
+               if (l->c == c) {
+                       res = l->data;
+                       break;
+               }
+               l = l->next;
        }
-       l = l->next;
-    }
-    if (l == 0) {
-       // Not an exception. Check if it allowed
-       if (current_view->buffer()->params.allowAccents == true ||
-           countChar(deadkey_info_.allowed, c) > 0) {
-           res = DoAccent(c, deadkey_info_.accent);
-       } else {
-           // Not allowed
-           if (deadkey_!= 0)
-               res = deadkey_;
-           res+= TOKEN_SEP;
-           res+= trans;
+       if (l == 0) {
+               // Not an exception. Check if it allowed
+               if (countChar(deadkey_info_.allowed, c) > 0) {
+                       res = DoAccent(c, deadkey_info_.accent);
+               } else {
+                       // Not allowed
+                       if (deadkey_!= 0)
+                               res = deadkey_;
+                       res+= TOKEN_SEP;
+                       res+= trans;
+               }
        }
-    }
-    currentState = init_state_;
-    return res;
+       currentState = init_state_;
+       return res;
 }
-
-
-string TransDeadkeyState::deadkey(char c, KmodInfo d)
+#else
+string const TransDeadkeyState::normalkey(char c)
 {
-    string res;
-    
-    // Check if the same deadkey was typed twice
-    if (deadkey_ == c) {
-       res = deadkey_;
-       deadkey_ = 0;
-       deadkey_info_.accent = TEX_NOACCENT;
+#if 0
+       string res;
+       
+       // Check if it is an exception
+       KmodException l = deadkey_info_.exception_list;
+       while (l != 0) {
+               if (l->c == c) {
+                       res = l->data;
+                       break;
+               }
+               l = l->next;
+       }
+       if (l == 0) {
+                       res = DoAccent(c, deadkey_info_.accent);
+       }
        currentState = init_state_;
        return res;
-    }
-    
-    // Check if it is a combination or an exception
-    KmodException l;
-    l = deadkey_info_.exception_list;
-    
-    while(l) {
-       if (l->combined == true && l->accent == d.accent) {
-           deadkey2_ = c;
-           deadkey2_info_ = d;
-           comb_info_ = l;
-           currentState = combined_state_;
-           return string();
+#else
+       string 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;
+#endif
+}
+#endif
+
+
+string const TransDeadkeyState::deadkey(char c, KmodInfo d)
+{
+       string 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;
        }
-       if (l->c == c) {
-           res = l->data;
-           deadkey_ = 0;
-           deadkey_info_.accent = TEX_NOACCENT;
-           currentState = init_state_;
-           return res;
+       
+       // Check if it is a combination or an exception
+#if 0
+       KmodException l;
+       l = deadkey_info_.exception_list;
+       
+       while (l) {
+               if (l->combined == true && l->accent == d.accent) {
+                       deadkey2_ = c;
+                       deadkey2_info_ = d;
+                       comb_info_ = l;
+                       currentState = combined_state_;
+                       return string();
+               }
+               if (l->c == c) {
+                       res = l->data;
+                       deadkey_ = 0;
+                       deadkey_info_.accent = TEX_NOACCENT;
+                       currentState = init_state_;
+                       return res;
+               }
+               l = l->next;
+       }
+#else
+       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 string();
+               }
+               if (cit->c == c) {
+                       res = cit->data;
+                       deadkey_ = 0;
+                       deadkey_info_.accent = TEX_NOACCENT;
+                       currentState = init_state_;
+                       return res;
+               }
        }
+#endif
+       // Not a combination or an exception. 
+       // Output deadkey1 and keep deadkey2
        
-       l = l->next;
-    }
-    
-    // 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;
+       if (deadkey_!= 0)
+               res = deadkey_;
+       deadkey_ = c;
+       deadkey_info_ = d;
+       currentState = deadkey_state_;
+       return res;
 }
 
 
 TransCombinedState::TransCombinedState()
 {
-    combined_state_ = this;
+       combined_state_ = this;
 }
 
 
-string TransCombinedState::normalkey(char c, char *trans)
+#if 0
+string const TransCombinedState::normalkey(char c, string const & trans)
 {
-    string res;
-    
-    // Check if the key is allowed on the combination
-    if (countChar(comb_info_->data, c) > 0) {
-       string temp;
-       temp = DoAccent(c, deadkey2_info_.accent);
+       string res;
+
+       // Check if the key is allowed on the combination
+       if (countChar(comb_info_->data, c) > 0) {
+               string const temp = DoAccent(c, deadkey2_info_.accent);
+               res = DoAccent(temp, deadkey_info_.accent);
+               currentState = init_state_;
+       } else {
+               // Not allowed. Output deadkey1 and check deadkey2 + c
+               if (deadkey_ != 0)
+                       res += deadkey_;
+               res += TOKEN_SEP;
+               deadkey_ = deadkey2_;
+               deadkey_info_ = deadkey2_info_;
+               // Call deadkey state and leave it to setup the FSM
+               res += deadkey_state_->normalkey(c, trans);
+       }
+       return res;
+}
+#else
+string const TransCombinedState::normalkey(char c)
+{
+       string res;
+
+       string const temp = DoAccent(c, deadkey2_info_.accent);
        res = DoAccent(temp, deadkey_info_.accent);
        currentState = init_state_;
-    } else {
-       // Not allowed. Output deadkey1 and check deadkey2 + c
-       if (deadkey_!= 0)
-           res+= deadkey_;
-       res+= TOKEN_SEP;
-       deadkey_ = deadkey2_;
-       deadkey_info_ = deadkey2_info_;
-       // Call deadkey state and leave it to setup the FSM
-       res+= deadkey_state_->normalkey(c, trans);
-    }
-    return res;
+       return res;
 }
+#endif
 
 
-string TransCombinedState::deadkey(char c, KmodInfo d)
+string const TransCombinedState::deadkey(char c, KmodInfo d)
 {
-    // Third key in a row. Output the first one and
-    // reenter with shifted deadkeys
-    string res;
-    if (deadkey_ != 0)
-       res = deadkey_;
-    res += TOKEN_SEP;
-    deadkey_ = deadkey2_;
-    deadkey_info_ = deadkey2_info_;
-    res += deadkey_state_->deadkey(c, d);
-    return res;
+       // Third key in a row. Output the first one and
+       // reenter with shifted deadkeys
+       string 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()
+       TransFSMData(),
+       TransInitState(),
+       TransDeadkeyState(),
+       TransCombinedState()
 {
-    currentState = init_state_;
+       currentState = init_state_;
 }
 
 
 // TransManager
-    
+
+// Initialize static member.
+Trans TransManager::default_;
+
+
 TransManager::TransManager()
        : active_(0), t1_(new Trans), t2_(new Trans)
 {}
 
 
-Trans * TransManager::default_ = new Trans;
-
-
 TransManager::~TransManager() 
 { 
-    delete t1_;
-    delete t2_;
+       delete t1_;
+       delete t2_;
 }
 
 
 int TransManager::SetPrimary(string const & language)
 {
-    if (t1_->GetName() == language) 
-       return 0;
+       if (t1_->GetName() == language) 
+               return 0;
        
-    return t1_->Load(language);
+       return t1_->Load(language);
 }
 
 
 int TransManager::SetSecondary(string const & language)
 {
-    if (t2_->GetName() == language)
-       return 0;
+       if (t2_->GetName() == language)
+               return 0;
        
-    return t2_->Load(language);
+       return t2_->Load(language);
 }
 
 
-bool TransManager::setCharset(char const * set)
+bool TransManager::setCharset(string const & str)
 {
-    return chset_.loadFile(set);
+       return chset_.loadFile(str);
 }
 
 
 void TransManager::EnablePrimary()
 {
-    if (t1_->IsDefined())
-       active_ = t1_;
-
-    lyxerr[Debug::KBMAP] << "Enabling primary keymap" << endl;
+       if (t1_->IsDefined())
+               active_ = t1_;
+       
+       lyxerr[Debug::KBMAP] << "Enabling primary keymap" << endl;
 }
 
 
 void TransManager::EnableSecondary()
 {
-    if (t2_->IsDefined( ))
-       active_ = t2_;
-    lyxerr[Debug::KBMAP] << "Enabling secondary keymap" << endl;
+       if (t2_->IsDefined())
+               active_ = t2_;
+       lyxerr[Debug::KBMAP] << "Enabling secondary keymap" << endl;
 }
 
 
 void TransManager::DisableKeymap()
 {
-    active_ = default_;
-    lyxerr[Debug::KBMAP] << "Disabling keymap" << endl;
+       active_ = &default_;
+       lyxerr[Debug::KBMAP] << "Disabling keymap" << endl;
 }
 
 
 void  TransManager::TranslateAndInsert(char c, LyXText * text)
 {
-    string res = active_->process(c, *this);
-    
-    // Process with tokens
-    string temp;
+       string res = active_->process(c, *this);
        
-    while(res.length()>0) {
-       res = split(res, temp, TransState::TOKEN_SEP);
-       insert(temp, text);
-    }
+       // Process with tokens
+       string temp;
+       
+       while (res.length() > 0) {
+               res = split(res, temp, TransState::TOKEN_SEP);
+               insert(temp, text);
+       }
 }
 
 
 void TransManager::insertVerbatim(string const & str, LyXText * text)
 {      
-    int l = str.length();
+       string::size_type const l = str.length();
        
-    for (int i = 0;i<l;i++){
-       if (str[i] == '\"' 
-           && text->GetFont(text->cursor.par,
-                            text->cursor.pos).latex() == LyXFont::OFF)
-           InsertCorrectQuote();
-       else
-           text->InsertChar(str[i]);
-    }
+       for (string::size_type i = 0; i < l; ++i) {
+               text->insertChar(current_view, str[i]);
+       }
 }
 
 
-void TransManager::insert(string str, LyXText * text)
+void TransManager::insert(string const & str, LyXText * text)
 {
-    string t = str;
-    
-    // Go through the character encoding only if the current 
-    // encoding (chset_->name()) matches the current font_norm
-    // (lyrxc->font_norm
-
-    if (chset_.getName() != lyxrc->font_norm || 
-       chset_.encodeString(str) == false) {
-       // Could not find an encoding
-       InsetLatexAccent ins(str);
-       if (ins.CanDisplay()) {
-           text->InsertInset(new InsetLatexAccent(ins));
-           return;
+       // Go through the character encoding only if the current 
+       // encoding (chset_->name()) matches the current font_norm
+       // (lyrxc->font_norm)
+       
+       // Is false to speak about "only if" the current encoding will
+       // almost always be equal to font_norm.
+       pair<bool, int> enc = chset_.encodeString(str);
+       if (chset_.getName() != lyxrc.font_norm || 
+           !enc.first) {
+               // Could not find an encoding
+               InsetLatexAccent ins(str);
+               if (ins.canDisplay()) {
+                       text->insertInset(current_view,
+                                         new InsetLatexAccent(ins));
+               } else {
+                       insertVerbatim(str, text);
+               }
+               return;
        }
-    }
-    
-    insertVerbatim(str, text);
+       string tmp;
+       tmp += static_cast<char>(enc.second);
+       insertVerbatim(tmp, text);
 }
 
 
 void TransManager::deadkey(char c, tex_accent accent, LyXText * t)
 {
-    KmodInfo i;
-    string res;
-    
-    if (c == 0 && active_ != default_) {
-       // A deadkey was pressed that cannot be printed
-       // or a accent command was typed in the minibuffer
-       
-       if (active_->isAccentDefined(accent, i) == true) {
-           res = trans_fsm_.currentState->deadkey(c, i);
-           insert(res, t);
-           return;
+       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) {
+                       string const res = trans_fsm_
+                               .currentState->deadkey(c, i);
+                       insert(res, t);
+                       return;
+               }
        }
-    }
-    
-    if (active_ == default_ || c == 0) {
-       i.accent = accent;
-       i.allowed = lyx_accent_table[accent].native;
-       i.data.clear();
-       i.exception_list = 0;
        
-       string res = trans_fsm_.currentState->deadkey(c, i);
-       insert(res, t);
-    } else {
-       // Go through the translation
-       TranslateAndInsert(c, t);
-    }
+       if (active_ == &default_ || c == 0) {
+               KmodInfo i;
+               i.accent = accent;
+#if 0
+               i.allowed = lyx_accent_table[accent].native;
+#endif
+               i.data.erase();
+#if 0
+               i.exception_list = 0;
+#endif 
+               string res = trans_fsm_.currentState->deadkey(c, i);
+               insert(res, t);
+       } else {
+               // Go through the translation
+               TranslateAndInsert(c, t);
+       }
 }