diff --git a/code/_global_vars/lists/misc.dm b/code/_global_vars/lists/misc.dm
new file mode 100644
index 0000000000..aa9680a5f6
--- /dev/null
+++ b/code/_global_vars/lists/misc.dm
@@ -0,0 +1 @@
+GLOBAL_LIST_INIT(speech_toppings, list("|" = "i", "+" = "b", "_" = "u"))
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index 858421143e..3ead9dedd4 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -22,7 +22,7 @@
if (message)
- message = say_emphasis(message)
+ message = encode_html_emphasis(message)
// Hearing gasp and such every five seconds is not good emotes were not global for a reason.
// Maybe some people are okay with that.
@@ -74,7 +74,7 @@
else
input = message
- input = say_emphasis(input)
+ input = encode_html_emphasis(input)
if(input)
log_ghostemote(input, src)
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index 1fd71995dc..ad3689e8c5 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -45,7 +45,7 @@
if(italics)
message = "[message]"
- message = say_emphasis(message)
+ message = encode_html_emphasis(message)
var/track = null
if(istype(src, /mob/observer/dead))
@@ -115,36 +115,14 @@
/mob/living/silicon/ai/special_mentions()
return list("AI") // AI door!
-// Converts specific characters, like +, |, and _ to formatted output.
-/mob/proc/say_emphasis(var/message)
- message = encode_html_emphasis(message, "|", "i")
- message = encode_html_emphasis(message, "+", "b")
- message = encode_html_emphasis(message, "_", "u")
- return message
-
-// Replaces a character inside message with html tags. Note that html var must not include brackets.
-// Will not create an open html tag if it would not have a closing one.
-/proc/encode_html_emphasis(var/message, var/char, var/html)
- var/i = 20 // Infinite loop safety.
- var/pattern = "(?") - 1
-
- // Now replace both.
- message = replacetext(message, char, "<[html]>", first, first + 1)
- message = replacetext(message, char, "[html]>", second + length_increase, second + length_increase + 1)
-
- // Check again to see if we need to keep going.
- first = re.Find(message)
- second = re.Find(message, first + 1)
- i--
- if(!i)
- CRASH("Possible infinite loop occured in encode_html_emphasis().")
- return message
+/proc/encode_html_emphasis(message)
+ var/tagged_message = message
+ for(var/delimiter in GLOB.speech_toppings)
+ var/regex/R = new("\\[delimiter](.+?)\\[delimiter]","g")
+ var/tag = GLOB.speech_toppings[delimiter]
+ tagged_message = R.Replace(tagged_message,"<[tag]>$1[tag]>")
+
+ return tagged_message
/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="")
@@ -240,7 +218,7 @@
speaker_name = "[speaker.real_name] ([speaker_name])"
track = "[speaker_name] ([ghost_follow_link(speaker, src)])"
- message = say_emphasis(message)
+ message = encode_html_emphasis(message)
var/formatted
if(language)
diff --git a/code/modules/mob/language/synthetic.dm b/code/modules/mob/language/synthetic.dm
index 36dd57bc69..e39674e037 100644
--- a/code/modules/mob/language/synthetic.dm
+++ b/code/modules/mob/language/synthetic.dm
@@ -18,7 +18,7 @@
if (!message)
return
- message = speaker.say_emphasis(message)
+ message = encode_html_emphasis(message)
var/message_start = "[name], [speaker.name]"
var/message_body = "[speaker.say_quote(message)], \"[message]\""
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index 0b80b937b2..9a0a72ab92 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -47,7 +47,7 @@
usr << "You have deadchat muted."
return
- message = say_emphasis(message)
+ message = encode_html_emphasis(message)
say_dead_direct("[pick("complains","moans","whines","laments","blubbers")], \"[message]\"", src)