diff --git a/src/eini_parser.yrl b/src/eini_parser.yrl index 5ab6ce4..502b153 100644 --- a/src/eini_parser.yrl +++ b/src/eini_parser.yrl @@ -23,6 +23,8 @@ Nonterminals sections_with_skip_lines section title_part + title_word + title_words title property_with_skip_lines properties property @@ -70,7 +72,13 @@ title_part -> title blank break : list_to_binary('$1'). title_part -> title break skip_lines : list_to_binary('$1'). title_part -> title blank break skip_lines : list_to_binary('$1'). -title -> '[' word ']' : value_of('$2'). +title_word -> word : value_of('$1'). +title_word -> blank : value_of('$1'). + +title_words -> title_word : ['$1']. +title_words -> title_word title_words : ['$1' | '$2']. + +title -> '[' title_words ']' : string:strip(lists:flatten('$2'), both, $\s). properties -> '$empty' : []. properties -> property_with_skip_lines properties : ['$1' | '$2']. @@ -90,7 +98,7 @@ values -> single_value : ['$1']. values -> single_value values : ['$1' | '$2']. %% At value position, any characters are accepted AS IS. -single_value -> word : value_of('$1'). +single_value -> word : value_of('$1'). single_value -> value : value_of('$1'). single_value -> blank : value_of('$1'). single_value -> comment : value_of('$1'). diff --git a/test/eini_tests.erl b/test/eini_tests.erl index c7860df..9e63a12 100644 --- a/test/eini_tests.erl +++ b/test/eini_tests.erl @@ -109,7 +109,16 @@ one_section_title_only_test_() -> "[title] \n" "\n" "\n" - )) + )), + %% blank char in section title + ?_assertEqual({ok, #{ <<"tit le">> => #{}}}, + parse("[tit le]")), + ?_assertEqual({ok, #{ <<"title">> => #{}}}, + parse("[title ]")), + ?_assertEqual({ok, #{ <<"title">> => #{}}}, + parse("[ title]")), + ?_assertEqual({ok, #{ <<"title">> => #{}}}, + parse("[ title ]")) ]}. one_section_title_only_syntax_error_test_() -> @@ -373,14 +382,6 @@ syntax_error_title_test_() -> ";\n" "; comment 2\n" " [title]")), - %% blank char in section title - ?_assertMatch({error, {syntax_error, _, _Reason}}, - parse( - "[titleA]\n" - "keyA1=valueA1\n" - "[tit leB]\n" - "keyB1=valueB1\n" - )), %% comment after title ?_assertMatch({error, {syntax_error, _, ["syntax error before: ", _]}}, parse("[title] ;comment")),