apply all matching account aliases, not just one directive and one option
This commit is contained in:
		
							parent
							
								
									9fa22e0398
								
							
						
					
					
						commit
						d25fe21834
					
				| @ -37,6 +37,7 @@ module Hledger.Data.Posting ( | |||||||
|   joinAccountNames, |   joinAccountNames, | ||||||
|   concatAccountNames, |   concatAccountNames, | ||||||
|   accountNameApplyAliases, |   accountNameApplyAliases, | ||||||
|  |   accountNameApplyOneAlias, | ||||||
|   -- * arithmetic |   -- * arithmetic | ||||||
|   sumPostings, |   sumPostings, | ||||||
|   -- * rendering |   -- * rendering | ||||||
| @ -218,9 +219,17 @@ concatAccountNames :: [AccountName] -> AccountName | |||||||
| concatAccountNames as = accountNameWithPostingType t $ intercalate ":" $ map accountNameWithoutPostingType as | concatAccountNames as = accountNameWithPostingType t $ intercalate ":" $ map accountNameWithoutPostingType as | ||||||
|     where t = headDef RegularPosting $ filter (/= RegularPosting) $ map accountNamePostingType as |     where t = headDef RegularPosting $ filter (/= RegularPosting) $ map accountNamePostingType as | ||||||
| 
 | 
 | ||||||
| -- | Rewrite an account name using the first applicable alias from the given list, if any. | -- | Rewrite an account name using all applicable aliases from the given list, in sequence. | ||||||
| accountNameApplyAliases :: [AccountAlias] -> AccountName -> AccountName | accountNameApplyAliases :: [AccountAlias] -> AccountName -> AccountName | ||||||
| accountNameApplyAliases aliases a = accountNameWithPostingType atype aname' | accountNameApplyAliases aliases a = accountNameWithPostingType atype aname' | ||||||
|  |   where | ||||||
|  |     (aname,atype) = (accountNameWithoutPostingType a, accountNamePostingType a) | ||||||
|  |     matchingaliases = filter (\(re,_) -> regexMatchesCI re aname) aliases | ||||||
|  |     aname' = foldl (flip (uncurry regexReplaceCI)) aname matchingaliases | ||||||
|  | 
 | ||||||
|  | -- | Rewrite an account name using the first applicable alias from the given list, if any. | ||||||
|  | accountNameApplyOneAlias :: [AccountAlias] -> AccountName -> AccountName | ||||||
|  | accountNameApplyOneAlias aliases a = accountNameWithPostingType atype aname' | ||||||
|   where |   where | ||||||
|     (aname,atype) = (accountNameWithoutPostingType a, accountNamePostingType a) |     (aname,atype) = (accountNameWithoutPostingType a, accountNamePostingType a) | ||||||
|     firstmatchingalias = headDef Nothing $ map Just $ filter (\(re,_) -> regexMatchesCI re aname) aliases |     firstmatchingalias = headDef Nothing $ map Just $ filter (\(re,_) -> regexMatchesCI re aname) aliases | ||||||
|  | |||||||
| @ -58,7 +58,7 @@ import Hledger.Utils.UTF8IOCompat (error') | |||||||
| -- | Regular expression. Extended regular expression-ish syntax ? But does not support eg (?i) syntax. | -- | Regular expression. Extended regular expression-ish syntax ? But does not support eg (?i) syntax. | ||||||
| type Regexp = String | type Regexp = String | ||||||
| 
 | 
 | ||||||
| -- | A replacement pattern. May include backreferences (\N). | -- | A replacement pattern. May include numeric backreferences (\N). | ||||||
| type Replacement = String | type Replacement = String | ||||||
| 
 | 
 | ||||||
| -- | Convert our string-based regexps to real ones. Can fail if the | -- | Convert our string-based regexps to real ones. Can fail if the | ||||||
| @ -91,8 +91,9 @@ regexReplaceBy r = replaceAllBy (toRegex r) | |||||||
| regexReplaceByCI :: Regexp -> (String -> String) -> String -> String | regexReplaceByCI :: Regexp -> (String -> String) -> String -> String | ||||||
| regexReplaceByCI r = replaceAllBy (toRegexCI r) | regexReplaceByCI r = replaceAllBy (toRegexCI r) | ||||||
| 
 | 
 | ||||||
| -- | Replace all occurrences of the regexp with the replacement pattern. | -- | Replace all occurrences of the regexp with the replacement | ||||||
| -- The replacement pattern supports \N backreferences but no other RE syntax. | -- pattern. The replacement pattern supports numeric backreferences | ||||||
|  | -- (\N) but no other RE syntax. | ||||||
| regexReplace :: Regexp -> Replacement -> String -> String | regexReplace :: Regexp -> Replacement -> String -> String | ||||||
| regexReplace re = replaceRegex (toRegex re) | regexReplace re = replaceRegex (toRegex re) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,10 +1,11 @@ | |||||||
| # alias-related tests | # alias-related tests | ||||||
| 
 | 
 | ||||||
| # 1. alias directive. The pattern is a case-insensitive regular | # 1. alias directive. The pattern is a case-insensitive regular | ||||||
| # expression matching anywhere in the account name. Only the most | # expression matching anywhere in the account name. All matching | ||||||
| # recently declared matching alias is applied to an account name. The | # aliases will be applied to an account name in turn, most recently | ||||||
| # replacement can replace multiple matches within the account name. | # declared first. The replacement can replace multiple matches within | ||||||
| # The replacement pattern does not yet support match references. | # the account name.  The replacement pattern supports numeric | ||||||
|  | # backreferences. | ||||||
| # | # | ||||||
| hledgerdev -f- print | hledgerdev -f- print | ||||||
| <<< | <<< | ||||||
| @ -29,14 +30,14 @@ alias A (.)=\1 | |||||||
|     c              -3 |     c              -3 | ||||||
| 
 | 
 | ||||||
| 2011/01/01 | 2011/01/01 | ||||||
|     a             1 |     b             1 | ||||||
|     a             2 |     b             2 | ||||||
|     c            -3 |     c            -3 | ||||||
| 
 | 
 | ||||||
| >>>=0 | >>>=0 | ||||||
| 
 | 
 | ||||||
| # 2. command-line --alias option. Only the first matching alias is | # 2. command-line --alias option. These are applied in the order | ||||||
| # applied per account name. Spaces are allowed if quoted. | # written. Spaces are allowed if quoted. | ||||||
| #  | #  | ||||||
| hledgerdev -f- print --alias 'A (.)=a' --alias a=b | hledgerdev -f- print --alias 'A (.)=a' --alias a=b | ||||||
| <<< | <<< | ||||||
| @ -47,14 +48,13 @@ hledgerdev -f- print --alias 'A (.)=a' --alias a=b | |||||||
| 
 | 
 | ||||||
| >>> | >>> | ||||||
| 2011/01/01 | 2011/01/01 | ||||||
|     a             1 |     b             1 | ||||||
|     a             2 |     b             2 | ||||||
|     c            -3 |     c            -3 | ||||||
| 
 | 
 | ||||||
| >>>=0 | >>>=0 | ||||||
| 
 | 
 | ||||||
| # 3. Alias options run after alias directives. At most one of each is | # 3. Alias options run after alias directives. | ||||||
| # applied. |  | ||||||
| # | # | ||||||
| hledgerdev -f- print --alias a=A --alias B=C --alias B=D --alias C=D | hledgerdev -f- print --alias a=A --alias B=C --alias B=D --alias C=D | ||||||
| <<< | <<< | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user