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
master 0.7.0
Lothar Buchholz 5 years ago
parent a29f6486fe
commit cb2c995a82

@ -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/), 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). 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 ### Added
- handle replacement via slash command - 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 ### Added
- honour capital/mixed cases for ignore case - honour capital/mixed cases for ignore case
- consolidate consecutive matches - consolidate consecutive matches
@ -23,7 +33,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added ### Added
- add replacements via options UI - add replacements via options UI
## Version 0.4.0 - 2020-05-30 ## Version 0.4.0 (unreleased) - 2020-05-30
### Added ### Added
- restructured files - restructured files
- extract functions and color codes - 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
- fixed DB storange and debug printing - fixed DB storange and debug printing
## Version 0.2.2 - 2020-05-26 ## Version 0.2.2 (unreleased) - 2020-05-26
### Added ### Added
- added Options UI under Interface Options - added Options UI under Interface Options
- store settings in profiles - store settings in profiles
- added more translations - added more translations
## Version 0.2.1 - 2020-05-25 ## Version 0.2.1 (unreleased) - 2020-05-25
### Added ### Added
- support automatic packaging for curseforge via .pkgmeta - support automatic packaging for curseforge via .pkgmeta
- include project logo - 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 - handle SendChatMessage ordering if addon Misspelled is also installed
- break long texts in chunks of 255 length - break long texts in chunks of 255 length
## Version 0.1 - 2020-05-24 ## Version 0.1 (unreleased) - 2020-05-24
### Added ### Added
- bootstrap addon with Ace3 based on [Misspelled](https://www.curseforge.com/wow/addons/misspelled) - bootstrap addon with Ace3 based on [Misspelled](https://www.curseforge.com/wow/addons/misspelled)

@ -22,10 +22,8 @@ local Grichelde = LibStub("AceAddon-3.0"):NewAddon(AddonTable, AddonName, "AceCo
Grichelde.L = LibStub("AceLocale-3.0"):GetLocale("Grichelde", true) Grichelde.L = LibStub("AceLocale-3.0"):GetLocale("Grichelde", true)
Grichelde.version = GetAddOnMetadata(AddonName, "Version") Grichelde.version = GetAddOnMetadata(AddonName, "Version")
Grichelde.build = GetAddOnMetadata(AddonName, "X-Build") or "Experimental" Grichelde.build = GetAddOnMetadata(AddonName, "X-Build") or "Experimental"
Grichelde.hooks = {}
Grichelde.classic = _G.WOW_PROJECT_ID == _G.WOW_PROJECT_CLASSIC Grichelde.classic = _G.WOW_PROJECT_ID == _G.WOW_PROJECT_CLASSIC
Grichelde.debug = false Grichelde.logLevel = 0 -- cannot reference Grichelde.LOG_LEVELs here as they are loaded afterwards
Grichelde.trace = false
-- publish to global env -- publish to global env
_G.Grichelde = Grichelde _G.Grichelde = Grichelde
@ -38,9 +36,8 @@ function Grichelde:OnInitialize()
self.options, self.dialog = self:SetupOptions() self.options, self.dialog = self:SetupOptions()
-- load replacements from database -- populate UI from database
self:RefreshOptions("OnProfileChanged") self:RefreshOptions("OnProfileChanged")
self:DebugPrint(self.db.profile)
self:SetupSlashCommands() self:SetupSlashCommands()
end end

@ -3,7 +3,7 @@
## Title: Grichelde ## Title: Grichelde
## Notes: Replaces characters from the chat box ## Notes: Replaces characters from the chat box
## Notes-de: Ersetzt eingegebene Zeichen in der Chat-Zeile ## Notes-de: Ersetzt eingegebene Zeichen in der Chat-Zeile
## Version: 0.6.0 ## Version: 0.7.0-beta
## Author: Teilzeit-Jedi ## Author: Teilzeit-Jedi
## eMail: tj@teilzeit-jedi.de ## eMail: tj@teilzeit-jedi.de

@ -210,7 +210,36 @@ function Grichelde:ReplaceCharacters(text)
local replace = replTable.replaceText local replace = replTable.replaceText
consolidate[replName] = {} 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) self:DebugPrint("ReplaceCharacters : \"%s => %s\" (ignoreCase)", search, replace)
local pos, offset = 1, 0 local pos, offset = 1, 0
local lowerResult = toLower(result) local lowerResult = toLower(result)
@ -253,19 +282,26 @@ function Grichelde:ReplaceCharacters(text)
self:TracePrint("rest: %s, n: %s, lastCase: %s", remainingReplace, nextLetter, lastCase) self:TracePrint("rest: %s, n: %s, lastCase: %s", remainingReplace, nextLetter, lastCase)
if (isUpper(nextLetter)) then if (isUpper(nextLetter)) then
if lastCase == nil or lastCase == false then
repl = repl .. remainingReplace
else
repl = repl .. toUpper(remainingReplace) repl = repl .. toUpper(remainingReplace)
end
elseif (isLower(nextLetter)) then elseif (isLower(nextLetter)) then
if lastCase == nil or lastCase == true then
repl = repl .. remainingReplace
else
repl = repl .. toLower(remainingReplace) repl = repl .. toLower(remainingReplace)
end
else else
-- no letter -- no letter
if lastCase == nil then
repl = repl .. remainingReplace repl = repl .. remainingReplace
-- if lastCase == nil then elseif lastCase == false then
-- repl = repl .. remainingReplace repl = repl .. toLower(remainingReplace)
-- elseif lastCase == false then else
-- repl = repl .. toLower(remainingReplace) repl = repl .. toUpper(remainingReplace)
-- else end
-- repl = repl .. toUpper(remainingReplace)
-- end
end end
end end
@ -285,35 +321,6 @@ function Grichelde:ReplaceCharacters(text)
pos = pos2 + 1 pos = pos2 + 1
pos1, pos2 = find(lowerResult, lowerSearch, pos) pos1, pos2 = find(lowerResult, lowerSearch, pos)
end 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 end
if before ~= result then if before ~= result then

@ -2,23 +2,28 @@
local _G = _G local _G = _G
local Grichelde = _G.Grichelde 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: -- colors:
Grichelde.COLOR_CODES = {} Grichelde.COLOR_CODES = {}
Grichelde.COLOR_CODES.PREFIX = "|c00FFAA00" Grichelde.COLOR_CODES.PREFIX = "|c00FFAA00"
-- https://github.com/stoneharry/Misc-WoW-Stuff/blob/master/EoC%20Interface/FrameXML/Constants.lua -- 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.NORMAL = _G.NORMAL_FONT_COLOR_CODE or "|cffffd200"
Grichelde.COLOR_CODES.HIGHLIGHT = _G.HIGHLIGHT_FONT_COLOR_CODE or "|cffffffff"; 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.RED = _G.RED_FONT_COLOR_CODE or "|cffff2020"
Grichelde.COLOR_CODES.GREEN = _G.GREEN_FONT_COLOR_CODE or "|cff20ff20"; Grichelde.COLOR_CODES.GREEN = _G.GREEN_FONT_COLOR_CODE or "|cff20ff20"
Grichelde.COLOR_CODES.LIGHTGRAY = "|cffC0C0C0"; Grichelde.COLOR_CODES.LIGHTGRAY = "|cffC0C0C0"
Grichelde.COLOR_CODES.GRAY = _G.GRAY_FONT_COLOR_CODE or "|cff808080"; Grichelde.COLOR_CODES.GRAY = _G.GRAY_FONT_COLOR_CODE or "|cff808080"
Grichelde.COLOR_CODES.DARKGRAY = "|cff404040"; Grichelde.COLOR_CODES.DARKGRAY = "|cff404040"
Grichelde.COLOR_CODES.YELLOW = _G.YELLOW_FONT_COLOR_CODE or "|cffffff00"; 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.LIGHTYELLOW = _G.LIGHTYELLOW_FONT_COLOR_CODE or "|cffffff9a"
Grichelde.COLOR_CODES.ORANGE = _G.ORANGE_FONT_COLOR_CODE or "|cffff7f3f"; 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.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" } 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 it = it + 1
if sortedKeys[it] then if sortedKeys[it] then
return sortedKeys[it], t[sortedKeys[it]] return sortedKeys[it], t[sortedKeys[it]]
else
return nil
end end
end end
end end
@ -89,20 +96,20 @@ local function tClone(orig)
return copy return copy
end end
local function isChar(char) local function isChar(word)
return Grichelde.functions.find(char, "%a+") return Grichelde.functions.find(word, "%a+")
end end
local function isNumber(digit) local function isNumber(digit)
return Grichelde.functions.find(Grichelde.functions.toString(digit), "%d+") return Grichelde.functions.find(digit, "%d+")
end end
local function isUpper(char) local function isUpper(word)
return Grichelde.functions.isChar(char) and char == Grichelde.functions.toUpper(char) return Grichelde.functions.isChar(word) and word == Grichelde.functions.toUpper(word)
end end
local function isLower(char) local function isLower(word)
return Grichelde.functions.isChar(char) and char == Grichelde.functions.toLower(char) return Grichelde.functions.isChar(word) and word == Grichelde.functions.toLower(word)
end end
local function isCapital(word) local function isCapital(word)

@ -2,8 +2,8 @@
local _G = _G local _G = _G
local Grichelde = _G.Grichelde local Grichelde = _G.Grichelde
local spairs, unpack, join, toString local pairs, tInsert, tClone, unpack, join, toString
= Grichelde.functions.spairs, Grichelde.functions.unpack, Grichelde.functions.join, Grichelde.functions.toString = Grichelde.functions.pairs, Grichelde.functions.tInsert, Grichelde.functions.tClone, Grichelde.functions.unpack, Grichelde.functions.join, Grichelde.functions.toString
function Grichelde:GetDefaultConfig() function Grichelde:GetDefaultConfig()
return { return {
@ -24,21 +24,28 @@ function Grichelde:GetDefaultConfig()
order = 9999, order = 9999,
searchText = "", searchText = "",
replaceText = "", replaceText = "",
ignoreCase = true, exactCase = false,
consolidate = true, consolidate = true,
}, },
replacement_0 = { replacement_10 = {
order = 5, order = 10,
searchText = "s", searchText = "s",
replaceText = "ch", replaceText = "ch",
ignoreCase = true, exactCase = false,
consolidate = true, consolidate = true,
}, },
replacement_1 = { replacement_11 = {
order = 9, order = 11,
searchText = "t", searchText = "t",
replaceText = "ck", replaceText = "ck",
ignoreCase = true, exactCase = false,
consolidate = true,
},
replacement_12 = {
order = 12,
searchText = "Zark",
replaceText = "toter Schamane",
exactCase = false,
consolidate = true, consolidate = true,
} }
} }
@ -59,10 +66,17 @@ function Grichelde:LoadDatabase()
end end
function Grichelde:SyncToDatabase(info, val) 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 option = self.db.profile
local path = 1 local path = 1
while (path < #info) do while (path < #info) do
if info[path] ~= "mappings" then
option = option[info[path]] -- or nil option = option[info[path]] -- or nil
end
path = path + 1 path = path + 1
end end
local optionPath = join(".", unpack(info, 1, #info)) local optionPath = join(".", unpack(info, 1, #info))
@ -71,36 +85,72 @@ function Grichelde:SyncToDatabase(info, val)
end end
function Grichelde:ReadFromDatabase(info) 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 option = self.db.profile
local path = 1 local path = 1
while (path <= #info) do while (path <= #info) do
if info[path] ~= "mappings" then
option = option[info[path]] -- or nil option = option[info[path]] -- or nil
end
path = path + 1 path = path + 1
end end
local optionPath = join(".", unpack(info, 1, #info)) 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 return option
end end
--- Sorts a replacements table by order sub-field. --- Sorts a replacements table by order sub-field and rename.
--- Usually called with with self.db.profile.replacements --- Do NOT reassign self.db.profile.replacements here or with its output as it will break defaults
-- @param replacementsTable table function Grichelde:ReorderReplacements()
-- @return table local replacements = self.db.profile.replacements or {}
function Grichelde:ReorderReplacements(replacementsTable)
local replacements = replacementsTable or {}
self:TracePrint("ReorderReplacements : unsorted table") 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
self:TracePrint("ReorderReplacements : size: %d, orderToName", size)
self:TracePrint(orderToName)
local sorted = {}
local index, count = 0, 0
local index = 0 while count < size do
for _, replTable in spairs(replacements) do local replName = orderToName[index]
sortedReplacements["replacement_" .. index] = replTable if replName and replacements[replName] then
sortedReplacements["replacement_" .. index].order = index 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 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 end
self:TracePrint("ReorderReplacements : sorted table") self:DebugPrint("ReorderReplacements : sorted table")
self:TracePrint(sortedReplacements) self:DebugPrint(self.db.profile.replacements)
return sortedReplacements
end end

@ -2,8 +2,8 @@
local _G = _G local _G = _G
local Grichelde = _G.Grichelde local Grichelde = _G.Grichelde
local nilOrEmpty, pairs, tSize, unpack, find, join, toString, toNumber local nilOrEmpty, pairs, find, match, 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 = Grichelde.functions.nilOrEmpty, Grichelde.functions.pairs, Grichelde.functions.find, Grichelde.functions.match, Grichelde.functions.toString, Grichelde.functions.toNumber
function Grichelde:CreateOptionsUI() function Grichelde:CreateOptionsUI()
return { return {
@ -29,71 +29,81 @@ function Grichelde:CreateOptionsUI()
name = self.L.Options_Channels_Group_Name, name = self.L.Options_Channels_Group_Name,
desc = self:Format(self.L.Options_Channels_Group_Desc, self.L.AddonName), desc = self:Format(self.L.Options_Channels_Group_Desc, self.L.AddonName),
args = { args = {
header = {
order = 1,
type = "description",
name = self.L.Options_Channels_Header
},
spacer = {
order = 2,
type = "header",
name = ""
},
say = { say = {
order = 0, order = 10,
type = "toggle", type = "toggle",
name = self.L.Options_Channels_ChannelSay_Name, name = self.L.Options_Channel_Say_Name,
desc = self:Format(self.L.Options_Channels_ChannelSay_Desc, self.L.AddonName), desc = self:Format(self.L.Options_Channel_Say_Desc, self.L.AddonName),
}, },
emote = { emote = {
order = 1, order = 11,
type = "toggle", type = "toggle",
name = self.L.Options_Channels_ChannelEmote_Name, name = self.L.Options_Channel_Emote_Name,
desc = self:Format(self.L.Options_Channels_ChannelEmote_Desc, self.L.AddonName), desc = self:Format(self.L.Options_Channel_Emote_Desc, self.L.AddonName),
}, },
yell = { yell = {
order = 2, order = 12,
type = "toggle", type = "toggle",
name = self.L.Options_Channels_ChannelYell_Name, name = self.L.Options_Channel_Yell_Name,
desc = self:Format(self.L.Options_Channels_ChannelYell_Desc, self.L.AddonName), desc = self:Format(self.L.Options_Channel_Yell_Desc, self.L.AddonName),
}, },
party = { party = {
order = 3, order = 13,
type = "toggle", type = "toggle",
name = self.L.Options_Channels_ChannelParty_Name, name = self.L.Options_Channel_Party_Name,
desc = self:Format(self.L.Options_Channels_ChannelParty_Desc, self.L.AddonName), desc = self:Format(self.L.Options_Channel_Party_Desc, self.L.AddonName),
}, },
guild = { guild = {
order = 4, order = 14,
type = "toggle", type = "toggle",
name = self.L.Options_Channels_ChannelGuild_Name, name = self.L.Options_Channel_Guild_Name,
desc = self:Format(self.L.Options_Channels_ChannelGuild_Desc, self.L.AddonName), desc = self:Format(self.L.Options_Channel_Guild_Desc, self.L.AddonName),
}, },
officer = { officer = {
order = 5, order = 15,
type = "toggle", type = "toggle",
name = self.L.Options_Channels_ChannelOfficer_Name, name = self.L.Options_Channel_Officer_Name,
desc = self:Format(self.L.Options_Channels_ChannelOfficer_Desc, self.L.AddonName), desc = self:Format(self.L.Options_Channel_Officer_Desc, self.L.AddonName),
}, },
raid = { raid = {
order = 6, order = 16,
type = "toggle", type = "toggle",
name = self.L.Options_Channels_ChannelRaid_Name, name = self.L.Options_Channel_Raid_Name,
desc = self:Format(self.L.Options_Channels_ChannelRaid_Desc, self.L.AddonName), desc = self:Format(self.L.Options_Channel_Raid_Desc, self.L.AddonName),
}, },
raidWarning = { raidWarning = {
order = 7, order = 17,
type = "toggle", type = "toggle",
name = self.L.Options_Channels_ChannelRaidWarning_Name, name = self.L.Options_Channel_RaidWarning_Name,
desc = self:Format(self.L.Options_Channels_ChannelRaidWarning_Desc, self.L.AddonName), desc = self:Format(self.L.Options_Channel_RaidWarning_Desc, self.L.AddonName),
}, },
instance = { instance = {
order = 8, order = 18,
type = "toggle", type = "toggle",
name = self.L.Options_Channels_ChannelInstance_Name, name = self.L.Options_Channel_Instance_Name,
desc = self:Format(self.L.Options_Channels_ChannelInstance_Desc, self.L.AddonName), desc = self:Format(self.L.Options_Channel_Instance_Desc, self.L.AddonName),
}, },
battleground = { battleground = {
order = 9, order = 19,
type = "toggle", type = "toggle",
name = self.L.Options_Channels_ChannelBattleground_Name, name = self.L.Options_Channel_Battleground_Name,
desc = self:Format(self.L.Options_Channels_ChannelBattleground_Desc, self.L.AddonName), desc = self:Format(self.L.Options_Channel_Battleground_Desc, self.L.AddonName),
}, },
whisper = { whisper = {
order = 10, order = 20,
type = "toggle", type = "toggle",
name = self.L.Options_Channels_ChannelWhisper_Name, name = self.L.Options_Channel_Whisper_Name,
desc = self:Format(self.L.Options_Channels_ChannelWhisper_Desc, self.L.AddonName), desc = self:Format(self.L.Options_Channel_Whisper_Desc, self.L.AddonName),
}, },
} }
}, },
@ -110,7 +120,7 @@ function Grichelde:CreateOptionsUI()
confirm = false, confirm = false,
name = self.L.Options_Replacements_Add_Name, name = self.L.Options_Replacements_Add_Name,
desc = self.L.Options_Replacements_Add_Desc, desc = self.L.Options_Replacements_Add_Desc,
func = function(info) self:AddReplacement(info) end func = function(info) self:AddEmptyMapping(info) end
}, },
deleteAll = { deleteAll = {
order = 1, order = 1,
@ -119,55 +129,89 @@ function Grichelde:CreateOptionsUI()
confirmText = self.L.Options_Replacements_DeleteAll_ConfirmText, confirmText = self.L.Options_Replacements_DeleteAll_ConfirmText,
name = self.L.Options_Replacements_DeleteAll_Name, name = self.L.Options_Replacements_DeleteAll_Name,
desc = self.L.Options_Replacements_DeleteAll_Desc, 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 end
function Grichelde:CreateReplacement(offset) function Grichelde:CreateMapping(offset)
return { return {
order = offset or 9999, order = offset or 9999,
type = "group", type = "group",
name = function(info) return self:MappingName(info) end, name = function(info) return self:MappingName(info) end,
desc = self.L.Options_Replacement_Group_Desc, desc = self.L.Options_Mapping_Group_Desc,
childGroups = "tree", childGroups = "tree",
args = { args = {
searchText = { searchText = {
order = 0, order = 0,
type = "input", type = "input",
name = self.L.Options_Replacement_SearchText_Name, name = self.L.Options_Mapping_SearchText_Name,
desc = self.L.Options_Replacement_SearchText_Desc, desc = self.L.Options_Mapping_SearchText_Desc,
}, },
replaceText = { replaceText = {
order = 1, order = 1,
type = "input", type = "input",
name = self.L.Options_Replacement_ReplaceText_Name, name = self.L.Options_Mapping_ReplaceText_Name,
desc = self.L.Options_Replacement_ReplaceText_Desc, desc = self.L.Options_Mapping_ReplaceText_Desc,
}, },
ignoreCase = { exactCase = {
order = 2, order = 2,
type = "toggle", type = "toggle",
name = self.L.Options_Replacement_IgnoreCase_Name, name = self.L.Options_Mapping_ExactCase_Name,
desc = self.L.Options_Replacement_IgnoreCase_Desc, desc = self.L.Options_Mapping_ExactCase_Desc,
width = "full",
}, },
consolidate = { consolidate = {
order = 3, order = 3,
type = "toggle", type = "toggle",
name = self.L.Options_Replacement_Consolidate_Name, name = self.L.Options_Mapping_Consolidate_Name,
desc = self.L.Options_Replacement_Consolidate_Desc, desc = self.L.Options_Mapping_Consolidate_Desc,
width = 2 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 = { delete = {
order = 4, order = 19,
type = "execute", type = "execute",
confirm = true, confirm = true,
confirmText = self.L.Options_Replacements_Delete_ConfirmText, confirmText = self.L.Options_Mapping_Delete_ConfirmText,
name = self.L.Options_Replacement_Delete_Name, name = self.L.Options_Mapping_Delete_Name,
desc = self.L.Options_Replacement_Delete_Desc, desc = self.L.Options_Mapping_Delete_Desc,
func = function(info) self:DeleteReplacement(info) end width = 0.5,
func = function(info) self:DeleteMapping(info) end
}, },
} }
} }
@ -195,17 +239,14 @@ function Grichelde:IsDisabled(info)
end end
function Grichelde:MappingName(info) function Grichelde:MappingName(info)
local option = self.db.profile -- self:TracePrint("MappingName : info")
local path = 1 -- self:TracePrint(info)
while (path <= #info) do local option = self.db.profile.replacements[info[2]]
option = option[info[path]]
path = path + 1
end
if nilOrEmpty(option.searchText) and nilOrEmpty(option.replaceText) then if nilOrEmpty(option.searchText) and nilOrEmpty(option.replaceText) then
return self.L.Options_Replacement_EmptyMapping return self.L.Options_Mapping_EmptyMapping
else 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
end end
@ -225,7 +266,7 @@ function Grichelde:RefreshOptions(event)
self:DebugPrint("Refreshing Profile %s on options change: %s", self.db:GetCurrentProfile(), event) self:DebugPrint("Refreshing Profile %s on options change: %s", self.db:GetCurrentProfile(), event)
end end
self.db.profile.replacements = self:ReorderReplacements(self.db.profile.replacements) self:ReorderReplacements()
self:RefreshReplacements(self.db.profile.replacements) self:RefreshReplacements(self.db.profile.replacements)
end end
@ -246,62 +287,144 @@ function Grichelde:RefreshReplacements(replacementsTable)
for replName, _ in pairs(replacementsTable or {}) do for replName, _ in pairs(replacementsTable or {}) do
local _, replNumber = self:SplitOnFirstMatch(replName, "_") local _, replNumber = self:SplitOnFirstMatch(replName, "_")
replacements[replName] = self:CreateReplacement(toNumber(replNumber)) replacements[replName] = self:CreateMapping(toNumber(replNumber))
end end
self:TracePrint("RefreshReplacements : UI options:") -- self:TracePrint("RefreshReplacements : UI options:")
self:TracePrint(replacements) -- self:TracePrint(replacements)
self.dialog:ConfigTableChanged(nil, self.name) self.dialog:ConfigTableChanged(nil, self.name)
end end
function Grichelde:AddReplacement() function Grichelde:AddEmptyMapping()
local replacements = self.db.profile.replacements local replacements = self.db.profile.replacements or {}
self:DebugPrint("AddReplacements : old DB entries:")
self:DebugPrint("AddEmptyMapping : old DB entries:")
self:DebugPrint(replacements) self:DebugPrint(replacements)
local maxRepl = tSize(replacements) local maxRepl = Grichelde.MAPPING_OFFSET
local newMapping = "replacement_" .. maxRepl for replName, _ in pairs(replacements) do
self:DebugPrint("AddReplacement : new replacement key:", newMapping) 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 -- do NOT set self.db.profile.replacements = {} it will break defaults
replacements[newMapping].order = maxRepl replacements[newMapping].order = toString(maxRepl + 1) -- will be reordered anyway
self:DebugPrint("AddReplacements : new DB entries:") self:DebugPrint("AddEmptyMapping : new DB entries:")
self:DebugPrint(replacements) self:DebugPrint(replacements)
--self.db.profile.replacements = replacements self:RefreshOptions("AddEmptyMapping " .. newMapping)
self:RefreshOptions("AddReplacement " .. newMapping)
self.dialog:SelectGroup(self.name, "replacements", newMapping) self.dialog:SelectGroup(self.name, "replacements", newMapping)
end end
function Grichelde:DeleteReplacement(info) function Grichelde:MoveUp(info)
self:DebugPrint("DeleteReplacement") self:TracePrint("MoveUp : info")
local option = self.db.profile for i = 0, #info do
local path = 1 self:TracePrint("%d = %s", i, info[i])
while (path < #info - 1) do end
option = option[info[path]]
--self:DebugPrint(option) local replacements = self.db.profile.replacements or {}
path = path + 1 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
local optionPath = join(".", unpack(info, 1, #info)) end
self:DebugPrint("delete option \"%s\": %s", optionPath, toString(option[info[path]]))
option[info[path]] = nil 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("DeleteReplacement " .. info[path]) self:RefreshOptions("DeleteMapping " .. currentName)
local _, replNumber = self:SplitOnFirstMatch(info[path], "_") local _, replNumber = self:SplitOnFirstMatch(currentName, "_")
local newMapping = "replacement_" .. toNumber(replNumber - 1) local newMapping = "replacement_" .. toNumber(replNumber - 1)
self.dialog:SelectGroup(self.name, "replacements", newMapping) self.dialog:SelectGroup(self.name, "replacements", newMapping)
end end
function Grichelde:DeleteAllReplacements() function Grichelde:DeleteAllMappings()
self:DebugPrint("DeleteAllReplacements : ") 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 for replName, _ in pairs(self.db.profile.replacements or {}) do
self.db.profile.replacements[replName] = nil self.db.profile.replacements[replName] = nil
end end
self:AddReplacement() self:AddEmptyMapping()
self:RefreshOptions("DeleteAllReplacements") self:RefreshOptions("DeleteAllMappings")
end end

@ -12,7 +12,7 @@ function Grichelde:Upgrade_To_v060()
self:DebugPrint(replacements) self:DebugPrint(replacements)
for _, replTable in pairs(replacements) do for _, replTable in pairs(replacements) do
replTable.ignoreCase = not replTable["caseSensitive"] replTable["ignoreCase"] = not replTable["caseSensitive"]
replTable["caseSensitive"] = nil replTable["caseSensitive"] = nil
end end
@ -21,14 +21,27 @@ function Grichelde:Upgrade_To_v060()
return 0, 6, 0 return 0, 6, 0
end end
--[[ function Grichelde:Upgrade_To_v070()
function Grichelde:Upgrade_To_v061() self:PrefixedPrint(self.L.Upgrade_ToVersion, Grichelde.COLOR_CODES.ORANGE .. "0.7.0" .. Grichelde.COLOR_CODES.CLOSE)
return 0, 6, 1
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 end
function Grichelde:Upgrade_To_v070() self:DebugPrint("Upgrade_To_070 : new database")
self:DebugPrint(replacements)
return 0, 7, 0 return 0, 7, 0
end end
--[[
function Grichelde:Upgrade_To_v071()
return 0, 7, 1
end
]] ]]
function Grichelde:UpgradeDatabase() function Grichelde:UpgradeDatabase()
@ -46,16 +59,16 @@ function Grichelde:UpgradeDatabase()
upgrade = upgrade + 1 upgrade = upgrade + 1
major, minor, patch = self:Upgrade_To_v060(dbVersion) major, minor, patch = self:Upgrade_To_v060(dbVersion)
end 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 if patch < 1 then
upgrade = upgrade + 1 upgrade = upgrade + 1
major, minor, patch = self:Upgrade_To_v061(dbVersion) major, minor, patch = self:Upgrade_To_v71(dbVersion)
end
end end
if minor < 7 then
upgrade = upgrade + 1
major, minor, patch = self:Upgrade_To_v070(dbVersion)
end end
]] ]]
end end

@ -121,53 +121,27 @@ function Grichelde:PrefixedPrint(...)
end end
function Grichelde:DebugPrint(obj, ...) 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(...)) print(self.COLOR_CODES.GRAY .. self.L.AddonName .. self.COLOR_CODES.CLOSE .. ":", self:Format(...))
end end, obj, ...)
if (self.debug) then
if obj == nil then
prefixedDebugPrint("<nil>")
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 end
function Grichelde:TracePrint(obj, ...) 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(...)) print(self.COLOR_CODES.DARKGRAY .. self.L.AddonName .. self.COLOR_CODES.CLOSE .. ":", self:Format(...))
end, obj, ...)
end 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 if obj == nil then
prefixedTracePrint("<nil>") printF("<nil>")
else else
if type(obj) == "string" then if type(obj) == "string" then
local l = select("#", ...) local l = select("#", ...)
if ( l == 0 or not find(obj, "%%")) then if ( l == 0 or not find(obj, "%%")) then
prefixedTracePrint(obj, ...) printF(obj, ...)
else else
-- sanitize nil values in vararg -- sanitize nil values in vararg
local packed = { ... } local packed = { ... }
@ -179,13 +153,21 @@ function Grichelde:TracePrint(obj, ...)
-- self:tPrint(packed) -- self:tPrint(packed)
-- cannot assign unpacked to a vararg variable and print it for debug -- 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) local fmtMsg = format(obj, unpack(packed, 1, l)) -- manually set count as unpack() stops on nil (bug with #table)
prefixedTracePrint(fmtMsg) printF(fmtMsg)
end end
elseif type(obj) == "table" then elseif type(obj) == "table" then
tPrint(obj, 0, {}, prefixedTracePrint) tPrint(obj, 0, {}, printF)
else else
prefixedTracePrint(plainValue(obj)) printF(plainValue(obj))
end
end end
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 end

@ -26,32 +26,34 @@ L.Options_Enabled_Desc = "Aktiviert %s"
L.Options_Channels_Group_Name = "Kan\195\164le" L.Options_Channels_Group_Name = "Kan\195\164le"
L.Options_Channels_Group_Desc = "%s ist in folgenden Kan\195\164len aktiv." L.Options_Channels_Group_Desc = "%s ist in folgenden Kan\195\164len aktiv."
L.Options_Channels_ChannelSay_Name = "Sagen" L.Options_Channels_Header = "Eine Ersetzung wird nur in den unten markierten Kan\195\164len durchgef\195\188hrt:"
L.Options_Channels_ChannelSay_Desc = "Aktiviert %s im Kanal \"Sagen\"."
L.Options_Channels_ChannelEmote_Name = "Emote" L.Options_Channel_Say_Name = "Sagen"
L.Options_Channels_ChannelEmote_Desc = "Aktiviert %s im Kanal \"Emote\"." L.Options_Channel_Say_Desc = "Aktiviert %s im Kanal \"Sagen\"."
L.Options_Channels_ChannelYell_Name = "Schreien" L.Options_Channel_Emote_Name = "Emote"
L.Options_Channels_ChannelYell_Desc = "Aktiviert %s im Kanal \"Schreien\"." L.Options_Channel_Emote_Desc = "Aktiviert %s im Kanal \"Emote\"."
L.Options_Channels_ChannelParty_Name = "Gruppe" L.Options_Channel_Yell_Name = "Schreien"
L.Options_Channels_ChannelParty_Desc = "Aktiviert %s im Kanal \"Gruppe\"." L.Options_Channel_Yell_Desc = "Aktiviert %s im Kanal \"Schreien\"."
L.Options_Channels_ChannelPartyLeader_Name = "Gruppenanf\195\188hrer" L.Options_Channel_Party_Name = "Gruppe"
L.Options_Channels_ChannelPartyLeader_Desc = "Aktiviert %s im Kanal \"Gruppenanf\195\188hrer\"." L.Options_Channel_Party_Desc = "Aktiviert %s im Kanal \"Gruppe\"."
L.Options_Channels_ChannelGuild_Name = "Gilde" L.Options_Channel_PartyLeader_Name = "Gruppenanf\195\188hrer"
L.Options_Channels_ChannelGuild_Desc = "Aktiviert %s im Kanal \"Gilde\"." L.Options_Channel_PartyLeader_Desc = "Aktiviert %s im Kanal \"Gruppenanf\195\188hrer\"."
L.Options_Channels_ChannelOfficer_Name = "Offiziere" L.Options_Channel_Guild_Name = "Gilde"
L.Options_Channels_ChannelOfficer_Desc = "Aktiviert %s im Kanal \"Offiziere\"." L.Options_Channel_Guild_Desc = "Aktiviert %s im Kanal \"Gilde\"."
L.Options_Channels_ChannelRaid_Name = "Schlachtzug" L.Options_Channel_Officer_Name = "Offiziere"
L.Options_Channels_ChannelRaid_Desc = "Aktiviert %s im Kanal \"Schlachtzug\"." L.Options_Channel_Officer_Desc = "Aktiviert %s im Kanal \"Offiziere\"."
L.Options_Channels_ChannelRaidLeader_Name = "Schlachtzugsanf\195\188hrer" L.Options_Channel_Raid_Name = "Schlachtzug"
L.Options_Channels_ChannelRaidLeader_Desc = "Aktiviert %s im Kanal \"Schlachtzugsanf\195\188hrer\"." L.Options_Channel_Raid_Desc = "Aktiviert %s im Kanal \"Schlachtzug\"."
L.Options_Channels_ChannelRaidWarning_Name = "Schlachtzugswarnung" L.Options_Channel_RaidLeader_Name = "Schlachtzugsanf\195\188hrer"
L.Options_Channels_ChannelRaidWarning_Desc = "Aktiviert %s im Kanal \"Schlachtzugswarnung." L.Options_Channel_RaidLeader_Desc = "Aktiviert %s im Kanal \"Schlachtzugsanf\195\188hrer\"."
L.Options_Channels_ChannelInstance_Name = "Instanz" L.Options_Channel_RaidWarning_Name = "Schlachtzugswarnung"
L.Options_Channels_ChannelInstance_Desc = "Aktiviert %s im Kanal \"Instanz\"." L.Options_Channel_RaidWarning_Desc = "Aktiviert %s im Kanal \"Schlachtzugswarnung."
L.Options_Channels_ChannelBattleground_Name = "Schlachtfeld" L.Options_Channel_Instance_Name = "Instanz"
L.Options_Channels_ChannelBattleground_Desc = "Aktiviert %s im Kanal \"Schlachtfeld\"." L.Options_Channel_Instance_Desc = "Aktiviert %s im Kanal \"Instanz\"."
L.Options_Channels_ChannelWhisper_Name = "Fl\195\188stern" L.Options_Channel_Battleground_Name = "Schlachtfeld"
L.Options_Channels_ChannelWhisper_Desc = "Aktiviert %s im Kanal \"Fl\195\188stern\"." 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_Name = "Ersetzungen"
L.Options_Replacements_Group_Desc = "Diese Vorkommen werden in den aktivierten Kan\195\164len ersetzt." 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_Name = "Alle L\195\182schen"
L.Options_Replacements_DeleteAll_Desc = "L\195\182scht alle Zuweisungen." L.Options_Replacements_DeleteAll_Desc = "L\195\182scht alle Zuweisungen."
L.Options_Replacements_DeleteAll_ConfirmText="Wirklich ALLE Zuweisungen l\195\182schen?" L.Options_Replacements_DeleteAll_ConfirmText="Wirklich ALLE Zuweisungen l\195\182schen?"
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."
L.Options_Replacement_Group_Name = "%s => %s" .."|nWird die Groß\195\159- und Kleinschreibung ignoriert, wird die Groß\195\159schreibung jedes Zeichens wird bei der Ersetzung \195\188bernommen."
L.Options_Replacement_Group_Desc = "Dieses Vorkommen wird in den aktivierten Kan\195\164len ersetzt." .."|nDas Zusammenfassen aufeinanderfolgender Treffer vermeidet unsch\195\182ne Wiederholungen, die durch die Ersetzung entstehen k\195\182nnen."
L.Options_Replacement_EmptyMapping = "(keine)" .."|nMit den beiden Standard-Ersetzung wird so aus \"Tasse\" => \"Ckache\"."
L.Options_Replacement_SearchText_Name = "Suchtext:" L.Options_Mapping_Group_Name = "%s => %s"
L.Options_Replacement_SearchText_Desc = "Dieser Text wird in der Chateingabe gesucht." L.Options_Mapping_Group_Desc = "Dieses Vorkommen wird in den aktivierten Kan\195\164len ersetzt."
L.Options_Replacement_ReplaceText_Name = "Ersetzung:" L.Options_Mapping_EmptyMapping = "(keine)"
L.Options_Replacement_ReplaceText_Desc = "Jeder Suchtreffer wird mit diesem Text ersetzt." L.Options_Mapping_SearchText_Name = "Suchtext:"
L.Options_Replacement_IgnoreCase_Name = "ignoriere Gro\195\159- und Kleinschreibung" L.Options_Mapping_SearchText_Desc = "Dieser Text wird in der Chateingabe gesucht."
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_Mapping_ReplaceText_Name = "Ersetzung:"
L.Options_Replacement_Consolidate_Name = "Fa\195\159e aufeinanderfolgende Treffer zusammen" L.Options_Mapping_ReplaceText_Desc = "Jeder Suchtreffer wird mit diesem Text ersetzt."
L.Options_Replacement_Consolidate_Desc = "Wenn durch die Ersetzung die Zeichenfolge mehrfach hintereinander steht,|nfasse sie zu einem Vorkommen zusammen." L.Options_Mapping_ExactCase_Name = "exakte Gro\195\159- und Kleinschreibung"
L.Options_Replacement_Delete_Name = "L\195\182schen" 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_Replacement_Delete_Desc = "L\195\182scht diese Zuweisung." L.Options_Mapping_Consolidate_Name = "Fa\195\159e aufeinanderfolgende Treffer zusammen"
L.Options_Replacements_Delete_ConfirmText="Diese Zuweisung l\195\182schen?" 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?"

@ -26,32 +26,34 @@ L.Options_Enabled_Desc = "Enables %s"
L.Options_Channels_Group_Name = "Channels" L.Options_Channels_Group_Name = "Channels"
L.Options_Channels_Group_Desc = "%s is active in the following channels." L.Options_Channels_Group_Desc = "%s is active in the following channels."
L.Options_Channels_ChannelSay_Name = "Say" L.Options_Channels_Header = "Text replacement will only be done for marked channels below:"
L.Options_Channels_ChannelSay_Desc = "Activates %s in channel \"Say\"."
L.Options_Channels_ChannelEmote_Name = "Emote" L.Options_Channel_Say_Name = "Say"
L.Options_Channels_ChannelEmote_Desc = "Activates %s in channel \"Emote\"." L.Options_Channel_Say_Desc = "Activates %s in channel \"Say\"."
L.Options_Channels_ChannelYell_Name = "Yell" L.Options_Channel_Emote_Name = "Emote"
L.Options_Channels_ChannelYell_Desc = "Activates %s in channel \"Yell\"." L.Options_Channel_Emote_Desc = "Activates %s in channel \"Emote\"."
L.Options_Channels_ChannelParty_Name = "Party" L.Options_Channel_Yell_Name = "Yell"
L.Options_Channels_ChannelParty_Desc = "Activates %s in channel \"Party\"." L.Options_Channel_Yell_Desc = "Activates %s in channel \"Yell\"."
L.Options_Channels_ChannelPartyLeader_Name = "Party Leader" L.Options_Channel_Party_Name = "Party"
L.Options_Channels_ChannelPartyLeader_Desc = "Activates %s in channel \"Party Leader\"." L.Options_Channel_Party_Desc = "Activates %s in channel \"Party\"."
L.Options_Channels_ChannelGuild_Name = "Guild" L.Options_Channel_PartyLeader_Name = "Party Leader"
L.Options_Channels_ChannelGuild_Desc = "Activates %s in channel \"Guild\"." L.Options_Channel_PartyLeader_Desc = "Activates %s in channel \"Party Leader\"."
L.Options_Channels_ChannelOfficer_Name = "Officers" L.Options_Channel_Guild_Name = "Guild"
L.Options_Channels_ChannelOfficer_Desc = "Activates %s in channel \"Officers\"." L.Options_Channel_Guild_Desc = "Activates %s in channel \"Guild\"."
L.Options_Channels_ChannelRaid_Name = "Raid" L.Options_Channel_Officer_Name = "Officers"
L.Options_Channels_ChannelRaid_Desc = "Activates %s in channel \"Raid\"." L.Options_Channel_Officer_Desc = "Activates %s in channel \"Officers\"."
L.Options_Channels_ChannelRaidLeader_Name = "Raid Leader" L.Options_Channel_Raid_Name = "Raid"
L.Options_Channels_ChannelRaidLeader_Desc = "Activates %s in channel \"Raid Leader\"." L.Options_Channel_Raid_Desc = "Activates %s in channel \"Raid\"."
L.Options_Channels_ChannelRaidWarning_Name = "Raid Warning" L.Options_Channel_RaidLeader_Name = "Raid Leader"
L.Options_Channels_ChannelRaidWarning_Desc = "Activates %s in channel \"Raid Warning\"." L.Options_Channel_RaidLeader_Desc = "Activates %s in channel \"Raid Leader\"."
L.Options_Channels_ChannelInstance_Name = "Instance" L.Options_Channel_RaidWarning_Name = "Raid Warning"
L.Options_Channels_ChannelInstance_Desc = "Activates %s in channel \"Instance\"." L.Options_Channel_RaidWarning_Desc = "Activates %s in channel \"Raid Warning\"."
L.Options_Channels_ChannelBattleground_Name = "Battleground" L.Options_Channel_Instance_Name = "Instance"
L.Options_Channels_ChannelBattleground_Desc = "Activates %s in channel \"Battleground\"." L.Options_Channel_Instance_Desc = "Activates %s in channel \"Instance\"."
L.Options_Channels_ChannelWhisper_Name = "Whisper" L.Options_Channel_Battleground_Name = "Battleground"
L.Options_Channels_ChannelWhisper_Desc = "Activates %s in channel \"Whisper\"." 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_Name = "Replacements"
L.Options_Replacements_Group_Desc = "These lookups will be replaced in activated channels." 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_Name = "Delete All"
L.Options_Replacements_DeleteAll_Desc = "Deletes all replacement mappings." 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_Replacements_DeleteAll_ConfirmText = "Do you really want to delete ALL replacement mappings?"
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."
L.Options_Replacement_Group_Name = "%s => %s" .. "|nIf case sensivity is ignored, the case for each letter of the matching text is taken over when replaced."
L.Options_Replacement_Group_Desc = "This lookup will be replaced in activated channels." .. "|nConsolidation of consecutive matches prevent unaesthetic repetitions of letters introduced by replacements."
L.Options_Replacement_EmptyMapping = "(none)" .. "|nWith both default mappings active, the mapping would be \"Tossing\" => \"Ckoching\"."
L.Options_Replacement_SearchText_Name = "Search for:" L.Options_Mapping_Group_Name = "%s => %s"
L.Options_Replacement_SearchText_Desc = "This text is looked up in your chat input box." L.Options_Mapping_Group_Desc = "This lookup will be replaced in activated channels."
L.Options_Replacement_ReplaceText_Name = "Replacement:" L.Options_Mapping_EmptyMapping = "(none)"
L.Options_Replacement_ReplaceText_Desc = "Any match will be replaced with this text." L.Options_Mapping_SearchText_Name = "Search for:"
L.Options_Replacement_IgnoreCase_Name = "ignore case" L.Options_Mapping_SearchText_Desc = "This text is looked up in your chat input box."
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_Mapping_ReplaceText_Name = "Replacement:"
L.Options_Replacement_Consolidate_Name = "consolidate consecutive matches" L.Options_Mapping_ReplaceText_Desc = "Any match will be replaced with this text."
L.Options_Replacement_Consolidate_Desc = "If after the replacement a text sequence is repeated|ndirectly after another, treat them as one occurrence." L.Options_Mapping_ExactCase_Name = "exact case"
L.Options_Replacement_Delete_Name = "Delete" 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_Replacement_Delete_Desc = "Deletes this replacement mapping." L.Options_Mapping_Consolidate_Name = "consolidate consecutive matches"
L.Options_Replacements_Delete_ConfirmText = "Delete this replacement mapping?" 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?"
Loading…
Cancel
Save