Skip to content

Commit

Permalink
Merge pull request #309 from transifex/CHAM-586-allow-number-and-symb…
Browse files Browse the repository at this point in the history
…ols-in-the-context-field-for-yaml-files

CHAM-586 Allow numbers and symbols on yaml context
  • Loading branch information
nkarab authored Sep 12, 2023
2 parents 990d6d6 + b1c8d33 commit b765d08
Show file tree
Hide file tree
Showing 13 changed files with 82 additions and 6 deletions.
13 changes: 11 additions & 2 deletions openformats/formats/yaml/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,13 +142,19 @@ def _is_custom_tag(self, tag):
Detect custom tags, like:
`foo: !bar test`
`foo: !xml "<bar>Bar</bar>"`
The name of the custom tag can have any of the following characters:
`a-z`, `A-Z`, `0-9`, `_`, `.`, `:`, `-`.
In any other case, we return `False`.
Built-in types, indicated by a `!!` prefix, will not be matched. We
can't preserve the information whether a built-in tag like `!!str` was
used for a value since the PyYAML library will tag such entries with
the built-in identifier. For example `tag:yaml.org,2002:str`, not
`!!str`.
"""
return re.match(ensure_unicode(r'^[\![a-zA-Z_]*]*$'),

return re.match(ensure_unicode(r'^\![a-zA-Z0-9_:.\-]*$'),
tag,
re.IGNORECASE)

Expand Down Expand Up @@ -222,6 +228,8 @@ def construct_mapping(self, node, deep=True):
and self._is_custom_tag(value_node.tag)
):
tag = six.text_type(value_node.tag)
# remove the exclamation mark from the tag
tag = tag[1:] if tag.startswith('!') else tag

value = Node(value, start, end, style, tag)
pairs.append((key, value))
Expand Down Expand Up @@ -349,8 +357,9 @@ def generate_yaml_dict(self, stringset):
yaml_dict, keys, flags, se.string.get(rule), tag=None,
)
else:
tag = '!' + se.context if se.context else se.context
self._insert_translation_in_dict(
yaml_dict, keys, flags, se.string, tag=se.context,
yaml_dict, keys, flags, se.string, tag=tag,
)
return yaml_dict

Expand Down
3 changes: 2 additions & 1 deletion openformats/formats/yaml/yaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,8 @@ def _compile_from_template(self, template, stringset, **kwargs):
# it and apply a space afterwards so it doesn't get merged with the
# string
if string.context:
transcriber.add(string.context)
# add an exclamation mark to the context to make it a tag
transcriber.add('!' + string.context)
transcriber.add(' ')
transcriber.add(translation)
transcriber.skip(len(string.template_replacement))
Expand Down
7 changes: 7 additions & 0 deletions openformats/tests/formats/yaml/files/1_el.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,13 @@ hello: "el:World" # Translatable
number: !!int 123 # Should ignore
bin: !!binary aGVsbG8= # Should ignore

# Custom tags with numbers and symbols
context_string: !cs:fd-94_fd.dot. "el:context string"
verbim_context_string: !context:t5-46_qa "el:verbim context string"
context_on_nested_map:
first: !first_context:54KJFLA95KJ4 "el:context in nested map"
second: !second_context:FDKJ40DK "el:context in nested map"

# Test with non-ASCII keys
#σχόλιο
σχόλιο: "el:κείμενο"
Expand Down
7 changes: 7 additions & 0 deletions openformats/tests/formats/yaml/files/1_en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,13 @@ hello: !!str World # Translatable
number: !!int 123 # Should ignore
bin: !!binary aGVsbG8= # Should ignore

# Custom tags with numbers and symbols
context_string: !cs:fd-94_fd.dot. "context string"
verbim_context_string: !<!context:t5-46_qa> "verbim context string"
context_on_nested_map:
first: !first_context:54KJFLA95KJ4 "context in nested map"
second: !second_context:FDKJ40DK "context in nested map"

# Test with non-ASCII keys
#σχόλιο
σχόλιο: κείμενο
Expand Down
7 changes: 7 additions & 0 deletions openformats/tests/formats/yaml/files/1_en_exported.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,13 @@ hello: World # Translatable
number: !!int 123 # Should ignore
bin: !!binary aGVsbG8= # Should ignore

# Custom tags with numbers and symbols
context_string: !cs:fd-94_fd.dot. "context string"
verbim_context_string: !context:t5-46_qa "verbim context string"
context_on_nested_map:
first: !first_context:54KJFLA95KJ4 "context in nested map"
second: !second_context:FDKJ40DK "context in nested map"

# Test with non-ASCII keys
#σχόλιο
σχόλιο: κείμενο
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ alias_key:
foo: !test 'bar'
bar: !xml "foo <xml>bar</xml>"
hello: World
context_string: !cs:fd-94_fd.dot. "context string"
verbim_context_string: !context:t5-46_qa "verbim context string"
context_on_nested_map:
first: "context in nested map"
second: "context in nested map"
σχόλιο: κείμενο
emojis: \uD83D\uDC40 🏹🍍🍍 \U0001F418
anchor_with_label:
Expand Down
11 changes: 9 additions & 2 deletions openformats/tests/formats/yaml/files/1_tpl.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,19 @@ alias_key:
- ddc3cfcedcf1686d9e3ba6b99a0d091b_tr

# Custom tags
foo: 3e4000f6f4cd8bb27db6fb82e1b50bb4_tr # Should treat as string and ignore leading spaces
bar: 75ce597a505a4faf6369b66b885926c8_tr # Also a string
foo: 023503fb466f78932b77209b6581156e_tr # Should treat as string and ignore leading spaces
bar: fac8140a2ec031af14bc758e73f59017_tr # Also a string
hello: b0ed9cf22c0a5186d1c5b483a910dd33_tr # Translatable
number: !!int 123 # Should ignore
bin: !!binary aGVsbG8= # Should ignore

# Custom tags with numbers and symbols
context_string: 17d854ee46fe3d3bc91fadb4cf4df426_tr
verbim_context_string: 0a3c1ae205b2c0d09ab69ab540e481f2_tr
context_on_nested_map:
first: 95175e30d6fbfe0f658e75919cd4982c_tr
second: dce391c231a7ad7fef9e6cc0ddcbf549_tr

# Test with non-ASCII keys
#σχόλιο
σχόλιο: 8687f34a9bf89770b456b48ad2395788_tr
Expand Down
2 changes: 1 addition & 1 deletion openformats/tests/formats/yaml/test_yaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ def test_openstring_attributes(self):
self.assertEqual(test_string.flags, '')

content_string = strings[1]
self.assertEqual(content_string.context, '!tag')
self.assertEqual(content_string.context, 'tag')
self.assertEqual(content_string.flags, "'")

def test_parse_duplicate_keys(self):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,10 @@ en:
anchor_mapping: &another_anchor
one: el:one
other: el:other

# context
context_string: !cs:fd-94_fd.dot. "el:context string"
verbim_context_string: !context:t5-46_qa "el:verbim context string"
context_on_nested_map:
first: !first_context:54KJFLA95KJ4 "el:context in nested map"
second: !second_context:FDKJ40DK "el:context in nested map"
Original file line number Diff line number Diff line change
Expand Up @@ -104,3 +104,10 @@ en:
anchor_mapping: &another_anchor
one: one
other: other

# context
context_string: !cs:fd-94_fd.dot. "context string"
verbim_context_string: !<!context:t5-46_qa> "verbim context string"
context_on_nested_map:
first: !first_context:54KJFLA95KJ4 "context in nested map"
second: !second_context:FDKJ40DK "context in nested map"
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,10 @@ en:
anchor_mapping: &another_anchor
one: one
other: other

# context
context_string: !cs:fd-94_fd.dot. "context string"
verbim_context_string: !context:t5-46_qa "verbim context string"
context_on_nested_map:
first: !first_context:54KJFLA95KJ4 "context in nested map"
second: !second_context:FDKJ40DK "context in nested map"
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,8 @@ en:
anchor_mapping:
one: one
other: other
context_string: !cs:fd-94_fd.dot. "context string"
verbim_context_string: !context:t5-46_qa "verbim context string"
context_on_nested_map:
first: "context in nested map"
second: "context in nested map"
Original file line number Diff line number Diff line change
Expand Up @@ -90,3 +90,10 @@ en:

anchor_mapping: &another_anchor
798cf4a4e275a90e80b0aac837f06793_pl

# context
context_string: 17d854ee46fe3d3bc91fadb4cf4df426_tr
verbim_context_string: 0a3c1ae205b2c0d09ab69ab540e481f2_tr
context_on_nested_map:
first: 95175e30d6fbfe0f658e75919cd4982c_tr
second: dce391c231a7ad7fef9e6cc0ddcbf549_tr

0 comments on commit b765d08

Please sign in to comment.