git.iko.soy/typeable/pandoc
on master help sign in
Muse reader: support multiline directives in Amusewiki mode
commit12789fd42a15126751018f7a392d08a05c68c210 authorAlexander Krotov <ilabdsf@gmail.com> dateTue 5 Dec 2017, 12:59 (9 years ago) parent00f634b
1 file changed+24−4
src/Text/Pandoc/Readers/Muse.hs+24−4
src/Text/Pandoc/Readers/Muse.hs+24−4
@@ -140,19 +140,39 @@ commonPrefix (x:xs) (y:ys)
140140-- directive parsers
141141--
142142
143−parseDirective :: PandocMonad m => MuseParser m (String, F Inlines)
144−parseDirective = do
143+-- While not documented, Emacs Muse allows "-" in directive name
144+parseDirectiveKey :: PandocMonad m => MuseParser m (String)
145+parseDirectiveKey = do
145146 char '#'
146− key <- many letter
147+ many (letter <|> char '-')
148+
149+parseEmacsDirective :: PandocMonad m => MuseParser m (String, F Inlines)
150+parseEmacsDirective = do
151+ key <- parseDirectiveKey
147152 space
148153 spaces
149154 raw <- manyTill anyChar eol
150155 value <- parseFromString (trimInlinesF . mconcat <$> many inline) raw
151156 return (key, value)
152157
158+parseAmuseDirective :: PandocMonad m => MuseParser m (String, F Inlines)
159+parseAmuseDirective = do
160+ key <- parseDirectiveKey
161+ space
162+ spaces
163+ first <- manyTill anyChar eol
164+ rest <- manyTill anyLine endOfDirective
165+ many blankline
166+ value <- parseFromString (trimInlinesF . mconcat <$> many inline) $ unlines (first : rest)
167+ return (key, value)
168+ where
169+ endOfDirective = lookAhead $ endOfInput <|> (try $ void blankline) <|> (try $ void parseDirectiveKey)
170+ endOfInput = try $ skipMany blankline >> skipSpaces >> eof
171+
153172directive :: PandocMonad m => MuseParser m ()
154173directive = do
155− (key, value) <- parseDirective
174+ ext <- getOption readerExtensions
175+ (key, value) <- if extensionEnabled Ext_amuse ext then parseAmuseDirective else parseEmacsDirective
156176 updateState $ \st -> st { stateMeta' = B.setMeta key <$> value <*> stateMeta' st }
157177
158178--