From e6bf04fce3c93630957339483a2aba7dd0e2fda0 Mon Sep 17 00:00:00 2001 From: Stephen Morgan Date: Sun, 13 Mar 2022 19:02:44 +1100 Subject: [PATCH] fix: aliases: Make sure we can escape forward slashes in account aliases, but otherwise the regular expression handler handles escapes. --- hledger-lib/Hledger/Read/Common.hs | 8 +++++--- hledger/test/account-aliases.test | 30 ++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/hledger-lib/Hledger/Read/Common.hs b/hledger-lib/Hledger/Read/Common.hs index 0e0f4f627..8846ac4cb 100644 --- a/hledger-lib/Hledger/Read/Common.hs +++ b/hledger-lib/Hledger/Read/Common.hs @@ -1517,15 +1517,17 @@ regexaliasp = do -- dbgparse 0 "regexaliasp" (off1, off2, re) <- between (char '/') (char '/') $ do off1 <- getOffset - re <- some $ noneOf ("/\\\n\r" :: [Char]) -- paranoid: don't try to read past line end - <|> (char '\\' *> anySingle) -- allow escaping any character + re <- fmap T.concat . some $ + (T.singleton <$> noneOf ("/\\\n\r" :: [Char])) -- paranoid: don't try to read past line end + <|> string "\\/" -- allow escaping forward slashes + <|> (liftM2 T.cons (char '\\') (T.singleton <$> anySingle)) -- Otherwise leave backslashes in off2 <- getOffset return (off1, off2, re) skipNonNewlineSpaces char '=' skipNonNewlineSpaces repl <- anySingle `manyTill` eolof - case toRegexCI $ T.pack re of + case toRegexCI re of Right r -> return $! RegexAlias r repl Left e -> customFailure $! parseErrorAtRegion off1 off2 e diff --git a/hledger/test/account-aliases.test b/hledger/test/account-aliases.test index 09cd2e9b7..58b3770c4 100644 --- a/hledger/test/account-aliases.test +++ b/hledger/test/account-aliases.test @@ -267,3 +267,33 @@ $ hledger -f- print b >=0 + +# 19. Make sure you can escape special regexp characters. +< +alias /\./ = : + +2021-01-01 + hi.there 1 + b + +$ hledger -f- print +2021-01-01 + hi:there 1 + b + +>=0 + +# 20. Including backslashes +< +alias /\\/ = : + +2021-01-01 + hi\there 1 + b + +$ hledger -f- print +2021-01-01 + hi:there 1 + b + +>=0