RST writer: better image handling.
- An image alone in its paragraph (but not a figure) is now rendered as an independent image, with an `alt` attribute if a description is supplied. - An inline image that is not alone in its paragraph will be rendered, as before, using a substitution. Such an image cannot have a "center", "left", or "right" alignment, so the classes `align-center`, `align-left`, or `align-right` are ignored. However, `align-top`, `align-middle`, `align-bottom` will generate a corresponding `align` attribute. Closes #6948.
This commit is contained in:
parent
32902d0fad
commit
c43e2dc0f4
3 changed files with 52 additions and 20 deletions
|
@ -143,9 +143,12 @@ pictToRST (label, (attr, src, _, mbtarget)) = do
|
|||
let (_, cls, _) = attr
|
||||
classes = case cls of
|
||||
[] -> empty
|
||||
["align-right"] -> ":align: right"
|
||||
["align-left"] -> ":align: left"
|
||||
["align-center"] -> ":align: center"
|
||||
["align-top"] -> ":align: top"
|
||||
["align-middle"] -> ":align: middle"
|
||||
["align-bottom"] -> ":align: bottom"
|
||||
["align-center"] -> empty
|
||||
["align-right"] -> empty
|
||||
["align-left"] -> empty
|
||||
_ -> ":class: " <> literal (T.unwords cls)
|
||||
return $ nowrap
|
||||
$ ".. |" <> label' <> "| image:: " <> literal src $$ hang 3 empty (classes $$ dims)
|
||||
|
@ -215,19 +218,28 @@ blockToRST (Div (ident,classes,_kvs) bs) = do
|
|||
nest 3 contents $$
|
||||
blankline
|
||||
blockToRST (Plain inlines) = inlineListToRST inlines
|
||||
-- title beginning with fig: indicates that the image is a figure
|
||||
blockToRST (Para [Image attr txt (src,T.stripPrefix "fig:" -> Just tit)]) = do
|
||||
capt <- inlineListToRST txt
|
||||
blockToRST (Para [Image attr txt (src, rawtit)]) = do
|
||||
description <- inlineListToRST txt
|
||||
dims <- imageDimsToRST attr
|
||||
let fig = "figure:: " <> literal src
|
||||
alt = ":alt: " <> if T.null tit then capt else literal tit
|
||||
-- title beginning with fig: indicates that the image is a figure
|
||||
let (isfig, tit) = case T.stripPrefix "fig:" rawtit of
|
||||
Nothing -> (False, rawtit)
|
||||
Just tit' -> (True, tit')
|
||||
let fig | isfig = "figure:: " <> literal src
|
||||
| otherwise = "image:: " <> literal src
|
||||
alt | isfig = ":alt: " <> if T.null tit then description else literal tit
|
||||
| null txt = empty
|
||||
| otherwise = ":alt: " <> description
|
||||
capt | isfig = description
|
||||
| otherwise = empty
|
||||
(_,cls,_) = attr
|
||||
classes = case cls of
|
||||
[] -> empty
|
||||
["align-right"] -> ":align: right"
|
||||
["align-left"] -> ":align: left"
|
||||
["align-center"] -> ":align: center"
|
||||
_ -> ":figclass: " <> literal (T.unwords cls)
|
||||
_ | isfig -> ":figclass: " <> literal (T.unwords cls)
|
||||
| otherwise -> ":class: " <> literal (T.unwords cls)
|
||||
return $ hang 3 ".. " (fig $$ alt $$ classes $$ dims $+$ capt) $$ blankline
|
||||
blockToRST (Para inlines)
|
||||
| LineBreak `elem` inlines =
|
||||
|
|
|
@ -1,14 +1,3 @@
|
|||
```
|
||||
% pandoc -f native -t rst
|
||||
[Image ("",["align-right"],[("width","100px")]) [Str "image"] ("foo.png","")]
|
||||
^D
|
||||
|image|
|
||||
|
||||
.. |image| image:: foo.png
|
||||
:align: right
|
||||
:width: 100px
|
||||
```
|
||||
|
||||
```
|
||||
% pandoc -f native -t rst
|
||||
[Para [Image ("",["align-right"],[("width","100px")]) [Str "image"] ("foo.png","fig:test")]]
|
||||
|
|
31
test/command/6948.md
Normal file
31
test/command/6948.md
Normal file
|
@ -0,0 +1,31 @@
|
|||
Treat an image alone in its paragraph (but not a figure)
|
||||
as an independent image:
|
||||
```
|
||||
% pandoc -f native -t rst
|
||||
[Para [Image ("",["align-center"],[]) [Str "https://pandoc.org/diagram.jpg"] ("https://pandoc.org/diagram.jpg","")]]
|
||||
^D
|
||||
.. image:: https://pandoc.org/diagram.jpg
|
||||
:alt: https://pandoc.org/diagram.jpg
|
||||
:align: center
|
||||
```
|
||||
|
||||
Here we just omit the center attribute as it's not valid:
|
||||
```
|
||||
% pandoc -f native -t rst
|
||||
[Para [Str "hi",Space,Image ("",["align-center"],[]) [Str "https://pandoc.org/diagram.jpg"] ("https://pandoc.org/diagram.jpg","")]]
|
||||
^D
|
||||
hi |https://pandoc.org/diagram.jpg|
|
||||
|
||||
.. |https://pandoc.org/diagram.jpg| image:: https://pandoc.org/diagram.jpg
|
||||
```
|
||||
|
||||
But we can use top, middle, or bottom alignment:
|
||||
```
|
||||
% pandoc -f native -t rst
|
||||
[Para [Str "hi",Space,Image ("",["align-top"],[]) [Str "https://pandoc.org/diagram.jpg"] ("https://pandoc.org/diagram.jpg","")]]
|
||||
^D
|
||||
hi |https://pandoc.org/diagram.jpg|
|
||||
|
||||
.. |https://pandoc.org/diagram.jpg| image:: https://pandoc.org/diagram.jpg
|
||||
:align: top
|
||||
```
|
Loading…
Reference in a new issue