diff --git a/src/Hasciidoc.hs b/src/Hasciidoc.hs index 8bc7275..a8eb43c 100644 --- a/src/Hasciidoc.hs +++ b/src/Hasciidoc.hs @@ -20,18 +20,18 @@ data Document = Doc , _header :: Maybe DocHeader , _preamble :: Maybe SectionBody , _sections :: Seq Section - } deriving (Show) + } deriving (Show, Eq) data DocHeader = DocHead { _docTitle :: Text - } deriving (Show) + } deriving (Show, Eq) data Section = Sec { _secAttrs :: Attributes , _secTitle :: Text , _secBody :: Maybe SectionBody , _secChildren :: Seq Section - } deriving (Show) + } deriving (Show, Eq) type SectionBody = Seq Block @@ -39,15 +39,33 @@ data Block = Block { _blockKind :: BlockKind , _blockAttrs :: Attributes , _blockTitle :: Maybe Text - } deriving (Show) + } deriving (Show, Eq) data BlockKind = Paragraph | DelimBlock | List - deriving (Show) + deriving (Show, Eq) data Inlines = TextChunk Text - deriving (Show) + deriving (Show, Eq) + +data AuthorInfo = Author + { _firstName :: [Text] + , _middleName :: Maybe [Text] + , _lastName :: Maybe [Text] + , _email :: Maybe Text + } deriving (Show, Eq) + +data RevisionInfo = Rev + { _revNum :: Maybe Text + , _revDate :: Maybe Text + , _revRemark :: Maybe Text + } deriving (Show, Eq) + +data AttrEntry = Attr + { _attName :: Text + , _attVal :: Text + } deriving (Show, Eq) pCountedChar :: Char -> Parser Int pCountedChar c = ((+) <$> (char c >> pure 1) <*> pCountedChar c) @@ -93,3 +111,30 @@ titleCharLevel c = case c of '+' -> return 4 _ -> fail "Bad title underline character" +pAuthorLine :: Parser AuthorInfo +pAuthorLine = do + author <- collapseSp <$> takeTill (\c -> c == '<' || isEndOfLine c) + let (f, m, l) = case T.words author of + (frst : mid : lst : []) -> + (T.splitOn "_" frst, Just $ T.splitOn "_" mid, Just $ T.splitOn "_" lst) + (frst : lst : []) -> + (T.splitOn "_" frst, Nothing, Just $ T.splitOn "_" lst) + (frst : []) -> + (T.splitOn "_" frst, Nothing, Nothing) + _ -> ([author], Nothing, Nothing) + email <- do char '<' + em <- takeTill (== '>') + char '>' + return (Just em) + <|> return Nothing + satisfy isEndOfLine + return (Author f m l email) + +pRevInfo :: Parser RevisionInfo +pRevInfo = pStdRevInfo <|> pRCSInfo <|> pure (Rev Nothing Nothing Nothing) + where + pStdRevInfo = fail "NotImpl" + pRCSInfo = fail "NotImpl" + +pAttributeEntry :: Parser AttrEntry +pAttributeEntry = undefined diff --git a/tests/Main.hs b/tests/Main.hs index 02350fd..6328498 100644 --- a/tests/Main.hs +++ b/tests/Main.hs @@ -92,3 +92,43 @@ headerParseSpec = do parseOnly pTitle "A two-line level 4 title\n++\n" `shouldBe` Right (4, "A two-line level 4 title") + describe "Document Author" $ do + + describe "pAuthorLine" $ do + it "parses a line with just a first name" $ + parseOnly pAuthorLine "Joe\n" + `shouldBe` Right (Author ["Joe"] Nothing Nothing Nothing) + it "parses a line with a two-word first name" $ + parseOnly pAuthorLine "Joe_Dee\n" + `shouldBe` Right (Author ["Joe", "Dee"] Nothing Nothing Nothing) + it "parses a line with a first and last name" $ + parseOnly pAuthorLine "Joe Bloggs\n" + `shouldBe` Right (Author ["Joe"] Nothing (Just ["Bloggs"]) Nothing) + it "parses a line with two first and two last names" $ + parseOnly pAuthorLine "Joe_Dee de_Winter\n" + `shouldBe` + Right (Author ["Joe", "Dee"] Nothing (Just ["de", "Winter"]) Nothing) + it "parses a first, middle, and last name" $ + parseOnly pAuthorLine "Joe Jay Bloggs\n" + `shouldBe` + Right (Author ["Joe"] (Just ["Jay"]) (Just ["Bloggs"]) Nothing) + it "parses multiple first, middle, and last names" $ + parseOnly pAuthorLine "Joe_Dee Dee_Ann de_Winter\n" + `shouldBe` + Right (Author ["Joe", "Dee"] + (Just ["Dee", "Ann"]) + (Just ["de", "Winter"]) Nothing) + it "parses first name and email address" $ + parseOnly pAuthorLine "Joe \n" + `shouldBe` + Right (Author ["Joe"] Nothing Nothing (Just "JoeBloggs@mail.com")) + it "parses first and last names and email address" $ + parseOnly pAuthorLine "Joe Bloggs \n" + `shouldBe` + Right (Author ["Joe"] Nothing (Just ["Bloggs"]) (Just "JoeBloggs@mail.com")) + it "Parses first, middle and last names and email address" $ + parseOnly pAuthorLine "Joe Jay Bloggs \n" + `shouldBe` + Right (Author ["Joe"] + (Just ["Jay"]) + (Just ["Bloggs"]) (Just "JoeBloggs@mail.com"))