@@ -46,6 +46,7 @@ import Control.Monad.State.Strict
46import Data.ByteString.Lazy.Char8 ( pack )
46import Data.ByteString.Lazy.Char8 ( pack )
47import Data.ByteString.Base64.Lazy
47import Data.ByteString.Base64.Lazy
48import Data.Char (isSpace, toUpper)
48import Data.Char (isSpace, toUpper)
49import Data.List (dropWhileEnd, intersperse)
50import Data.List (dropWhileEnd, intersperse)
50import Data.List.Split (splitOn)
51import Data.List.Split (splitOn)
51import Data.Text (Text)
52import Data.Text (Text)
@@ -53,8 +54,9 @@ import Data.Default
53import Data.Maybe
54import Data.Maybe
54import Text.HTML.TagSoup.Entity (lookupEntity)
55import Text.HTML.TagSoup.Entity (lookupEntity)
55import Text.Pandoc.Builder
56import Text.Pandoc.Builder
56−import Text.Pandoc.Class (PandocMonad, insertMedia)
57+import Text.Pandoc.Class (PandocMonad, insertMedia, report)
57import Text.Pandoc.Error
58import Text.Pandoc.Error
59+import Text.Pandoc.Logging
58import Text.Pandoc.Options
60import Text.Pandoc.Options
59import Text.Pandoc.Shared (crFilter)
61import Text.Pandoc.Shared (crFilter)
60import Text.XML.Light
62import Text.XML.Light
@@ -122,7 +124,7 @@ parseBlock (Elem e) =
122 case qName $ elName e of
124 case qName $ elName e of
123 "?xml" -> pure mempty
125 "?xml" -> pure mempty
124 "FictionBook" -> mconcat <$> mapM parseFictionBookChild (elChildren e)
126 "FictionBook" -> mconcat <$> mapM parseFictionBookChild (elChildren e)
125− name -> throwError $ PandocParseError ("Couldn't parse FB2 file: unexpected element " ++ name ++ ".")
127+ name -> report (UnexpectedXmlElement name "root") $> mempty
126parseBlock _ = pure mempty
128parseBlock _ = pure mempty
128-- | Parse a child of @\<FictionBook>@ element.
130-- | Parse a child of @\<FictionBook>@ element.
@@ -133,7 +135,7 @@ parseFictionBookChild e =
133 "description" -> mempty <$ mapM_ parseDescriptionChild (elChildren e)
135 "description" -> mempty <$ mapM_ parseDescriptionChild (elChildren e)
134 "body" -> mconcat <$> mapM parseBodyChild (elChildren e)
136 "body" -> mconcat <$> mapM parseBodyChild (elChildren e)
135 "binary" -> mempty <$ parseBinaryElement e
137 "binary" -> mempty <$ parseBinaryElement e
136− name -> throwError $ PandocParseError ("Couldn't parse FB2 file: unexpected element " ++ name ++ "in FictionBook.")
138+ name -> report (UnexpectedXmlElement name "FictionBook") $> mempty
138-- | Parse a child of @\<description>@ element.
140-- | Parse a child of @\<description>@ element.
139parseDescriptionChild :: PandocMonad m => Element -> FB2 m ()
141parseDescriptionChild :: PandocMonad m => Element -> FB2 m ()
@@ -226,7 +228,7 @@ parseCiteChild e =
226 "subtitle" -> parseSubtitle e
228 "subtitle" -> parseSubtitle e
227 "table" -> parseTable e
229 "table" -> parseTable e
228 "text-author" -> para <$> parsePType e
230 "text-author" -> para <$> parsePType e
229− name -> throwError $ PandocParseError ("Couldn't parse FB2 file: unexpected element " ++ name ++ " in cite.")
231+ name -> report (UnexpectedXmlElement name "cite") $> mempty
231-- | Parse @poemType@
233-- | Parse @poemType@
232parsePoem :: PandocMonad m => Element -> FB2 m Blocks
234parsePoem :: PandocMonad m => Element -> FB2 m Blocks
@@ -241,7 +243,7 @@ parsePoemChild e =
241 "stanza" -> parseStanza e
243 "stanza" -> parseStanza e
242 "text-author" -> para <$> parsePType e
244 "text-author" -> para <$> parsePType e
243 "date" -> pure $ para $ text $ strContent e
245 "date" -> pure $ para $ text $ strContent e
244− name -> throwError $ PandocParseError ("Couldn't parse FB2 file: unexpected element " ++ name ++ " in poem.")
246+ name -> report (UnexpectedXmlElement name "poem") $> mempty
246parseStanza :: PandocMonad m => Element -> FB2 m Blocks
248parseStanza :: PandocMonad m => Element -> FB2 m Blocks
247parseStanza e = fromList . joinLineBlocks . toList . mconcat <$> mapM parseStanzaChild (elChildren e)
249parseStanza e = fromList . joinLineBlocks . toList . mconcat <$> mapM parseStanzaChild (elChildren e)
@@ -257,7 +259,7 @@ parseStanzaChild e =
257 "title" -> parseTitle e
259 "title" -> parseTitle e
258 "subtitle" -> parseSubtitle e
260 "subtitle" -> parseSubtitle e
259 "v" -> lineBlock . (:[]) <$> parsePType e
261 "v" -> lineBlock . (:[]) <$> parsePType e
260− name -> throwError $ PandocParseError ("Couldn't parse FB2 file: unexpected element " ++ name ++ " in stanza.")
262+ name -> report (UnexpectedXmlElement name "stanza") $> mempty
262-- | Parse @epigraphType@
264-- | Parse @epigraphType@
263parseEpigraph :: PandocMonad m => Element -> FB2 m Blocks
265parseEpigraph :: PandocMonad m => Element -> FB2 m Blocks
@@ -273,7 +275,7 @@ parseEpigraphChild e =
273 "cite" -> parseCite e
275 "cite" -> parseCite e
274 "empty-line" -> pure horizontalRule
276 "empty-line" -> pure horizontalRule
275 "text-author" -> para <$> parsePType e
277 "text-author" -> para <$> parsePType e
276− name -> throwError $ PandocParseError ("Couldn't parse FB2 file: unexpected element " ++ name ++ " in epigraph.")
278+ name -> report (UnexpectedXmlElement name "epigraph") $> mempty
278-- | Parse @annotationType@
280-- | Parse @annotationType@
279parseAnnotation :: PandocMonad m => Element -> FB2 m Blocks
281parseAnnotation :: PandocMonad m => Element -> FB2 m Blocks
@@ -288,7 +290,7 @@ parseAnnotationChild e =
288 "subtitle" -> parseSubtitle e
290 "subtitle" -> parseSubtitle e
289 "table" -> parseTable e
291 "table" -> parseTable e
290 "empty-line" -> pure horizontalRule
292 "empty-line" -> pure horizontalRule
291− name -> throwError $ PandocParseError ("Couldn't parse FB2 file: unexpected element " ++ name ++ " in annotation.")
293+ name -> report (UnexpectedXmlElement name "annotation") $> mempty
293-- | Parse @sectionType@
295-- | Parse @sectionType@
294parseSection :: PandocMonad m => Element -> FB2 m Blocks
296parseSection :: PandocMonad m => Element -> FB2 m Blocks
@@ -314,7 +316,7 @@ parseSectionChild e =
314 "subtitle" -> parseSubtitle e
316 "subtitle" -> parseSubtitle e
315 "p" -> para <$> parsePType e
317 "p" -> para <$> parsePType e
316 "section" -> parseSection e
318 "section" -> parseSection e
317− name -> throwError $ PandocParseError ("Couldn't parse FB2 file: unexpected element " ++ name ++ " in section.")
319+ name -> report (UnexpectedXmlElement name "section") $> mempty
319-- | parse @styleType@
321-- | parse @styleType@
320parseStyleType :: PandocMonad m => Element -> FB2 m Inlines
322parseStyleType :: PandocMonad m => Element -> FB2 m Inlines