Source code for xlsx2html.format.locale
import re
from typing import Optional, Tuple, Union
from babel import Locale, UnknownLocaleError
from xlsx2html.constants import LCID_HEX_MAP
LOCALE_FORMAT_RE = re.compile(
r"""
\[
\$
(?:.+|)
-(?P<lcid>[0-9A-Fa-f]{3,4})
\]
""",
re.VERBOSE,
)
[docs]def parse_locale_code(code: str) -> Optional[str]:
"""
>>> parse_locale_code('-404')
'zh_Hant_TW'
>>> parse_locale_code('404')
'zh_Hant_TW'
>>> parse_locale_code('0404')
'zh_Hant_TW'
>>> parse_locale_code('58050')
"""
try:
lcid = abs(int(code, 16))
locale_code = LCID_HEX_MAP.get(lcid, "UNKNOWN")
return str(Locale.parse(locale_code))
except UnknownLocaleError:
return None
[docs]def extract_locale_from_format(fmt: str) -> Tuple[Union[str, None], str]:
"""
>>> extract_locale_from_format('[$-404]e/m/d')
('zh_Hant_TW', 'e/m/d')
>>> extract_locale_from_format('[$USD-404]e/m/d')
('zh_Hant_TW', 'e/m/d')
>>> extract_locale_from_format('[$$-404]#.00')
('zh_Hant_TW', '#.00')
>>> extract_locale_from_format('[RED]e/m/d')
(None, '[RED]e/m/d')
"""
locale = None
m = LOCALE_FORMAT_RE.match(fmt)
if not m:
return locale, fmt
win_locale = m.group()
# todo keep currency
new_locale = parse_locale_code(m.group(1))
if new_locale:
locale = new_locale
fmt = fmt.replace(win_locale, "")
return locale, fmt