Files
api-v2/deps/expo/src/expo_po_parser.yrl
2025-04-16 10:03:13 -03:00

281 lines
7.6 KiB
Erlang

Nonterminals
grammar
obsolete_pluralization
obsolete_pluralizations
obsolete_plural_message
obsolete_singular_message
only_comments
pluralization
pluralizations
plural_message
singular_message
message
messages
message_meta.
Terminals
comment
msgctxt
msgid
msgid_plural
msgstr
obsolete_msgctxt
obsolete_msgid
obsolete_msgid_plural
obsolete_msgstr
plural_form
previous
str_lines.
Rootsymbol grammar.
Endsymbol '$end'.
grammar ->
only_comments : {only_comments, '$1'}.
grammar ->
messages : {messages, '$1'}.
grammar ->
'$empty' : empty.
only_comments ->
comment only_comments : [extract_simple_token('$1') | '$2'].
only_comments ->
comment : [extract_simple_token('$1')].
messages ->
message messages : ['$1' | '$2'].
messages ->
message : ['$1'].
message ->
obsolete_singular_message : '$1'.
message ->
singular_message : '$1'.
message ->
obsolete_plural_message : '$1'.
message ->
plural_message : '$1'.
singular_message ->
message_meta msgid str_lines msgstr str_lines : to_singular_message(
[
{msgid, extract_simple_token('$3')},
{msgstr, extract_simple_token('$5')}
| group_meta('$1')
], [
{msgid, extract_line('$2')},
{msgstr, extract_line('$4')}
]
).
singular_message ->
message_meta msgctxt str_lines msgid str_lines msgstr str_lines : to_singular_message(
[
{msgctxt, extract_simple_token('$3')},
{msgid, extract_simple_token('$5')},
{msgstr, extract_simple_token('$7')}
| group_meta('$1')
],
[
{msgctxt, extract_line('$2')},
{msgid, extract_line('$4')},
{msgstr, extract_line('$6')}
]
).
obsolete_singular_message ->
message_meta obsolete_msgid str_lines obsolete_msgstr str_lines : to_singular_message(
[
{obsolete, true},
{msgid, extract_simple_token('$3')},
{msgstr, extract_simple_token('$5')}
| group_meta('$1')
], [
{msgid, extract_line('$2')},
{msgstr, extract_line('$4')}
]
).
obsolete_singular_message ->
message_meta obsolete_msgctxt str_lines obsolete_msgid str_lines obsolete_msgstr str_lines : to_singular_message(
[
{obsolete, true},
{msgctxt, extract_simple_token('$3')},
{msgid, extract_simple_token('$5')},
{msgstr, extract_simple_token('$7')}
| group_meta('$1')
],
[
{msgctxt, extract_line('$2')},
{msgid, extract_line('$4')},
{msgstr, extract_line('$6')}
]
).
plural_message ->
message_meta msgid str_lines msgid_plural str_lines pluralizations :
{Pluralizations, PluralLineInformation} = split_msgstr('$6'),
to_plural_message(
[
{msgid, extract_simple_token('$3')},
{msgid_plural, extract_simple_token('$5')},
{msgstr, maps:from_list(Pluralizations)}
| group_meta('$1')
],
[
{msgid, extract_line('$2')},
{msgid_plural, extract_line('$4')} | PluralLineInformation
]
).
plural_message ->
message_meta msgctxt str_lines msgid str_lines msgid_plural str_lines pluralizations :
{Pluralizations, PluralLineInformation} = split_msgstr('$8'),
to_plural_message(
[
{msgctxt, extract_simple_token('$3')},
{msgid, extract_simple_token('$5')},
{msgid_plural, extract_simple_token('$7')},
{msgstr, maps:from_list(Pluralizations)}
| group_meta('$1')
],
[
{msgctx, extract_line('$2')},
{msgid, extract_line('$4')},
{msgid_plural, extract_line('$6')}
| PluralLineInformation
]
).
obsolete_plural_message ->
message_meta obsolete_msgid str_lines obsolete_msgid_plural str_lines obsolete_pluralizations :
{Pluralizations, PluralLineInformation} = split_msgstr('$6'),
to_plural_message(
[
{obsolete, true},
{msgid, extract_simple_token('$3')},
{msgid_plural, extract_simple_token('$5')},
{msgstr, maps:from_list(Pluralizations)}
| group_meta('$1')
],
[
{msgid, extract_line('$2')},
{msgid_plural, extract_line('$4')}
| PluralLineInformation
]
).
obsolete_plural_message ->
message_meta obsolete_msgctxt str_lines obsolete_msgid str_lines obsolete_msgid_plural str_lines obsolete_pluralizations :
{Pluralizations, PluralLineInformation} = split_msgstr('$8'),
to_plural_message(
[
{obsolete, true},
{msgctxt, extract_simple_token('$3')},
{msgid, extract_simple_token('$5')},
{msgid_plural, extract_simple_token('$7')},
{msgstr, maps:from_list(Pluralizations)}
| group_meta('$1')
],
[
{msgctx, extract_line('$2')},
{msgid, extract_line('$4')},
{msgid_plural, extract_line('$6')}
| PluralLineInformation
]
).
pluralizations ->
pluralization : ['$1'].
pluralizations ->
pluralization pluralizations : ['$1'|'$2'].
obsolete_pluralizations ->
obsolete_pluralization : ['$1'].
obsolete_pluralizations ->
obsolete_pluralization obsolete_pluralizations : ['$1' | '$2'].
pluralization ->
msgstr plural_form str_lines : {extract_simple_token('$2'), extract_simple_token('$3'), extract_line('$2')}.
obsolete_pluralization ->
obsolete_msgstr plural_form str_lines : {extract_simple_token('$2'), extract_simple_token('$3'), extract_line('$2')}.
message_meta ->
'$empty': [].
message_meta ->
comment message_meta : [
{comments, extract_simple_token('$1')}
| '$2'
].
message_meta ->
previous msgctxt str_lines previous msgid str_lines previous msgid_plural str_lines message_meta : [
{previous_messages, to_plural_message(
[
{msgctxt, extract_simple_token('$3')},
{msgid, extract_simple_token('$6')},
{msgid_plural, extract_simple_token('$9')}
],
[
{msgctxt, extract_line('$2')},
{msgid, extract_line('$5')},
{msgid_plural, extract_line('$8')}
]
)} | '$10'
].
message_meta ->
previous msgid str_lines previous msgid_plural str_lines message_meta : [
{previous_messages, to_plural_message(
[{msgid, extract_simple_token('$3')}, {msgid_plural, extract_simple_token('$6')}],
[{msgid, extract_line('$2')}, {msgid_plural, extract_line('$5')}]
)} | '$7'
].
message_meta ->
previous msgctxt str_lines previous msgid str_lines message_meta : [
{previous_messages, to_singular_message(
[{msgctxt, extract_simple_token('$3')}, {msgid, extract_simple_token('$6')}],
[{msgctxt, extract_line('$2')}, {msgid, extract_line('$5')}]
)} | '$7'
].
message_meta ->
previous msgid str_lines message_meta : [
{previous_messages, to_singular_message(
[{msgid, extract_simple_token('$3')}],
[{msgid, extract_line('$2')}]
)} | '$4'
].
Erlang code.
extract_simple_token({_Token, _Line, Value}) ->
Value.
extract_line({_Token, Line}) ->
Line;
extract_line({_Token, Line, _Value}) ->
Line.
to_singular_message(Fields, LineNumbers) ->
'Elixir.Kernel':struct(
'Elixir.Expo.Message.Singular',
Fields ++ [{'__meta__', #{source_line => maps:from_list(LineNumbers)}}]
).
to_plural_message(Fields, LineNumbers) ->
'Elixir.Kernel':struct(
'Elixir.Expo.Message.Plural',
Fields ++ [{'__meta__', #{source_line => maps:from_list(LineNumbers)}}]
).
split_msgstr(Pluralizations) ->
{
lists:map(fun({PluralForm, Message, _LineNumber}) -> {PluralForm, Message} end, Pluralizations),
lists:map(fun({PluralForm, _Message, LineNumber}) -> {{msgstr, PluralForm}, LineNumber} end, Pluralizations)
}.
group_meta(MetaFields) ->
maps:to_list(
% Use maps:groups_from_list when supporting OTP >= 25 exclusively
lists:foldr(
fun({Key, Value}, Acc) ->
maps:update_with(Key, fun(Cur) -> [Value | Cur] end, [Value], Acc)
end,
#{},
MetaFields
)
).