Skip to content

Commit 3fadc16

Browse files
committed
Properly handle non-ascii characters for all languages enum keys
1 parent ef06843 commit 3fadc16

File tree

7 files changed

+32
-16
lines changed

7 files changed

+32
-16
lines changed

src/SDK/Language.php

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -86,24 +86,42 @@ public function getFilters(): array
8686

8787
protected function toPascalCase(string $value): string
8888
{
89-
return ucfirst($this->toCamelCase($value));
89+
return \ucfirst($this->toCamelCase($value));
9090
}
9191

9292
protected function toCamelCase($str): string
9393
{
94-
$str = preg_replace('/[^a-z0-9' . implode("", []) . ']+/i', ' ', $str);
95-
$str = trim($str);
96-
$str = ucwords($str);
97-
$str = str_replace(" ", "", $str);
98-
return lcfirst($str);
94+
// Normalize the string to decompose accented characters
95+
$str = \Normalizer::normalize($str, \Normalizer::FORM_D);
96+
97+
// Remove accents and other residual non-ASCII characters
98+
$str = \preg_replace('/\p{M}/u', '', $str);
99+
100+
$str = \preg_replace('/[^a-zA-Z0-9]+/', ' ', $str);
101+
$str = \trim($str);
102+
$str = \ucwords($str);
103+
$str = \str_replace(' ', '', $str);
104+
$str = \lcfirst($str);
105+
106+
return $str;
99107
}
100108

101109
protected function toSnakeCase($str): string
102110
{
103-
$str = \preg_replace('/([a-z])([A-Z])/', '$1 $2', $str);
104-
$str = \explode(' ', $str);
105-
$str = \implode('_', $str);
106-
return \strtolower($str);
111+
// Normalize the string to decompose accented characters
112+
$str = \Normalizer::normalize($str, \Normalizer::FORM_D);
113+
114+
// Remove accents and other residual non-ASCII characters
115+
$str = \preg_replace('/\p{M}/u', '', $str);
116+
117+
// Remove apostrophes before replacing non-word characters with underscores
118+
$str = \str_replace("'", '', $str);
119+
$str = \preg_replace('/[^a-zA-Z0-9]+/', '_', $str);
120+
$str = \preg_replace('/_+/', '_', $str);
121+
$str = \trim($str, '_');
122+
$str = \strtolower($str);
123+
124+
return $str;
107125
}
108126

109127
protected function toUpperSnakeCase($str): string

src/SDK/Language/Kotlin.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,6 @@ public function getFilters(): array
443443
if (isset($this->getIdentifierOverrides()[$value])) {
444444
$value = $this->getIdentifierOverrides()[$value];
445445
}
446-
$value = \preg_replace('/[^a-zA-Z0-9]/', '', $value);
447446
return $this->toUpperSnakeCase($value);
448447
}),
449448
];

src/SDK/Language/Swift.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,6 @@ public function getFilters(): array
471471
if (isset($this->getIdentifierOverrides()[$value])) {
472472
$value = $this->getIdentifierOverrides()[$value];
473473
}
474-
$value = \preg_replace('/[^a-zA-Z0-9]/', '', $value);
475474
return $this->toCamelCase($value);
476475
}),
477476
];

templates/deno/src/enums/enum.ts.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export enum {{ enum.name | caseUcfirst | overrideIdentifier }} {
22
{%~ for value in enum.enum %}
33
{%~ set key = enum.keys is empty ? value : enum.keys[loop.index0] %}
4-
{{ key | caseUcfirst | replace({'-': ''}) }} = '{{ value }}',
4+
{{ key | caseEnumKey }} = '{{ value }}',
55
{%~ endfor %}
66
}

templates/node/lib/enums/enum.js.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const {{ enum.name | caseUcfirst | overrideIdentifier }} = {
22
{% for value in enum.enum %}
33
{% set key = enum.keys is empty ? value : enum.keys[loop.index0] %}
4-
{{ key | replace({'-': '',' ': ''}) | caseEnumKey }}: '{{value}}' {% if not loop.last %},{% endif %}
4+
{{ key | caseEnumKey }}: '{{value}}' {% if not loop.last %},{% endif %}
55

66
{% endfor %}
77
}

templates/python/package/enums/enum.py.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ from enum import Enum
33
class {{ enum.name | caseUcfirst | overrideIdentifier }}(Enum):
44
{% for value in enum.enum %}
55
{% set key = enum.keys is empty ? value : enum.keys[loop.index0] %}
6-
{{ key | caseUpper | replace({'-': '',' ':'_', '(': '', ')': '', '.': ''})}} = "{{ value }}"
6+
{{ key | caseEnumKey }} = "{{ value }}"
77
{% endfor %}

templates/ruby/lib/container/enums/enum.rb.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module {{ spec.title | caseUcfirst }}
33
module {{ enum.name | caseUcfirst | overrideIdentifier }}
44
{%~ for value in enum.enum %}
55
{%~ set key = enum.keys is empty ? value : enum.keys[loop.index0] %}
6-
{{ key | caseUpper | replace({'-': '_', ' ':'_', '(': '', ')': '', '.': ''}) }} = '{{ value }}'
6+
{{ key | caseEnumKey }} = '{{ value }}'
77
{%~ endfor %}
88
end
99
end

0 commit comments

Comments
 (0)