@@ -1,6 +1,7 @@
1{-# LANGUAGE OverloadedStrings #-}
1{-# LANGUAGE OverloadedStrings #-}
2module Text.Pandoc.Readers.LaTeX.SIunitx
2module Text.Pandoc.Readers.LaTeX.SIunitx
4 , doSIrange
5 , doSIrange
@@ -17,13 +18,16 @@ import Data.Char (isDigit)
17import Data.Text (Text)
18import Data.Text (Text)
18import qualified Data.Text as T
19import qualified Data.Text as T
21+dosi :: PandocMonad m => LP m Inlines -> LP m Inlines
22+dosi tok = grouped (siUnit tok) <|> siUnit tok
20-- converts e.g. \SI{1}[\$]{} to "$ 1" or \SI{1}{\euro} to "1 €"
24-- converts e.g. \SI{1}[\$]{} to "$ 1" or \SI{1}{\euro} to "1 €"
21doSI :: PandocMonad m => LP m Inlines -> LP m Inlines
25doSI :: PandocMonad m => LP m Inlines -> LP m Inlines
22doSI tok = do
26doSI tok = do
24− value <- tok
28+ value <- doSInum
25 valueprefix <- option "" $ bracketed tok
29 valueprefix <- option "" $ bracketed tok
26− unit <- grouped (siUnit tok) <|> tok
30+ unit <- dosi tok
27 return . mconcat $ [valueprefix,
31 return . mconcat $ [valueprefix,
28 emptyOr160 valueprefix,
32 emptyOr160 valueprefix,
@@ -65,11 +69,11 @@ parseNumPart =
65doSIrange :: PandocMonad m => LP m Inlines -> LP m Inlines
69doSIrange :: PandocMonad m => LP m Inlines -> LP m Inlines
66doSIrange tok = do
70doSIrange tok = do
68− startvalue <- tok
72+ startvalue <- doSInum
69 startvalueprefix <- option "" $ bracketed tok
73 startvalueprefix <- option "" $ bracketed tok
70− stopvalue <- tok
74+ stopvalue <- doSInum
71 stopvalueprefix <- option "" $ bracketed tok
75 stopvalueprefix <- option "" $ bracketed tok
72− unit <- grouped (siUnit tok) <|> tok
76+ unit <- dosi tok
73 return . mconcat $ [startvalueprefix,
77 return . mconcat $ [startvalueprefix,
74 emptyOr160 startvalueprefix,
78 emptyOr160 startvalueprefix,
75 startvalue,
79 startvalue,
@@ -86,7 +90,7 @@ emptyOr160 :: Inlines -> Inlines
86emptyOr160 x = if x == mempty then x else str "\160"
90emptyOr160 x = if x == mempty then x else str "\160"
88siUnit :: PandocMonad m => LP m Inlines -> LP m Inlines
92siUnit :: PandocMonad m => LP m Inlines -> LP m Inlines
89−siUnit tok = do
93+siUnit tok = try (do
90 Tok _ (CtrlSeq name) _ <- anyControlSeq
94 Tok _ (CtrlSeq name) _ <- anyControlSeq
91 case name of
95 case name of
92 "square" -> do
96 "square" -> do
@@ -108,7 +112,17 @@ siUnit tok = do
108 , (il <> superscript "3") <$ controlSeq "cubed"
112 , (il <> superscript "3") <$ controlSeq "cubed"
109 , (\n -> il <> superscript n) <$> (controlSeq "tothe" *> tok)
113 , (\n -> il <> superscript n) <$> (controlSeq "tothe" *> tok)
111− Nothing -> tok
115+ Nothing -> fail "not an siunit unit command")
116+ <|> (lookAhead anyControlSeq >> tok)
117+ <|> (do Tok _ Word t <- satisfyTok isWordTok
119+ <|> (symbol '^' *> (superscript <$> tok))
120+ <|> (symbol '_' *> (subscript <$> tok))
121+ <|> ("\xa0" <$ symbol '.')
122+ <|> ("\xa0" <$ symbol '~')
124+ <|> (do Tok _ _ t <- anyTok
113siUnitMap :: M.Map Text Inlines
127siUnitMap :: M.Map Text Inlines
114siUnitMap = M.fromList
128siUnitMap = M.fromList