- handle replacement via slash command
- emote and ooc detection
- de-/activate single mappings
- move buttons and mappings are disabled when already at top/bottom or deactivated
- minimap button is darkened when addon is disabled
- help tab with examples
- right-click on minimap button quickly de-/activates replacements
- fixed mapping to raid warning, instance and battleground chats
- localized raid target markers
- capital % substitutions
- incorrect consolidation
- Umlaut and accent replacements
@ -8,27 +8,57 @@ Intentionally started as a helper addon for a roleplaying friend, Grichelde can
* write out abbreviations for you
* create hilarious moments during roleplay
## Disclaimer
#### No Warranty
The addon is provided "AS IS" and comes without warranty of any kind of function or correctness (for more details, consult the GPL 3 license).
Also the author is not held responsible for any risk or damage the addon or its use might cause, especially lost of progress or data due to crashes of the WoW client.
#### Respect others
This addon does not encourange or intend to hurt or to tease people with speaking disabilities or language disorders.
The responsibility rest on the user completely. Please use the features with care and respect to other players.
## FAQ
### How do I start
#### Where do I start?
Grichelde is active right from the start with default mappings. To open the options UI, either left-click on
the new minimap icon, or type `/gri` or `/grichelde` in the chatbox. All mappings and channels can be configured there.
### My replacement is not taken.
#### Does it replace only letters but also whole words?
Grichelde is capable of handling both, even whole sentences can be replaced.
Only slash commands, item links, textures, placeholders and ooc-markers are excluded from replacement.
#### My replacement is not taken.
After entering a search or replacement text, you see a button "Okay" next to yout input. This is **not** a validation message,
but the save button for text. This is a rectriction from the UI library and can be seen in other addons as well.
but the save button for text. This is a restriction from the UI library and can be seen in other addons as well.
Please click on "Okay" button to save the input permanently.
### I get errors, what should I do?
If it still does not work or gives you errors, please read the next question.
#### I have to disable the Addon frequently. Is there a more elegant solution
Actually there are two solutions:
1. A right-click on the minimap button will disable Grichelde instantly. Right-click a second time will activate it again. Easy, isn't it?
2. You can disable Grichelde permanently and forcefully replace the sentence in the chatbox. I call it "Grichelde-On-Demand" :)
In the chatbox put `/gri` or `/grichelde` in front of your typed text, you can also include the target channel,
i.e. `/gri /guild hello there` and Grichelde will apply the active replacements even if guild channel or Grichelde was disabled.
#### I get errors, what should I do?
Please report your errors here. Make a screenshot or copy both the error message as well as your recent mappings.
You can bring up a small windows with your mapping by right-clicking the minimap icon or entering the "/gri mappings" command.
You can bring up a small windows with your mapping by entering the `/gri mappings` command.
#### Why that strange name?
Grichelde is the name of an undead rogue without a jaw, who was played in RP sessions with a guild member.
She started replacing "s" and "t" letters manually for each line in the chat, which became cumbersome over time.
(If you ever wondered how an Undead without a jaw sounds like, its really hilarious, you should try it.)
Without spelling errors, "Griselde" in German is an old-fashioned female first name.
### Why that strange name?
#### I'm a pro. Does it support regular expressions?
Grichelde is the name of the undead rogue without a jaw, that was played in RP session with my friend.
She started replacing "s" and "t" letters manually for each line in the chat, which is cumbersome over time.
(If you wondered how an Undead without a jaw sounds like, its really hilarious.) Without spelling errors,
"Griselde" in German would be a old-fashioned female first name.
This is actually an unofficial feature. In general the searchText is passed in as Lua, so yes regex can be used in lookups.
There are two caveats: first, Lua does not support PCRE syntax, as it would bloat Lua's simplicity and performance (read [here](http://www.lua.org/pil/20.1.html) why).
Secondly, Grichelde does not support capture groups in the replacement text, so matches get lost.
L.AddonLoaded="%s hilft Euch jetzt bei euren Sprachschwierigkeiten."
L.AddonNamePlusVersion="%s v%s"
L.AddonLoaded="%s unterst\195\188tzt Euch jetzt bei euren Sprachschwierigkeiten."
L.AddonUnloaded="%s wartet geduldig Euch weiter unterst\195\188tzen zu d\195\188rfen."
L.Upgrade_ToVersion="Hebe Databank auf Version %s an."
L.Upgrade_Successful="Upgrade erfolgreich."
-- debug
L.Debug_Options="Optionen"
L.Debug_Mappings="Ersetzungen"
L.Debug_Mappings_Hint="Der Inhalt der Textbox dient nur zur Fehlersuche und kann herauskopiert werden. Es werden keine Werte aus dieser Textbox eingelesen oder anderweitig verwertet."
L.Options_Replacements_DeleteAll_Desc="L\195\182scht alle Zuweisungen."
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."
.."|nWird die Gro\195\159- und Kleinschreibung ignoriert, wird die Gro\195\159schreibung jedes Zeichens 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_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_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_Enabled_Name="Aktiv"
L.Options_Mapping_Enabled_Desc="Diese Ersetzung wird durchgef\195\188hrt"
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_Help_Group_Desc="Hilfstellungen zu den Suchmustern und zur Ersetzungslogik."
L.Options_Help_Disclaimer=cYellow("Haftungsausschlu\195\159:").." Das Addon wird im reinen Ist-Zustand zur Verf\195\188gung gestellt, ohne Garantie auf Funktion und Fehlerfreiheit (f\195\188r mehr Details siehe GPL 3 Lizenzdokument). "
.."Ferner \195\188bernimmt der Autor keinerlei Haftung oder Gew\195\164hrleistung f\195\188r durch das Addon oder dessen Nutzung entstandene Fehler oder Sch\195\164den, "
.."insb. den Verlust von Spielfortschritt oder Daten aufgrund von Abst\195\188rzen des WoW-Clients."
L.Options_Help_Tab_Basics_Name="Grundlagen"
L.Options_Help_Tab_Basics_Desc="Erl\195\164utert die Grundlagen des Addons"
L.Options_Help_Tab_Expert_Name="Experte"
L.Options_Help_Tab_Expert_Desc="Beleuchtet die Besonderheiten bei der Textsuche."
.."|nEs sind unbegrenzt viele Textersetzung m\195\182glich, und sie werden in der Reihenfolge der definierten Zuordnungen abgearbeitet, von oben nach unten. "
.."Ersetzungen sind transitiv, d.h. nachfolgende Zuordnungen beziehen sich nicht auf den Originaltext, sondern das Resultat der vorherigen Ersetzung. "
.."|nMit der Zuordnung "..cPrefix("\"a\" => \"b\"").." und "..cPrefix("\"b\" => \"c\"").." wird bei Eingabe von "..cPrefix("\"a\" => \"c\"").."."
.."|n|n"..cYellow("Exakte Gro\195\159- und Kleinschreibung")
.."|nBei exakter Gro\195\159- und Kleinschreibung muss die Schreibweise genau \195\188berstimmen, sonst findet keine Textersetzug f\195\188r diese Zuordnung statt. "
.."Wird die Gro\195\159- und Kleinschreibung ignoriert, wird die Gro\195\159schreibung jedes Zeichens bei der Ersetzung \195\188bernommen. "
.."|nMit der Zuordnung "..cPrefix("\"aBcDeF\" => \"uvWXYz\"").." wird aus "..cPrefix("\"abcdef\" => \"uvwxyz\"")..", "
.."aus "..cPrefix("\"ABCDEF\" => \"UVWXYZ\"").." und aus "..cPrefix("\"AbCdEf\" => \"UvWxYz\"").."."
.."|nDas Zusammenfassen aufeinanderfolgender Treffer vermeidet unsch\195\182ne Wiederholungen, die durch die Ersetzung entstehen k\195\182nnen. "
.."Die Zusammenfassung wird erst nach der Ersetzung vorgenommen, d.h. am vollst\195\164ndig ersetzten Text f\195\188r jede Zuordnung. "
.."|nMit der Zuordnung "..cPrefix("\"s\" => \"sch\"").." wird aus "..cPrefix("\"Tasse\" => \"Tasche\"").." statt "..cPrefix("\"Taschsche\"")..", "
.."aber "..cPrefix("\"schmeissen\" => \"schchmeischen\"")..". Solche Randbedingungen beseitigt in der Regel eine weitere Zuordnung wie "..cPrefix("\"chch\" => \"ch\"").."."
.."|nIst der Ersetzungstext k\195\188rzer als der eigentliche Suchtext, werden die \195\188bersch\195\188\195\159igen Zeichen des Suchtreffers entfernt. "
.."Ist der Ersetzungstext l\195\163nger, werden die \195\188brigen Zeichen nach dem Treffer hinten drangehangen. Dabei wird die Gro\195\159- und Kleinschreibung des letzten Zeichens ber\195\188cksichtigt, "
.."ebenso wie die Gro\195\159- und Kleinschreibung des nachfolgenden Zeichens. Gro\195\159geschriebene Abk\195\188rzungen und Ausdr\195\188cke bleiben so einheitlich. "
.."|nMit der Zuordnung "..cPrefix("\"Kr\195\164uter\" => \"Gr\195\188nzeugs\"").." wird aus "..cPrefix("\"KR\195\132UTER\" => \"GR\195\156NZEUGS\"").." statt "..cPrefix("\"GR\195\156NZEUgs\"")..""
.."unter Beibehaltung von absichtlicher Gro\195\159schreibung wie "..cPrefix("\"Kr\195\132utERGarten\" => \"Gr195\156nzEUGSgarten\"").." statt "..cPrefix("\"Gr\195\188nzeugsGarten\"").."."
.."|n|n"..cYellow("Standby")
.."|nErsetzungen k\195\182nnen auch nur bei Bedarf durchgef\195\188hrt werden, selbst wenn das Addon oder ein Kanal deaktivert wurde. "
.."Vor der Eingabe in der Chatbox schreibt man "..cPrefix("/gri").." oder "..cPrefix("/grichelde").." und optional noch den Zielkanal "
.."z.B. "..cPrefix("\"/gri /p hallo da dr\195\188ben\"").." und alle aktiven Zuordnungen werden ersetzt, selbst wenn der Gruppenkanal oder das Addon nicht aktiv sind."
.."|nRegEx sind sehr m\195\163chtige Such- und Ersetzunsgmuster die h\195\163ufig in der Programmierung verwendet werden. Technisch gesehen benutzt das Addon f\195\188r die Suchen des Eingabetextes bereits regul\195\163ren Ausdr\195\188cke. "
.."Das Eingeben von RegEx als Suchtext ist allerings eine inoffizielle Funktion und hat zwei gro\195\159e Einschr\195\163nkungen: "
.."|n1. Leider unterst\195\188tzt Lua nicht den vollst\195\163ndigen Umfang von PCRE. Trotzdem k\195\182nnen einige Muster verwendet werden wie Zeilenanfang "..cPrefix("\"^\"")..""
.."oder Zeilenende "..cPrefix("\"$\"")..", Zeichenklassen wie Zahlen "..cPrefix("\"%d\"").." oder (negierte) Auswahlen "..cPrefix("\"[^%p]\"")..". "
.."|n2. Es werden keine Gruppen im Ersetzungstest unterst\195\188tzt, so da\195\159 Gruppen einfach verloren gehen. Wegen der Gro\195\159- und Kleinschreibung und steigender Komplexit\195\163t ist diese Funktion auch f\195\188r die Zukunft nicht geplant. "
.."|nIm Beispiel-Reiter gibt es einige Ersetzungen, welche mit regul\195\164ren Ausdr\195\188cke umgesetzt wurden."
L.Options_Help_Examples_Note=cYellow("Hinweis:").." Dieses Addon bef\195\188rwortet nicht und beabsichtig nicht Personen mit (Fremd-)Sprachproblemen |nzu verletztem oder herabzuw\195\188rdigen. Die Verantwortung f\195\188r den Einsatz des Addons obliegt dem Benutzer. |nBitte verwendet die Funktion respektvoll und zur\195\188ckhaltend gegen\195\188ber anderen Mitspielern."
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_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_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_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_Enabled_Name="active"
L.Options_Mapping_Enabled_Desc="This replacement will be processed."
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_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_Desc="If after the replacement a text sequence is repeated|ndirectly after another, treat them as one occurrence."
L.Options_Mapping_StopOnMatch_Name="stop on match"
L.Options_Mapping_StopOnMatch_Desc="Stops looking for any following replacements, when this one matched."
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?"
L.Options_Mapping_Delete_ConfirmText="Delete this replacement mapping?"
L.Options_Help_Group_Name="Help"
L.Options_Help_Group_Desc="Guideance to search patterns and replacement logic."
L.Options_Help_Disclaimer=cYellow("Disclaimer of warranty:").." The addon is provided \"AS IS\" and comes without warranty of any kind of function or correctness (for more details, consult the GPL 3 license). "
.."Also the author is not held responsible for any risk or damage the addon or its use might cause, especially lost of progress or data due to crashes of the WoW client."
L.Options_Help_Tab_Basics_Name="Basics"
L.Options_Help_Tab_Basics_Desc="Some explanatory notes the the basic behaviour."
L.Options_Help_Tab_Expert_Name="Expert"
L.Options_Help_Tab_Expert_Desc="More details on special search options."
L.Options_Help_Tab_Examples_Name="Examples"
L.Options_Help_Tab_Examples_Desc="Templates for particular scenarios."
L.Options_Help_Basics=cYellow("Ordering")
.."|nYou can have an unlimited number of replacements. All mappings will be processed in same order as defined, from top down. "
.."Replacements are also transitive, so consecutive mappings do not work on the original input but the resulting text from the previous replacements. "
.."|nBoth mappings "..cPrefix("\"a\" => \"b\"").." and "..cPrefix("\"b\" => \"c\"").." applied, result in the final text "..cPrefix("\"a\" => \"c\"").."."
.."|n|n"..cYellow("exact case")
.."|nIf \"exact case\" is checked, lower and upper case must match exactly to be replaced, otherwise the mapping is skipped. "
.."If case sensivity is ignored, the case for each letter of the matching text is taken over when replaced. "
.."|nWith mapping "..cPrefix("\"aBcDeF\" => \"uvWXYz\"").." text results in "..cPrefix("\"abcdef\" => \"uvwxyz\"")..", "
.."also "..cPrefix("\"ABCDEF\" => \"UVWXYZ\"").." and "..cPrefix("\"AbCdEf\" => \"UvWxYz\"").."."
.."|nIf the replacement is shorter than the actual match, all remaining characters will be skipped. If the replacement is longer, all remaining characters will be appended. "
.."The case of the replaced character is considered as well as the case of the next character in the original text. That way capital case abbreviations and expressions will not be distorted. "
.."|nWith mapping "..cPrefix("\"Body\" => \"Corpse\"").." the input becomes "..cPrefix("\"BODY\" => \"CORPSE\"").." instead of "..cPrefix("\"CORPse\"")..""
.."but still keeps intended exceptions like "..cPrefix("\"BodYGuard\" => \"CorPSEGuard\"").." instead of "..cPrefix("\"CorpseGuard\"")..". "
.."|n|n"..cYellow("On-Demand")
.."|nFor convenience input text in a chatbox can be forcefully replaced, even if the addon or the channel was disabled. "
.."In the chatbox put "..cPrefix("/gri").." or "..cPrefix("/grichelde").." in front of your typed text, you can also include the target channel, "
.."i.e. "..cPrefix("\"/gri /guild hello there\"").." and the active replacements are applied even if the guild channel or global switch was disabled."
.."|n|n"..cYellow("Regular Expressions")
.."|nRegex are very powerful search and replacement patterns commonly used in programming. Technically all searches the addon performs on the input text are done with regular expression methods. "
.."Entering regex as search text however is an unofficial feature and has two major caveats: "
.."|n1. Unfornately Lua does not support full PCRE syntax and is very limited. Nethertheless some patterns can be used like start of line "..cPrefix("\"^\"").." or end of line "..cPrefix("\"$\"")..", "
.."character classes like numbers "..cPrefix("\"%d\"").." or (inversed) sets "..cPrefix("\"[^%p]\"")..". "
.."|n2. There is no support for capture groups in the replacement text, so matches get lost. Because of case sensivity and complexity there are no plans to support this."
.."|nAnyway, there are some mappings using RegEx in the Example secion."
L.Options_Help_Examples_Note=cYellow("Note:").." This addon does not encourange or intend to hurt or to tease people with speaking disabilities or language disorders. The responsibility rest on the user completely. Please use the features with care and respect to other players."
L.Options_Help_Examples4_Header=cYellow("Say much, type less.")
L.Options_Help_Examples4_Text=cPrefix("gz => Congratulations").."|n|n"..cPrefix("gn8 => Good night").."|n|n"..cPrefix("afk => I'm temporarikly not available (AFK)").."|n|n"..cPrefix("MC => Molten Core")
L.Options_Help_Examples5_Select="Proper names"
L.Options_Help_Examples5_Header=cYellow("Replace player names, NPCs or locations.")
L.Options_Help_Examples5_Text=cPrefix("Sylvanas => the revengeful banshee queen").."|n|n"..cPrefix("Asmongold => Asmon").."|n|n"..cPrefix("Crossroads => X-roads")
L.Options_Help_Examples6_Select="lisp"
L.Options_Help_Examples6_Header=cYellow("S and Z will become a sibilant")