mirror of
https://github.com/jgm/pandoc.git
synced 2026-08-28 17:20:47 +08:00
JATS writer: fix XML output for nested figures
Subfigures are now wrapped inside a `<fig-group>` element. Furthermore, figure content that isn't allowed as children of `<fig>` elements, such as raw text, gets wrapped in `<p>` elements to ensure schema-conform XML production. Fixes: #11342
This commit is contained in:
@@ -439,12 +439,36 @@ blockToJATS opts (Figure (ident, _, kvs) (Caption _short longcapt) body) = do
|
||||
capt <- if null longcapt
|
||||
then pure empty
|
||||
else inTagsSimple "caption" <$> blocksToJATS opts longcapt
|
||||
figbod <- blocksToJATS opts $ walk unsetAltIfDupl body
|
||||
let figattr = [("id", escapeNCName ident) | not (T.null ident)] ++
|
||||
[(k,v) | (k,v) <- kvs
|
||||
, k `elem` [ "fig-type", "orientation"
|
||||
, "position", "specific-use"]]
|
||||
return $ inTags True "fig" figattr $ capt $$ figbod
|
||||
|
||||
-- We handle the element specially if it's a figure with subfigures, i.e., if
|
||||
-- all immediate children are figures themselves.
|
||||
let hasSubfigures = all (\case { Figure{} -> True; _ -> False}) body
|
||||
needsWrapping = if hasSubfigures
|
||||
then (const False)
|
||||
else \case
|
||||
-- Wrap all figure content elements, except for those
|
||||
-- allowed as direct subelements.
|
||||
BlockQuote{} -> False
|
||||
CodeBlock{} -> False
|
||||
Para{} -> False
|
||||
Plain [Image{}] -> False
|
||||
Plain [Math{}] -> False
|
||||
Table{} -> False
|
||||
_ -> True
|
||||
|
||||
children <- wrappedBlocksToJATS needsWrapping opts $ walk unsetAltIfDupl body
|
||||
let (tag, allowedAttributes) =
|
||||
if hasSubfigures
|
||||
then ( "fig-group"
|
||||
, ["content-type", "orientation", "position", "specific-use"]
|
||||
)
|
||||
else ("fig"
|
||||
, ["fig-type", "orientation", "position", "specific-use"]
|
||||
)
|
||||
let xmlattr = [("id", escapeNCName ident) | not (T.null ident)] ++
|
||||
[(k,v) | (k,v) <- kvs
|
||||
, k `elem` allowedAttributes]
|
||||
return $ inTags True tag xmlattr $ capt $$ children
|
||||
|
||||
-- | Convert a list of inline elements to JATS.
|
||||
inlinesToJATS :: PandocMonad m => WriterOptions -> [Inline] -> JATS m (Doc Text)
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
Subfigures should be converted to *fig-group* elements.
|
||||
|
||||
```
|
||||
% pandoc -f latex -t jats
|
||||
\begin{figure}[H]
|
||||
\begin{subfigure}
|
||||
\centering
|
||||
\includegraphics[height=1.5in]{assets/A.png}
|
||||
\caption{Graph for function *A*.}
|
||||
\label{fig:A}
|
||||
\end{subfigure}
|
||||
\begin{subfigure}
|
||||
\centering
|
||||
\includegraphics[height=1.5in]{assets/B.png}
|
||||
\caption{Graph for function *B*.}
|
||||
\label{fig:B}
|
||||
\end{subfigure}
|
||||
\label{fig:graphs}
|
||||
\caption{Function graphs.}
|
||||
\end{figure}
|
||||
^D
|
||||
<fig-group id="figU003Agraphs">
|
||||
<caption><p>Function graphs.</p></caption>
|
||||
<fig id="figU003AA">
|
||||
<caption><p>Graph for function *A*.</p></caption>
|
||||
<graphic mimetype="image" mime-subtype="png" xlink:href="assets/A.png" />
|
||||
</fig>
|
||||
<fig id="figU003AB">
|
||||
<caption><p>Graph for function *B*.</p></caption>
|
||||
<graphic mimetype="image" mime-subtype="png" xlink:href="assets/B.png" />
|
||||
</fig>
|
||||
</fig-group>
|
||||
```
|
||||
Reference in New Issue
Block a user