git.iko.soy/typeable/pandoc
on master help sign in
Muse reader: support multiline directives in Amusewiki mode
12789fdAlexander Krotov
src/Text/Pandoc/Readers/Muse.hs+24−4
@@ -140,19 +140,39 @@ commonPrefix (x:xs) (y:ys)
140-- directive parsers
140-- directive parsers
141--
141--
142
142
143+-- While not documented, Emacs Muse allows "-" in directive name
143−parseDirective :: PandocMonad m => MuseParser m (String, F Inlines)
144+parseDirectiveKey :: PandocMonad m => MuseParser m (String)
144−parseDirective = do
145+parseDirectiveKey = do
145 char '#'
146 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
147 space
152 space
148 spaces
153 spaces
149 raw <- manyTill anyChar eol
154 raw <- manyTill anyChar eol
150 value <- parseFromString (trimInlinesF . mconcat <$> many inline) raw
155 value <- parseFromString (trimInlinesF . mconcat <$> many inline) raw
151 return (key, value)
156 return (key, value)
152
157
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+
153directive :: PandocMonad m => MuseParser m ()
172directive :: PandocMonad m => MuseParser m ()
154directive = do
173directive = do
155− (key, value) <- parseDirective
174+ ext <- getOption readerExtensions
175+ (key, value) <- if extensionEnabled Ext_amuse ext then parseAmuseDirective else parseEmacsDirective
156 updateState $ \st -> st { stateMeta' = B.setMeta key <$> value <*> stateMeta' st }
176 updateState $ \st -> st { stateMeta' = B.setMeta key <$> value <*> stateMeta' st }
157
177
158--
178--