@@ -98,7 +98,9 @@ parseInline (Elem e) =
9898 "sup" -> superscript <$> parseStyleType e
9999 "code" -> pure $ code $ strContent e
100100 "image" -> parseInlineImageElement e
101− name -> throwError $ PandocParseError ("Couldn't parse FB2 file: unexpected element " ++ name ++ ".")
101+ name -> do
102+ report $ IgnoredElement name
103+ pure mempty
102104parseInline (Text x) = pure $ text $ cdData x
103105parseInline (CRef r) = pure $ str $ convertEntity r
104106
@@ -173,7 +175,9 @@ parseDescriptionChild e =
173175 "publish-info" -> pure ()
174176 "custom-info" -> pure ()
175177 "output" -> pure ()
176− name -> throwError $ PandocParseError ("Couldn't parse FB2 file: unexpected element " ++ name ++ "in description.")
178+ name -> do
179+ report $ IgnoredElement $ name ++ " in description"
180+ pure mempty
177181
178182-- | Parse a child of @\<body>@ element.
179183parseBodyChild :: PandocMonad m => Element -> FB2 m Blocks
@@ -189,26 +193,29 @@ parseBodyChild e =
189193parseBinaryElement :: PandocMonad m => Element -> FB2 m ()
190194parseBinaryElement e =
191195 case (findAttr (unqual "id") e, findAttr (unqual "content-type") e) of
192− (Nothing, _) -> throwError $ PandocParseError "<binary> element must have an \"id\" attribute"
193− (Just _, Nothing) -> throwError $ PandocParseError "<binary> element must have a \"content-type\" attribute"
196+ (Nothing, _) -> report $ IgnoredElement "binary without id attribute"
197+ (Just _, Nothing) ->
198+ report $ IgnoredElement "binary without content-type attribute"
194199 (Just filename, contentType) -> insertMedia filename contentType (decodeLenient (pack (strContent e)))
195200
196201-- * Type parsers
197202
198203-- | Parse @authorType@
199204parseAuthor :: PandocMonad m => Element -> FB2 m String
200−parseAuthor e = unwords <$> mapM parseAuthorChild (elChildren e)
205+parseAuthor e = unwords . catMaybes <$> mapM parseAuthorChild (elChildren e)
201206
202−parseAuthorChild :: PandocMonad m => Element -> FB2 m String
207+parseAuthorChild :: PandocMonad m => Element -> FB2 m (Maybe String)
203208parseAuthorChild e =
204209 case qName $ elName e of
205− "first-name" -> pure $ strContent e
206− "middle-name" -> pure $ strContent e
207− "last-name" -> pure $ strContent e
208− "nickname" -> pure $ strContent e
209− "home-page" -> pure $ strContent e
210− "email" -> pure $ strContent e
211− name -> throwError $ PandocParseError ("Couldn't parse FB2 file: unexpected element " ++ name ++ " in author.")
210+ "first-name" -> pure $ Just $ strContent e
211+ "middle-name" -> pure $ Just $ strContent e
212+ "last-name" -> pure $ Just $ strContent e
213+ "nickname" -> pure $ Just $ strContent e
214+ "home-page" -> pure $ Just $ strContent e
215+ "email" -> pure $ Just $ strContent e
216+ name -> do
217+ report $ IgnoredElement $ name ++ " in author"
218+ pure Nothing
212219
213220-- | Parse @titleType@
214221parseTitle :: PandocMonad m => Element -> FB2 m Blocks
@@ -230,7 +237,9 @@ parseImageElement :: PandocMonad m => Element -> FB2 m Blocks
230237parseImageElement e =
231238 case href of
232239 Just src -> pure $ para $ imageWith (imgId, [], []) (removeHash src) title alt
233− Nothing -> throwError $ PandocParseError "Couldn't parse FB2 file: image without href."
240+ Nothing -> do
241+ report $ IgnoredElement " image without href"
242+ pure mempty
234243 where alt = maybe mempty str $ findAttr (unqual "alt") e
235244 title = fromMaybe "" $ findAttr (unqual "title") e
236245 imgId = fromMaybe "" $ findAttr (unqual "id") e
@@ -355,7 +364,9 @@ parseNamedStyle e = do
355364 let lang = maybeToList $ ("lang",) <$> findAttr (QName "lang" Nothing (Just "xml")) e
356365 case findAttr (unqual "name") e of
357366 Just name -> pure $ spanWith ("", [name], lang) content
358− Nothing -> throwError $ PandocParseError "Couldn't parse FB2 file: link without required name."
367+ Nothing -> do
368+ report $ IgnoredElement "link without required name"
369+ pure mempty
359370
360371parseNamedStyleChild :: PandocMonad m => Content -> FB2 m Inlines
361372parseNamedStyleChild (Elem e) =
@@ -369,7 +380,9 @@ parseNamedStyleChild (Elem e) =
369380 "sup" -> superscript <$> parseStyleType e
370381 "code" -> pure $ code $ strContent e
371382 "image" -> parseInlineImageElement e
372− name -> throwError $ PandocParseError ("Couldn't parse FB2 file: unexpected element " ++ name ++ ".")
383+ name -> do
384+ report $ IgnoredElement $ name ++ " in style"
385+ pure mempty
373386parseNamedStyleChild x = parseInline x
374387
375388-- | Parse @linkType@
@@ -383,13 +396,17 @@ parseLinkType e = do
383396 Nothing -> pure $ link href "" content
384397 Just contents -> pure $ note contents
385398 _ -> pure $ link href "" content
386− Nothing -> throwError $ PandocParseError "Couldn't parse FB2 file: link without required href."
399+ Nothing -> do
400+ report $ IgnoredElement "link without required href"
401+ pure mempty
387402
388403-- | Parse @styleLinkType@
389404parseStyleLinkType :: PandocMonad m => Content -> FB2 m Inlines
390405parseStyleLinkType x@(Elem e) =
391406 case qName (elName e) of
392− "a" -> throwError $ PandocParseError "Couldn't parse FB2 file: links cannot be nested."
407+ "a" -> do
408+ report $ IgnoredElement "nested link"
409+ pure mempty
393410 _ -> parseInline x
394411parseStyleLinkType x = parseInline x
395412
@@ -412,7 +429,7 @@ parseTitleInfoChild e =
412429 "src-lang" -> pure ()
413430 "translator" -> pure ()
414431 "sequence" -> pure ()
415− name -> throwError $ PandocParseError ("Couldn't parse FB2 file: unexpected element " ++ name ++ " in title-info.")
432+ name -> report $ IgnoredElement $ name ++ " in title-info"
416433
417434parseCoverPage :: PandocMonad m => Element -> FB2 m ()
418435parseCoverPage e =
@@ -430,6 +447,8 @@ parseInlineImageElement :: PandocMonad m
430447parseInlineImageElement e =
431448 case href of
432449 Just src -> pure $ imageWith ("", [], []) (removeHash src) "" alt
433− Nothing -> throwError $ PandocParseError "Couldn't parse FB2 file: inline image without href."
450+ Nothing -> do
451+ report $ IgnoredElement "inline image without href"
452+ pure mempty
434453 where alt = maybe mempty str $ findAttr (unqual "alt") e
435454 href = findAttr (QName "href" (Just "http://www.w3.org/1999/xlink") Nothing) e