git.iko.soy/typeable/pandoc
on master help sign in
Support numrange, numlist for siunitx.
a157e1aJohn MacFarlane
src/Text/Pandoc/Readers/LaTeX.hs+3−1
@@ -879,7 +879,9 @@ inlineCommands = M.union inlineLanguageCommands $ M.fromList
879 -- siuntix
879 -- siuntix
880 , ("si", skipopts *> dosi tok)
880 , ("si", skipopts *> dosi tok)
881 , ("SI", doSI tok)
881 , ("SI", doSI tok)
882− , ("SIrange", doSIrange tok)
882+ , ("SIrange", doSIrange True tok)
883+ , ("numrange", doSIrange False tok)
884+ , ("numlist", doSInumlist)
883 , ("num", doSInum)
885 , ("num", doSInum)
884 , ("ang", doSIang)
886 , ("ang", doSIang)
885 -- hyphenat
887 -- hyphenat
src/Text/Pandoc/Readers/LaTeX/SIunitx.hs+24−8
@@ -4,6 +4,7 @@ module Text.Pandoc.Readers.LaTeX.SIunitx
4 , doSI
4 , doSI
5 , doSIrange
5 , doSIrange
6 , doSInum
6 , doSInum
7+ , doSInumlist
7 , doSIang
8 , doSIang
8 )
9 )
9where
10where
@@ -18,6 +19,7 @@ import qualified Data.Map as M
18import Data.Char (isDigit)
19import Data.Char (isDigit)
19import Data.Text (Text)
20import Data.Text (Text)
20import qualified Data.Text as T
21import qualified Data.Text as T
22+import Data.List (intersperse)
21
23
22dosi :: PandocMonad m => LP m Inlines -> LP m Inlines
24dosi :: PandocMonad m => LP m Inlines -> LP m Inlines
23dosi tok = grouped (siUnit tok) <|> siUnit tok
25dosi tok = grouped (siUnit tok) <|> siUnit tok
@@ -36,12 +38,24 @@ doSI tok = do
36 unit]
38 unit]
37
39
38doSInum :: PandocMonad m => LP m Inlines
40doSInum :: PandocMonad m => LP m Inlines
39−doSInum = do
40− skipopts
41− value <- untokenize <$> braced
41+doSInum = skipopts *> (tonum . untokenize <$> braced)
42+
43+tonum :: Text -> Inlines
44+tonum value =
42 case runParser parseNum () "" value of
45 case runParser parseNum () "" value of
43− Left _ -> return $ text value
46+ Left _ -> text value
44− Right num -> return num
47+ Right num -> num
48+
49+doSInumlist :: PandocMonad m => LP m Inlines
50+doSInumlist = do
51+ skipopts
52+ xs <- map tonum . T.splitOn ";" . untokenize <$> braced
53+ case xs of
54+ [] -> return mempty
55+ [x] -> return x
56+ _ -> return $
57+ mconcat (intersperse (str "," <> space) (init xs)) <>
58+ text ", & " <> last xs
45
59
46parseNum :: Parser Text () Inlines
60parseNum :: Parser Text () Inlines
47parseNum = mconcat <$> many parseNumPart
61parseNum = mconcat <$> many parseNumPart
@@ -78,14 +92,16 @@ doSIang = do
78 _ -> return mempty
92 _ -> return mempty
79
93
80-- converts e.g. \SIrange{100}{200}{\ms} to "100 ms--200 ms"
94-- converts e.g. \SIrange{100}{200}{\ms} to "100 ms--200 ms"
81−doSIrange :: PandocMonad m => LP m Inlines -> LP m Inlines
95+doSIrange :: PandocMonad m => Bool -> LP m Inlines -> LP m Inlines
82−doSIrange tok = do
96+doSIrange includeUnits tok = do
83 skipopts
97 skipopts
84 startvalue <- doSInum
98 startvalue <- doSInum
85 startvalueprefix <- option "" $ bracketed tok
99 startvalueprefix <- option "" $ bracketed tok
86 stopvalue <- doSInum
100 stopvalue <- doSInum
87 stopvalueprefix <- option "" $ bracketed tok
101 stopvalueprefix <- option "" $ bracketed tok
102+ unit <- if includeUnits
88− unit <- dosi tok
103+ then dosi tok
104+ else return mempty
89 return . mconcat $ [startvalueprefix,
105 return . mconcat $ [startvalueprefix,
90 emptyOr160 startvalueprefix,
106 emptyOr160 startvalueprefix,
91 startvalue,
107 startvalue,