[odt] Infer table's caption from the paragraph (#3224)
ODT's reader always put empty captions for the parsed tables. This commit 1) checks paragraphs that follow the table definition 2) treats specially a paragraph with a style named 'Table' 3) does some postprocessing of the paragraphs that combines tables followed immediately by captions The ODT writer used 'TableCaption' style name for the caption paragraph. This commit follows the open office approach which allows for appending captions to table but uses a built-in style named 'Table' instead of 'TableCaption'. Any users of odt format (both writer and reader) are therefore required to change the style's name to 'Table', if necessary.
This commit is contained in:
parent
baa25362a4
commit
015dead0bb
7 changed files with 29 additions and 14 deletions
|
@ -133,7 +133,7 @@ xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2">
|
|||
style:font-size-complex="12pt"
|
||||
style:font-style-complex="italic" />
|
||||
</style:style>
|
||||
<style:style style:name="TableCaption" style:family="paragraph"
|
||||
<style:style style:name="Table" style:family="paragraph"
|
||||
style:parent-style-name="Caption" style:class="extra">
|
||||
</style:style>
|
||||
<style:style style:name="FigureCaption" style:family="paragraph"
|
||||
|
|
|
@ -312,7 +312,7 @@ withNewStyle a = proc x -> do
|
|||
where
|
||||
isCodeStyle :: StyleName -> Bool
|
||||
isCodeStyle "Source_Text" = True
|
||||
isCodeStyle _ = False
|
||||
isCodeStyle _ = False
|
||||
|
||||
inlineCode :: Inlines -> Inlines
|
||||
inlineCode = code . intercalate "" . map stringify . toList
|
||||
|
@ -415,12 +415,18 @@ constructPara reader = proc blocks -> do
|
|||
fStyle <- readStyleByName -< blocks
|
||||
case fStyle of
|
||||
Left _ -> reader -< blocks
|
||||
Right (styleName, _) | isTableCaptionStyle styleName -> do
|
||||
blocks' <- reader -< blocks
|
||||
arr tableCaptionP -< blocks'
|
||||
Right (_, style) -> do
|
||||
let modifier = getParaModifier style
|
||||
blocks' <- reader -< blocks
|
||||
arr modifier -<< blocks'
|
||||
|
||||
|
||||
blocks' <- reader -< blocks
|
||||
arr modifier -<< blocks'
|
||||
where
|
||||
isTableCaptionStyle :: StyleName -> Bool
|
||||
isTableCaptionStyle "Table" = True
|
||||
isTableCaptionStyle _ = False
|
||||
tableCaptionP b = divWith ("", ["caption"], []) b
|
||||
|
||||
type ListConstructor = [Blocks] -> Blocks
|
||||
|
||||
|
@ -904,6 +910,15 @@ read_text = matchChildContent' [ read_header
|
|||
]
|
||||
>>^ doc
|
||||
|
||||
post_process :: Pandoc -> Pandoc
|
||||
post_process (Pandoc m blocks) =
|
||||
Pandoc m (post_process' blocks)
|
||||
|
||||
post_process' :: [Block] -> [Block]
|
||||
post_process' ((Table _ a w h r) : (Div ("", ["caption"], _) [Para inlines] ) : xs) =
|
||||
(Table inlines a w h r) : ( post_process' xs )
|
||||
post_process' bs = bs
|
||||
|
||||
read_body :: OdtReader _x (Pandoc, MediaBag)
|
||||
read_body = executeIn NsOffice "body"
|
||||
$ executeIn NsOffice "text"
|
||||
|
@ -911,4 +926,4 @@ read_body = executeIn NsOffice "body"
|
|||
$ proc inlines -> do
|
||||
txt <- read_text -< inlines
|
||||
state <- getExtraState -< ()
|
||||
returnA -< (txt, getMediaBag state)
|
||||
returnA -< (post_process txt, getMediaBag state)
|
||||
|
|
|
@ -336,7 +336,7 @@ blockToOpenDocument o bs
|
|||
mapM_ addParaStyle . newPara $ paraHStyles ++ paraStyles
|
||||
captionDoc <- if null c
|
||||
then return empty
|
||||
else withParagraphStyle o "TableCaption" [Para c]
|
||||
else withParagraphStyle o "Table" [Para c]
|
||||
th <- if all null h
|
||||
then return empty
|
||||
else colHeadsToOpenDocument o name (map fst paraHStyles) h
|
||||
|
|
|
@ -157,6 +157,7 @@ namesOfTestsComparingToNative = [ "blockquote"
|
|||
, "referenceToListItem"
|
||||
, "referenceToText"
|
||||
, "simpleTable"
|
||||
, "simpleTableWithCaption"
|
||||
-- , "table"
|
||||
, "unicode"
|
||||
, "unorderedList"
|
||||
|
|
1
tests/odt/native/simpleTableWithCaption.native
Normal file
1
tests/odt/native/simpleTableWithCaption.native
Normal file
|
@ -0,0 +1 @@
|
|||
[Table [Str "Table",Space,Str "1:",Space,Str "Some",Space,Str "caption",Space,Str "for",Space,Str "a",Space,Str "table"] [AlignDefault,AlignDefault] [0.0,0.0] [[],[]] [[[Plain [Str "Content"]],[Plain [Str "More",Space,Str "content"]]]],Para []]
|
BIN
tests/odt/odt/simpleTableWithCaption.odt
Normal file
BIN
tests/odt/odt/simpleTableWithCaption.odt
Normal file
Binary file not shown.
|
@ -63,8 +63,7 @@
|
|||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<text:p text:style-name="TableCaption">Demonstration of simple table
|
||||
syntax.</text:p>
|
||||
<text:p text:style-name="Table">Demonstration of simple table syntax.</text:p>
|
||||
<text:p text:style-name="First_20_paragraph">Simple table without
|
||||
caption:</text:p>
|
||||
<table:table table:name="Table2" table:style-name="Table2">
|
||||
|
@ -197,8 +196,7 @@ spaces:</text:p>
|
|||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<text:p text:style-name="TableCaption">Demonstration of simple table
|
||||
syntax.</text:p>
|
||||
<text:p text:style-name="Table">Demonstration of simple table syntax.</text:p>
|
||||
<text:p text:style-name="First_20_paragraph">Multiline table with
|
||||
caption:</text:p>
|
||||
<table:table table:name="Table4" table:style-name="Table4">
|
||||
|
@ -253,8 +251,8 @@ caption:</text:p>
|
|||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<text:p text:style-name="TableCaption">Here's the caption. It may span
|
||||
multiple lines.</text:p>
|
||||
<text:p text:style-name="Table">Here's the caption. It may span multiple
|
||||
lines.</text:p>
|
||||
<text:p text:style-name="First_20_paragraph">Multiline table without
|
||||
caption:</text:p>
|
||||
<table:table table:name="Table5" table:style-name="Table5">
|
||||
|
|
Loading…
Add table
Reference in a new issue