11from json import dumps
22
3- from moz .l10n .formats import Format
4- from moz .l10n .formats .fluent import fluent_parse_entry
3+ from moz .l10n .formats .fluent import fluent_parse_entry , fluent_serialize_message
54from moz .l10n .formats .mf2 import mf2_parse_message , mf2_serialize_message
6- from moz .l10n .message import serialize_message
75from moz .l10n .model import (
86 CatchallKey ,
97 Expression ,
108 Markup ,
119 Message ,
1210 Pattern ,
1311 PatternMessage ,
14- SelectMessage ,
1512 VariableRef ,
1613)
1714
1815from pontoon .base .models import Resource
1916
2017
21- def get_simple_preview (format : str , string : str ) :
18+ def get_simple_preview (format : str , msg : str | Message | Pattern ) -> str :
2219 """
2320 Flatten a message entry as a simple string.
2421
@@ -27,58 +24,58 @@ def get_simple_preview(format: str, string: str):
2724 For Fluent, selects the value if it's not empty,
2825 or the first non-empty attribute.
2926 """
30- try :
31- match format :
32- case Resource . Format . FLUENT :
33- entry = fluent_parse_entry (string , with_linepos = False )
34- if not entry . value . is_empty ():
35- msg = entry .value
36- else :
37- msg = next (
27+ if format == Resource . Format . FLUENT :
28+ if isinstance ( msg , str ) :
29+ try :
30+ entry = fluent_parse_entry (msg , with_linepos = False )
31+ msg = (
32+ entry .value
33+ if not entry . value . is_empty ()
34+ else next (
3835 prop
3936 for prop in entry .properties .values ()
4037 if not prop .is_empty ()
4138 )
42- msg = as_pattern_message (msg )
43- return serialize_message (Format .fluent , msg )
39+ )
40+ except Exception :
41+ return msg
42+ pattern = as_simple_pattern (msg )
43+ return fluent_serialize_message (PatternMessage (pattern ))
4444
45- case Resource .Format .ANDROID :
46- msg = mf2_parse_message (string )
47- return android_simple_preview (msg )
48-
49- case Resource .Format .GETTEXT | Resource .Format .WEBEXT :
50- msg = mf2_parse_message (string )
51- msg = as_pattern_message (msg )
52- return serialize_message (None , msg )
53- except Exception :
54- pass
55- return string
56-
57-
58- def as_pattern_message (msg : Message ) -> PatternMessage :
59- if isinstance (msg , SelectMessage ):
60- default_pattern = next (
61- pattern
62- for keys , pattern in msg .variants .items ()
63- if all (isinstance (key , CatchallKey ) for key in keys )
64- )
65- return PatternMessage (default_pattern )
66- else :
45+ if format in (
46+ Resource .Format .ANDROID ,
47+ Resource .Format .GETTEXT ,
48+ Resource .Format .WEBEXT ,
49+ Resource .Format .XCODE ,
50+ Resource .Format .XLIFF ,
51+ ):
52+ if isinstance (msg , str ):
53+ try :
54+ msg = mf2_parse_message (msg )
55+ except Exception :
56+ return msg
57+ elif isinstance (msg , str ):
6758 return msg
6859
69-
70- def android_simple_preview (msg : Message | Pattern ) -> str :
71- """
72- Matches the JS androidEditPattern() from translate/src/utils/message/android.ts
73- """
7460 preview = ""
75- pattern = msg if isinstance (msg , list ) else as_pattern_message (msg ).pattern
76- for part in pattern :
77- preview += android_placeholder_preview (part )
61+ for part in as_simple_pattern (msg ):
62+ preview += preview_placeholder (part )
7863 return preview
7964
8065
81- def android_placeholder_preview (part : str | Expression | Markup ) -> str :
66+ def as_simple_pattern (msg : Message | Pattern ) -> Pattern :
67+ if isinstance (msg , list ):
68+ return msg
69+ if isinstance (msg , PatternMessage ):
70+ return msg .pattern
71+ return next (
72+ pattern
73+ for keys , pattern in msg .variants .items ()
74+ if all (isinstance (key , CatchallKey ) for key in keys )
75+ )
76+
77+
78+ def preview_placeholder (part : str | Expression | Markup ) -> str :
8279 if isinstance (part , str ):
8380 return part
8481 if isinstance (ps := part .attributes .get ("source" , None ), str ):
@@ -88,12 +85,12 @@ def android_placeholder_preview(part: str | Expression | Markup) -> str:
8885 return part .arg
8986 elif part .function == "entity" and isinstance (part .arg , VariableRef ):
9087 return part .arg .name
91- elif part .kind == "open" :
88+ elif part .kind in ( "open" , "standalone" ) :
9289 res = "<" + part .name
9390 for name , val in part .options .items ():
9491 valstr = dumps (val ) if isinstance (val , str ) else "$" + val .name
9592 res += f" { name } ={ valstr } "
96- res += ">"
93+ res += ">" if part . kind == "open" else " />"
9794 return res
9895 elif part .kind == "close" and not part .options :
9996 return f"</{ part .name } >"
0 commit comments