@@ -21,6 +21,10 @@ const REGEX_FUNC_CALL :=\
21
21
r "(?<caller>\w +)\. (?<name>\w +)\( (?<args>.*)\) $" ;\
22
22
static var _regex_func_call := RegEx .create_from_string (REGEX_FUNC_CALL )
23
23
24
+ const REGEX_FUNC_VARS := \
25
+ r "(?<![\"\'\d ])\b ([a-zA-Z_]\w *)\s *\.\s *([a-zA-Z_]\w *)\b (?![\"\'\d ])" ;\
26
+ static var _regex_func_vars := RegEx .create_from_string (REGEX_FUNC_VARS )
27
+
24
28
const REGEX_INDENT := \
25
29
r "(?<=\n {1} )\s +" ;\
26
30
static var _regex_indent := RegEx .create_from_string (REGEX_INDENT )
@@ -53,6 +57,7 @@ const __CALLER := "caller"
53
57
const __NAME := "name"
54
58
const __ARGS := "args"
55
59
const __LN_NUM := "ln_num"
60
+ const __STANDALONE := "standalone"
56
61
#endregion
57
62
58
63
const SETS_TEMPLATE := {
@@ -105,10 +110,13 @@ const FUNC_TEMPLATE := {
105
110
__NAME : EMPTY ,
106
111
107
112
# Arguments used.
108
- __ARGS : [] ,
113
+ __ARGS : null ,
109
114
110
115
# Line number of where the function is written.
111
116
__LN_NUM : 0 ,
117
+
118
+ __STANDALONE : true ,
119
+ __VARS : [],
112
120
}
113
121
114
122
const TAG_DELAY_ALIASES : PackedStringArray = [
@@ -142,6 +150,7 @@ static func _initialize_regex() -> void:
142
150
_regex_dlg_tags_newline = RegEx .create_from_string (REGEX_DLG_TAGS_NEWLINE )
143
151
_regex_bbcode_tags = RegEx .create_from_string (REGEX_BBCODE_TAGS )
144
152
_regex_func_call = RegEx .create_from_string (REGEX_FUNC_CALL )
153
+ _regex_func_vars = RegEx .create_from_string (REGEX_FUNC_VARS )
145
154
_regex_indent = RegEx .create_from_string (REGEX_INDENT )
146
155
_regex_valid_dlg = RegEx .create_from_string (REGEX_VALID_DLG )
147
156
_regex_section = RegEx .create_from_string (REGEX_SECTION )
@@ -179,7 +188,7 @@ func _init(src : String = ""):
179
188
if dlg_raw_size < i + 1 :
180
189
printerr ("Error: actor's name exists without a dialogue body" )
181
190
182
- setsl [__ACTOR ] = n_stripped .trim_suffix (COLON )
191
+ setsl [__ACTOR ] = StringName ( n_stripped .trim_suffix (COLON ) )
183
192
setsl [__LINE_NUM ] = ln_num
184
193
185
194
if setsl [__ACTOR ] == UNDERSCORE :
@@ -213,12 +222,12 @@ func _init(src : String = ""):
213
222
if regex_func_match != null :
214
223
var func_dict := FUNC_TEMPLATE .duplicate (true )
215
224
216
- func_dict [__CALLER ] = regex_func_match .get_string (
225
+ func_dict [__CALLER ] = StringName ( regex_func_match .get_string (
217
226
regex_func_match .names [__CALLER ]
218
- )
219
- func_dict [__NAME ] = regex_func_match .get_string (
227
+ ))
228
+ func_dict [__NAME ] = StringName ( regex_func_match .get_string (
220
229
regex_func_match .names [__NAME ]
221
- )
230
+ ))
222
231
223
232
# Function arguments
224
233
var args_raw := regex_func_match .get_string (
@@ -229,14 +238,20 @@ func _init(src : String = ""):
229
238
230
239
# Parse parameter arguments
231
240
var args := Expression .new ()
232
- var args_err := args .parse ("[%s ]" % args_raw )
233
- if args_err != OK :
234
- printerr ("Error: '%s ' when parsing arguments on function %s .%s (%s ) on line %d " % [
235
- error_string (args_err ),
236
- func_dict [__CALLER ], func_dict [__NAME ], args_raw , ln_num
237
- ])
238
-
239
- func_dict [__ARGS ] = args .execute () as Array
241
+ var args_err := args .parse ("[" + args_raw + "]" )
242
+ var var_matches := _regex_func_vars .search_all (args_raw )
243
+
244
+ if var_matches .is_empty ():
245
+ func_dict [__ARGS ] = args .execute () as Array
246
+
247
+ else :
248
+ func_dict [__STANDALONE ] = false
249
+ func_dict [__ARGS ] = "[" + args_raw + "]"
250
+
251
+ for var_match in var_matches :
252
+ func_dict [__VARS ].append (var_match .get_string (1 ))
253
+
254
+ func_dict .make_read_only ()
240
255
output [body_pos ][__FUNC ].append (func_dict )
241
256
#endregion
242
257
@@ -289,6 +304,7 @@ func _init(src : String = ""):
289
304
output [n ][__FUNC_POS ] = parsed_tags [__FUNC_POS ]
290
305
output [n ][__FUNC_IDX ] = parsed_tags [__FUNC_IDX ]
291
306
307
+ output [n ][__FUNC ].make_read_only ()
292
308
output [n ][__CONTENT ] = body
293
309
294
310
## Check if [param string] is indented with tabs or spaces.
@@ -362,23 +378,19 @@ static func parse_tags(string : String) -> Dictionary:
362
378
else :
363
379
string = string .replace (bb .strings [0 ], EMPTY )
364
380
365
- # TODO
366
381
# Escaped Curly Brackets ===============================================
367
382
# 💀💀💀💀💀💀💀💀💀💀💀
368
- # var regex_curly_brackets := RegEx.new()
369
- # regex_curly_brackets.compile(r"\\\{|\\\}")
370
- #
371
- # var esc_curly_brackets : Array[Dictionary] = []
372
- #
373
- # for cb in regex_curly_brackets.search_all(string):
374
- # esc_curly_brackets.append({
375
- # "pos": cb.get_start(),
376
- # "chr": cb.strings[0],
377
- # })
378
- #
379
- # if !esc_curly_brackets.is_empty():
380
- # esc_curly_brackets.reverse()
381
- # string = regex_curly_brackets.sub(string, "-", true)
383
+ var regex_curly_brackets := RegEx .create_from_string (r "\\ (\{ |\} )" )
384
+
385
+ var esc_curly_brackets : Dictionary = {}
386
+
387
+ for cb in regex_curly_brackets .search_all (
388
+ _regex_dlg_tags .sub (string , EMPTY , true )
389
+ ):
390
+ esc_curly_brackets [cb .get_start ()] = cb .strings [0 ]
391
+
392
+ if ! esc_curly_brackets .is_empty ():
393
+ string = regex_curly_brackets .sub (string , HASH , true )
382
394
383
395
# Dialogue tags ========================================================
384
396
var tag_pos_offset : int = 0
@@ -415,12 +427,11 @@ static func parse_tags(string : String) -> Dictionary:
415
427
416
428
tag_pos_offset += string_match .length ()
417
429
418
- # TODO
419
430
# Insert back escaped curly brackets ===================================
420
- # for cb in esc_curly_brackets:
421
- # string = string\
422
- # .erase(cb["pos"] )\
423
- # .insert(cb["pos"], cb["chr" ])
431
+ for cb in esc_curly_brackets . keys () :
432
+ string = string \
433
+ .erase (cb )\
434
+ .insert (cb , esc_curly_brackets [ cb ])
424
435
425
436
# Insert back BBCodes ==================================================
426
437
string = string \
0 commit comments