penny-lib-0.2.0.0: Penny/Copper/Memos/Posting.hs
module Penny.Copper.Memos.Posting (
memo, render, isCommentChar) where
import Control.Applicative ((<*>), (<*), (<$), (<$>))
import qualified Data.Text as X
import Text.Parsec (char, satisfy, many, (<?>))
import Text.Parsec.Text ( Parser )
import Penny.Copper.Util (eol, rangeLettersToSymbols)
import qualified Penny.Lincoln.Bits as B
import qualified Penny.Lincoln.TextNonEmpty as TNE
isCommentChar :: Char -> Bool
isCommentChar c = rangeLettersToSymbols c
|| c == ' '
memo :: Parser B.Memo
memo = B.Memo <$> many memoLine
memoLine :: Parser B.MemoLine
memoLine = (\c cs -> B.MemoLine $ TNE.TextNonEmpty c (X.pack cs))
<$ char '\''
<*> satisfy isCommentChar
<*> many (satisfy isCommentChar)
<* eol
<?> "posting memo"
render :: B.Memo -> Maybe X.Text
render (B.Memo ls) = X.concat <$> mapM renderLine ls
renderLine :: B.MemoLine -> Maybe X.Text
renderLine (B.MemoLine l) =
if TNE.all isCommentChar l
then Just $
X.pack (replicate 8 ' ')
`X.snoc` '\''
`X.append` TNE.toText l
`X.snoc` '\n'
else Nothing