Skip to content

Commit d99f11a

Browse files
committed
Add Script::from_full_name and Script::from_short_name
1 parent 8cd55c9 commit d99f11a

File tree

3 files changed

+500
-85
lines changed

3 files changed

+500
-85
lines changed

scripts/unicode.py

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,16 @@
3434
3535
#![allow(missing_docs, non_upper_case_globals, non_snake_case)]
3636
37-
use super::ScriptExtension;
37+
pub use tables_impl::*;
38+
39+
#[rustfmt::skip]
40+
mod tables_impl {
41+
use crate::ScriptExtension;
42+
'''
43+
44+
# Close `mod impl {`
45+
ending='''
46+
}
3847
'''
3948

4049
UNICODE_VERSION = (13, 0, 0)
@@ -239,7 +248,21 @@ def emit_enums(f, script_list, extension_list, longforms):
239248
f.write(" /// %s\n pub const %s: ScriptExtension = %s;\n" % (longform, name, expr))
240249
f.write("""}
241250
242-
impl Script {
251+
""")
252+
253+
# Generate implementation for the `Script`
254+
generate_script_impl(f)
255+
256+
257+
def generate_script_impl(f):
258+
"""Generates an `impl Script { ... }` section with all the required functions"""
259+
260+
# Open `impl Script` section.
261+
f.write("""impl Script {
262+
""")
263+
264+
# Generate impl of `inner_full_name`.
265+
f.write("""
243266
#[inline]
244267
pub(crate) fn inner_full_name(self) -> &'static str {
245268
match self {
@@ -251,7 +274,26 @@ def emit_enums(f, script_list, extension_list, longforms):
251274
f.write(" Script::%s => \"%s\",\n" % (longforms[script], longforms[script]))
252275
f.write(""" }
253276
}
277+
""")
254278

279+
# Generate impl of `inner_from_full_name`.
280+
f.write("""
281+
#[inline]
282+
pub(crate) fn inner_from_full_name(input: &str) -> Option<Self> {
283+
match input {
284+
"Unknown" => Some(Script::Unknown),
285+
"Common" => Some(Script::Common),
286+
"Inherited" => Some(Script::Inherited),
287+
""")
288+
for script in script_list:
289+
f.write(" \"%s\" => Some(Script::%s),\n" % (longforms[script], longforms[script]))
290+
f.write(" _ => None,\n" )
291+
f.write(""" }
292+
}
293+
""")
294+
295+
# Generate impl of `inner_short_name`
296+
f.write("""
255297
#[inline]
256298
pub(crate) fn inner_short_name(self) -> &'static str {
257299
match self {
@@ -263,7 +305,26 @@ def emit_enums(f, script_list, extension_list, longforms):
263305
f.write(" Script::%s => \"%s\",\n" % (longforms[script], script))
264306
f.write(""" }
265307
}
308+
""")
266309

310+
# Generate impl of `inner_from_short_name`
311+
f.write("""
312+
#[inline]
313+
pub(crate) fn inner_from_short_name(input: &str) -> Option<Self> {
314+
match input {
315+
"" => Some(Script::Unknown),
316+
"Zyyy" => Some(Script::Common),
317+
"Zinh" => Some(Script::Inherited),
318+
""")
319+
for script in script_list:
320+
f.write(" \"%s\" => Some(Script::%s),\n" % (script, longforms[script]))
321+
f.write(""" _ => None,\n""")
322+
f.write(""" }
323+
}
324+
""")
325+
326+
# Generate impl of `for_integer`
327+
f.write("""
267328
#[inline]
268329
pub(crate) fn for_integer(value: u8) -> Self {
269330
match value {
@@ -273,6 +334,10 @@ def emit_enums(f, script_list, extension_list, longforms):
273334
f.write(""" _ => unreachable!(),
274335
}
275336
}
337+
""")
338+
339+
# Close `impl Script` section
340+
f.write("""
276341
}
277342
""")
278343

@@ -281,8 +346,6 @@ def extension_name(ext):
281346
return "script_extensions::%s" % "_".join([e.upper() for e in ext])
282347

283348

284-
285-
286349
if __name__ == "__main__":
287350
r = "tables.rs"
288351
if os.path.exists(r):
@@ -336,3 +399,5 @@ def extension_name(ext):
336399
is_pub=False , pfun=lambda x: "(%s,%s,%s)" % (escape_char(x[0]), escape_char(x[1]), extension_name(x[2])))
337400

338401
# emit_table(rf, "FOObar", properties)
402+
403+
rf.write(ending)

src/lib.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,30 @@ use tables::{get_script, get_script_extension, NEXT_SCRIPT};
1515
pub use tables::{Script, UNICODE_VERSION};
1616

1717
impl Script {
18-
/// Get the full name of a script
18+
/// Get the full name of a script.
1919
pub fn full_name(self) -> &'static str {
2020
self.inner_full_name()
2121
}
2222

23-
/// Get the four-character short name of a script
23+
/// Attempts to parse script name from the provided string.
24+
/// Returns `None` if the provided string does not represent a valid
25+
/// script full name.
26+
pub fn from_full_name(input: &str) -> Option<Self> {
27+
Self::inner_from_full_name(input)
28+
}
29+
30+
/// Get the four-character short name of a script.
2431
pub fn short_name(self) -> &'static str {
2532
self.inner_short_name()
2633
}
2734

35+
/// Attempts to parse script name from the provided string.
36+
/// Returns `None` if the provided string does not represent a valid
37+
/// script four-character short name.
38+
pub fn from_short_name(input: &str) -> Option<Self> {
39+
Self::inner_from_short_name(input)
40+
}
41+
2842
/// Is this script "Recommended" according to
2943
/// [UAX #31](www.unicode.org/reports/tr31/#Table_Recommended_Scripts)?
3044
pub fn is_recommended(self) -> bool {

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy