Muse reader: add openTag and closeTag functions
This commit is contained in:
parent
6632f2f2ce
commit
1feb62cb24
1 changed files with 19 additions and 18 deletions
|
@ -179,16 +179,22 @@ someUntil p end = first <$> ((:) <$> p) <*> manyUntil p end
|
|||
|
||||
-- ** HTML parsers
|
||||
|
||||
openTag :: PandocMonad m => String -> MuseParser m Attr
|
||||
openTag tag = do
|
||||
(TagOpen _ attr, _) <- htmlTag(~== TagOpen tag [])
|
||||
return $ htmlAttrToPandoc attr
|
||||
|
||||
closeTag :: PandocMonad m => String -> MuseParser m ()
|
||||
closeTag tag = void $ htmlTag (~== TagClose tag)
|
||||
|
||||
-- | Parse HTML tag, returning its attributes and literal contents.
|
||||
htmlElement :: PandocMonad m
|
||||
=> String -- ^ Tag name
|
||||
-> MuseParser m (Attr, String)
|
||||
htmlElement tag = try $ do
|
||||
(TagOpen _ attr, _) <- htmlTag (~== TagOpen tag [])
|
||||
content <- manyTill anyChar endtag
|
||||
return (htmlAttrToPandoc attr, content)
|
||||
where
|
||||
endtag = void $ htmlTag (~== TagClose tag)
|
||||
attr <- openTag tag
|
||||
content <- manyTill anyChar $ closeTag tag
|
||||
return (attr, content)
|
||||
|
||||
htmlBlock :: PandocMonad m
|
||||
=> String -- ^ Tag name
|
||||
|
@ -213,13 +219,11 @@ parseHtmlContent :: PandocMonad m
|
|||
parseHtmlContent tag = try $ do
|
||||
many spaceChar
|
||||
pos <- getPosition
|
||||
(TagOpen _ attr, _) <- htmlTag (~== TagOpen tag [])
|
||||
attr <- openTag tag
|
||||
manyTill spaceChar eol
|
||||
content <- parseBlocksTill $ try $ count (sourceColumn pos - 1) spaceChar >> endtag
|
||||
content <- parseBlocksTill $ try $ count (sourceColumn pos - 1) spaceChar >> closeTag tag
|
||||
manyTill spaceChar eol -- closing tag must be followed by optional whitespace and newline
|
||||
return (htmlAttrToPandoc attr, content)
|
||||
where
|
||||
endtag = void $ htmlTag (~== TagClose tag)
|
||||
return (attr, content)
|
||||
|
||||
-- ** Directive parsers
|
||||
|
||||
|
@ -423,13 +427,12 @@ exampleTag = try $ do
|
|||
literalTag :: PandocMonad m => MuseParser m (F Blocks)
|
||||
literalTag = try $ do
|
||||
many spaceChar
|
||||
(TagOpen _ attr, _) <- htmlTag (~== TagOpen "literal" [])
|
||||
attr <- openTag "literal"
|
||||
manyTill spaceChar eol
|
||||
content <- manyTill anyChar endtag
|
||||
content <- manyTill anyChar $ closeTag "literal"
|
||||
manyTill spaceChar eol
|
||||
return $ return $ rawBlock (htmlAttrToPandoc attr, content)
|
||||
return $ return $ rawBlock (attr, content)
|
||||
where
|
||||
endtag = void $ htmlTag (~== TagClose "literal")
|
||||
-- FIXME: Emacs Muse inserts <literal> without style into all output formats, but we assume HTML
|
||||
format (_, _, kvs) = fromMaybe "html" $ lookup "style" kvs
|
||||
rawBlock (attrs, content) = B.rawBlock (format attrs) $ rchop $ intercalate "\n" $ dropSpacePrefix $ splitOn "\n" $ lchop content
|
||||
|
@ -480,14 +483,12 @@ verseTag :: PandocMonad m => MuseParser m (F Blocks)
|
|||
verseTag = try $ do
|
||||
many spaceChar
|
||||
pos <- getPosition
|
||||
(TagOpen _ _, _) <- htmlTag (~== TagOpen "verse" [])
|
||||
openTag "verse"
|
||||
manyTill spaceChar eol
|
||||
let indent = count (sourceColumn pos - 1) spaceChar
|
||||
content <- sequence <$> manyTill (indent >> verseLine) (try $ indent >> endtag)
|
||||
content <- sequence <$> manyTill (indent >> verseLine) (try $ indent >> closeTag "verse")
|
||||
manyTill spaceChar eol
|
||||
return $ B.lineBlock <$> content
|
||||
where
|
||||
endtag = void $ htmlTag (~== TagClose "verse")
|
||||
|
||||
-- | Parse @\<comment>@ tag.
|
||||
commentTag :: PandocMonad m => MuseParser m (F Blocks)
|
||||
|
|
Loading…
Add table
Reference in a new issue