@@ -641,8 +641,11 @@ def get_rule_fractional(self, val):
641641
642642 # TODO create simpler repr and move logic to testing utils
643643 def __repr__ (self ):
644+ return f"<Ruleset { self .name } { 'private' if self .private else ' ' } { len (self .rules )} rules>"
645+
646+ def __str__ (self ):
644647 rules_str = '\n ' .join (['\t ' + str (r ) for r in self .rules ])
645- return f'Ruleset { self .name } { self .private } \n { rules_str } \n '
648+ return f'Ruleset { self .name } { "private" if self .private else " " } \n { rules_str } \n '
646649
647650
648651class Rule :
@@ -719,7 +722,6 @@ def apply(self, number, context):
719722
720723 elif t .type == PLURAL_TOKEN :
721724 form = context .speller .plural_rule (number )
722- print (t .reference , type (t .reference ))
723725 if form not in t .reference and "other" not in t .reference :
724726 raise RuleMalformed (f"Plural form { form } not in { self } and no fallback option ('other') either!" )
725727
@@ -730,10 +732,18 @@ def apply(self, number, context):
730732
731733 return '' .join (res )
732734
733- # TODO create simpler repr and move logic to testing utils
734735 def __repr__ (self ):
735- tokens_str = '\n ' .join (['\t \t ' + str (t ) for t in self .tokens ])
736- return f'Rule { self .value } - { self .divisor } \n { tokens_str } \n '
736+ return f"<Rule { self .value } - { self .divisor } { len (self .tokens )} tokens>"
737+
738+ def __str__ (self ):
739+ tokens_str = '\n ' .join ([f"[{ t .reference } ]" if t .optional else t .reference if t .type == TEXT_TOKEN else {
740+ INTEGRAL_TOKEN : f"←{ t .reference } ←" ,
741+ REMAINDER_TOKEN : f"→{ t .reference } →" ,
742+ SUBSTITUTION_TOKEN : f"={ t .reference } =" ,
743+ PREVIOUS_TOKEN : "→→→" ,
744+ PLURAL_TOKEN : f"$({ ',' .join ([f'{ k } {{{ v } }}' for k ,v in t .reference .items ()])} )$" ,
745+ }[t .type ] for t in self .tokens ])
746+ return f'Rule { self .value } - { self .divisor } : { tokens_str } '
737747
738748
739749@dataclass
@@ -759,3 +769,28 @@ def return_value_by_type(self, typ: int):
759769 REMAINDER_TOKEN : self .REMAINDER ,
760770 SUBSTITUTION_TOKEN : self .SUBSTITUTION ,
761771 }[typ ]
772+
773+
774+ def parse_rbnf_rules (data , tree ):
775+ """
776+ Parse rules based on:
777+ http://www.unicode.org/reports/tr35/tr35-47/tr35-numbers.html#Rule-Based_Number_Formatting
778+ """
779+ rbnf_rules = data .setdefault ('rbnf_rules' , {})
780+
781+ # ElementTree.dump(tree)
782+
783+ for ruleset_grouping in tree .findall ('.//rbnf/rulesetGrouping' ):
784+ group_name = ruleset_grouping .attrib ['type' ]
785+ rbnf_rules [group_name ] = [] # TODO check for overwrite
786+ for ruleset in ruleset_grouping .findall ('ruleset' ):
787+ ruleset_name = ruleset .attrib ['type' ]
788+ private = ruleset .attrib .get ('access' ) == 'private'
789+ ruleset_obj = Ruleset (ruleset_name , private )
790+ for rule in ruleset .findall ('rbnfrule' ):
791+ radix = rule .attrib .get ('radix' )
792+ if radix == "1,000" : # HACK: work around misspelled radix in mt.xml
793+ radix = "1000"
794+ rule_obj = Rule (rule .attrib ['value' ], rule .text , radix )
795+ ruleset_obj .rules .append (rule_obj )
796+ rbnf_rules [group_name ].append (ruleset_obj )
0 commit comments