@@ -9,26 +9,31 @@ private[toml] case class NamedFunction[T, V](f: T => V, name: String)
9
9
override def toString : String = name
10
10
}
11
11
12
- object Rules extends PlatformRules {
12
+ sealed trait Extension
13
+ object Extension {
14
+ case object MultiLineInlineTables extends Extension
15
+ }
16
+
17
+ case object Rules extends toml.Rules (Set ())
18
+
19
+ class Rules (extensions : Set [Extension ]) extends PlatformRules {
13
20
import Constants ._
21
+ import Extension ._
14
22
15
23
val UntilNewline = NamedFunction (! CrLf .contains(_ : Char ), " UntilNewline" )
16
24
17
25
val newLine = P (StringIn (CrLf , Lf ))
18
26
val charsChunk = P (CharsWhile (UntilNewline ))
19
27
val comment = P (" #" ~ charsChunk.? ~ & (newLine | End ))
28
+ val whitespace = P (CharIn (WhitespaceChars .toList))
20
29
21
- val whitespace = P (CharIn ( WhitespaceChars .toList ))
22
- val whitespaces = P (whitespace.rep( 1 ))
30
+ val skip = P (NoCut ( NoTrace ((whitespace | comment | newLine).rep) ))
31
+ val skipWs = P (NoCut ( NoTrace ( whitespace.rep) ))
23
32
24
- val skip = P (NoCut (NoTrace ((whitespaces | comment | newLine).rep)))
25
-
26
- val letter = P (CharIn (LettersRange ))
27
- val letters = P (letter.rep(1 ))
28
- val digit = P (CharIn (NumbersRange ))
29
- val digits = P (digit.rep(1 ))
30
-
31
- val skipSpaces = P (CharsWhile (_.isWhitespace).? )
33
+ val letter = P (CharIn (LettersRange ))
34
+ val digit = P (CharIn (NumbersRange ))
35
+ val digits = P (digit.rep(1 ))
36
+ val dash = P (CharIn (Dashes .toList))
32
37
33
38
val StringChars = NamedFunction (! " \"\\ " .contains(_ : Char ), " StringChars" )
34
39
val strChars = P (CharsWhile (StringChars ))
@@ -52,14 +57,14 @@ object Rules extends PlatformRules {
52
57
val multiLineBasicStr : Parser [Value .Str ] =
53
58
P (
54
59
MultiLineDoubleQuote ~/
55
- skipSpaces ~
60
+ newLine. ? ~
56
61
(! MultiLineDoubleQuote ~ AnyChar ).rep.! ~
57
62
MultiLineDoubleQuote
58
63
).map(str => Value .Str (Unescape .unescapeJavaString(str)))
59
64
val multiLineLiteralStr : Parser [Value .Str ] =
60
65
P (
61
66
MultiLineSingleQuote ~/
62
- skipSpaces ~
67
+ newLine. ? ~
63
68
(! MultiLineSingleQuote ~ AnyChar ).rep.! ~
64
69
MultiLineSingleQuote
65
70
).map(Value .Str )
@@ -98,44 +103,42 @@ object Rules extends PlatformRules {
98
103
val `false` = P (" false" ).map(_ => Value .Bool (false ))
99
104
val boolean = P (`true` | `false`)
100
105
101
- val dashes = P (CharIn (Dashes .toList))
102
- val bareKey = P ((letters | digits | dashes).rep(min = 1 )).!
106
+ val bareKey = P ((letter | digit | dash).rep(min = 1 )).!
103
107
val validKey : Parser [String ] =
104
108
P (NoCut (basicStr.map(_.value)) | NoCut (literalStr.map(_.value)) | bareKey)
105
109
val pair : Parser [(String , Value )] =
106
- P (validKey ~ whitespaces. ? ~ " =" ~ whitespaces. ? ~ elem)
110
+ P (validKey ~ skipWs ~ " =" ~ skipWs ~ elem)
107
111
val array : Parser [Value .Arr ] =
108
112
P (" [" ~ skip ~ elem.rep(sep = " ," ~ skip) ~ " ," .? ~ skip ~ " ]" )
109
113
.map(l => Value .Arr (l.toList))
110
114
val inlineTable : Parser [Value .Tbl ] =
111
- P (" {" ~ skip ~ pair.rep(sep = " ," ~ skip) ~ " ," .? ~ skip ~ " }" )
112
- .map(p => Value .Tbl (p.toMap))
115
+ (if (extensions.contains(MultiLineInlineTables ))
116
+ P (" {" ~ skip ~ pair.rep(sep = " ," ~ skip) ~ " ," .? ~ skip ~ " }" )
117
+ else
118
+ P (" {" ~ skipWs ~ pair.rep(sep = " ," ~ skipWs) ~ skipWs ~ " }" )
119
+ ).map(p => Value .Tbl (p.toMap))
113
120
114
121
val tableIds : Parser [Seq [String ]] =
115
- P (validKey.rep(min = 1 , sep = whitespaces. ? ~ " ." ~ whitespaces. ? ).map(_.toSeq))
122
+ P (validKey.rep(min = 1 , sep = skipWs ~ " ." ~ skipWs ).map(_.toSeq))
116
123
val tableDef : Parser [Seq [String ]] =
117
- P (" [" ~ whitespaces. ? ~ tableIds ~ whitespaces. ? ~ " ]" )
124
+ P (" [" ~ skipWs ~ tableIds ~ skipWs ~ " ]" )
118
125
val tableArrayDef : Parser [Seq [String ]] =
119
- P (" [[" ~ whitespaces. ? ~ tableIds ~ whitespaces. ? ~ " ]]" )
126
+ P (" [[" ~ skipWs ~ tableIds ~ skipWs ~ " ]]" )
120
127
121
128
val pairNode : Parser [Node .Pair ] = pair.map { case (k, v) => Node .Pair (k, v) }
122
129
val table : Parser [Node .NamedTable ] =
123
- P (skip ~ tableDef ~ skip ~ pair.rep(sep = skip)).map { case (a, b) =>
130
+ P (tableDef ~ skip ~ pair.rep(sep = skip)).map { case (a, b) =>
124
131
Node .NamedTable (a.toList, b.toList)
125
132
}
126
133
val tableArray : Parser [Node .NamedArray ] =
127
- P (skip ~ tableArrayDef ~ skip ~ pair.rep(sep = skip)).map { case (a, b) =>
134
+ P (tableArrayDef ~ skip ~ pair.rep(sep = skip)).map { case (a, b) =>
128
135
Node .NamedArray (a.toList, b.toList)
129
136
}
130
137
131
- lazy val elem : Parser [Value ] = P {
132
- skip ~
133
- (date | string | boolean | double | integer | array | inlineTable) ~
134
- skip
135
- }
136
-
137
- lazy val node : Parser [Node ] = P (skip ~ (pairNode | table | tableArray))
138
+ lazy val elem : Parser [Value ] =
139
+ P (date | string | boolean | double | integer | array | inlineTable)
138
140
139
- val root : Parser [Root ] = P (node.rep(sep = skip) ~ skip ~ End )
141
+ val node : Parser [Node ] = P (pairNode | table | tableArray)
142
+ val root : Parser [Root ] = P (skip ~ node.rep(sep = skip) ~ skip ~ End )
140
143
.map(nodes => Root (nodes.toList))
141
144
}
0 commit comments