lib: refactor: factor out a TextParser from datep
This commit is contained in:
		
							parent
							
								
									09fd8132b7
								
							
						
					
					
						commit
						b3a91a49d8
					
				| @ -362,18 +362,22 @@ descriptionp = many (noneOf (";\n" :: [Char])) | ||||
| -- Leading zeroes may be omitted. | ||||
| datep :: JournalParser m Day | ||||
| datep = do | ||||
|   myear <- getYear | ||||
|   lift $ datep' myear | ||||
| 
 | ||||
| datep' :: Maybe Year -> TextParser m Day | ||||
| datep' myear = do | ||||
|   -- hacky: try to ensure precise errors for invalid dates | ||||
|   -- XXX reported error position is not too good | ||||
|   -- pos <- genericSourcePos <$> getPosition | ||||
|   datestr <- do | ||||
|     c <- digitChar | ||||
|     cs <- lift $ many $ choice' [digitChar, datesepchar] | ||||
|     cs <- many $ choice' [digitChar, datesepchar] | ||||
|     return $ c:cs | ||||
|   let sepchars = nub $ sort $ filter (`elem` datesepchars) datestr | ||||
|   when (length sepchars /= 1) $ fail $ "bad date, different separators used: " ++ datestr | ||||
|   let dateparts = wordsBy (`elem` datesepchars) datestr | ||||
|   currentyear <- getYear | ||||
|   [y,m,d] <- case (dateparts,currentyear) of | ||||
|   [y,m,d] <- case (dateparts, myear) of | ||||
|               ([m,d],Just y)  -> return [show y,m,d] | ||||
|               ([_,_],Nothing) -> fail $ "partial date "++datestr++" found, but the current year is unknown" | ||||
|               ([y,m,d],_)     -> return [y,m,d] | ||||
| @ -829,7 +833,7 @@ followingcommentp = T.unlines . map snd <$> followingcommentlinesp | ||||
| 
 | ||||
| followingcommentlinesp :: TextParser m [(SourcePos, Text)] | ||||
| followingcommentlinesp = do | ||||
|   lift $ skipMany spacenonewline | ||||
|   skipMany spacenonewline | ||||
|   samelineComment@(_, samelineCommentText) | ||||
|     <- try commentp <|> (,) <$> (getPosition <* newline) <*> pure "" | ||||
|   newlineComments <- many $ try $ do | ||||
| @ -873,10 +877,7 @@ followingcommentandtagsp mdefdate = do | ||||
| 
 | ||||
|   -- Extract date-tag style posting dates from the tags. | ||||
|   -- Use the transaction date for defaults, if provided. | ||||
|   journal <- fmap | ||||
|     (\j -> j{jparsedefaultyear=first3.toGregorian <$> mdefdate}) get | ||||
| 
 | ||||
|   let eTagDates = traverse (tagDate journal) | ||||
|   let eTagDates = traverse tagDate | ||||
|                 $ filter (isDateLabel . fst . snd) tagsWithPositions | ||||
|                 where isDateLabel txt = txt == "date" || txt == "date2" | ||||
|   tagDates <- case eTagDates of | ||||
| @ -910,17 +911,12 @@ followingcommentandtagsp mdefdate = do | ||||
|     runErroringJournalParserAt parser (pos, txt) = | ||||
|       runErroringJournalParser (setPosition pos *> parser) txt | ||||
| 
 | ||||
|     parseWithStateAt' st parser (pos, txt) = | ||||
|       parseWithState' st (setPosition pos *> parser) txt | ||||
| 
 | ||||
|     tagDate | ||||
|       :: Journal | ||||
|       -> (SourcePos, Tag) | ||||
|       -> Either String (TagName, Day) | ||||
|     tagDate journal (pos, (name, value)) = | ||||
|       case parseWithStateAt' journal datep (pos, value) of | ||||
|     tagDate :: (SourcePos, Tag) -> Either String (TagName, Day) | ||||
|     tagDate (pos, (name, value)) = | ||||
|       case runTextParserAt (datep' myear) (pos, value) of | ||||
|         Left e -> Left $ parseErrorPretty e | ||||
|         Right day -> Right (name, day) | ||||
|       where myear = fmap (first3 . toGregorian) mdefdate | ||||
| 
 | ||||
| -- A transaction/posting comment must start with a semicolon. | ||||
| -- This parser discards the leading whitespace of the comment | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user