Skip to content

Commit ca2d286

Browse files
committed
Merge pull request godotengine#90196 from bruvzg/ts_tcase
[TextServer] Expose ICU title case string conversion to scripting.
2 parents fe78457 + 27f6f41 commit ca2d286

File tree

10 files changed

+66
-0
lines changed

10 files changed

+66
-0
lines changed

doc/classes/TextServer.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1736,6 +1736,16 @@
17361736
[b]Note:[/b] The result may be longer or shorter than the original.
17371737
</description>
17381738
</method>
1739+
<method name="string_to_title" qualifiers="const">
1740+
<return type="String" />
1741+
<param index="0" name="string" type="String" />
1742+
<param index="1" name="language" type="String" default="&quot;&quot;" />
1743+
<description>
1744+
Returns the string converted to title case.
1745+
[b]Note:[/b] Casing is locale dependent and context sensitive if server support [constant FEATURE_CONTEXT_SENSITIVE_CASE_CONVERSION] feature (supported by [TextServerAdvanced]).
1746+
[b]Note:[/b] The result may be longer or shorter than the original.
1747+
</description>
1748+
</method>
17391749
<method name="string_to_upper" qualifiers="const">
17401750
<return type="String" />
17411751
<param index="0" name="string" type="String" />

doc/classes/TextServerExtension.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1913,6 +1913,15 @@
19131913
Returns the string converted to lowercase.
19141914
</description>
19151915
</method>
1916+
<method name="_string_to_title" qualifiers="virtual const">
1917+
<return type="String" />
1918+
<param index="0" name="string" type="String" />
1919+
<param index="1" name="language" type="String" />
1920+
<description>
1921+
[b]Optional.[/b]
1922+
Returns the string converted to title case.
1923+
</description>
1924+
</method>
19161925
<method name="_string_to_upper" qualifiers="virtual const">
19171926
<return type="String" />
19181927
<param index="0" name="string" type="String" />

modules/text_server_adv/text_server_adv.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6976,6 +6976,34 @@ String TextServerAdvanced::_string_to_lower(const String &p_string, const String
69766976
return String::utf16(lower.ptr(), len);
69776977
}
69786978

