Skip to content

Commit 27c8f96

Browse files
Improve random selection regex and highlighting (#2478)
Now allows text effects and bbcode in the random selection: ``` <[b]Option 1 [/b] / [color=red]option 2[/color] / option 3> ``` The highlighting has also been fixed for these situations.
1 parent 3efe717 commit 27c8f96

File tree

3 files changed

+31
-15
lines changed

3 files changed

+31
-15
lines changed

addons/dialogic/Editor/TimelineEditor/TextEditor/syntax_highlighter.gd

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,3 +199,13 @@ func color_shortcode_content(dict:Dictionary, line:String, from:int = 0, to:int
199199
dict[x.get_start('value')+from-1] = {"color":base_color.lerp(normal_color, 0.7)}
200200
dict[x.get_end()+from] = {"color":normal_color}
201201
return dict
202+
203+
204+
func dict_get_color_at_column(dict:Dictionary, column:int) -> Color:
205+
var prev_idx := -1
206+
for i in dict:
207+
if i > prev_idx and i <= column:
208+
prev_idx = i
209+
if prev_idx != -1:
210+
return dict[prev_idx].color
211+
return normal_color

addons/dialogic/Modules/Text/event_text.gd

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -463,10 +463,10 @@ var text_effect_color := Color('#898276')
463463
func _get_syntax_highlighting(Highlighter:SyntaxHighlighter, dict:Dictionary, line:String) -> Dictionary:
464464
load_text_effects()
465465
if text_random_word_regex.get_pattern().is_empty():
466-
text_random_word_regex.compile("(?<!\\\\)\\<[^\\[\\>]+(\\/[^\\>]*)\\>")
466+
text_random_word_regex.compile(r"(?<!\\)\<[^\>]+(\/[^\>]*)\>")
467467

468468
var result := regex.search(line)
469-
if !result:
469+
if not result:
470470
return dict
471471
if Highlighter.mode == Highlighter.Modes.FULL_HIGHLIGHTING:
472472
if result.get_string('name'):
@@ -476,24 +476,29 @@ func _get_syntax_highlighting(Highlighter:SyntaxHighlighter, dict:Dictionary, li
476476
dict[result.get_start('portrait')] = {"color":Highlighter.character_portrait_color}
477477
dict[result.get_end('portrait')] = {"color":Highlighter.normal_color}
478478
if result.get_string('text'):
479-
var effects_result := text_effects_regex.search_all(line)
480-
for eff in effects_result:
481-
dict[eff.get_start()] = {"color":text_effect_color}
482-
dict[eff.get_end()] = {"color":Highlighter.normal_color}
483-
dict = Highlighter.color_region(dict, Highlighter.variable_color, line, '{', '}', result.get_start('text'))
484479

480+
## Color the random selection modifier
485481
for replace_mod_match in text_random_word_regex.search_all(result.get_string('text')):
486482
var color: Color = Highlighter.string_color
487483
color = color.lerp(Highlighter.normal_color, 0.4)
488484
dict[replace_mod_match.get_start()+result.get_start('text')] = {'color':Highlighter.string_color}
489485
var offset := 1
490-
for b in replace_mod_match.get_string().trim_suffix('>').trim_prefix('<').split('/'):
486+
for b:RegExMatch in RegEx.create_from_string(r"(\[[^\]]*\]|[^\/]|\/\/)+").search_all(replace_mod_match.get_string().trim_prefix("<").trim_suffix(">")):
491487
color.h = wrap(color.h+0.2, 0, 1)
492488
dict[replace_mod_match.get_start()+result.get_start('text')+offset] = {'color':color}
493-
offset += len(b)
489+
offset += len(b.get_string())
494490
dict[replace_mod_match.get_start()+result.get_start('text')+offset] = {'color':Highlighter.string_color}
495491
offset += 1
496492
dict[replace_mod_match.get_end()+result.get_start('text')] = {'color':Highlighter.normal_color}
493+
494+
## Color bbcode and text effects
495+
var effects_result := text_effects_regex.search_all(line)
496+
for eff in effects_result:
497+
var prev_color: Color = Highlighter.dict_get_color_at_column(dict, eff.get_start())
498+
dict[eff.get_start()] = {"color":text_effect_color.lerp(prev_color, 0.4)}
499+
dict[eff.get_end()] = {"color":prev_color}
500+
dict = Highlighter.color_region(dict, Highlighter.variable_color, line, '{', '}', result.get_start('text'))
501+
497502
return dict
498503

499504
#endregion

addons/dialogic/Modules/Text/subsystem_text.gd

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -576,14 +576,15 @@ func effect_mood(_text_node:Control, _skipped:bool, argument:String) -> void:
576576
load(dialogic.current_state_info.speaker).custom_info.get('sound_moods', {}).get(argument, {}))
577577

578578

579-
var modifier_words_select_regex := RegEx.create_from_string(r"(?<!\\)\<[^\[\>]+(\/[^\>]*)\>")
579+
var modifier_select_regex := RegEx.create_from_string(r"(?<!\\)\<[^\>]+(\/[^\>]*)\>")
580+
var modifier_select_split_regex := RegEx.create_from_string(r"(\[[^\]]*\]|[^\/]|\/\/)+")
580581
func modifier_random_selection(text:String) -> String:
581-
for replace_mod_match in modifier_words_select_regex.search_all(text):
582+
for replace_mod_match: RegExMatch in modifier_select_regex.search_all(text):
582583
var string: String = replace_mod_match.get_string().trim_prefix("<").trim_suffix(">")
583-
string = string.replace('//', '<slash>')
584-
var list: PackedStringArray = string.split('/')
585-
var item: String = list[randi()%len(list)]
586-
item = item.replace('<slash>', '/')
584+
var options := []
585+
for split: RegExMatch in modifier_select_split_regex.search_all(string):
586+
options.append(split.get_string())
587+
var item: String = options.pick_random()
587588
text = text.replace(replace_mod_match.get_string(), item.strip_edges())
588589
return text
589590

0 commit comments

Comments
 (0)