@@ -86,6 +86,7 @@ import Data.Text.Encoding.Error (lenientDecode)
8686import qualified Data.HashMap.Strict as M
8787import Data.Typeable
8888import Data.Attoparsec.Number
89+import qualified Data.HashSet as HashSet
8990
9091encode :: ToJSON a => a -> ByteString
9192encode obj = unsafePerformIO $
@@ -123,7 +124,13 @@ objToEvents' (Object pairs) rest =
123124-- https://github.com/snoyberg/yaml/issues/24
124125objToEvents' (String "") rest = EventScalar "" NoTag SingleQuoted Nothing : rest
125126
126−objToEvents' (String s) rest = EventScalar (encodeUtf8 s) StrTag PlainNoTag Nothing : rest
127+objToEvents' (String s) rest =
128+ event : rest
129+ where
130+ event
131+ -- Make sure that special strings are encoded as strings properly.
132+ | s `HashSet.member` specialStrings = EventScalar (encodeUtf8 s) StrTag SingleQuoted Nothing
133+ | otherwise = EventScalar (encodeUtf8 s) StrTag PlainNoTag Nothing
127134objToEvents' Null rest = EventScalar "null" NullTag PlainNoTag Nothing : rest
128135objToEvents' (Bool True) rest = EventScalar "true" BoolTag PlainNoTag Nothing : rest
129136objToEvents' (Bool False) rest = EventScalar "false" BoolTag PlainNoTag Nothing : rest
@@ -134,6 +141,11 @@ pairToEvents (k, v) rest =
134141 EventScalar (encodeUtf8 k) StrTag PlainNoTag Nothing
135142 : objToEvents' v rest
136143
144+-- | Strings which must be escaped so as not to be treated as non-string scalars.
145+specialStrings :: HashSet.HashSet Text
146+specialStrings = HashSet.fromList $ T.words
147+ "y Y yes Yes YES n N no No NO true True TRUE false False FALSE on On ON off Off OFF null Null NULL ~"
148+
137149-- Parsing
138150
139151data ParseException = NonScalarKey