diff --git a/src/parse_config.ml b/src/parse_config.ml index 1cd487b8..5bb30af6 100644 --- a/src/parse_config.ml +++ b/src/parse_config.ml @@ -38,16 +38,20 @@ module Parse_data = struct take_while1 ident_char >>| String.lowercase_ascii let line = take_till is_eol <* end_of_line - let blank = blanks <* end_of_line >>| fun () -> Blank + let blank_line = blanks <* end_of_line >>| fun () -> Blank let comment = blanks *> (char '#' <|> char '%') *> line >>| fun s -> Comment s - let header = char '[' *> id <* char ']' <* end_of_line >>| fun s -> Header s + let header = blanks *> char '[' *> id <* char ']' <* blanks <* end_of_line >>| fun s -> Header s let item_value = let unquoted_value = - take_while1 (fun c -> not (is_whitespace c || is_eol c)) <* end_of_line + take_while1 (fun c -> not (is_whitespace c || is_eol c)) <* blanks <* end_of_line in let quoted_value = - char '"' *> take_till is_eol <* end_of_line >>= fun s -> + char '"' *> + take_till ((=) '"') <* char '"' + + + <* end_of_line >>= fun s -> match String.ends_with ~suffix:"\"" s with | false -> fail "invalid quoted value" | true -> @@ -62,7 +66,7 @@ module Parse_data = struct id (blanks *> char '=' *> blanks *> item_value) - let config = many (choice [ blank; comment; header; item ]) <* end_of_input + let config = many (choice [ blank_line; comment; header; item ]) <* end_of_input let fold_sections l = let rec loop section_l item_l l =