git.iko.soy/typeable/pandoc
on master help sign in
Txt2Tags Reader: Parse Meta information
2a73195mpickering
src/Text/Pandoc/Readers/Txt2Tags.hs+36−10
@@ -92,15 +92,41 @@ readTxt2TagsNoMacros = readTxt2Tags def
92parseT2T :: T2T Pandoc
92parseT2T :: T2T Pandoc
93parseT2T = do
93parseT2T = do
94 -- Parse header if standalone flag is set
94 -- Parse header if standalone flag is set
95− optional ((readerStandalone . stateOptions <$> getState)
95+ standalone <- getOption readerStandalone
96− >>= guard
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
97− >> (() <$ (try blankline) <|> () <$ (count 3 anyLine)))
103+ () <$ try blankline <|> header
104+ meta <- stateMeta <$> getState
105+ optional blanklines
98 config <- manyTill setting (notFollowedBy setting)
106 config <- manyTill setting (notFollowedBy setting)
99 -- TODO: Handle settings better
107 -- TODO: Handle settings better
100− let settings = foldr (\(k,v) -> B.setMeta k (MetaString v)) nullMeta config
108+ let settings = foldr (\(k,v) -> B.setMeta k (MetaString v)) meta config
101− updateState (\s -> s {stateMeta = settings})
109+ updateState (\s -> s {stateMeta = settings}) <* optional blanklines
102− body <- mconcat <$> manyTill block eof
110+
103− return $ Pandoc mempty (B.toList body)
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)
104
130
105type Keyword = String
131type Keyword = String
106type Value = String
132type Value = String
@@ -245,7 +271,7 @@ indentWith n = count n space
245
271
246table :: T2T Blocks
272table :: T2T Blocks
247table = try $ do
273table = try $ do
248− header <- fmap snd <$> option mempty (try headerRow)
274+ tableHeader <- fmap snd <$> option mempty (try headerRow)
249 rows <- many1 (many commentLine *> tableRow)
275 rows <- many1 (many commentLine *> tableRow)
250 let columns = transpose rows
276 let columns = transpose rows
251 let ncolumns = length columns
277 let ncolumns = length columns
@@ -253,7 +279,7 @@ table = try $ do
253 let rows' = map (map snd) rows
279 let rows' = map (map snd) rows
254 let size = maximum (map length rows')
280 let size = maximum (map length rows')
255 let rowsPadded = map (pad size) rows'
281 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
257 return $ B.table mempty
283 return $ B.table mempty
258 (zip aligns (replicate ncolumns 0.0))
284 (zip aligns (replicate ncolumns 0.0))
259 headerPadded rowsPadded
285 headerPadded rowsPadded
@@ -500,7 +526,7 @@ image = try $ do
500
526
501-- Characters used in markup
527-- Characters used in markup
502specialChars :: String
528specialChars :: String
503−specialChars = "%*-_/|:+"
529+specialChars = "%*-_/|:+;"
504
530
505tab :: T2T Char
531tab :: T2T Char
506tab = char '\t'
532tab = 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"])]})
2[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."]
2[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."]
3,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 "."]
3,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 "."]
4,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."]
4,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 @@
1Txt2tags Markup Rules
1Txt2tags Markup Rules
2−
2+author
3−
3+date
4%!includeconf: rules.conf
4%!includeconf: rules.conf
5
5
6This document describes all the details about each txt2tags mark.
6This document describes all the details about each txt2tags mark.