blob: 23e0f7448aecc4fa72bc180d0d85de0b63ec6e06 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{- |
Module : Text.Pandoc.Readers.CSV
Copyright : Copyright (C) 2006-2022 John MacFarlane
License : GNU GPL, version 2 or above
Maintainer : John MacFarlane <[email protected]>
Stability : alpha
Portability : portable
Conversion from CSV or TSV to a 'Pandoc' table.
-}
module Text.Pandoc.Readers.CSV (
readCSV,
readTSV
) where
import qualified Data.Text as T
import Text.Pandoc.CSV (parseCSV, defaultCSVOptions, CSVOptions(..))
import Text.Pandoc.Definition
import qualified Text.Pandoc.Builder as B
import Text.Pandoc.Class (PandocMonad)
import Text.Pandoc.Error
import Text.Pandoc.Sources (ToSources(..), sourcesToText)
import Text.Pandoc.Options (ReaderOptions)
import Control.Monad.Except (throwError)
import Data.Text (Text)
readCSV :: (PandocMonad m, ToSources a)
=> ReaderOptions -- ^ Reader options
-> a
-> m Pandoc
readCSV _opts s = do
readCSVWith defaultCSVOptions $ sourcesToText $ toSources s
readTSV :: (PandocMonad m, ToSources a)
=> ReaderOptions -- ^ Reader options
-> a
-> m Pandoc
readTSV _opts s = do
readCSVWith tsvOpts $ sourcesToText $ toSources s
where
tsvOpts = CSVOptions{
csvDelim = '\t',
csvQuote = Nothing,
csvKeepSpace = False,
csvEscape = Nothing }
readCSVWith :: PandocMonad m
=> CSVOptions
-> Text
-> m Pandoc
readCSVWith csvopts txt = do
case parseCSV csvopts txt of
Right (r:rs) -> return $ B.doc $ B.table capt
(zip aligns widths)
(TableHead nullAttr hdrs)
[TableBody nullAttr 0 [] rows]
(TableFoot nullAttr [])
where capt = B.emptyCaption
numcols = length r
toplain = B.simpleCell . B.plain . B.text . T.strip
toRow = Row nullAttr . map toplain
toHeaderRow l = [toRow l | not (null l)]
hdrs = toHeaderRow r
rows = map toRow rs
aligns = replicate numcols AlignDefault
widths = replicate numcols ColWidthDefault
Right [] -> return $ B.doc mempty
Left e -> throwError $ PandocParsecError (toSources [("",txt)]) e
|