6979+
String TextServerAdvanced::_string_to_title(const String &p_string, const String &p_language) const {
6980+
#ifndef ICU_STATIC_DATA
6981+
if (!icu_data_loaded) {
6982+
return p_string.capitalize();
6983+
}
6984+
#endif
6985+
6986+
if (p_string.is_empty()) {
6987+
return p_string;
6988+
}
6989+
const String lang = (p_language.is_empty()) ? TranslationServer::get_singleton()->get_tool_locale() : p_language;
6990+
6991+
// Convert to UTF-16.
6992+
Char16String utf16 = p_string.utf16();
6993+
6994+
Vector<char16_t> upper;
6995+
UErrorCode err = U_ZERO_ERROR;
6996+
int32_t len = u_strToTitle(nullptr, 0, utf16.get_data(), -1, nullptr, lang.ascii().get_data(), &err);
6997+
ERR_FAIL_COND_V_MSG(err != U_BUFFER_OVERFLOW_ERROR, p_string, u_errorName(err));
6998+
upper.resize(len);
6999+
err = U_ZERO_ERROR;
7000+
u_strToTitle(upper.ptrw(), len, utf16.get_data(), -1, nullptr, lang.ascii().get_data(), &err);
7001+
ERR_FAIL_COND_V_MSG(U_FAILURE(err), p_string, u_errorName(err));
7002+
7003+
// Convert back to UTF-32.
7004+
return String::utf16(upper.ptr(), len);
7005+
}
7006+
69797007
PackedInt32Array TextServerAdvanced::_string_get_word_breaks(const String &p_string, const String &p_language, int64_t p_chars_per_line) const {
69807008
const String lang = (p_language.is_empty()) ? TranslationServer::get_singleton()->get_tool_locale() : p_language;
69817009
// Convert to UTF-16.

modules/text_server_adv/text_server_adv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -991,6 +991,7 @@ class TextServerAdvanced : public TextServerExtension {
991991

992992
MODBIND2RC(String, string_to_upper, const String &, const String &);
993993
MODBIND2RC(String, string_to_lower, const String &, const String &);
994+
MODBIND2RC(String, string_to_title, const String &, const String &);
994995

995996
MODBIND0(cleanup);
996997

modules/text_server_fb/text_server_fb.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4439,6 +4439,10 @@ String TextServerFallback::_string_to_lower(const String &p_string, const String
44394439
return p_string.to_lower();
44404440
}
44414441

4442+
String TextServerFallback::_string_to_title(const String &p_string, const String &p_language) const {
4443+
return p_string.capitalize();
4444+
}
4445+
44424446
PackedInt32Array TextServerFallback::_string_get_word_breaks(const String &p_string, const String &p_language, int64_t p_chars_per_line) const {
44434447
PackedInt32Array ret;
44444448

modules/text_server_fb/text_server_fb.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,7 @@ class TextServerFallback : public TextServerExtension {
848848

849849
MODBIND2RC(String, string_to_upper, const String &, const String &);
850850
MODBIND2RC(String, string_to_lower, const String &, const String &);
851+
MODBIND2RC(String, string_to_title, const String &, const String &);
851852

852853
MODBIND0(cleanup);
853854

servers/text/text_server_extension.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ void TextServerExtension::_bind_methods() {
341341

342342
GDVIRTUAL_BIND(_string_to_upper, "string", "language");
343343
GDVIRTUAL_BIND(_string_to_lower, "string", "language");
344+
GDVIRTUAL_BIND(_string_to_title, "string", "language");
344345

345346
GDVIRTUAL_BIND(_parse_structured_text, "parser_type", "args", "text");
346347

@@ -1507,6 +1508,14 @@ String TextServerExtension::string_to_upper(const String &p_string, const String
15071508
return p_string;
15081509
}
15091510

1511+
String TextServerExtension::string_to_title(const String &p_string, const String &p_language) const {
1512+
String ret;
1513+
if (GDVIRTUAL_CALL(_string_to_title, p_string, p_language, ret)) {
1514+
return ret;
1515+
}
1516+
return p_string;
1517+
}
1518+
15101519
String TextServerExtension::string_to_lower(const String &p_string, const String &p_language) const {
15111520
String ret;
15121521
if (GDVIRTUAL_CALL(_string_to_lower, p_string, p_language, ret)) {

servers/text/text_server_extension.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,8 +566,10 @@ class TextServerExtension : public TextServer {
566566

567567
virtual String string_to_upper(const String &p_string, const String &p_language = "") const override;
568568
virtual String string_to_lower(const String &p_string, const String &p_language = "") const override;
569+
virtual String string_to_title(const String &p_string, const String &p_language = "") const override;
569570
GDVIRTUAL2RC(String, _string_to_upper, const String &, const String &);
570571
GDVIRTUAL2RC(String, _string_to_lower, const String &, const String &);
572+
GDVIRTUAL2RC(String, _string_to_title, const String &, const String &);
571573

572574
TypedArray<Vector3i> parse_structured_text(StructuredTextParser p_parser_type, const Array &p_args, const String &p_text) const;
573575
GDVIRTUAL3RC(TypedArray<Vector3i>, _parse_structured_text, StructuredTextParser, const Array &, const String &);

servers/text_server.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,7 @@ void TextServer::_bind_methods() {
491491

492492
ClassDB::bind_method(D_METHOD("string_to_upper", "string", "language"), &TextServer::string_to_upper, DEFVAL(""));
493493
ClassDB::bind_method(D_METHOD("string_to_lower", "string", "language"), &TextServer::string_to_lower, DEFVAL(""));
494+
ClassDB::bind_method(D_METHOD("string_to_title", "string", "language"), &TextServer::string_to_title, DEFVAL(""));
494495

495496
ClassDB::bind_method(D_METHOD("parse_structured_text", "parser_type", "args", "text"), &TextServer::parse_structured_text);
496497

servers/text_server.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,7 @@ class TextServer : public RefCounted {
546546
// Other string operations.
547547
virtual String string_to_upper(const String &p_string, const String &p_language = "") const = 0;
548548
virtual String string_to_lower(const String &p_string, const String &p_language = "") const = 0;
549+
virtual String string_to_title(const String &p_string, const String &p_language = "") const = 0;
549550

550551
TypedArray<Vector3i> parse_structured_text(StructuredTextParser p_parser_type, const Array &p_args, const String &p_text) const;
551552

0 commit comments

Comments
 (0)