From 9bdb1d82f867147af44def8c1cca3dfb8259b99c Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Fri, 11 May 2012 12:22:43 -0400 Subject: rename feature from "autocorrect" to "autoreplace", change names accordingly --- indra/newview/llautoreplace.cpp | 458 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 458 insertions(+) create mode 100644 indra/newview/llautoreplace.cpp (limited to 'indra/newview/llautoreplace.cpp') diff --git a/indra/newview/llautoreplace.cpp b/indra/newview/llautoreplace.cpp new file mode 100644 index 0000000000..a5683e4190 --- /dev/null +++ b/indra/newview/llautoreplace.cpp @@ -0,0 +1,458 @@ +/** + * @file llautoreplace.cpp + * @brief Auto Replace Manager + * + * $LicenseInfo:firstyear=2012&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2012, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llautoreplace.h" +#include "llsdserialize.h" +#include "llboost.h" +#include "llcontrol.h" +#include "llviewercontrol.h" +#include "llnotificationsutil.h" + +AutoReplace* AutoReplace::sInstance; + +AutoReplace::AutoReplace() +{ + sInstance = this; + sInstance->loadFromDisk(); +} + +AutoReplace::~AutoReplace() +{ + sInstance = NULL; +} + +void AutoReplace::autoreplaceCallback(LLUIString& inputText, S32& cursorPos) +{ + static LLCachedControl perform_autoreplace(gSavedSettings, "AutoReplace"); + if(perform_autoreplace) + { + S32 wordStart = 0; + S32 wordEnd = cursorPos-1; + + if(wordEnd < 1) + return; + + LLWString text = inputText.getWString(); + + if(text.size()<1) + return; + + if(LLWStringUtil::isPartOfWord(text[wordEnd])) + return;//we only check on word breaks + + wordEnd--; + + if(LLWStringUtil::isPartOfWord(text[wordEnd])) + { + while ((wordEnd > 0) && (' ' != text[wordEnd-1])) + { + wordEnd--; + } + + wordStart=wordEnd; + + while ((wordEnd < (S32)text.length()) && (' ' != text[wordEnd])) + { + wordEnd++; + } + + std::string strLastWord = std::string(text.begin(), text.end()); + std::string lastTypedWord = strLastWord.substr(wordStart, wordEnd-wordStart); + std::string replaceedWord(replaceWord(lastTypedWord)); + + if(replaceedWord != lastTypedWord) + { + LLWString strNew = utf8str_to_wstring(replaceedWord); + LLWString strOld = utf8str_to_wstring(lastTypedWord); + int nDiff = strNew.size() - strOld.size(); + + //int wordStart = regText.find(lastTypedWord); + text.replace(wordStart,lastTypedWord.length(),strNew); + inputText = wstring_to_utf8str(text); + cursorPos+=nDiff; + } + } + } +} + +AutoReplace* AutoReplace::getInstance() +{ + if(sInstance)return sInstance; + else + { + sInstance = new AutoReplace(); + return sInstance; + } +} +void AutoReplace::save() +{ + saveToDisk(mAutoReplaces); +} +std::string AutoReplace::getFileName() +{ + std::string path=gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""); + + if (!path.empty()) + { + path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "settings_autoreplace.xml"); + } + return path; +} +std::string AutoReplace::getDefaultFileName() +{ + std::string path=gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""); + + if (!path.empty()) + { + path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "settings_autoreplace.xml"); + } + return path; +} +LLSD AutoReplace::exportList(std::string listName) +{ + LLSD toReturn; + if(mAutoReplaces.has(listName)) + { + toReturn["listName"]=listName; + toReturn["data"]=mAutoReplaces[listName]["data"]; + toReturn["author"]=mAutoReplaces[listName]["author"]; + toReturn["wordStyle"]=mAutoReplaces[listName]["wordStyle"]; + toReturn["priority"]=mAutoReplaces[listName]["priority"]; + } + return toReturn; +} +BOOL AutoReplace::addReplacementList(LLSD newList) +{ + if(newList.has("listName")) + { + std::string name = newList["listName"]; + //if(!mAutoReplaces.has(name)){ + LLSD newPart; + newPart["data"]=newList["data"]; + newPart["enabled"]=TRUE; + newPart["announce"]=FALSE; + newPart["author"]=newList["author"]; + newPart["wordStyle"]=newList["wordStyle"]; + newPart["priority"]=newList["priority"].asInteger(); + llinfos << "adding new list with settings priority "<fileExists(filename)) + { + std::string defaultName = getDefaultFileName(); + llinfos << " user settings file doesnt exist, going to try and read default one from "<fileExists(defaultName)) + { + LLSD blankllsd; + llifstream file; + file.open(defaultName.c_str()); + if (file.is_open()) + { + LLSDSerialize::fromXMLDocument(blankllsd, file); + } + file.close(); + saveToDisk(blankllsd); + }else + saveToDisk(getExampleLLSD()); + } + else + { + llifstream file; + file.open(filename.c_str()); + if (file.is_open()) + { + LLSDSerialize::fromXML(mAutoReplaces, file); + } + file.close(); + } +} +void AutoReplace::saveToDisk(LLSD newSettings) +{ + mAutoReplaces=newSettings; + std::string filename=getFileName(); + llofstream file; + file.open(filename.c_str()); + LLSDSerialize::toPrettyXML(mAutoReplaces, file); + file.close(); +} +void AutoReplace::runTest() +{ + std::string startS("He just abandonned all his abilties"); + std::string endS = replaceWords(startS); + llinfos << "!!! Test of autoreplace; start with "< perform_autoreplace(gSavedSettings, "AutoReplace"); + if(!(perform_autoreplace))return currentWord; + //loop through priorities + for(int currentPriority = 10;currentPriority>=0;currentPriority--) + { + LLSD::map_const_iterator loc_it = mAutoReplaces.beginMap(); + LLSD::map_const_iterator loc_end = mAutoReplaces.endMap(); + for (; loc_it != loc_end; ++loc_it) + { + const std::string& location = (*loc_it).first; + //llinfos << "location is "< " << replacement.c_str() << llendl; + return replacement; + } + } + } + } + return currentWord; +} +std::string AutoReplace::replaceWords(std::string words) +{ + static LLCachedControl perform_autoreplace(gSavedSettings, "AutoReplace"); + if(!(perform_autoreplace))return words; + //*TODO update this function to use the "wordStyle" thing, + //but so far this function is never used, so later + + boost_tokenizer tokens(words, boost::char_separator(" ")); + for (boost_tokenizer::iterator token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter) + { + std::string currentWord(*token_iter); + LLSD::map_const_iterator loc_it = mAutoReplaces.beginMap(); + LLSD::map_const_iterator loc_end = mAutoReplaces.endMap(); + for (; loc_it != loc_end; ++loc_it) + { + const std::string& location = (*loc_it).first; + const LLSD& loc_map = (*loc_it).second; + if((loc_map["data"].has(currentWord))&&(loc_map["enabled"].asBoolean())) + { + std::string replacement = loc_map["data"][currentWord]; + if(loc_map["announce"].asBoolean()) + { + LLSD args; + //"[Before]" has been auto replaced by "[Replacement]" + // based on your [ListName] list. + args["BEFORE"] = currentWord; + args["LISTNAME"]=location; + args["REPLACEMENT"]=replacement; + LLNotificationsUtil::add("AutoReplace",args); + } + lldebugs << "found a word in list " << location.c_str() << " and it will replace " << currentWord.c_str() << " => " << replacement.c_str() << llendl; + int wordStart = words.find(currentWord); + words.replace(wordStart,currentWord.length(),replacement); + return replaceWords(words);//lol recursion! + } + } + } + return words; +} +BOOL AutoReplace::addEntryToList(std::string wrong, std::string right, std::string listName) +{ + // *HACK: Make sure the "Custom" list exists, because the design of this + // system prevents us from updating it by changing the original file... + if(mAutoReplaces.has(listName)) + { + mAutoReplaces[listName]["data"][wrong]=right; + return TRUE; + } + else if(listName == "Custom") + { + mAutoReplaces[listName]["announce"] = 0; + mAutoReplaces[listName]["author"] = "You"; + mAutoReplaces[listName]["data"][wrong] = right; + mAutoReplaces[listName]["enabled"] = 1; + mAutoReplaces[listName]["priority"] = 10; + mAutoReplaces[listName]["wordStyle"] = 1; + return TRUE; + } + + return FALSE; +} +BOOL AutoReplace::removeEntryFromList(std::string wrong, std::string listName) +{ + if(mAutoReplaces.has(listName)) + { + if(mAutoReplaces[listName]["data"].has(wrong)) + { + mAutoReplaces[listName]["data"].erase(wrong); + return TRUE; + } + } + return FALSE; +} + +LLSD AutoReplace::getExampleLLSD() +{ + LLSD toReturn; + + LLSD listone; + LLSD listtwo; + + LLSD itemOne; + itemOne["wrong"]="wrong1"; + itemOne["right"]="right1"; + listone[0]=itemOne; + + LLSD itemTwo; + itemTwo["wrong"]="wrong2"; + itemTwo["right"]="right2"; + listone[1]=itemTwo; + + toReturn["listOne"]=listone; + + + itemOne["wrong"]="secondwrong1"; + itemOne["right"]="secondright1"; + listone[0]=itemOne; + + itemTwo["wrong"]="secondwrong2"; + itemTwo["right"]="secondright2"; + listone[1]=itemTwo; + + toReturn["listTwo"]=listone; + + return toReturn; +} + -- cgit v1.3 From 6d9c0fab8f2c19fa624e3c1f697ee9c7f08d9245 Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Fri, 11 May 2012 14:31:45 -0400 Subject: remove author tracking, non-wordstyle option, and notifications --- .../newview/app_settings/settings_autoreplace.xml | 18 ------ indra/newview/llautoreplace.cpp | 71 ---------------------- indra/newview/llautoreplace.h | 2 - indra/newview/llautoreplacefloater.cpp | 5 -- .../skins/default/xui/en/floater_autoreplace.xml | 63 +------------------ .../newview/skins/default/xui/en/notifications.xml | 7 --- 6 files changed, 1 insertion(+), 165 deletions(-) (limited to 'indra/newview/llautoreplace.cpp') diff --git a/indra/newview/app_settings/settings_autoreplace.xml b/indra/newview/app_settings/settings_autoreplace.xml index 4669ba5822..790cd62a02 100644 --- a/indra/newview/app_settings/settings_autoreplace.xml +++ b/indra/newview/app_settings/settings_autoreplace.xml @@ -2,25 +2,15 @@ Custom - announce - 0 - author - You data enabled 1 priority 10 - wordStyle - 1 Abbreviations - announce - 0 - author - Wulf / TankMaster data afaic @@ -90,15 +80,9 @@ 1 priority 4 - wordStyle - 1 Spelling Corrections - announce - 0 - author - LordGregGreg / Wikipedia data Amercia @@ -8362,8 +8346,6 @@ 1 priority 5 - wordStyle - 1 diff --git a/indra/newview/llautoreplace.cpp b/indra/newview/llautoreplace.cpp index a5683e4190..fa46f53e96 100644 --- a/indra/newview/llautoreplace.cpp +++ b/indra/newview/llautoreplace.cpp @@ -137,8 +137,6 @@ LLSD AutoReplace::exportList(std::string listName) { toReturn["listName"]=listName; toReturn["data"]=mAutoReplaces[listName]["data"]; - toReturn["author"]=mAutoReplaces[listName]["author"]; - toReturn["wordStyle"]=mAutoReplaces[listName]["wordStyle"]; toReturn["priority"]=mAutoReplaces[listName]["priority"]; } return toReturn; @@ -152,9 +150,6 @@ BOOL AutoReplace::addReplacementList(LLSD newList) LLSD newPart; newPart["data"]=newList["data"]; newPart["enabled"]=TRUE; - newPart["announce"]=FALSE; - newPart["author"]=newList["author"]; - newPart["wordStyle"]=newList["wordStyle"]; newPart["priority"]=newList["priority"].asInteger(); llinfos << "adding new list with settings priority "< " << replacement.c_str() << llendl; return replacement; } @@ -353,8 +297,6 @@ std::string AutoReplace::replaceWords(std::string words) { static LLCachedControl perform_autoreplace(gSavedSettings, "AutoReplace"); if(!(perform_autoreplace))return words; - //*TODO update this function to use the "wordStyle" thing, - //but so far this function is never used, so later boost_tokenizer tokens(words, boost::char_separator(" ")); for (boost_tokenizer::iterator token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter) @@ -369,16 +311,6 @@ std::string AutoReplace::replaceWords(std::string words) if((loc_map["data"].has(currentWord))&&(loc_map["enabled"].asBoolean())) { std::string replacement = loc_map["data"][currentWord]; - if(loc_map["announce"].asBoolean()) - { - LLSD args; - //"[Before]" has been auto replaced by "[Replacement]" - // based on your [ListName] list. - args["BEFORE"] = currentWord; - args["LISTNAME"]=location; - args["REPLACEMENT"]=replacement; - LLNotificationsUtil::add("AutoReplace",args); - } lldebugs << "found a word in list " << location.c_str() << " and it will replace " << currentWord.c_str() << " => " << replacement.c_str() << llendl; int wordStart = words.find(currentWord); words.replace(wordStart,currentWord.length(),replacement); @@ -399,12 +331,9 @@ BOOL AutoReplace::addEntryToList(std::string wrong, std::string right, std::stri } else if(listName == "Custom") { - mAutoReplaces[listName]["announce"] = 0; - mAutoReplaces[listName]["author"] = "You"; mAutoReplaces[listName]["data"][wrong] = right; mAutoReplaces[listName]["enabled"] = 1; mAutoReplaces[listName]["priority"] = 10; - mAutoReplaces[listName]["wordStyle"] = 1; return TRUE; } diff --git a/indra/newview/llautoreplace.h b/indra/newview/llautoreplace.h index b11c124a62..6c531d0040 100644 --- a/indra/newview/llautoreplace.h +++ b/indra/newview/llautoreplace.h @@ -33,9 +33,7 @@ public: BOOL addReplacementList(LLSD newList); BOOL removeReplacementList(std::string listName); BOOL setListEnabled(std::string listName, BOOL enabled); - BOOL setListAnnounceeState(std::string listName, BOOL announce); BOOL setListPriority(std::string listName, int priority); - BOOL setListStyle(std::string listName, BOOL announce); std::string replaceWords(std::string words); std::string replaceWord(std::string currentWord); BOOL addEntryToList(std::string wrong, std::string right, std::string listName); diff --git a/indra/newview/llautoreplacefloater.cpp b/indra/newview/llautoreplacefloater.cpp index 01950adb37..ab299aeffe 100644 --- a/indra/newview/llautoreplacefloater.cpp +++ b/indra/newview/llautoreplacefloater.cpp @@ -131,10 +131,7 @@ void AutoReplaceFloater::updateItemsList() LLSD listData = AutoReplace::getInstance()->getAutoReplaceEntries(listName); childSetValue("ac_list_enabled",listData["enabled"].asBoolean()); - childSetValue("ac_list_style",listData["wordStyle"].asBoolean()); - childSetValue("ac_list_show",listData["announce"].asBoolean()); childSetValue("ac_text_name",listName); - childSetValue("ac_text_author",listData["author"]); childSetValue("ac_priority",listData["priority"]); LLSD autoReplaces = listData["data"]; @@ -201,7 +198,6 @@ void AutoReplaceFloater::updateListControlsEnabled(BOOL selected) childSetEnabled("ac_text1",selected); childSetEnabled("ac_text2",selected); childSetEnabled("ac_text_name",selected); - childSetEnabled("ac_text_author",selected); childSetEnabled("ac_list_enabled",selected); childSetEnabled("ac_list_show",selected); childSetEnabled("ac_list_style",selected); @@ -256,7 +252,6 @@ void AutoReplaceFloater::onEntrySettingChange(LLUICtrl* caller, void* user_data) { std::string listName= self->namesList->getFirstSelected()->getColumn(0)->getValue().asString(); AutoReplace::getInstance()->setListEnabled(listName,self->childGetValue("ac_list_enabled").asBoolean()); - AutoReplace::getInstance()->setListAnnounceeState(listName,self->childGetValue("ac_list_show").asBoolean()); AutoReplace::getInstance()->setListStyle(listName,self->childGetValue("ac_list_style").asBoolean()); AutoReplace::getInstance()->setListPriority(listName,self->childGetValue("ac_priority").asInteger()); diff --git a/indra/newview/skins/default/xui/en/floater_autoreplace.xml b/indra/newview/skins/default/xui/en/floater_autoreplace.xml index 5f53e61fa2..f68aeacb97 100644 --- a/indra/newview/skins/default/xui/en/floater_autoreplace.xml +++ b/indra/newview/skins/default/xui/en/floater_autoreplace.xml @@ -126,39 +126,6 @@ name="ac_text_name"> List Name - - Author: - - - - Author Name - - -