1717 r"%" + PLACEHOLDER_PARAMETER_FLAGS_WIDTH_PRECISION_LENGTH + PLACEHOLDER_TYPES
1818)
1919
20+ TWINE_PLACEHOLDER_REGEX = re .compile (
21+ r"(%" + PLACEHOLDER_PARAMETER_FLAGS_WIDTH_PRECISION_LENGTH + r")@"
22+ )
23+
24+ PLACEHOLDER_SYNTAX = (
25+ PLACEHOLDER_PARAMETER_FLAGS_WIDTH_PRECISION_LENGTH + PLACEHOLDER_TYPES
26+ )
27+ SINGLE_PERCENT_REGEX = re .compile (r"([^%])(%)(?!(%|" + PLACEHOLDER_SYNTAX + r"))" )
28+
29+ NON_NUMBERED_PLACEHOLDER_REGEX = re .compile (
30+ "%(" + PLACEHOLDER_FLAGS_WIDTH_PRECISION_LENGTH + PLACEHOLDER_TYPES + ")"
31+ )
32+
33+ ANDROID_PLACEHOLDER_REGEX = re .compile (
34+ "(%" + PLACEHOLDER_PARAMETER_FLAGS_WIDTH_PRECISION_LENGTH + ")s"
35+ )
36+ PYTHON_PLACEHOLDER_REGEX = re .compile (
37+ r"%\([a-zA-Z0-9_-]+\)"
38+ + PLACEHOLDER_PARAMETER_FLAGS_WIDTH_PRECISION_LENGTH
39+ + PLACEHOLDER_TYPES
40+ )
41+
2042
2143def number_of_twine_placeholders (input_str : str ) -> int :
2244 """Count the number of printf-style placeholders in a string."""
@@ -25,10 +47,7 @@ def number_of_twine_placeholders(input_str: str) -> int:
2547
2648def convert_twine_string_placeholder (input_str : str ) -> str :
2749 """Convert Twine string placeholder from %@ to %s."""
28- pattern = re .compile (
29- r"(%" + PLACEHOLDER_PARAMETER_FLAGS_WIDTH_PRECISION_LENGTH + r")@"
30- )
31- return pattern .sub (r"\1s" , input_str )
50+ return TWINE_PLACEHOLDER_REGEX .sub (r"\1s" , input_str )
3251
3352
3453def convert_placeholders_from_twine_to_android (input_str : str ) -> str :
@@ -53,21 +72,13 @@ def convert_placeholders_from_twine_to_android(input_str: str) -> str:
5372
5473 # Got placeholders -> need to double single percent signs
5574 # % -> %% (but %% -> %%, %d -> %d)
56- placeholder_syntax = (
57- PLACEHOLDER_PARAMETER_FLAGS_WIDTH_PRECISION_LENGTH + PLACEHOLDER_TYPES
58- )
59- single_percent_regex = re .compile (r"([^%])(%)(?!(%|" + placeholder_syntax + r"))" )
60- value = single_percent_regex .sub (r"\1%%" , value )
75+ value = SINGLE_PERCENT_REGEX .sub (r"\1%%" , value )
6176
6277 if num_placeholders < 2 :
6378 return value
6479
6580 # Number placeholders if there are multiple
66- non_numbered_placeholder_regex = re .compile (
67- r"%(" + PLACEHOLDER_FLAGS_WIDTH_PRECISION_LENGTH + PLACEHOLDER_TYPES + r")"
68- )
69-
70- non_numbered_matches = non_numbered_placeholder_regex .findall (value )
81+ non_numbered_matches = NON_NUMBERED_PLACEHOLDER_REGEX .findall (value )
7182 num_non_numbered = len (non_numbered_matches )
7283
7384 if num_non_numbered == 0 :
@@ -86,17 +97,14 @@ def number_placeholder(match):
8697 index += 1
8798 return f"%{ index } ${ match .group (1 )} "
8899
89- value = non_numbered_placeholder_regex .sub (number_placeholder , value )
100+ value = NON_NUMBERED_PLACEHOLDER_REGEX .sub (number_placeholder , value )
90101
91102 return value
92103
93104
94105def convert_placeholders_from_android_to_twine (input_str : str ) -> str :
95106 """Convert Android string placeholders (%s) to Twine format (%@)."""
96- placeholder_regex = re .compile (
97- r"(%" + PLACEHOLDER_PARAMETER_FLAGS_WIDTH_PRECISION_LENGTH + r")s"
98- )
99- return placeholder_regex .sub (r"\1@" , input_str )
107+ return ANDROID_PLACEHOLDER_REGEX .sub (r"\1@" , input_str )
100108
101109
102110def convert_placeholders_from_twine_to_flash (input_str : str ) -> str :
@@ -132,9 +140,4 @@ def contains_python_specific_placeholder(input_str: str) -> bool:
132140 Python supports placeholders like %(amount)03d
133141 See https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting
134142 """
135- pattern = re .compile (
136- r"%\([a-zA-Z0-9_-]+\)"
137- + PLACEHOLDER_PARAMETER_FLAGS_WIDTH_PRECISION_LENGTH
138- + PLACEHOLDER_TYPES
139- )
140- return pattern .search (input_str ) is not None
143+ return PYTHON_PLACEHOLDER_REGEX .search (input_str ) is not None
0 commit comments