From a33833212f040272fc6c97047c8cb335b6f5405a Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Tue, 24 Jul 2012 06:41:19 +0000 Subject: SimpleAR, SimpleStatusMsg, SmileyAdd, SpellChecker: changed folder structure git-svn-id: http://svn.miranda-ng.org/main/trunk@1149 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/SpellChecker/src/autoreplace.cpp | 229 +++++++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 plugins/SpellChecker/src/autoreplace.cpp (limited to 'plugins/SpellChecker/src/autoreplace.cpp') diff --git a/plugins/SpellChecker/src/autoreplace.cpp b/plugins/SpellChecker/src/autoreplace.cpp new file mode 100644 index 0000000000..2d257ccfec --- /dev/null +++ b/plugins/SpellChecker/src/autoreplace.cpp @@ -0,0 +1,229 @@ +/* +Copyright (C) 2009-2010 Ricardo Pescuma Domenecci + +This is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this file; see the file license.txt. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. +*/ + + +#include "commons.h" + + +AutoReplacement::AutoReplacement() + : useVariables(FALSE) +{ +} + +AutoReplacement::AutoReplacement(const TCHAR *replace, BOOL useVariables) + : replace(replace), useVariables(useVariables) +{ +} + + +AutoReplaceMap::AutoReplaceMap(TCHAR *aFilename, Dictionary *dict) +{ + this->dict = dict; + lstrcpyn(filename, aFilename, MAX_REGS(filename)); + loadAutoReplaceMap(); +} + +void AutoReplaceMap::loadAutoReplaceMap() +{ + FILE *file = _tfopen(filename, _T("rb")); + if (file == NULL) + return; + + char tmp[1024]; + char c; + int pos = 0; + while((c = fgetc(file)) != EOF) + { + if (c == '\n' || c == '\r' || pos >= MAX_REGS(tmp) - 1) + { + if (pos > 0) + { + tmp[pos] = '\0'; + + // Get from + BOOL useVars; + char *p; + if ((p = strstr(tmp, "->")) != NULL) + { + *p = '\0'; + p += 2; + useVars = FALSE; + } + else if ((p = strstr(tmp, "-V>")) != NULL) + { + *p = '\0'; + p += 3; + useVars = TRUE; + } + + if (p != NULL) + { + Utf8ToTchar find(tmp); + Utf8ToTchar replace(p); + + lstrtrim(find); + lstrtrim(replace); + + if (find[0] != 0 && replace[0] != 0) + replacements[find.get()] = AutoReplacement(replace, useVars); + } + } + + pos = 0; + } + else + { + tmp[pos] = c; + pos ++; + } + } + fclose(file); +} + +void AutoReplaceMap::writeAutoReplaceMap() +{ + // Create path + TCHAR *p = _tcsrchr(filename, _T('\\')); + if (p != NULL) + { + *p = 0; + CreatePath(filename); + *p = _T('\\'); + } + + // Write it + FILE *file = _tfopen(filename, _T("wb")); + if (file != NULL) + { + map::iterator it = replacements.begin(); + for (; it != replacements.end(); it++) + { + AutoReplacement &ar = it->second; + + TcharToUtf8 find(it->first.c_str()); + TcharToUtf8 replace(ar.replace.c_str()); + + if (ar.useVariables) + fprintf(file, "%s-V>%s\n", (const char *)find, (const char *)replace); + else + fprintf(file, "%s->%s\n", (const char *)find, (const char *)replace); + } + fclose(file); + } +} + + +BOOL AutoReplaceMap::isWordChar(TCHAR c) +{ + if (IsNumber(c)) + return TRUE; + + if (_tcschr(_T("-_.!@#$%&*()[]{}<>:?/\\=+"), c) != NULL) + return TRUE; + + return dict->isWordChar(c); +} + + +TCHAR * AutoReplaceMap::autoReplace(const TCHAR * word) +{ + scoped_free from = _tcslwr(_tcsdup(word)); + + if (replacements.find(from.get()) == replacements.end()) + return NULL; + + AutoReplacement &ar = replacements[from.get()]; + + TCHAR *to; + if (ar.useVariables) + to = variables_parsedup((TCHAR *) ar.replace.c_str(), (TCHAR *) word, NULL); + else + to = _tcsdup(ar.replace.c_str()); + + // Wich case to use? + size_t len = lstrlen(word); + size_t i; + for (i = 0; i < len; i++) + if (IsCharLower(word[i])) + break; + + if (i <= 0) + { + // All lower + return to; + } + else if (i >= len) + { + // All upper + return CharUpper(to); + } + else + { + // First upper + TCHAR tmp[2]; + tmp[0] = to[0]; + tmp[1] = _T('\0'); + CharUpper(tmp); + to[0] = tmp[0]; + return to; + } +} + +TCHAR * AutoReplaceMap::filterText(const TCHAR *find) +{ + TCHAR *ret = _tcsdup(find); + int len = lstrlen(ret); + int pos = 0; + for(int i = 0; i < len; i++) + if (isWordChar(find[i])) + ret[pos++] = ret[i]; + ret[pos] = 0; + return CharLower(ret); +} + +void AutoReplaceMap::add(const TCHAR * aFrom, const TCHAR * to, BOOL useVariables) +{ + scoped_free from = filterText(aFrom); + + replacements[from.get()] = AutoReplacement(to, useVariables); + + writeAutoReplaceMap(); +} + +void AutoReplaceMap::copyMap(map *replacements) +{ + *replacements = this->replacements; +} + +void AutoReplaceMap::setMap(const map &replacements) +{ + this->replacements.clear(); + + map::const_iterator it = replacements.begin(); + for (; it != replacements.end(); it++) + { + scoped_free from = filterText(it->first.c_str()); + this->replacements[from.get()] = it->second; + } + + writeAutoReplaceMap(); +} + + + -- cgit v1.2.3