@@ -23,6 +23,7 @@ def make_regex(string: str, extra_flags: int = 0) -> Pattern[str]:
2323_unquoted_key = make_regex (r"([^=\#\s]+)" )
2424_equal_sign = make_regex (r"(=[^\S\r\n]*)" )
2525_single_quoted_value = make_regex (r"'((?:\\'|[^'])*)'" )
26+ _single_quote_splice = make_regex ('"\' "' )
2627_double_quoted_value = make_regex (r'"((?:\\"|[^"])*)"' )
2728_unquoted_value = make_regex (r"([^\r\n]*)" )
2829_comment = make_regex (r"(?:[^\S\r\n]*#[^\r\n]*)?" )
@@ -125,11 +126,23 @@ def parse_unquoted_value(reader: Reader) -> str:
125126 return re .sub (r"\s+#.*" , "" , part ).rstrip ()
126127
127128
129+ def parse_single_quoted_value (reader : Reader ) -> str :
130+ splice_value = '"\' "'
131+ value = ""
132+ while True :
133+ (part ,) = reader .read_regex (_single_quoted_value )
134+ value += decode_escapes (_single_quote_escapes , part )
135+ if reader .peek (len (splice_value )) != splice_value :
136+ break
137+ reader .read_regex (_single_quote_splice )
138+ value += "'"
139+ return value
140+
141+
128142def parse_value (reader : Reader ) -> str :
129143 char = reader .peek (1 )
130144 if char == "'" :
131- (value ,) = reader .read_regex (_single_quoted_value )
132- return decode_escapes (_single_quote_escapes , value )
145+ return parse_single_quoted_value (reader )
133146 elif char == '"' :
134147 (value ,) = reader .read_regex (_double_quoted_value )
135148 return decode_escapes (_double_quote_escapes , value )
0 commit comments