@@ -0,0 +1,36 @@
1+module Text.Pandoc.Readers.DocBook ( readDocBook ) where
2+import Text.Pandoc.Parsing (ParserState(..), defaultParserState)
3+import Text.Pandoc.Definition
4+import Text.Pandoc.Builder
5+import Text.XML.Light
6+import Data.Monoid
7+import Data.Char (isSpace)
8+
9+readDocBook :: ParserState -> String -> Pandoc
10+readDocBook st inp = Pandoc (Meta [] [] []) $ toList blocks
11+ where blocks = mconcat $ map (parseBlock st) $ parseXML inp
12+
13+parseBlock :: ParserState -> Content -> Blocks
14+parseBlock st (Text (CData _ s _)) = if all isSpace s
15+ then mempty
16+ else plain $ text s
17+parseBlock st (Elem e) =
18+ case qName (elName e) of
19+ "para" -> para $ trimInlines $ mconcat
20+ $ map (parseInline st) $ elContent e
21+ _ -> mconcat $ map (parseBlock st) $ elContent e
22+parseBlock st (CRef _) = mempty
23+
24+parseInline :: ParserState -> Content -> Inlines
25+parseInline st (Text (CData _ s _)) = text s
26+parseInline st (Elem e) =
27+ case qName (elName e) of
28+ "emphasis" -> case lookupAttrBy (\attr -> qName attr == "role")
29+ (elAttribs e) of
30+ Just "strong" -> strong innerInlines
31+ _ -> emph innerInlines
32+ _ -> innerInlines
33+ where innerInlines = trimInlines . mconcat . map (parseInline st)
34+ $ elContent e
35+parseInline st (CRef _) = mempty
36+