diff options
| -rw-r--r-- | spec/practical/not_xml_spec.cr | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/spec/practical/not_xml_spec.cr b/spec/practical/not_xml_spec.cr index f0b6911..c9db2a6 100644 --- a/spec/practical/not_xml_spec.cr +++ b/spec/practical/not_xml_spec.cr @@ -111,26 +111,37 @@ def close_element(name : String) match_literal("</") >> match_literal(name) << match_literal(">") end -# TODO: implement Parser#and_then -def parent_element - Parser(Char, Element).new("parent element") do |tokens| - result_open = open_element.parse(tokens) - tokens = result_open.tokens - base_element = result_open.value - closing_name = base_element.name - - result_children = (element.many << close_element(closing_name)).parse(tokens) - Result.new( - result_children.tokens, +def parent_element : Parser(Char, Element) + open_element.and_then do |base_element| + (element.many << close_element(base_element.name)).map do |elems| Element.new( base_element.name, base_element.attributes, - result_children.value + elems ) - ) + end.as(Parser(Char, Element)) end end +#def old_parent_element +# Parser(Char, Element).new("parent element") do |tokens| +# result_open = open_element.parse(tokens) +# tokens = result_open.tokens +# base_element = result_open.value +# closing_name = base_element.name +# +# result_children = (element.many << close_element(closing_name)).parse(tokens) +# Result.new( +# result_children.tokens, +# Element.new( +# base_element.name, +# base_element.attributes, +# result_children.value +# ) +# ) +# end +#end + # Adapted from: https://bodil.lol/parser-combinators/ describe "markup language similar to XML" do |
