lib: simple dates must start with non-space; docs
This commit is contained in:
		
							parent
							
								
									4d4a6b1660
								
							
						
					
					
						commit
						fb37e99bc8
					
				| @ -440,8 +440,10 @@ test_transaction = do | |||||||
|     assertEqual 2 (let Right t = p in length $ tpostings t) |     assertEqual 2 (let Right t = p in length $ tpostings t) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| -- | Parse a date in YYYY/MM/DD format. Fewer digits are allowed. The year | -- | Parse a date in YYYY/MM/DD format. | ||||||
| -- may be omitted if a default year has already been set. | -- Hyphen (-) and period (.) are also allowed as separators. | ||||||
|  | -- The year may be omitted if a default year has been set. | ||||||
|  | -- Leading zeroes may be omitted. | ||||||
| datep :: Stream [Char] m t => ParsecT [Char] JournalContext m Day | datep :: Stream [Char] m t => ParsecT [Char] JournalContext m Day | ||||||
| datep = do | datep = do | ||||||
|   -- hacky: try to ensure precise errors for invalid dates |   -- hacky: try to ensure precise errors for invalid dates | ||||||
| @ -463,10 +465,12 @@ datep = do | |||||||
|     Just date -> return date |     Just date -> return date | ||||||
|   <?> "full or partial date" |   <?> "full or partial date" | ||||||
| 
 | 
 | ||||||
| -- | Parse a date and time in YYYY/MM/DD HH:MM[:SS][+-ZZZZ] format.  Any | -- | Parse a date and time in YYYY/MM/DD HH:MM[:SS][+-ZZZZ] format. | ||||||
| -- timezone will be ignored; the time is treated as local time.  Fewer | -- Hyphen (-) and period (.) are also allowed as date separators. | ||||||
| -- digits are allowed, except in the timezone. The year may be omitted if | -- The year may be omitted if a default year has been set. | ||||||
| -- a default year has already been set. | -- Seconds are optional. | ||||||
|  | -- The timezone is optional and ignored (the time is always interpreted as a local time). | ||||||
|  | -- Leading zeroes may be omitted (except in a timezone). | ||||||
| datetimep :: Stream [Char] m Char => ParsecT [Char] JournalContext m LocalTime | datetimep :: Stream [Char] m Char => ParsecT [Char] JournalContext m LocalTime | ||||||
| datetimep = do | datetimep = do | ||||||
|   day <- datep |   day <- datep | ||||||
| @ -618,21 +622,24 @@ modifiedaccountname = do | |||||||
|   aliases <- getAccountAliases |   aliases <- getAccountAliases | ||||||
|   return $ accountNameApplyAliases aliases prefixed |   return $ accountNameApplyAliases aliases prefixed | ||||||
| 
 | 
 | ||||||
| -- | Parse an account name. Account names may have single spaces inside | -- | Parse an account name. Account names start with a non-space, may | ||||||
| -- them, and are terminated by two or more spaces. They should have one or | -- have single spaces inside them, and are terminated by two or more | ||||||
| -- more components of at least one character, separated by the account | -- spaces (or end of input). Also they have one or more components of | ||||||
| -- separator char. | -- at least one character, separated by the account separator char. | ||||||
|  | -- (This parser will also consume one following space, if present.) | ||||||
| accountnamep :: Stream [Char] m Char => ParsecT [Char] st m AccountName | accountnamep :: Stream [Char] m Char => ParsecT [Char] st m AccountName | ||||||
| accountnamep = do | accountnamep = do | ||||||
|     a <- many1 (nonspace <|> singlespace) |     a <- do | ||||||
|     let a' = striptrailingspace a |       c <- nonspace | ||||||
|     when (accountNameFromComponents (accountNameComponents a') /= a') |       cs <- striptrailingspace <$> many (nonspace <|> singlespace) | ||||||
|          (fail $ "account name seems ill-formed: "++a') |       return $ c:cs | ||||||
|     return a' |     when (accountNameFromComponents (accountNameComponents a) /= a) | ||||||
|  |          (fail $ "account name seems ill-formed: "++a) | ||||||
|  |     return a | ||||||
|     where |     where | ||||||
|       singlespace = try (do {spacenonewline; do {notFollowedBy spacenonewline; return ' '}}) |       singlespace = try (do {spacenonewline; do {notFollowedBy spacenonewline; return ' '}}) | ||||||
|       -- couldn't avoid consuming a final space sometimes, harmless |       striptrailingspace "" = "" | ||||||
|       striptrailingspace s = if last s == ' ' then init s else s |       striptrailingspace s  = if last s == ' ' then init s else s | ||||||
| 
 | 
 | ||||||
| -- accountnamechar = notFollowedBy (oneOf "()[]") >> nonspace | -- accountnamechar = notFollowedBy (oneOf "()[]") >> nonspace | ||||||
| --     <?> "account name character (non-bracket, non-parenthesis, non-whitespace)" | --     <?> "account name character (non-bracket, non-parenthesis, non-whitespace)" | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user