diff options
author | Joe Crayne <joe@jerkface.net> | 2019-06-11 04:06:24 -0400 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2019-06-11 04:06:24 -0400 |
commit | 7303e1d9c65c6d1c91e89bfdf7b4bf3313ea7b06 (patch) | |
tree | 3ca11342b9e28258d3bef0a2ccbf511d1109d533 | |
parent | 33ac9c597f708c0f0d2232c25e1fbbf7840b9610 (diff) |
Sabadie parser: support trailing blanks.
-rw-r--r-- | src/Codec/Wavefront/Token.hs | 28 | ||||
-rw-r--r-- | test/TestSabadie.hs | 5 |
2 files changed, 15 insertions, 18 deletions
diff --git a/src/Codec/Wavefront/Token.hs b/src/Codec/Wavefront/Token.hs index 71691a8..01acd5c 100644 --- a/src/Codec/Wavefront/Token.hs +++ b/src/Codec/Wavefront/Token.hs | |||
@@ -81,7 +81,7 @@ cleanupTokens = catMaybes | |||
81 | -- Location ---------------------------------------------------------------------------------------- | 81 | -- Location ---------------------------------------------------------------------------------------- |
82 | 82 | ||
83 | location :: Parser Location | 83 | location :: Parser Location |
84 | location = skipSpace *> string "v " *> skipHSpace *> parseXYZW <* eol | 84 | location = string "v " *> skipHSpace *> parseXYZW <* eol |
85 | where | 85 | where |
86 | parseXYZW = do | 86 | parseXYZW = do |
87 | xyz <- float `sepBy1` skipHSpace | 87 | xyz <- float `sepBy1` skipHSpace |
@@ -96,7 +96,7 @@ location = skipSpace *> string "v " *> skipHSpace *> parseXYZW <* eol | |||
96 | -- Normal ------------------------------------------------------------------------------------------ | 96 | -- Normal ------------------------------------------------------------------------------------------ |
97 | 97 | ||
98 | normal :: Parser Normal | 98 | normal :: Parser Normal |
99 | normal = skipSpace *> string "vn " *> skipHSpace *> parseIJK <* eol | 99 | normal = string "vn " *> skipHSpace *> parseIJK <* eol |
100 | where | 100 | where |
101 | parseIJK = do | 101 | parseIJK = do |
102 | ijk <- float `sepBy1` skipHSpace | 102 | ijk <- float `sepBy1` skipHSpace |
@@ -108,7 +108,7 @@ normal = skipSpace *> string "vn " *> skipHSpace *> parseIJK <* eol | |||
108 | -- Texture coordinates ----------------------------------------------------------------------------- | 108 | -- Texture coordinates ----------------------------------------------------------------------------- |
109 | 109 | ||
110 | texCoord :: Parser TexCoord | 110 | texCoord :: Parser TexCoord |
111 | texCoord = skipSpace *> string "vt " *> skipHSpace *> parseUVW <* eol | 111 | texCoord = string "vt " *> skipHSpace *> parseUVW <* eol |
112 | where | 112 | where |
113 | parseUVW = do | 113 | parseUVW = do |
114 | uvw <- float `sepBy1` skipHSpace | 114 | uvw <- float `sepBy1` skipHSpace |
@@ -121,7 +121,7 @@ texCoord = skipSpace *> string "vt " *> skipHSpace *> parseUVW <* eol | |||
121 | -- Parameter-space coordinates ----------------------------------------------------------------------------- | 121 | -- Parameter-space coordinates ----------------------------------------------------------------------------- |
122 | 122 | ||
123 | paramCoord :: Parser ParamCoord | 123 | paramCoord :: Parser ParamCoord |
124 | paramCoord = skipSpace *> string "vp " *> skipHSpace *> parseUVW <* eol | 124 | paramCoord = string "vp " *> skipHSpace *> parseUVW <* eol |
125 | where | 125 | where |
126 | parseUVW = do | 126 | parseUVW = do |
127 | uvw <- float `sepBy1` skipHSpace | 127 | uvw <- float `sepBy1` skipHSpace |
@@ -134,13 +134,12 @@ paramCoord = skipSpace *> string "vp " *> skipHSpace *> parseUVW <* eol | |||
134 | -- Points ------------------------------------------------------------------------------------------ | 134 | -- Points ------------------------------------------------------------------------------------------ |
135 | 135 | ||
136 | points :: Parser [Point] | 136 | points :: Parser [Point] |
137 | points = skipSpace *> string "p " *> skipHSpace *> fmap Point decimal `sepBy1` skipHSpace <* eol | 137 | points = string "p " *> skipHSpace *> fmap Point decimal `sepBy1` skipHSpace <* eol |
138 | 138 | ||
139 | ---------------------------------------------------------------------------------------------------- | 139 | ---------------------------------------------------------------------------------------------------- |
140 | -- Lines ------------------------------------------------------------------------------------------- | 140 | -- Lines ------------------------------------------------------------------------------------------- |
141 | lines :: Parser [Line] | 141 | lines :: Parser [Line] |
142 | lines = do | 142 | lines = do |
143 | skipSpace | ||
144 | _ <- string "l " | 143 | _ <- string "l " |
145 | skipHSpace | 144 | skipHSpace |
146 | pointIndices <- parsePointIndices | 145 | pointIndices <- parsePointIndices |
@@ -159,7 +158,6 @@ lines = do | |||
159 | -- Faces ------------------------------------------------------------------------------------------- | 158 | -- Faces ------------------------------------------------------------------------------------------- |
160 | face :: Parser Face | 159 | face :: Parser Face |
161 | face = do | 160 | face = do |
162 | skipSpace | ||
163 | _ <- string "f " | 161 | _ <- string "f " |
164 | skipHSpace | 162 | skipHSpace |
165 | faceIndices <- parseFaceIndices | 163 | faceIndices <- parseFaceIndices |
@@ -184,37 +182,37 @@ face = do | |||
184 | -- Groups ------------------------------------------------------------------------------------------ | 182 | -- Groups ------------------------------------------------------------------------------------------ |
185 | 183 | ||
186 | groups :: Parser [Text] | 184 | groups :: Parser [Text] |
187 | groups = skipSpace *> string "g " *> skipHSpace *> name `sepBy` skipHSpace <* eol | 185 | groups = string "g " *> skipHSpace *> name `sepBy` skipHSpace <* eol |
188 | 186 | ||
189 | ---------------------------------------------------------------------------------------------------- | 187 | ---------------------------------------------------------------------------------------------------- |
190 | -- Objects ----------------------------------------------------------------------------------------- | 188 | -- Objects ----------------------------------------------------------------------------------------- |
191 | 189 | ||
192 | object :: Parser Text | 190 | object :: Parser Text |
193 | object = skipSpace *> string "o " *> skipHSpace *> spacedName <* eol | 191 | object = string "o " *> skipHSpace *> spacedName <* eol |
194 | 192 | ||
195 | ---------------------------------------------------------------------------------------------------- | 193 | ---------------------------------------------------------------------------------------------------- |
196 | -- Material libraries ------------------------------------------------------------------------------ | 194 | -- Material libraries ------------------------------------------------------------------------------ |
197 | 195 | ||
198 | mtllib :: Parser [Text] | 196 | mtllib :: Parser [Text] |
199 | mtllib = skipSpace *> string "mtllib " *> skipHSpace *> name `sepBy1` skipHSpace <* eol | 197 | mtllib = string "mtllib " *> skipHSpace *> name `sepBy1` skipHSpace <* eol |
200 | 198 | ||
201 | ---------------------------------------------------------------------------------------------------- | 199 | ---------------------------------------------------------------------------------------------------- |
202 | -- Using materials --------------------------------------------------------------------------------- | 200 | -- Using materials --------------------------------------------------------------------------------- |
203 | 201 | ||
204 | usemtl :: Parser Text | 202 | usemtl :: Parser Text |
205 | usemtl = skipSpace *> string "usemtl " *> skipHSpace *> spacedName <* eol | 203 | usemtl = string "usemtl " *> skipHSpace *> spacedName <* eol |
206 | 204 | ||
207 | ---------------------------------------------------------------------------------------------------- | 205 | ---------------------------------------------------------------------------------------------------- |
208 | -- Smoothing groups -------------------------------------------------------------------------------- | 206 | -- Smoothing groups -------------------------------------------------------------------------------- |
209 | smoothingGroup :: Parser Natural | 207 | smoothingGroup :: Parser Natural |
210 | smoothingGroup = skipSpace *> string "s " *> skipHSpace *> offOrIndex <* skipHSpace <* eol | 208 | smoothingGroup = string "s " *> skipHSpace *> offOrIndex <* skipHSpace <* eol |
211 | where | 209 | where |
212 | offOrIndex = string "off" *> pure 0 <|> decimal | 210 | offOrIndex = string "off" *> pure 0 <|> decimal |
213 | 211 | ||
214 | ---------------------------------------------------------------------------------------------------- | 212 | ---------------------------------------------------------------------------------------------------- |
215 | -- Comments ---------------------------------------------------------------------------------------- | 213 | -- Comments ---------------------------------------------------------------------------------------- |
216 | comment :: Parser () | 214 | comment :: Parser () |
217 | comment = skipSpace *> string "#" *> (() <$ manyTill anyChar eol) | 215 | comment = string "#" *> (() <$ manyTill anyChar eol) |
218 | 216 | ||
219 | ---------------------------------------------------------------------------------------------------- | 217 | ---------------------------------------------------------------------------------------------------- |
220 | -- Special parsers --------------------------------------------------------------------------------- | 218 | -- Special parsers --------------------------------------------------------------------------------- |
@@ -250,6 +248,6 @@ untilEnd :: Parser a -> Parser [a] | |||
250 | untilEnd p = go | 248 | untilEnd p = go |
251 | where | 249 | where |
252 | go = do | 250 | go = do |
253 | a <- p | 251 | skipSpace |
254 | end <- atEnd | 252 | end <- atEnd |
255 | if end then pure [a] else fmap (a:) go | 253 | if end then pure [] else (:) <$> p <*> go |
diff --git a/test/TestSabadie.hs b/test/TestSabadie.hs index de13678..d8d1949 100644 --- a/test/TestSabadie.hs +++ b/test/TestSabadie.hs | |||
@@ -3,6 +3,7 @@ module TestSabadie where | |||
3 | import Codec.Wavefront | 3 | import Codec.Wavefront |
4 | import System.Directory | 4 | import System.Directory |
5 | import System.IO | 5 | import System.IO |
6 | import Text.Show.Pretty (ppShow) | ||
6 | 7 | ||
7 | getDataDir :: IO FilePath | 8 | getDataDir :: IO FilePath |
8 | getDataDir = do | 9 | getDataDir = do |
@@ -14,6 +15,4 @@ getDataDir = do | |||
14 | main = do | 15 | main = do |
15 | ddir <- getDataDir | 16 | ddir <- getDataDir |
16 | r1 <- fromFile (ddir ++ "/01.obj") | 17 | r1 <- fromFile (ddir ++ "/01.obj") |
17 | print r1 | 18 | either print (putStrLn . ppShow) r1 |
18 | -- Failed: ` vp ` [...]: Failed reading: empty | ||
19 | -- Reason: blank lines | ||