diff options
author | elfmz <fenix1905@tut.by> | 2022-01-23 21:47:57 +0300 |
---|---|---|
committer | elfmz <fenix1905@tut.by> | 2022-01-23 21:51:12 +0300 |
commit | 027016eb33e9adeefa3eb20767c09d326f08f0f4 (patch) | |
tree | ddcf6f62dbede4b8ae29ff7e39aafd1df7a4af03 /far2l/src/locale | |
parent | a0b3a3cd77406f2ee4a221c282af8e4647412372 (diff) |
Add <Input settings> menu to configure xlat and some other stuff
Diffstat (limited to 'far2l/src/locale')
-rw-r--r-- | far2l/src/locale/xlat.cpp | 132 | ||||
-rw-r--r-- | far2l/src/locale/xlat.hpp | 26 |
2 files changed, 86 insertions, 72 deletions
diff --git a/far2l/src/locale/xlat.cpp b/far2l/src/locale/xlat.cpp index 94f8d248..d75e0f04 100644 --- a/far2l/src/locale/xlat.cpp +++ b/far2l/src/locale/xlat.cpp @@ -50,87 +50,84 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "config.hpp" #include "xlat.hpp" #include "console.hpp" +#include "dirmix.hpp" -Xlater::Xlater(DWORD flags) +Xlator::Xlator(DWORD flags) { - _min_len_table = Min(Opt.XLat.Table[0].GetLength(), Opt.XLat.Table[1].GetLength()); + KeyFileReadSection xlat_local(InMyConfig("xlats.ini"), Opt.XLat.XLat.GetMB()); + if (xlat_local.SectionLoaded()) { + InitFromValues(xlat_local); + + } else { + KeyFileReadSection xlat_global(GetHelperPathName("xlats.ini"), Opt.XLat.XLat.GetMB()); + if (xlat_global.SectionLoaded()) { + InitFromValues(xlat_global); + } + } - if (flags & XLAT_USEKEYBLAYOUTNAME) - { - fprintf(stderr, "Xlater: XLAT_USEKEYBLAYOUTNAME is not supported\n"); + if (flags & XLAT_USEKEYBLAYOUTNAME) { + fprintf(stderr, "Xlator: XLAT_USEKEYBLAYOUTNAME is not supported\n"); } } -wchar_t Xlater::Transcode(wchar_t chr) +void Xlator::Rules::InitFromValue(const std::wstring &v) +{ + for (size_t i = 0; i + 1 < v.size();) { + emplace_back(std::make_pair(v[i], v[i + 1])); + for (i+= 2; i < v.size() && v[i] == ' '; ++i) { + } + } +} + +void Xlator::InitFromValues(KeyFileValues &kfv) +{ + _latin = kfv.GetString("Latin", L""); + _local = kfv.GetString("Local", L""); + + _after_latin.InitFromValue(kfv.GetString("AfterLatin", L"")); + _after_local.InitFromValue(kfv.GetString("AfterLocal", L"")); + _after_other.InitFromValue(kfv.GetString("AfterOther", L"")); + + _min_len_table = std::min(_local.size(), _latin.size()); +} + +wchar_t Xlator::Transcode(wchar_t chr) { - const wchar_t chr_old = chr; + size_t i; // chr_old - пред символ - bool changed = false; // цикл по просмотру Chr в таблицах // <= _min_len_table так как длина настоящая а начальный индекс 1 - for (size_t i = 0; i <= _min_len_table; i++) { + for (i = 0; i < _min_len_table; i++) { // символ из латиницы? - if (chr == Opt.XLat.Table[1].At(i)) { - chr = Opt.XLat.Table[0].At(i); - changed = true; - _cur_lang = 1; // pred - english - _lang_count[1]++; - break; + if (chr == _latin[i]) { + _cur_lang = LATIN; // pred - english + return _local[i]; - } else if (chr == Opt.XLat.Table[0].At(i)) { // символ из русской? - chr = Opt.XLat.Table[1].At(i); - changed = true; - _cur_lang = 0; // pred - russian - _lang_count[0]++; - break; + } else if (chr == _local[i]) { // символ из русской? + _cur_lang = LOCAL; // pred - local + return _latin[i]; } } - if (!changed) { // особые случаи... - _prev_lang = _cur_lang; - - if (_lang_count[0] > _lang_count[1]) - _cur_lang = 0; - else if (_lang_count[0] < _lang_count[1]) - _cur_lang = 1; - else - _cur_lang = 2; + // особые случаи... + Rules *rules; + switch (_cur_lang) { + case LATIN: + rules = &_after_latin; + break; - if (_prev_lang != _cur_lang) - _cur_lang = _prev_lang; + case LOCAL: + rules = &_after_local; + break; - for (size_t i = 0, ii = Opt.XLat.Rules[_cur_lang].GetLength(); i < ii; i+= 2) { - if (chr_old == Opt.XLat.Rules[_cur_lang].At(i)) { - chr = Opt.XLat.Rules[_cur_lang].At(i+1); - break; - } - } + default: + rules = &_after_other; + } -#if 0 - // Если в таблице не найдено и таблица была Unknown... - if (I >= Opt.XLat.Rules[CurLang][0] && CurLang == 2) - { - // ...смотрим сначала в первой таблице... - for (I=1; I < Opt.XLat.Rules[0][0]; I+=2) - if (ChrOld == (BYTE)Opt.XLat.Rules[0][I]) - break; - - for (J=1; J < Opt.XLat.Rules[1][0]; J+=2) - if (ChrOld == (BYTE)Opt.XLat.Rules[1][J]) - break; - - if (I >= Opt.XLat.Rules[0][0]) - CurLang=1; - - if (J >= Opt.XLat.Rules[1][0]) - CurLang=0; - - if ()//??? - { - Chr=(BYTE)Opt.XLat.Rules[CurLang][J+1]; - } + for (const auto &rule : *rules) { + if (chr == rule.first) { + return rule.second; } -#endif } return chr; @@ -148,13 +145,14 @@ wchar_t* WINAPI Xlat(wchar_t *Line, EndPos = (EndPos == -1) ? Length : Min(EndPos, Length); StartPos = Max(StartPos, 0); - if (StartPos > EndPos || StartPos >= Length) + if (StartPos > EndPos || StartPos >= Length) { return Line; + } - if (!Opt.XLat.Table[0].GetLength() || !Opt.XLat.Table[1].GetLength()) + Xlator xlt(Flags); + if (xlt.Valid()) { return Line; - - Xlater xlt(Flags); + } for (int j=StartPos; j < EndPos; j++) { Line[j] = xlt.Transcode(Line[j]); @@ -163,7 +161,7 @@ wchar_t* WINAPI Xlat(wchar_t *Line, // переключаем раскладку клавиатуры? if (Flags & XLAT_SWITCHKEYBLAYOUT) { //todo - fprintf(stderr, "Xlater: XLAT_USEKEYBLAYOUTNAME is not supported\n"); + fprintf(stderr, "Xlator: XLAT_USEKEYBLAYOUTNAME is not supported\n"); } return Line; diff --git a/far2l/src/locale/xlat.hpp b/far2l/src/locale/xlat.hpp index 23479803..129030b7 100644 --- a/far2l/src/locale/xlat.hpp +++ b/far2l/src/locale/xlat.hpp @@ -34,15 +34,31 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <WinCompat.h> +#include <KeyFileHelper.h> +#include <string> +#include <vector> -class Xlater +class Xlator { - size_t _min_len_table; - int _prev_lang {2}, _cur_lang {2}; // unknown - int _lang_count[2] {0, 0}; + std::wstring _latin, _local; + struct Rules : std::vector<std::pair<wchar_t, wchar_t>> + { + void InitFromValue(const std::wstring &v); + + } _after_latin, _after_local, _after_other; + + size_t _min_len_table{0}; + enum { + UNKNOWN, + LATIN, + LOCAL, + } _cur_lang {UNKNOWN}; + + void InitFromValues(KeyFileValues &kfv); public: - Xlater(DWORD flags); + Xlator(DWORD flags); + bool Valid() const { return _min_len_table != 0; } wchar_t Transcode(wchar_t chr); }; |