git.iko.soy/typeable/pandoc
on master help sign in
OpenDocument Writer: Implement table cell alignment (#6700)

Co-authored-by: Mauro Bieg <mb21@users.noreply.github.com>

commitae4dcc0d4a66b30991babf080de23c08ac37cf90 authorNils Carlson <nils@nilscarlson.se> dateSun 27 Sep 2020, 18:21 (6 years ago) parent3abfcbe
3 files changed+98−25
src/Text/Pandoc/Writers/OpenDocument.hs+33−5 test/command/table-with-cell-align.md+45 test/command/table-with-column-span.md+20−20
src/Text/Pandoc/Writers/OpenDocument.hs+33−5
@@ -492,7 +492,6 @@ tableRowToOpenDocument o ns r =
492492 in inTagsIndented "table:table-row" . vcat <$>
493493 mapM (tableItemToOpenDocument o "TableRowCell") (zip ns c)
494494
495−
496495colspanAttrib :: ColSpan -> [(Text, Text)]
497496colspanAttrib cs =
498497 case cs of
@@ -505,17 +504,32 @@ rowspanAttrib rs =
505504 RowSpan 1 -> mempty
506505 RowSpan n -> [("table:number-rows-spanned", tshow n)]
507506
507+alignAttrib :: Alignment -> [(Text,Text)]
508+alignAttrib a = case a of
509+ AlignRight -> ("fo:text-align","end") : style
510+ AlignCenter -> ("fo:text-align","center") : style
511+ _ -> []
512+ where
513+ style = [("style:justify-single-word","false")]
514+
508515tableItemToOpenDocument :: PandocMonad m
509516 => WriterOptions -> Text -> (Text,Ann.Cell)
510517 -> OD m (Doc Text)
511−tableItemToOpenDocument o s (n,c) =
512− let (Ann.Cell _colspecs _colnum (Cell _ _ rs cs i) ) = c
518+tableItemToOpenDocument o s (n,c) = do
519+ let (Ann.Cell _colspecs _colnum (Cell _ align rs cs i) ) = c
513520 csa = colspanAttrib cs
514521 rsa = rowspanAttrib rs
522+ aa = alignAttrib align
515523 a = [ ("table:style-name" , s )
516524 , ("office:value-type", "string" ) ] ++ csa ++ rsa
517− in inTags True "table:table-cell" a <$>
518− withParagraphStyle o n (map plainToPara i)
525+ itemParaStyle <- case aa of
526+ [] -> return 0
527+ _ -> paraStyleFromParent n aa
528+ let itemParaStyle' = case itemParaStyle of
529+ 0 -> n
530+ x -> "P" <> tshow x
531+ inTags True "table:table-cell" a <$>
532+ withParagraphStyle o itemParaStyle' (map plainToPara i)
519533
520534-- | Convert a list of inline elements to OpenDocument.
521535inlinesToOpenDocument :: PandocMonad m => WriterOptions -> [Inline] -> OD m (Doc Text)
@@ -713,6 +727,20 @@ paraStyle attrs = do
713727 addParaStyle $ inTags True "style:style" (styleAttr <> attrs) paraProps
714728 return pn
715729
730+paraStyleFromParent :: PandocMonad m => Text -> [(Text,Text)] -> OD m Int
731+paraStyleFromParent parent attrs = do
732+ pn <- (+) 1 . length <$> gets stParaStyles
733+ let styleAttr = [ ("style:name" , "P" <> tshow pn)
734+ , ("style:family" , "paragraph")
735+ , ("style:parent-style-name", parent)]
736+ paraProps = if null attrs
737+ then mempty
738+ else selfClosingTag
739+ "style:paragraph-properties" attrs
740+ addParaStyle $ inTags True "style:style" styleAttr paraProps
741+ return pn
742+
743+
716744paraListStyle :: PandocMonad m => Int -> OD m Int
717745paraListStyle l = paraStyle
718746 [("style:parent-style-name","Text_20_body")
test/command/table-with-cell-align.md+45
@@ -35,3 +35,48 @@
3535 (TableFoot ("",[],[])
3636 [])]
3737```
38+```
39+% pandoc -f native -t opendocument --quiet
40+[Table ("",[],[]) (Caption Nothing
41+ [])
42+ [(AlignDefault,ColWidthDefault)
43+ ,(AlignDefault,ColWidthDefault)
44+ ,(AlignDefault,ColWidthDefault)
45+ ,(AlignDefault,ColWidthDefault)]
46+ (TableHead ("",[],[])
47+ [])
48+ [(TableBody ("",[],[]) (RowHeadColumns 0)
49+ []
50+ [Row ("",[],[])
51+ [Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1)
52+ [Para [Str "1"]]
53+ ,Cell ("",[],[]) AlignLeft (RowSpan 1) (ColSpan 1)
54+ [Para [Str "2"]]
55+ ,Cell ("",[],[]) AlignRight (RowSpan 1) (ColSpan 1)
56+ [Para [Str "3"]]
57+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
58+ [Para [Str "4"]]]])]
59+ (TableFoot ("",[],[])
60+ [])]
61+^D
62+<table:table table:name="Table1" table:style-name="Table1">
63+ <table:table-column table:style-name="Table1.A" />
64+ <table:table-column table:style-name="Table1.B" />
65+ <table:table-column table:style-name="Table1.C" />
66+ <table:table-column table:style-name="Table1.D" />
67+ <table:table-row>
68+ <table:table-cell table:style-name="TableRowCell" office:value-type="string">
69+ <text:p text:style-name="P1">1</text:p>
70+ </table:table-cell>
71+ <table:table-cell table:style-name="TableRowCell" office:value-type="string">
72+ <text:p text:style-name="Table_20_Contents">2</text:p>
73+ </table:table-cell>
74+ <table:table-cell table:style-name="TableRowCell" office:value-type="string">
75+ <text:p text:style-name="P2">3</text:p>
76+ </table:table-cell>
77+ <table:table-cell table:style-name="TableRowCell" office:value-type="string">
78+ <text:p text:style-name="Table_20_Contents">4</text:p>
79+ </table:table-cell>
80+ </table:table-row>
81+</table:table>
82+```
test/command/table-with-column-span.md+20−20
@@ -142,47 +142,47 @@
142142 [(TableBody ("",[],[]) (RowHeadColumns 0)
143143 []
144144 [Row ("",[],[])
145− [Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 8)
145+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 8)
146146 [Para [Strong [Str "Octet",Space,Str "no.",Space,Str "1"]]]
147− ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 8)
147+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 8)
148148 [Para [Strong [Str "Octet",Space,Str "no.",Space,Str "2"]]]]
149149 ,Row ("",[],[])
150− [Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1)
150+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
151151 [Para [Str "16"]]
152− ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1)
152+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
153153 [Para [Str "15"]]
154− ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1)
154+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
155155 [Para [Str "14"]]
156− ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1)
156+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
157157 [Para [Str "13"]]
158− ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1)
158+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
159159 [Para [Str "12"]]
160− ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1)
160+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
161161 [Para [Str "11"]]
162− ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1)
162+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
163163 [Para [Str "10"]]
164− ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1)
164+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
165165 [Para [Str "9"]]
166− ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1)
166+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
167167 [Para [Str "8"]]
168− ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1)
168+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
169169 [Para [Str "7"]]
170− ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1)
170+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
171171 [Para [Str "6"]]
172− ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1)
172+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
173173 [Para [Str "5"]]
174− ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1)
174+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
175175 [Para [Str "4"]]
176− ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1)
176+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
177177 [Para [Str "3"]]
178− ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1)
178+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
179179 [Para [Str "2"]]
180− ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 1)
180+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
181181 [Para [Str "1"]]]
182182 ,Row ("",[],[])
183− [Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 8)
183+ [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 8)
184184 [Para [Str "Code",Space,Str "A"]]
185− ,Cell ("",[],[]) AlignCenter (RowSpan 1) (ColSpan 8)
185+ ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 8)
186186 [Para [Str "Code",Space,Str "B"]]]])]
187187 (TableFoot ("",[],[])
188188 [])]