New substr formatting function.

This commit is contained in:
Dion Moult
2023-09-07 13:02:45 +10:00
parent 306ee3dfa4
commit de27554043
2 changed files with 7 additions and 1 deletions
@@ -115,7 +115,7 @@ get_element_grammar = lark.Lark(
format_grammar = lark.Lark(
"""start: function
function: round | format_length | lower | upper | title | concat | ESCAPED_STRING | NUMBER
function: round | format_length | lower | upper | title | concat | substr | ESCAPED_STRING | NUMBER
round: "round(" function "," NUMBER ")"
format_length: metric_length | imperial_length
@@ -125,6 +125,7 @@ format_grammar = lark.Lark(
upper: "upper(" function ")"
title: "title(" function ")"
concat: "concat(" function ("," function)* ")"
substr: "substr(" function "," SIGNED_INT "," SIGNED_INT ")"
// Embed common.lark for packaging
DIGIT: "0".."9"
@@ -181,6 +182,9 @@ class FormatTransformer(lark.Transformer):
def concat(self, args):
return "".join(args)
def substr(self, args):
return str(args[0])[int(args[1]):int(args[2])]
def round(self, args):
return str(round(float(args[0]) / float(args[1])) * float(args[1]))
@@ -34,6 +34,8 @@ class TestFormat():
assert subject.format('title(\"fOo\")') == "Foo"
assert subject.format('concat(\"fOo\", \"bar\")') == "fOobar"
assert subject.format('upper(concat(\"fOo\", \"bar\"))') == "FOOBAR"
assert subject.format('substr(\"foobar\", 1, 2)') == "o"
assert subject.format('substr(\"foobar\", 1, -1)') == "ooba"
def test_number_formatting(self):
assert subject.format("round(123, 5)") == "125.0"