git.iko.soy/typeable/pandoc
on master help sign in
Txt2Tags Reader: Parse Meta information

The header is now parsed as meta information. The first line is the `title`, the second is the `author` and third line is the `date`.

commit2a7319541d7c43fdd80d8b64169aae2e59255a2d authormpickering <matthewtpickering@gmail.com> dateThu 21 Aug 2014, 16:59 (12 years ago) parent2cd049a
3 files changed+39−13
src/Text/Pandoc/Readers/Txt2Tags.hs+36−10 tests/txt2tags.native+1−1 tests/txt2tags.t2t+2−2
src/Text/Pandoc/Readers/Txt2Tags.hs+36−10
@@ -92,15 +92,41 @@ readTxt2TagsNoMacros = readTxt2Tags def
9292parseT2T :: T2T Pandoc
9393parseT2T = do
9494 -- Parse header if standalone flag is set
95− optional ((readerStandalone . stateOptions <$> getState)
96− >>= guard
97− >> (() <$ (try blankline) <|> () <$ (count 3 anyLine)))
95+ standalone <- getOption readerStandalone
96+ when standalone parseHeader
97+ body <- mconcat <$> manyTill block eof
98+ meta' <- stateMeta <$> getState
99+ return $ Pandoc meta' (B.toList body)
100+
101+parseHeader :: T2T ()
102+parseHeader = do
103+ () <$ try blankline <|> header
104+ meta <- stateMeta <$> getState
105+ optional blanklines
98106 config <- manyTill setting (notFollowedBy setting)
99107 -- TODO: Handle settings better
100− let settings = foldr (\(k,v) -> B.setMeta k (MetaString v)) nullMeta config
101− updateState (\s -> s {stateMeta = settings})
102− body <- mconcat <$> manyTill block eof
103− return $ Pandoc mempty (B.toList body)
108+ let settings = foldr (\(k,v) -> B.setMeta k (MetaString v)) meta config
109+ updateState (\s -> s {stateMeta = settings}) <* optional blanklines
110+
111+header :: T2T ()
112+header = titleline >> authorline >> dateline
113+
114+headerline :: B.ToMetaValue a => String -> T2T a -> T2T ()
115+headerline field p = (() <$ try blankline)
116+ <|> (p >>= updateState . B.setMeta field)
117+
118+titleline :: T2T ()
119+titleline =
120+ headerline "title" (trimInlines . mconcat <$> manyTill inline newline)
121+
122+authorline :: T2T ()
123+authorline =
124+ headerline "author" (sepBy author (char ';') <* newline)
125+ where
126+ author = trimInlines . mconcat <$> many (notFollowedBy (char ';' <|> newline) >> inline)
127+
128+dateline :: T2T ()
129+dateline = headerline "date" (trimInlines . mconcat <$> manyTill inline newline)
104130
105131type Keyword = String
106132type Value = String
@@ -245,7 +271,7 @@ indentWith n = count n space
245271
246272table :: T2T Blocks
247273table = try $ do
248− header <- fmap snd <$> option mempty (try headerRow)
274+ tableHeader <- fmap snd <$> option mempty (try headerRow)
249275 rows <- many1 (many commentLine *> tableRow)
250276 let columns = transpose rows
251277 let ncolumns = length columns
@@ -253,7 +279,7 @@ table = try $ do
253279 let rows' = map (map snd) rows
254280 let size = maximum (map length rows')
255281 let rowsPadded = map (pad size) rows'
256− let headerPadded = if (not (null header)) then pad size header else mempty
282+ let headerPadded = if (not (null tableHeader)) then pad size tableHeader else mempty
257283 return $ B.table mempty
258284 (zip aligns (replicate ncolumns 0.0))
259285 headerPadded rowsPadded
@@ -500,7 +526,7 @@ image = try $ do
500526
501527-- Characters used in markup
502528specialChars :: String
503−specialChars = "%*-_/|:+"
529+specialChars = "%*-_/|:+;"
504530
505531tab :: T2T Char
506532tab = char '\t'
tests/txt2tags.native+1−1
@@ -1,4 +1,4 @@
1−Pandoc (Meta {unMeta = fromList []})
1+Pandoc (Meta {unMeta = fromList [("author",MetaList [MetaInlines [Str "author"]]),("date",MetaInlines [Str "date"]),("includeconf",MetaString "rules.conf"),("title",MetaInlines [Str "Txt2tags",Space,Str "Markup",Space,Str "Rules"])]})
22[Para [Str "This",Space,Str "document",Space,Str "describes",Space,Str "all",Space,Str "the",Space,Str "details",Space,Str "about",Space,Str "each",Space,Str "txt2tags",Space,Str "mark.",Space,Str "The",Space,Str "target",Space,Str "audience",Space,Str "are",Space,Strong [Str "experienced"],Space,Str "users.",Space,Str "You",Space,Str "may",Space,Str "find",Space,Str "it",Space,Str "useful",Space,Str "if",Space,Str "you",Space,Str "want",Space,Str "to",Space,Str "master",Space,Str "the",Space,Str "marks",Space,Str "or",Space,Str "solve",Space,Str "a",Space,Str "specific",Space,Str "problem",Space,Str "about",Space,Str "a",Space,Str "mark."]
33,Para [Str "If",Space,Str "you",Space,Str "are",Space,Str "new",Space,Str "to",Space,Str "txt2tags",Space,Str "or",Space,Str "just",Space,Str "want",Space,Str "to",Space,Str "know",Space,Str "which",Space,Str "are",Space,Str "the",Space,Str "available",Space,Str "marks,",Space,Str "please",Space,Str "read",Space,Str "the",Space,Link [Str "Markup",Space,Str "Demo"] ("MARKUPDEMO",""),Str "."]
44,Para [Str "Note",Space,Str "1:",Space,Str "This",Space,Str "document",Space,Str "is",Space,Str "generated",Space,Str "directly",Space,Str "from",Space,Str "the",Space,Str "txt2tags",Space,Str "test-suite.",Space,Str "All",Space,Str "the",Space,Str "rules",Space,Str "mentioned",Space,Str "here",Space,Str "are",Space,Str "100%",Space,Str "in",Space,Str "sync",Space,Str "with",Space,Str "the",Space,Str "current",Space,Str "program",Space,Str "code."]
tests/txt2tags.t2t+2−2
@@ -1,6 +1,6 @@
11Txt2tags Markup Rules
2−
3−
2+author
3+date
44%!includeconf: rules.conf
55
66This document describes all the details about each txt2tags mark.