From cb2c995a825ce494b1a30f8135aa1b7712c25926 Mon Sep 17 00:00:00 2001 From: Lothar Buchholz Date: Sat, 6 Jun 2020 14:33:06 +0200 Subject: [PATCH] Version 0.7.0-beta - order buttons - use numeric LogLevel over booleans - exact case option reversed (again) - smart case handling if replacement is longer than match - Deletion of all mappings --- CHANGELOG.md | 22 ++- Grichelde.lua | 7 +- Grichelde.toc | 2 +- GricheldeChat.lua | 87 ++++++------ GricheldeConstants.lua | 45 +++--- GricheldeDatabase.lua | 104 ++++++++++---- GricheldeOptions.lua | 315 ++++++++++++++++++++++++++++------------- GricheldeUpgrade.lua | 37 +++-- GricheldeUtils.lua | 60 +++----- localisation/deDE.lua | 91 ++++++------ localisation/enUS.lua | 91 ++++++------ 11 files changed, 534 insertions(+), 327 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f412c0e..e022045 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,11 +3,21 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] Version 0.7.0-beta - 2020-06-06 +## [Upcoming] Version 0.7.1-beta - 2020-06-08 ### Added - handle replacement via slash command -## Version 0.6.0 - 2020-06-05 +## Version 0.7.0-beta - 2020-06-07 +### Added +- order buttons +### Changed +- use numeric LogLevel over booleans +- exact case option reversed (again) +- smart case handling if replacement is longer than match +### Fixed +- Deletion of all mappings + +## Version 0.6.0 (unreleased) - 2020-06-05 ### Added - honour capital/mixed cases for ignore case - consolidate consecutive matches @@ -23,7 +33,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - add replacements via options UI -## Version 0.4.0 - 2020-05-30 +## Version 0.4.0 (unreleased) - 2020-05-30 ### Added - restructured files - extract functions and color codes @@ -33,13 +43,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - fixed DB storange and debug printing -## Version 0.2.2 - 2020-05-26 +## Version 0.2.2 (unreleased) - 2020-05-26 ### Added - added Options UI under Interface Options - store settings in profiles - added more translations -## Version 0.2.1 - 2020-05-25 +## Version 0.2.1 (unreleased) - 2020-05-25 ### Added - support automatic packaging for curseforge via .pkgmeta - include project logo @@ -52,6 +62,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - handle SendChatMessage ordering if addon Misspelled is also installed - break long texts in chunks of 255 length -## Version 0.1 - 2020-05-24 +## Version 0.1 (unreleased) - 2020-05-24 ### Added - bootstrap addon with Ace3 based on [Misspelled](https://www.curseforge.com/wow/addons/misspelled) \ No newline at end of file diff --git a/Grichelde.lua b/Grichelde.lua index 6825fd3..25f4495 100644 --- a/Grichelde.lua +++ b/Grichelde.lua @@ -22,10 +22,8 @@ local Grichelde = LibStub("AceAddon-3.0"):NewAddon(AddonTable, AddonName, "AceCo Grichelde.L = LibStub("AceLocale-3.0"):GetLocale("Grichelde", true) Grichelde.version = GetAddOnMetadata(AddonName, "Version") Grichelde.build = GetAddOnMetadata(AddonName, "X-Build") or "Experimental" -Grichelde.hooks = {} Grichelde.classic = _G.WOW_PROJECT_ID == _G.WOW_PROJECT_CLASSIC -Grichelde.debug = false -Grichelde.trace = false +Grichelde.logLevel = 0 -- cannot reference Grichelde.LOG_LEVELs here as they are loaded afterwards -- publish to global env _G.Grichelde = Grichelde @@ -38,9 +36,8 @@ function Grichelde:OnInitialize() self.options, self.dialog = self:SetupOptions() - -- load replacements from database + -- populate UI from database self:RefreshOptions("OnProfileChanged") - self:DebugPrint(self.db.profile) self:SetupSlashCommands() end diff --git a/Grichelde.toc b/Grichelde.toc index 0c614f5..e08c5b3 100644 --- a/Grichelde.toc +++ b/Grichelde.toc @@ -3,7 +3,7 @@ ## Title: Grichelde ## Notes: Replaces characters from the chat box ## Notes-de: Ersetzt eingegebene Zeichen in der Chat-Zeile -## Version: 0.6.0 +## Version: 0.7.0-beta ## Author: Teilzeit-Jedi ## eMail: tj@teilzeit-jedi.de diff --git a/GricheldeChat.lua b/GricheldeChat.lua index b236004..8664e86 100644 --- a/GricheldeChat.lua +++ b/GricheldeChat.lua @@ -210,7 +210,36 @@ function Grichelde:ReplaceCharacters(text) local replace = replTable.replaceText consolidate[replName] = {} - if replTable.ignoreCase then + if replTable.exactCase then + -- exact case + self:DebugPrint("ReplaceCharacters : \"%s => %s\" (exact case)", search, replace) + local pos, offset = 1, 0 + local oldResult = result + + local pos1, pos2 = find(oldResult, search, pos) + while (pos1 and pos2) do + self:TracePrint("pos1: %d, pos2: %d", pos1, pos2) + local pre = sub(result, 1, pos1 - 1 + offset) + local post = sub(result, pos2 + 1 + offset) + self:TracePrint("pre: %s, post: %s", pre, post) + + -- actual replacement + result = pre .. replace .. post + self:DebugPrint("result: %s", result) + + -- remember positions for consolidate + if replTable.consolidate then + tInsert(consolidate[replName], pos1 + offset) + end + + -- replacement text can lengthen or shorten the resulting text + -- after replacement result and lowerResult can have different sizes + offset = offset + length(replace) - length(search) + -- update values for next iteration + pos = pos2 + 1 + pos1, pos2 = find(oldResult, search, pos) + end + else self:DebugPrint("ReplaceCharacters : \"%s => %s\" (ignoreCase)", search, replace) local pos, offset = 1, 0 local lowerResult = toLower(result) @@ -253,19 +282,26 @@ function Grichelde:ReplaceCharacters(text) self:TracePrint("rest: %s, n: %s, lastCase: %s", remainingReplace, nextLetter, lastCase) if (isUpper(nextLetter)) then - repl = repl .. toUpper(remainingReplace) + if lastCase == nil or lastCase == false then + repl = repl .. remainingReplace + else + repl = repl .. toUpper(remainingReplace) + end elseif (isLower(nextLetter)) then - repl = repl .. toLower(remainingReplace) + if lastCase == nil or lastCase == true then + repl = repl .. remainingReplace + else + repl = repl .. toLower(remainingReplace) + end else -- no letter - repl = repl .. remainingReplace --- if lastCase == nil then --- repl = repl .. remainingReplace --- elseif lastCase == false then --- repl = repl .. toLower(remainingReplace) --- else --- repl = repl .. toUpper(remainingReplace) --- end + if lastCase == nil then + repl = repl .. remainingReplace + elseif lastCase == false then + repl = repl .. toLower(remainingReplace) + else + repl = repl .. toUpper(remainingReplace) + end end end @@ -285,35 +321,6 @@ function Grichelde:ReplaceCharacters(text) pos = pos2 + 1 pos1, pos2 = find(lowerResult, lowerSearch, pos) end - else - -- exact case - self:DebugPrint("ReplaceCharacters : \"%s => %s\" (exact case)", search, replace) - local pos, offset = 1, 0 - local oldResult = result - - local pos1, pos2 = find(oldResult, search, pos) - while (pos1 and pos2) do - self:TracePrint("pos1: %d, pos2: %d", pos1, pos2) - local pre = sub(result, 1, pos1 - 1 + offset) - local post = sub(result, pos2 + 1 + offset) - self:TracePrint("pre: %s, post: %s", pre, post) - - -- actual replacement - result = pre .. replace .. post - self:DebugPrint("result: %s", result) - - -- remember positions for consolidate - if replTable.consolidate then - tInsert(consolidate[replName], pos1 + offset) - end - - -- replacement text can lengthen or shorten the resulting text - -- after replacement result and lowerResult can have different sizes - offset = offset + length(replace) - length(search) - -- update values for next iteration - pos = pos2 + 1 - pos1, pos2 = find(oldResult, search, pos) - end end if before ~= result then diff --git a/GricheldeConstants.lua b/GricheldeConstants.lua index 212e1e7..b60c661 100644 --- a/GricheldeConstants.lua +++ b/GricheldeConstants.lua @@ -2,23 +2,28 @@ local _G = _G local Grichelde = _G.Grichelde --- upvalues and constants +-- constants and upvalues +Grichelde.LOG_LEVEL = {} +Grichelde.LOG_LEVEL.DEBUG = 1 +Grichelde.LOG_LEVEL.TRACE = 2 + +Grichelde.MAPPING_OFFSET = 10 -- colors: Grichelde.COLOR_CODES = {} Grichelde.COLOR_CODES.PREFIX = "|c00FFAA00" -- https://github.com/stoneharry/Misc-WoW-Stuff/blob/master/EoC%20Interface/FrameXML/Constants.lua -Grichelde.COLOR_CODES.NORMAL = _G.NORMAL_FONT_COLOR_CODE or "|cffffd200"; -Grichelde.COLOR_CODES.HIGHLIGHT = _G.HIGHLIGHT_FONT_COLOR_CODE or "|cffffffff"; -Grichelde.COLOR_CODES.RED = _G.RED_FONT_COLOR_CODE or "|cffff2020"; -Grichelde.COLOR_CODES.GREEN = _G.GREEN_FONT_COLOR_CODE or "|cff20ff20"; -Grichelde.COLOR_CODES.LIGHTGRAY = "|cffC0C0C0"; -Grichelde.COLOR_CODES.GRAY = _G.GRAY_FONT_COLOR_CODE or "|cff808080"; -Grichelde.COLOR_CODES.DARKGRAY = "|cff404040"; -Grichelde.COLOR_CODES.YELLOW = _G.YELLOW_FONT_COLOR_CODE or "|cffffff00"; -Grichelde.COLOR_CODES.LIGHTYELLOW = _G.LIGHTYELLOW_FONT_COLOR_CODE or "|cffffff9a"; -Grichelde.COLOR_CODES.ORANGE = _G.ORANGE_FONT_COLOR_CODE or "|cffff7f3f"; -Grichelde.COLOR_CODES.CLOSE = _G.FONT_COLOR_CODE_CLOSE or "|r"; +Grichelde.COLOR_CODES.NORMAL = _G.NORMAL_FONT_COLOR_CODE or "|cffffd200" +Grichelde.COLOR_CODES.HIGHLIGHT = _G.HIGHLIGHT_FONT_COLOR_CODE or "|cffffffff" +Grichelde.COLOR_CODES.RED = _G.RED_FONT_COLOR_CODE or "|cffff2020" +Grichelde.COLOR_CODES.GREEN = _G.GREEN_FONT_COLOR_CODE or "|cff20ff20" +Grichelde.COLOR_CODES.LIGHTGRAY = "|cffC0C0C0" +Grichelde.COLOR_CODES.GRAY = _G.GRAY_FONT_COLOR_CODE or "|cff808080" +Grichelde.COLOR_CODES.DARKGRAY = "|cff404040" +Grichelde.COLOR_CODES.YELLOW = _G.YELLOW_FONT_COLOR_CODE or "|cffffff00" +Grichelde.COLOR_CODES.LIGHTYELLOW = _G.LIGHTYELLOW_FONT_COLOR_CODE or "|cffffff9a" +Grichelde.COLOR_CODES.ORANGE = _G.ORANGE_FONT_COLOR_CODE or "|cffff7f3f" +Grichelde.COLOR_CODES.CLOSE = _G.FONT_COLOR_CODE_CLOSE or "|r" Grichelde.slashCommands = { "/s", "/say", "/e", "/em", "/me", "/emote", "/y", "/yell", "/sh", "/shout", "/p", "/party", "/pl", "/partyleader", "/g", "/gc", "/guild", "/o", "/osay", "/officer", "/raid", "/rsay", "/rl", "/raidleader", "/rw", "/raidwarning", "/i", "/instance", "/bg", "/battleground", "/w", "/whisper", "/t", "/tell", "/send", "/r", "/reply" } @@ -47,6 +52,8 @@ local function spairs(t, orderFunc) it = it + 1 if sortedKeys[it] then return sortedKeys[it], t[sortedKeys[it]] + else + return nil end end end @@ -89,20 +96,20 @@ local function tClone(orig) return copy end -local function isChar(char) - return Grichelde.functions.find(char, "%a+") +local function isChar(word) + return Grichelde.functions.find(word, "%a+") end local function isNumber(digit) - return Grichelde.functions.find(Grichelde.functions.toString(digit), "%d+") + return Grichelde.functions.find(digit, "%d+") end -local function isUpper(char) - return Grichelde.functions.isChar(char) and char == Grichelde.functions.toUpper(char) +local function isUpper(word) + return Grichelde.functions.isChar(word) and word == Grichelde.functions.toUpper(word) end -local function isLower(char) - return Grichelde.functions.isChar(char) and char == Grichelde.functions.toLower(char) +local function isLower(word) + return Grichelde.functions.isChar(word) and word == Grichelde.functions.toLower(word) end local function isCapital(word) diff --git a/GricheldeDatabase.lua b/GricheldeDatabase.lua index 2bb8ea3..19eab1f 100644 --- a/GricheldeDatabase.lua +++ b/GricheldeDatabase.lua @@ -2,8 +2,8 @@ local _G = _G local Grichelde = _G.Grichelde -local spairs, unpack, join, toString - = Grichelde.functions.spairs, Grichelde.functions.unpack, Grichelde.functions.join, Grichelde.functions.toString +local pairs, tInsert, tClone, unpack, join, toString + = Grichelde.functions.pairs, Grichelde.functions.tInsert, Grichelde.functions.tClone, Grichelde.functions.unpack, Grichelde.functions.join, Grichelde.functions.toString function Grichelde:GetDefaultConfig() return { @@ -24,21 +24,28 @@ function Grichelde:GetDefaultConfig() order = 9999, searchText = "", replaceText = "", - ignoreCase = true, + exactCase = false, consolidate = true, }, - replacement_0 = { - order = 5, + replacement_10 = { + order = 10, searchText = "s", replaceText = "ch", - ignoreCase = true, + exactCase = false, consolidate = true, }, - replacement_1 = { - order = 9, + replacement_11 = { + order = 11, searchText = "t", replaceText = "ck", - ignoreCase = true, + exactCase = false, + consolidate = true, + }, + replacement_12 = { + order = 12, + searchText = "Zark", + replaceText = "toter Schamane", + exactCase = false, consolidate = true, } } @@ -59,10 +66,17 @@ function Grichelde:LoadDatabase() end function Grichelde:SyncToDatabase(info, val) + self:TracePrint("SyncToDatabase : info") + for i = 0, #info do + self:TracePrint("%d = %s", i, info[i]) + end + local option = self.db.profile local path = 1 while (path < #info) do - option = option[info[path]] -- or nil + if info[path] ~= "mappings" then + option = option[info[path]] -- or nil + end path = path + 1 end local optionPath = join(".", unpack(info, 1, #info)) @@ -71,36 +85,72 @@ function Grichelde:SyncToDatabase(info, val) end function Grichelde:ReadFromDatabase(info) + self:TracePrint("ReadFromDatabase : info") + for i = 0, #info do + self:TracePrint("%d = %s", i, info[i]) + end + local option = self.db.profile local path = 1 while (path <= #info) do - option = option[info[path]] -- or nil + if info[path] ~= "mappings" then + option = option[info[path]] -- or nil + end path = path + 1 end local optionPath = join(".", unpack(info, 1, #info)) - self:TracePrint("read option \"%s\": %s", optionPath, toString(option)) + self:DebugPrint("read option \"%s\": %s", optionPath, toString(option)) return option end ---- Sorts a replacements table by order sub-field. ---- Usually called with with self.db.profile.replacements --- @param replacementsTable table --- @return table -function Grichelde:ReorderReplacements(replacementsTable) - local replacements = replacementsTable or {} +--- Sorts a replacements table by order sub-field and rename. +--- Do NOT reassign self.db.profile.replacements here or with its output as it will break defaults +function Grichelde:ReorderReplacements() + local replacements = self.db.profile.replacements or {} + self:TracePrint("ReorderReplacements : unsorted table") - self:TracePrint(replacementsTable) + self:TracePrint(replacements) - local sortedReplacements = {} + local orderToName = {} + local size = 0 + for replName, replTable in pairs(replacements) do + size = size + 1 + tInsert(orderToName, replTable.order, replName) + end - local index = 0 - for _, replTable in spairs(replacements) do - sortedReplacements["replacement_" .. index] = replTable - sortedReplacements["replacement_" .. index].order = index + self:TracePrint("ReorderReplacements : size: %d, orderToName", size) + self:TracePrint(orderToName) + + local sorted = {} + local index, count = 0, 0 + + while count < size do + local replName = orderToName[index] + if replName and replacements[replName] then + self:TracePrint("ReorderReplacements : replName: %s, replTable", replName) + self:TracePrint(replacements[replName]) + local order = Grichelde.MAPPING_OFFSET + count + sorted["replacement_" .. order] = tClone(replacements[replName]) + sorted["replacement_" .. order].order = order + count = count + 1 + end index = index + 1 + if ( index > 10000) then break end + end + +-- self:TracePrint("ReorderReplacements : sorted") +-- self:TracePrint(sorted) + + -- do NOT set self.db.profile.replacements = {} it will break defaults + for replName, _ in pairs(replacements) do + replacements[replName] = nil + end + + -- copy over sorted replacements + for replName, replTable in pairs(sorted) do + replacements[replName] = replTable end - self:TracePrint("ReorderReplacements : sorted table") - self:TracePrint(sortedReplacements) - return sortedReplacements + self:DebugPrint("ReorderReplacements : sorted table") + self:DebugPrint(self.db.profile.replacements) end \ No newline at end of file diff --git a/GricheldeOptions.lua b/GricheldeOptions.lua index 5960493..382b859 100644 --- a/GricheldeOptions.lua +++ b/GricheldeOptions.lua @@ -2,8 +2,8 @@ local _G = _G local Grichelde = _G.Grichelde -local nilOrEmpty, pairs, tSize, unpack, find, join, toString, toNumber - = Grichelde.functions.nilOrEmpty, Grichelde.functions.pairs, Grichelde.functions.tSize, Grichelde.functions.unpack, Grichelde.functions.find, Grichelde.functions.join, Grichelde.functions.toString, Grichelde.functions.toNumber +local nilOrEmpty, pairs, find, match, toString, toNumber + = Grichelde.functions.nilOrEmpty, Grichelde.functions.pairs, Grichelde.functions.find, Grichelde.functions.match, Grichelde.functions.toString, Grichelde.functions.toNumber function Grichelde:CreateOptionsUI() return { @@ -29,71 +29,81 @@ function Grichelde:CreateOptionsUI() name = self.L.Options_Channels_Group_Name, desc = self:Format(self.L.Options_Channels_Group_Desc, self.L.AddonName), args = { + header = { + order = 1, + type = "description", + name = self.L.Options_Channels_Header + }, + spacer = { + order = 2, + type = "header", + name = "" + }, say = { - order = 0, + order = 10, type = "toggle", - name = self.L.Options_Channels_ChannelSay_Name, - desc = self:Format(self.L.Options_Channels_ChannelSay_Desc, self.L.AddonName), + name = self.L.Options_Channel_Say_Name, + desc = self:Format(self.L.Options_Channel_Say_Desc, self.L.AddonName), }, emote = { - order = 1, + order = 11, type = "toggle", - name = self.L.Options_Channels_ChannelEmote_Name, - desc = self:Format(self.L.Options_Channels_ChannelEmote_Desc, self.L.AddonName), + name = self.L.Options_Channel_Emote_Name, + desc = self:Format(self.L.Options_Channel_Emote_Desc, self.L.AddonName), }, yell = { - order = 2, + order = 12, type = "toggle", - name = self.L.Options_Channels_ChannelYell_Name, - desc = self:Format(self.L.Options_Channels_ChannelYell_Desc, self.L.AddonName), + name = self.L.Options_Channel_Yell_Name, + desc = self:Format(self.L.Options_Channel_Yell_Desc, self.L.AddonName), }, party = { - order = 3, + order = 13, type = "toggle", - name = self.L.Options_Channels_ChannelParty_Name, - desc = self:Format(self.L.Options_Channels_ChannelParty_Desc, self.L.AddonName), + name = self.L.Options_Channel_Party_Name, + desc = self:Format(self.L.Options_Channel_Party_Desc, self.L.AddonName), }, guild = { - order = 4, + order = 14, type = "toggle", - name = self.L.Options_Channels_ChannelGuild_Name, - desc = self:Format(self.L.Options_Channels_ChannelGuild_Desc, self.L.AddonName), + name = self.L.Options_Channel_Guild_Name, + desc = self:Format(self.L.Options_Channel_Guild_Desc, self.L.AddonName), }, officer = { - order = 5, + order = 15, type = "toggle", - name = self.L.Options_Channels_ChannelOfficer_Name, - desc = self:Format(self.L.Options_Channels_ChannelOfficer_Desc, self.L.AddonName), + name = self.L.Options_Channel_Officer_Name, + desc = self:Format(self.L.Options_Channel_Officer_Desc, self.L.AddonName), }, raid = { - order = 6, + order = 16, type = "toggle", - name = self.L.Options_Channels_ChannelRaid_Name, - desc = self:Format(self.L.Options_Channels_ChannelRaid_Desc, self.L.AddonName), + name = self.L.Options_Channel_Raid_Name, + desc = self:Format(self.L.Options_Channel_Raid_Desc, self.L.AddonName), }, raidWarning = { - order = 7, + order = 17, type = "toggle", - name = self.L.Options_Channels_ChannelRaidWarning_Name, - desc = self:Format(self.L.Options_Channels_ChannelRaidWarning_Desc, self.L.AddonName), + name = self.L.Options_Channel_RaidWarning_Name, + desc = self:Format(self.L.Options_Channel_RaidWarning_Desc, self.L.AddonName), }, instance = { - order = 8, + order = 18, type = "toggle", - name = self.L.Options_Channels_ChannelInstance_Name, - desc = self:Format(self.L.Options_Channels_ChannelInstance_Desc, self.L.AddonName), + name = self.L.Options_Channel_Instance_Name, + desc = self:Format(self.L.Options_Channel_Instance_Desc, self.L.AddonName), }, battleground = { - order = 9, + order = 19, type = "toggle", - name = self.L.Options_Channels_ChannelBattleground_Name, - desc = self:Format(self.L.Options_Channels_ChannelBattleground_Desc, self.L.AddonName), + name = self.L.Options_Channel_Battleground_Name, + desc = self:Format(self.L.Options_Channel_Battleground_Desc, self.L.AddonName), }, whisper = { - order = 10, + order = 20, type = "toggle", - name = self.L.Options_Channels_ChannelWhisper_Name, - desc = self:Format(self.L.Options_Channels_ChannelWhisper_Desc, self.L.AddonName), + name = self.L.Options_Channel_Whisper_Name, + desc = self:Format(self.L.Options_Channel_Whisper_Desc, self.L.AddonName), }, } }, @@ -110,7 +120,7 @@ function Grichelde:CreateOptionsUI() confirm = false, name = self.L.Options_Replacements_Add_Name, desc = self.L.Options_Replacements_Add_Desc, - func = function(info) self:AddReplacement(info) end + func = function(info) self:AddEmptyMapping(info) end }, deleteAll = { order = 1, @@ -119,55 +129,89 @@ function Grichelde:CreateOptionsUI() confirmText = self.L.Options_Replacements_DeleteAll_ConfirmText, name = self.L.Options_Replacements_DeleteAll_Name, desc = self.L.Options_Replacements_DeleteAll_Desc, - func = function(info) self:DeleteAllReplacements(info) end - } + func = function(info) self:DeleteAllMappings(info) end + }, + header = { + order = 3, + type = "description", + name = self.L.Options_Replacements_Header + }, + spacer = { + order = 4, + type = "header", + name = "" + }, } } } } end -function Grichelde:CreateReplacement(offset) +function Grichelde:CreateMapping(offset) return { order = offset or 9999, type = "group", name = function(info) return self:MappingName(info) end, - desc = self.L.Options_Replacement_Group_Desc, + desc = self.L.Options_Mapping_Group_Desc, childGroups = "tree", args = { searchText = { order = 0, type = "input", - name = self.L.Options_Replacement_SearchText_Name, - desc = self.L.Options_Replacement_SearchText_Desc, + name = self.L.Options_Mapping_SearchText_Name, + desc = self.L.Options_Mapping_SearchText_Desc, }, replaceText = { order = 1, type = "input", - name = self.L.Options_Replacement_ReplaceText_Name, - desc = self.L.Options_Replacement_ReplaceText_Desc, + name = self.L.Options_Mapping_ReplaceText_Name, + desc = self.L.Options_Mapping_ReplaceText_Desc, }, - ignoreCase = { + exactCase = { order = 2, type = "toggle", - name = self.L.Options_Replacement_IgnoreCase_Name, - desc = self.L.Options_Replacement_IgnoreCase_Desc, + name = self.L.Options_Mapping_ExactCase_Name, + desc = self.L.Options_Mapping_ExactCase_Desc, + width = "full", }, consolidate = { order = 3, type = "toggle", - name = self.L.Options_Replacement_Consolidate_Name, - desc = self.L.Options_Replacement_Consolidate_Desc, - width = 2 + name = self.L.Options_Mapping_Consolidate_Name, + desc = self.L.Options_Mapping_Consolidate_Desc, + width = "full" + }, + moveUp = { + order = 10, + type = "execute", + name = self.L.Options_Mapping_MoveUp_Name, + desc = self.L.Options_Mapping_MoveUp_Desc, + width = 0.25, + func = function(info) self:MoveUp(info) end + }, + moveDown = { + order = 11, + type = "execute", + name = self.L.Options_Mapping_MoveDown_Name, + desc = self.L.Options_Mapping_MoveDown_Desc, + width = 0.25, + func = function(info) self:MoveDown(info) end + }, + spacer = { + order = 18, + type = "description", + name = "", + width = 1, }, delete = { - order = 4, + order = 19, type = "execute", confirm = true, - confirmText = self.L.Options_Replacements_Delete_ConfirmText, - name = self.L.Options_Replacement_Delete_Name, - desc = self.L.Options_Replacement_Delete_Desc, - func = function(info) self:DeleteReplacement(info) end + confirmText = self.L.Options_Mapping_Delete_ConfirmText, + name = self.L.Options_Mapping_Delete_Name, + desc = self.L.Options_Mapping_Delete_Desc, + width = 0.5, + func = function(info) self:DeleteMapping(info) end }, } } @@ -195,17 +239,14 @@ function Grichelde:IsDisabled(info) end function Grichelde:MappingName(info) - local option = self.db.profile - local path = 1 - while (path <= #info) do - option = option[info[path]] - path = path + 1 - end +-- self:TracePrint("MappingName : info") +-- self:TracePrint(info) + local option = self.db.profile.replacements[info[2]] if nilOrEmpty(option.searchText) and nilOrEmpty(option.replaceText) then - return self.L.Options_Replacement_EmptyMapping + return self.L.Options_Mapping_EmptyMapping else - return self:Format(self.L.Options_Replacement_Group_Name, option.searchText or "", option.replaceText or "") + return self:Format(self.L.Options_Mapping_Group_Name, option.searchText or "", option.replaceText or "") end end @@ -225,7 +266,7 @@ function Grichelde:RefreshOptions(event) self:DebugPrint("Refreshing Profile %s on options change: %s", self.db:GetCurrentProfile(), event) end - self.db.profile.replacements = self:ReorderReplacements(self.db.profile.replacements) + self:ReorderReplacements() self:RefreshReplacements(self.db.profile.replacements) end @@ -246,62 +287,144 @@ function Grichelde:RefreshReplacements(replacementsTable) for replName, _ in pairs(replacementsTable or {}) do local _, replNumber = self:SplitOnFirstMatch(replName, "_") - replacements[replName] = self:CreateReplacement(toNumber(replNumber)) + replacements[replName] = self:CreateMapping(toNumber(replNumber)) end - self:TracePrint("RefreshReplacements : UI options:") - self:TracePrint(replacements) +-- self:TracePrint("RefreshReplacements : UI options:") +-- self:TracePrint(replacements) self.dialog:ConfigTableChanged(nil, self.name) end -function Grichelde:AddReplacement() - local replacements = self.db.profile.replacements - self:DebugPrint("AddReplacements : old DB entries:") +function Grichelde:AddEmptyMapping() + local replacements = self.db.profile.replacements or {} + + self:DebugPrint("AddEmptyMapping : old DB entries:") self:DebugPrint(replacements) - local maxRepl = tSize(replacements) - local newMapping = "replacement_" .. maxRepl - self:DebugPrint("AddReplacement : new replacement key:", newMapping) + local maxRepl = Grichelde.MAPPING_OFFSET + for replName, _ in pairs(replacements) do + local num = match(replName, "^replacement_(%d+)") + if num and maxRepl < toNumber(num) then + maxRepl = toNumber(num) + end + end + + local newMapping = "replacement_" .. toString(maxRepl + 1) + self:DebugPrint("AddEmptyMapping : new mapping key:", newMapping) - -- setting replacements[newMapping] = {} will deactivate defaults - replacements[newMapping].order = maxRepl - self:DebugPrint("AddReplacements : new DB entries:") + -- do NOT set self.db.profile.replacements = {} it will break defaults + replacements[newMapping].order = toString(maxRepl + 1) -- will be reordered anyway + self:DebugPrint("AddEmptyMapping : new DB entries:") self:DebugPrint(replacements) - --self.db.profile.replacements = replacements - self:RefreshOptions("AddReplacement " .. newMapping) + self:RefreshOptions("AddEmptyMapping " .. newMapping) self.dialog:SelectGroup(self.name, "replacements", newMapping) end -function Grichelde:DeleteReplacement(info) - self:DebugPrint("DeleteReplacement") - local option = self.db.profile - local path = 1 - while (path < #info - 1) do - option = option[info[path]] - --self:DebugPrint(option) - path = path + 1 +function Grichelde:MoveUp(info) + self:TracePrint("MoveUp : info") + for i = 0, #info do + self:TracePrint("%d = %s", i, info[i]) end - local optionPath = join(".", unpack(info, 1, #info)) - self:DebugPrint("delete option \"%s\": %s", optionPath, toString(option[info[path]])) - option[info[path]] = nil - self:RefreshOptions("DeleteReplacement " .. info[path]) + local replacements = self.db.profile.replacements or {} + local currentName = info[2] + + self:DebugPrint("MoveUp : \"%s\"", currentName) + self:DebugPrint(replacements[currentName]) + + local _, replNumber = self:SplitOnFirstMatch(currentName, "_") + local currentOrder = toNumber(replNumber) + + -- if not on top + if currentOrder ~= Grichelde.MAPPING_OFFSET then + local swapName = "replacement_" .. toString(currentOrder - 1) + + -- swap ordering + self:DebugPrint("swap with option %s", swapName) + + replacements[swapName].order = currentOrder + replacements[currentName].order = currentOrder - 1 + + self:RefreshOptions("MoveUp " .. currentName) + + self:DebugPrint("MoveUp : refresh focus on %s", swapName) + self.dialog:SelectGroup(self.name, "replacements", swapName) + else + self:DebugPrint("MoveUp : already on top") + end +end + +function Grichelde:MoveDown(info) + self:TracePrint("MoveDown : info") + for i = 0, #info do + self:TracePrint("%d = %s", i, info[i]) + end + + local replacements = self.db.profile.replacements or {} + local currentName = info[2] + + self:DebugPrint("MoveDown : \"%s\"", currentName) + self:DebugPrint(replacements[currentName]) + + local _, replNumber = self:SplitOnFirstMatch(currentName, "_") + local currentOrder = toNumber(replNumber) + + local maxRepl = Grichelde.MAPPING_OFFSET + for replName, _ in pairs(replacements) do + local num = match(replName, "^replacement_(%d+)") + if num and maxRepl < toNumber(num) then + maxRepl = toNumber(num) + end + end + + -- if not last element + self:DebugPrint("MoveDown : maxRepl: %d", maxRepl) + if currentOrder < maxRepl then + local swapName = "replacement_" .. toString(currentOrder + 1) + + -- swap ordering + self:DebugPrint("swap with option %s", swapName) + + replacements[swapName].order = currentOrder + replacements[currentName].order = currentOrder + 1 + + self:RefreshOptions("MoveDown " .. currentName) + + self:DebugPrint("MoveDown : refresh focus on %s", swapName) + self.dialog:SelectGroup(self.name, "replacements", swapName) + else + self:DebugPrint("MoveDown : already at bottom") + end +end + +function Grichelde:DeleteMapping(info) + self:TracePrint("DeleteMapping : info") + for i = 0, #info do + self:TracePrint("%d = %s", i, info[i]) + end + + local currentName = info[2] + + self:DebugPrint("delete option: %s", currentName) + self.db.profile.replacements[currentName] = nil + + self:RefreshOptions("DeleteMapping " .. currentName) - local _, replNumber = self:SplitOnFirstMatch(info[path], "_") + local _, replNumber = self:SplitOnFirstMatch(currentName, "_") local newMapping = "replacement_" .. toNumber(replNumber - 1) self.dialog:SelectGroup(self.name, "replacements", newMapping) end -function Grichelde:DeleteAllReplacements() - self:DebugPrint("DeleteAllReplacements : ") +function Grichelde:DeleteAllMappings() + self:DebugPrint("DeleteAllMappings") - --self.db.profile.replacements = {} + -- do NOT set self.db.profile.replacements = {} it will break defaults for replName, _ in pairs(self.db.profile.replacements or {}) do self.db.profile.replacements[replName] = nil end - self:AddReplacement() + self:AddEmptyMapping() - self:RefreshOptions("DeleteAllReplacements") + self:RefreshOptions("DeleteAllMappings") end diff --git a/GricheldeUpgrade.lua b/GricheldeUpgrade.lua index 0a6c742..db4c289 100644 --- a/GricheldeUpgrade.lua +++ b/GricheldeUpgrade.lua @@ -12,7 +12,7 @@ function Grichelde:Upgrade_To_v060() self:DebugPrint(replacements) for _, replTable in pairs(replacements) do - replTable.ignoreCase = not replTable["caseSensitive"] + replTable["ignoreCase"] = not replTable["caseSensitive"] replTable["caseSensitive"] = nil end @@ -21,14 +21,27 @@ function Grichelde:Upgrade_To_v060() return 0, 6, 0 end ---[[ -function Grichelde:Upgrade_To_v061() - return 0, 6, 1 -end - function Grichelde:Upgrade_To_v070() + self:PrefixedPrint(self.L.Upgrade_ToVersion, Grichelde.COLOR_CODES.ORANGE .. "0.7.0" .. Grichelde.COLOR_CODES.CLOSE) + + local replacements = self.db.profile.replacements or {} + self:DebugPrint("Upgrade_To_070 : old database") + self:DebugPrint(replacements) + + for _, replTable in pairs(replacements) do + replTable["exactCase"] = not replTable["ignoreCase"] + replTable["ignoreCase"] = nil + end + + self:DebugPrint("Upgrade_To_070 : new database") + self:DebugPrint(replacements) return 0, 7, 0 end + +--[[ +function Grichelde:Upgrade_To_v071() + return 0, 7, 1 +end ]] function Grichelde:UpgradeDatabase() @@ -46,17 +59,17 @@ function Grichelde:UpgradeDatabase() upgrade = upgrade + 1 major, minor, patch = self:Upgrade_To_v060(dbVersion) end + if minor < 7 then + upgrade = upgrade + 1 + major, minor, patch = self:Upgrade_To_v070(dbVersion) + end --[[ - if minor == 6 then + if minor == 7 then if patch < 1 then upgrade = upgrade + 1 - major, minor, patch = self:Upgrade_To_v061(dbVersion) + major, minor, patch = self:Upgrade_To_v71(dbVersion) end end - if minor < 7 then - upgrade = upgrade + 1 - major, minor, patch = self:Upgrade_To_v070(dbVersion) - end ]] end diff --git a/GricheldeUtils.lua b/GricheldeUtils.lua index 55c852b..d7d6d83 100644 --- a/GricheldeUtils.lua +++ b/GricheldeUtils.lua @@ -121,53 +121,27 @@ function Grichelde:PrefixedPrint(...) end function Grichelde:DebugPrint(obj, ...) - local function prefixedDebugPrint(...) + self:LogPrint(Grichelde.LOG_LEVEL.DEBUG, function(...) print(self.COLOR_CODES.GRAY .. self.L.AddonName .. self.COLOR_CODES.CLOSE .. ":", self:Format(...)) - end - - if (self.debug) then - if obj == nil then - prefixedDebugPrint("") - else - if type(obj) == "string" then - local l = select("#", ...) - if ( l == 0 or not find(obj, "%%")) then - prefixedDebugPrint(obj, ...) - else - -- sanitize nil values in vararg - local packed = { ... } - for i = 1, l do - packed[i] = toString(packed[i]) or "nil" - end - --- print("packed = ", packed) --- self:tPrint(packed) - -- cannot assign unpacked to a vararg variable and print it for debug - local fmtMsg = format(obj, unpack(packed, 1, l)) -- manually set count as unpack() stops on nil (bug with #table) - prefixedDebugPrint(fmtMsg) - end - elseif type(obj) == "table" then - tPrint(obj, 0, {}, prefixedDebugPrint) - else - prefixedDebugPrint(plainValue(obj)) - end - end - end + end, obj, ...) end function Grichelde:TracePrint(obj, ...) - local function prefixedTracePrint(...) + self:LogPrint(Grichelde.LOG_LEVEL.TRACE, function(...) print(self.COLOR_CODES.DARKGRAY .. self.L.AddonName .. self.COLOR_CODES.CLOSE .. ":", self:Format(...)) - end + end, obj, ...) +end - if (self.debug and self.trace) then +function Grichelde:LogPrint(logLevel, printFunc, obj, ...) + if (self.logLevel >= logLevel) then + local printF = printFunc or print if obj == nil then - prefixedTracePrint("") + printF("") else if type(obj) == "string" then local l = select("#", ...) if ( l == 0 or not find(obj, "%%")) then - prefixedTracePrint(obj, ...) + printF(obj, ...) else -- sanitize nil values in vararg local packed = { ... } @@ -179,13 +153,21 @@ function Grichelde:TracePrint(obj, ...) -- self:tPrint(packed) -- cannot assign unpacked to a vararg variable and print it for debug local fmtMsg = format(obj, unpack(packed, 1, l)) -- manually set count as unpack() stops on nil (bug with #table) - prefixedTracePrint(fmtMsg) + printF(fmtMsg) end elseif type(obj) == "table" then - tPrint(obj, 0, {}, prefixedTracePrint) + tPrint(obj, 0, {}, printF) else - prefixedTracePrint(plainValue(obj)) + printF(plainValue(obj)) end end end +end + +function Grichelde:PrintOptions() + self:DebugPrint(self.options.args.replacements.args) +end + +function Grichelde:PrintMappings() + self:DebugPrint(self.db.profile.replacements) end \ No newline at end of file diff --git a/localisation/deDE.lua b/localisation/deDE.lua index af5333c..6385213 100644 --- a/localisation/deDE.lua +++ b/localisation/deDE.lua @@ -26,32 +26,34 @@ L.Options_Enabled_Desc = "Aktiviert %s" L.Options_Channels_Group_Name = "Kan\195\164le" L.Options_Channels_Group_Desc = "%s ist in folgenden Kan\195\164len aktiv." -L.Options_Channels_ChannelSay_Name = "Sagen" -L.Options_Channels_ChannelSay_Desc = "Aktiviert %s im Kanal \"Sagen\"." -L.Options_Channels_ChannelEmote_Name = "Emote" -L.Options_Channels_ChannelEmote_Desc = "Aktiviert %s im Kanal \"Emote\"." -L.Options_Channels_ChannelYell_Name = "Schreien" -L.Options_Channels_ChannelYell_Desc = "Aktiviert %s im Kanal \"Schreien\"." -L.Options_Channels_ChannelParty_Name = "Gruppe" -L.Options_Channels_ChannelParty_Desc = "Aktiviert %s im Kanal \"Gruppe\"." -L.Options_Channels_ChannelPartyLeader_Name = "Gruppenanf\195\188hrer" -L.Options_Channels_ChannelPartyLeader_Desc = "Aktiviert %s im Kanal \"Gruppenanf\195\188hrer\"." -L.Options_Channels_ChannelGuild_Name = "Gilde" -L.Options_Channels_ChannelGuild_Desc = "Aktiviert %s im Kanal \"Gilde\"." -L.Options_Channels_ChannelOfficer_Name = "Offiziere" -L.Options_Channels_ChannelOfficer_Desc = "Aktiviert %s im Kanal \"Offiziere\"." -L.Options_Channels_ChannelRaid_Name = "Schlachtzug" -L.Options_Channels_ChannelRaid_Desc = "Aktiviert %s im Kanal \"Schlachtzug\"." -L.Options_Channels_ChannelRaidLeader_Name = "Schlachtzugsanf\195\188hrer" -L.Options_Channels_ChannelRaidLeader_Desc = "Aktiviert %s im Kanal \"Schlachtzugsanf\195\188hrer\"." -L.Options_Channels_ChannelRaidWarning_Name = "Schlachtzugswarnung" -L.Options_Channels_ChannelRaidWarning_Desc = "Aktiviert %s im Kanal \"Schlachtzugswarnung." -L.Options_Channels_ChannelInstance_Name = "Instanz" -L.Options_Channels_ChannelInstance_Desc = "Aktiviert %s im Kanal \"Instanz\"." -L.Options_Channels_ChannelBattleground_Name = "Schlachtfeld" -L.Options_Channels_ChannelBattleground_Desc = "Aktiviert %s im Kanal \"Schlachtfeld\"." -L.Options_Channels_ChannelWhisper_Name = "Fl\195\188stern" -L.Options_Channels_ChannelWhisper_Desc = "Aktiviert %s im Kanal \"Fl\195\188stern\"." +L.Options_Channels_Header = "Eine Ersetzung wird nur in den unten markierten Kan\195\164len durchgef\195\188hrt:" + +L.Options_Channel_Say_Name = "Sagen" +L.Options_Channel_Say_Desc = "Aktiviert %s im Kanal \"Sagen\"." +L.Options_Channel_Emote_Name = "Emote" +L.Options_Channel_Emote_Desc = "Aktiviert %s im Kanal \"Emote\"." +L.Options_Channel_Yell_Name = "Schreien" +L.Options_Channel_Yell_Desc = "Aktiviert %s im Kanal \"Schreien\"." +L.Options_Channel_Party_Name = "Gruppe" +L.Options_Channel_Party_Desc = "Aktiviert %s im Kanal \"Gruppe\"." +L.Options_Channel_PartyLeader_Name = "Gruppenanf\195\188hrer" +L.Options_Channel_PartyLeader_Desc = "Aktiviert %s im Kanal \"Gruppenanf\195\188hrer\"." +L.Options_Channel_Guild_Name = "Gilde" +L.Options_Channel_Guild_Desc = "Aktiviert %s im Kanal \"Gilde\"." +L.Options_Channel_Officer_Name = "Offiziere" +L.Options_Channel_Officer_Desc = "Aktiviert %s im Kanal \"Offiziere\"." +L.Options_Channel_Raid_Name = "Schlachtzug" +L.Options_Channel_Raid_Desc = "Aktiviert %s im Kanal \"Schlachtzug\"." +L.Options_Channel_RaidLeader_Name = "Schlachtzugsanf\195\188hrer" +L.Options_Channel_RaidLeader_Desc = "Aktiviert %s im Kanal \"Schlachtzugsanf\195\188hrer\"." +L.Options_Channel_RaidWarning_Name = "Schlachtzugswarnung" +L.Options_Channel_RaidWarning_Desc = "Aktiviert %s im Kanal \"Schlachtzugswarnung." +L.Options_Channel_Instance_Name = "Instanz" +L.Options_Channel_Instance_Desc = "Aktiviert %s im Kanal \"Instanz\"." +L.Options_Channel_Battleground_Name = "Schlachtfeld" +L.Options_Channel_Battleground_Desc = "Aktiviert %s im Kanal \"Schlachtfeld\"." +L.Options_Channel_Whisper_Name = "Fl\195\188stern" +L.Options_Channel_Whisper_Desc = "Aktiviert %s im Kanal \"Fl\195\188stern\"." L.Options_Replacements_Group_Name = "Ersetzungen" L.Options_Replacements_Group_Desc = "Diese Vorkommen werden in den aktivierten Kan\195\164len ersetzt." @@ -60,18 +62,25 @@ L.Options_Replacements_Add_Desc = "F\195\188gt eine neue Zuordnung hinzu." L.Options_Replacements_DeleteAll_Name = "Alle L\195\182schen" L.Options_Replacements_DeleteAll_Desc = "L\195\182scht alle Zuweisungen." L.Options_Replacements_DeleteAll_ConfirmText="Wirklich ALLE Zuweisungen l\195\182schen?" - -L.Options_Replacement_Group_Name = "%s => %s" -L.Options_Replacement_Group_Desc = "Dieses Vorkommen wird in den aktivierten Kan\195\164len ersetzt." -L.Options_Replacement_EmptyMapping = "(keine)" -L.Options_Replacement_SearchText_Name = "Suchtext:" -L.Options_Replacement_SearchText_Desc = "Dieser Text wird in der Chateingabe gesucht." -L.Options_Replacement_ReplaceText_Name = "Ersetzung:" -L.Options_Replacement_ReplaceText_Desc = "Jeder Suchtreffer wird mit diesem Text ersetzt." -L.Options_Replacement_IgnoreCase_Name = "ignoriere Gro\195\159- und Kleinschreibung" -L.Options_Replacement_IgnoreCase_Desc = "Wenn nicht gesetzt, muss die Groß\195\159- und Kleinschreibung des Suchtextes exakt \195\188berein stimmen.|nDie Groß\195\159schreibung jedes Zeichens wird bei der Ersetzung \195\188bernommen." -L.Options_Replacement_Consolidate_Name = "Fa\195\159e aufeinanderfolgende Treffer zusammen" -L.Options_Replacement_Consolidate_Desc = "Wenn durch die Ersetzung die Zeichenfolge mehrfach hintereinander steht,|nfasse sie zu einem Vorkommen zusammen." -L.Options_Replacement_Delete_Name = "L\195\182schen" -L.Options_Replacement_Delete_Desc = "L\195\182scht diese Zuweisung." -L.Options_Replacements_Delete_ConfirmText="Diese Zuweisung l\195\182schen?" \ No newline at end of file +L.Options_Replacements_Header = "Die Vorkommen links vom Pfeil ( => ) werden in den aktivierten Kan\195\164len gesucht und durch den Text rechts vom Pfeil ersetzt." + .."|nWird die Groß\195\159- und Kleinschreibung ignoriert, wird die Groß\195\159schreibung jedes Zeichens wird bei der Ersetzung \195\188bernommen." + .."|nDas Zusammenfassen aufeinanderfolgender Treffer vermeidet unsch\195\182ne Wiederholungen, die durch die Ersetzung entstehen k\195\182nnen." + .."|nMit den beiden Standard-Ersetzung wird so aus \"Tasse\" => \"Ckache\"." +L.Options_Mapping_Group_Name = "%s => %s" +L.Options_Mapping_Group_Desc = "Dieses Vorkommen wird in den aktivierten Kan\195\164len ersetzt." +L.Options_Mapping_EmptyMapping = "(keine)" +L.Options_Mapping_SearchText_Name = "Suchtext:" +L.Options_Mapping_SearchText_Desc = "Dieser Text wird in der Chateingabe gesucht." +L.Options_Mapping_ReplaceText_Name = "Ersetzung:" +L.Options_Mapping_ReplaceText_Desc = "Jeder Suchtreffer wird mit diesem Text ersetzt." +L.Options_Mapping_ExactCase_Name = "exakte Gro\195\159- und Kleinschreibung" +L.Options_Mapping_ExactCase_Desc = "Wenn gesetzt, muss die Groß\195\159- und Kleinschreibung des Suchtextes exakt \195\188berein stimmen. Anderfalls wird die Groß\195\159schreibung jedes Zeichens bei der Ersetzung \195\188bernommen." +L.Options_Mapping_Consolidate_Name = "Fa\195\159e aufeinanderfolgende Treffer zusammen" +L.Options_Mapping_Consolidate_Desc = "Wenn durch die Ersetzung die Zeichenfolge mehrfach hintereinander steht,|nfasse sie zu einem Vorkommen zusammen." +L.Options_Mapping_MoveUp_Name = "^" +L.Options_Mapping_MoveUp_Desc = "nach oben verschieben" +L.Options_Mapping_MoveDown_Name = "v" +L.Options_Mapping_MoveDown_Desc = "nach unten verschieben" +L.Options_Mapping_Delete_Name = "L\195\182schen" +L.Options_Mapping_Delete_Desc = "L\195\182scht diese Zuweisung." +L.Options_Mapping_Delete_ConfirmText="Diese Zuweisung l\195\182schen?" \ No newline at end of file diff --git a/localisation/enUS.lua b/localisation/enUS.lua index bdf82ee..5ca6bdf 100644 --- a/localisation/enUS.lua +++ b/localisation/enUS.lua @@ -26,32 +26,34 @@ L.Options_Enabled_Desc = "Enables %s" L.Options_Channels_Group_Name = "Channels" L.Options_Channels_Group_Desc = "%s is active in the following channels." -L.Options_Channels_ChannelSay_Name = "Say" -L.Options_Channels_ChannelSay_Desc = "Activates %s in channel \"Say\"." -L.Options_Channels_ChannelEmote_Name = "Emote" -L.Options_Channels_ChannelEmote_Desc = "Activates %s in channel \"Emote\"." -L.Options_Channels_ChannelYell_Name = "Yell" -L.Options_Channels_ChannelYell_Desc = "Activates %s in channel \"Yell\"." -L.Options_Channels_ChannelParty_Name = "Party" -L.Options_Channels_ChannelParty_Desc = "Activates %s in channel \"Party\"." -L.Options_Channels_ChannelPartyLeader_Name = "Party Leader" -L.Options_Channels_ChannelPartyLeader_Desc = "Activates %s in channel \"Party Leader\"." -L.Options_Channels_ChannelGuild_Name = "Guild" -L.Options_Channels_ChannelGuild_Desc = "Activates %s in channel \"Guild\"." -L.Options_Channels_ChannelOfficer_Name = "Officers" -L.Options_Channels_ChannelOfficer_Desc = "Activates %s in channel \"Officers\"." -L.Options_Channels_ChannelRaid_Name = "Raid" -L.Options_Channels_ChannelRaid_Desc = "Activates %s in channel \"Raid\"." -L.Options_Channels_ChannelRaidLeader_Name = "Raid Leader" -L.Options_Channels_ChannelRaidLeader_Desc = "Activates %s in channel \"Raid Leader\"." -L.Options_Channels_ChannelRaidWarning_Name = "Raid Warning" -L.Options_Channels_ChannelRaidWarning_Desc = "Activates %s in channel \"Raid Warning\"." -L.Options_Channels_ChannelInstance_Name = "Instance" -L.Options_Channels_ChannelInstance_Desc = "Activates %s in channel \"Instance\"." -L.Options_Channels_ChannelBattleground_Name = "Battleground" -L.Options_Channels_ChannelBattleground_Desc = "Activates %s in channel \"Battleground\"." -L.Options_Channels_ChannelWhisper_Name = "Whisper" -L.Options_Channels_ChannelWhisper_Desc = "Activates %s in channel \"Whisper\"." +L.Options_Channels_Header = "Text replacement will only be done for marked channels below:" + +L.Options_Channel_Say_Name = "Say" +L.Options_Channel_Say_Desc = "Activates %s in channel \"Say\"." +L.Options_Channel_Emote_Name = "Emote" +L.Options_Channel_Emote_Desc = "Activates %s in channel \"Emote\"." +L.Options_Channel_Yell_Name = "Yell" +L.Options_Channel_Yell_Desc = "Activates %s in channel \"Yell\"." +L.Options_Channel_Party_Name = "Party" +L.Options_Channel_Party_Desc = "Activates %s in channel \"Party\"." +L.Options_Channel_PartyLeader_Name = "Party Leader" +L.Options_Channel_PartyLeader_Desc = "Activates %s in channel \"Party Leader\"." +L.Options_Channel_Guild_Name = "Guild" +L.Options_Channel_Guild_Desc = "Activates %s in channel \"Guild\"." +L.Options_Channel_Officer_Name = "Officers" +L.Options_Channel_Officer_Desc = "Activates %s in channel \"Officers\"." +L.Options_Channel_Raid_Name = "Raid" +L.Options_Channel_Raid_Desc = "Activates %s in channel \"Raid\"." +L.Options_Channel_RaidLeader_Name = "Raid Leader" +L.Options_Channel_RaidLeader_Desc = "Activates %s in channel \"Raid Leader\"." +L.Options_Channel_RaidWarning_Name = "Raid Warning" +L.Options_Channel_RaidWarning_Desc = "Activates %s in channel \"Raid Warning\"." +L.Options_Channel_Instance_Name = "Instance" +L.Options_Channel_Instance_Desc = "Activates %s in channel \"Instance\"." +L.Options_Channel_Battleground_Name = "Battleground" +L.Options_Channel_Battleground_Desc = "Activates %s in channel \"Battleground\"." +L.Options_Channel_Whisper_Name = "Whisper" +L.Options_Channel_Whisper_Desc = "Activates %s in channel \"Whisper\"." L.Options_Replacements_Group_Name = "Replacements" L.Options_Replacements_Group_Desc = "These lookups will be replaced in activated channels." @@ -60,18 +62,25 @@ L.Options_Replacements_Add_Desc = "Adds a new replacement mapping." L.Options_Replacements_DeleteAll_Name = "Delete All" L.Options_Replacements_DeleteAll_Desc = "Deletes all replacement mappings." L.Options_Replacements_DeleteAll_ConfirmText = "Do you really want to delete ALL replacement mappings?" - -L.Options_Replacement_Group_Name = "%s => %s" -L.Options_Replacement_Group_Desc = "This lookup will be replaced in activated channels." -L.Options_Replacement_EmptyMapping = "(none)" -L.Options_Replacement_SearchText_Name = "Search for:" -L.Options_Replacement_SearchText_Desc = "This text is looked up in your chat input box." -L.Options_Replacement_ReplaceText_Name = "Replacement:" -L.Options_Replacement_ReplaceText_Desc = "Any match will be replaced with this text." -L.Options_Replacement_IgnoreCase_Name = "ignore case" -L.Options_Replacement_IgnoreCase_Desc = "When deactivated matches are case-sensitive.|nThe case for each letter of the matching text is honoured when replaced." -L.Options_Replacement_Consolidate_Name = "consolidate consecutive matches" -L.Options_Replacement_Consolidate_Desc = "If after the replacement a text sequence is repeated|ndirectly after another, treat them as one occurrence." -L.Options_Replacement_Delete_Name = "Delete" -L.Options_Replacement_Delete_Desc = "Deletes this replacement mapping." -L.Options_Replacements_Delete_ConfirmText = "Delete this replacement mapping?" \ No newline at end of file +L.Options_Replacements_Header = "All matches on the lefthand side of the arrow ( => ) will be replaced in activated channels by the text on the righthand side." + .. "|nIf case sensivity is ignored, the case for each letter of the matching text is taken over when replaced." + .. "|nConsolidation of consecutive matches prevent unaesthetic repetitions of letters introduced by replacements." + .. "|nWith both default mappings active, the mapping would be \"Tossing\" => \"Ckoching\"." +L.Options_Mapping_Group_Name = "%s => %s" +L.Options_Mapping_Group_Desc = "This lookup will be replaced in activated channels." +L.Options_Mapping_EmptyMapping = "(none)" +L.Options_Mapping_SearchText_Name = "Search for:" +L.Options_Mapping_SearchText_Desc = "This text is looked up in your chat input box." +L.Options_Mapping_ReplaceText_Name = "Replacement:" +L.Options_Mapping_ReplaceText_Desc = "Any match will be replaced with this text." +L.Options_Mapping_ExactCase_Name = "exact case" +L.Options_Mapping_ExactCase_Desc = "When set, matches must be case-sensitive. Otherwise the case for each letter of the matching text is taken over when replaced." +L.Options_Mapping_Consolidate_Name = "consolidate consecutive matches" +L.Options_Mapping_Consolidate_Desc = "If after the replacement a text sequence is repeated|ndirectly after another, treat them as one occurrence." +L.Options_Mapping_MoveUp_Name = "^" +L.Options_Mapping_MoveUp_Desc = "move up" +L.Options_Mapping_MoveDown_Name = "v" +L.Options_Mapping_MoveDown_Desc = "move down" +L.Options_Mapping_Delete_Name = "Delete" +L.Options_Mapping_Delete_Desc = "Deletes this replacement mapping." +L.Options_Mapping_Delete_ConfirmText = "Delete this replacement mapping?" \ No newline at end of file