parsing: don't ignore trailing junk in a smart date, eg in web add form

This commit is contained in:
Simon Michael 2010-03-09 23:11:12 +00:00
parent 8daa9a33cd
commit 4973b82fb4

View File

@ -84,7 +84,7 @@ parsePeriodExpr refdate expr = (interval,span)
spanFromSmartDateString :: Day -> String -> DateSpan spanFromSmartDateString :: Day -> String -> DateSpan
spanFromSmartDateString refdate s = spanFromSmartDate refdate sdate spanFromSmartDateString refdate s = spanFromSmartDate refdate sdate
where where
sdate = fromparse $ parsewith smartdate s sdate = fromparse $ parsewith smartdateonly s
spanFromSmartDate :: Day -> SmartDate -> DateSpan spanFromSmartDate :: Day -> SmartDate -> DateSpan
spanFromSmartDate refdate sdate = DateSpan (Just b) (Just e) spanFromSmartDate refdate sdate = DateSpan (Just b) (Just e)
@ -127,7 +127,7 @@ fixSmartDateStr t s = either parseerror id $ fixSmartDateStrEither t s
-- | A safe version of fixSmartDateStr. -- | A safe version of fixSmartDateStr.
fixSmartDateStrEither :: Day -> String -> Either ParseError String fixSmartDateStrEither :: Day -> String -> Either ParseError String
fixSmartDateStrEither t s = case parsewith smartdate (lowercase s) of fixSmartDateStrEither t s = case parsewith smartdateonly (lowercase s) of
Right sd -> Right $ showDay $ fixSmartDate t sd Right sd -> Right $ showDay $ fixSmartDate t sd
Left e -> Left e Left e -> Left e
@ -252,6 +252,14 @@ smartdate = do
(y,m,d) <- choice $ map try dateparsers (y,m,d) <- choice $ map try dateparsers
return (y,m,d) return (y,m,d)
-- | Like smartdate, but there must be nothing other than whitespace after the date.
smartdateonly :: GenParser Char st SmartDate
smartdateonly = do
d <- smartdate
many spacenonewline
eof
return d
datesepchar = oneOf "/-." datesepchar = oneOf "/-."
yyyymmdd :: GenParser Char st SmartDate yyyymmdd :: GenParser Char st SmartDate