summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhubertp-lshift <hubertp@lshift.de>2016-11-26 21:45:56 +0100
committerJohn MacFarlane <jgm@berkeley.edu>2016-11-26 21:45:56 +0100
commit015dead0bb2bb5cea06a0fa366fdd651c8e07889 (patch)
treeab88036f84b91ddd4009f63a1bd4f9e52ffafae0
parentbaa25362a40fe905368f60222ebd8a533bcfe0f9 (diff)
[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.
-rw-r--r--data/odt/styles.xml2
-rw-r--r--src/Text/Pandoc/Readers/Odt/ContentReader.hs27
-rw-r--r--src/Text/Pandoc/Writers/OpenDocument.hs2
-rw-r--r--tests/Tests/Readers/Odt.hs1
-rw-r--r--tests/odt/native/simpleTableWithCaption.native1
-rw-r--r--tests/odt/odt/simpleTableWithCaption.odtbin0 -> 10396 bytes
-rw-r--r--tests/tables.opendocument10
7 files changed, 29 insertions, 14 deletions
diff --git a/data/odt/styles.xml b/data/odt/styles.xml
index 1f1e2c5c8..623a89051 100644
--- a/data/odt/styles.xml
+++ b/data/odt/styles.xml
@@ -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"
diff --git a/src/Text/Pandoc/Readers/Odt/ContentReader.hs b/src/Text/Pandoc/Readers/Odt/ContentReader.hs
index 3a6a99237..2672b01ef 100644
--- a/src/Text/Pandoc/Readers/Odt/ContentReader.hs
+++ b/src/Text/Pandoc/Readers/Odt/ContentReader.hs
@@ -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)
diff --git a/src/Text/Pandoc/Writers/OpenDocument.hs b/src/Text/Pandoc/Writers/OpenDocument.hs
index 42c151780..8bd0f469e 100644
--- a/src/Text/Pandoc/Writers/OpenDocument.hs
+++ b/src/Text/Pandoc/Writers/OpenDocument.hs
@@ -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
diff --git a/tests/Tests/Readers/Odt.hs b/tests/Tests/Readers/Odt.hs
index d6ed48f8d..cd764dd62 100644
--- a/tests/Tests/Readers/Odt.hs
+++ b/tests/Tests/Readers/Odt.hs
@@ -157,6 +157,7 @@ namesOfTestsComparingToNative = [ "blockquote"
, "referenceToListItem"
, "referenceToText"
, "simpleTable"
+ , "simpleTableWithCaption"
-- , "table"
, "unicode"
, "unorderedList"
diff --git a/tests/odt/native/simpleTableWithCaption.native b/tests/odt/native/simpleTableWithCaption.native
new file mode 100644
index 000000000..18d68b772
--- /dev/null
+++ b/tests/odt/native/simpleTableWithCaption.native
@@ -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 []]
diff --git a/tests/odt/odt/simpleTableWithCaption.odt b/tests/odt/odt/simpleTableWithCaption.odt
new file mode 100644
index 000000000..ec6fac894
--- /dev/null
+++ b/tests/odt/odt/simpleTableWithCaption.odt
Binary files differ
diff --git a/tests/tables.opendocument b/tests/tables.opendocument
index aa35abc91..0765bb783 100644
--- a/tests/tables.opendocument
+++ b/tests/tables.opendocument
@@ -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">