aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Writers/Ms.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Text/Pandoc/Writers/Ms.hs')
-rw-r--r--src/Text/Pandoc/Writers/Ms.hs38
1 files changed, 28 insertions, 10 deletions
diff --git a/src/Text/Pandoc/Writers/Ms.hs b/src/Text/Pandoc/Writers/Ms.hs
index 96914d3c6..97c23f24d 100644
--- a/src/Text/Pandoc/Writers/Ms.hs
+++ b/src/Text/Pandoc/Writers/Ms.hs
@@ -2,7 +2,7 @@
{-# LANGUAGE ViewPatterns #-}
{- |
Module : Text.Pandoc.Writers.Ms
- Copyright : Copyright (C) 2007-2020 John MacFarlane
+ Copyright : Copyright (C) 2007-2021 John MacFarlane
License : GNU GPL, version 2 or above
Maintainer : John MacFarlane <jgm@berkeley.edu>
@@ -23,6 +23,7 @@ module Text.Pandoc.Writers.Ms ( writeMs ) where
import Control.Monad.State.Strict
import Data.Char (isLower, isUpper, ord)
import Data.List (intercalate, intersperse)
+import Data.List.NonEmpty (nonEmpty)
import qualified Data.Map as Map
import Data.Maybe (catMaybes)
import Data.Text (Text)
@@ -244,13 +245,17 @@ blockToMs opts (Table _ blkCapt specs thead tbody tfoot) =
aligncode AlignDefault = "l"
in do
caption' <- inlineListToMs' opts caption
- let iwidths = if all (== 0) widths
- then repeat ""
- else map (T.pack . printf "w(%0.1fn)" . (70 *)) widths
+ let isSimple = all (== 0) widths
+ let totalWidth = 70
-- 78n default width - 8n indent = 70n
let coldescriptions = literal $ T.unwords
- (zipWith (\align width -> aligncode align <> width)
- alignments iwidths) <> "."
+ (zipWith (\align width -> aligncode align <>
+ if width == 0
+ then ""
+ else T.pack $
+ printf "w(%0.1fn)"
+ (totalWidth * width))
+ alignments widths) <> "."
colheadings <- mapM (blockListToMs opts) headers
let makeRow cols = literal "T{" $$
vcat (intersperse (literal "T}\tT{") cols) $$
@@ -259,12 +264,26 @@ blockToMs opts (Table _ blkCapt specs thead tbody tfoot) =
then empty
else makeRow colheadings $$ char '_'
body <- mapM (\row -> do
- cols <- mapM (blockListToMs opts) row
+ cols <- mapM (\(cell, w) ->
+ (if isSimple
+ then id
+ else (literal (".nr LL " <>
+ T.pack (printf "%0.1fn"
+ (w * totalWidth))) $$)) <$>
+ blockListToMs opts cell) (zip row widths)
return $ makeRow cols) rows
setFirstPara
return $ literal ".PP" $$ caption' $$
+ literal ".na" $$ -- we don't want justification in table cells
+ (if isSimple
+ then ""
+ else ".nr LLold \\n[LL]") $$
literal ".TS" $$ literal "delim(@@) tab(\t);" $$ coldescriptions $$
- colheadings' $$ vcat body $$ literal ".TE"
+ colheadings' $$ vcat body $$ literal ".TE" $$
+ (if isSimple
+ then ""
+ else ".nr LL \\n[LLold]") $$
+ literal ".ad"
blockToMs opts (BulletList items) = do
contents <- mapM (bulletListItemToMs opts) items
@@ -272,8 +291,7 @@ blockToMs opts (BulletList items) = do
return (vcat contents)
blockToMs opts (OrderedList attribs items) = do
let markers = take (length items) $ orderedListMarkers attribs
- let indent = 2 +
- maximum (map T.length markers)
+ let indent = 2 + maybe 0 maximum (nonEmpty (map T.length markers))
contents <- mapM (\(num, item) -> orderedListItemToMs opts num indent item) $
zip markers items
setFirstPara