git.iko.soy/typeable/pandoc
on master help sign in
Add T.P.Readers.LaTeX.Include.
commit022d89b8f8054472103bf031c90ae44b36a52d72 authorJohn MacFarlane <jgm@berkeley.edu> dateWed 3 Mar 2021, 18:47 (6 years ago) parent5a73fe2
4 files changed+87−52
pandoc.cabal+1 src/Text/Pandoc/Readers/LaTeX.hs+7−50 src/Text/Pandoc/Readers/LaTeX/Include.hs+66 src/Text/Pandoc/Readers/LaTeX/Inline.hs+13−2
pandoc.cabal+1
@@ -626,6 +626,7 @@ library
626626 Text.Pandoc.Readers.HTML.Table,
627627 Text.Pandoc.Readers.HTML.TagCategories,
628628 Text.Pandoc.Readers.HTML.Types,
629+ Text.Pandoc.Readers.LaTeX.Include,
629630 Text.Pandoc.Readers.LaTeX.Inline,
630631 Text.Pandoc.Readers.LaTeX.Citation,
631632 Text.Pandoc.Readers.LaTeX.Lang,
src/Text/Pandoc/Readers/LaTeX.hs+7−50
@@ -38,9 +38,8 @@ import Text.Pandoc.BCP47 (renderLang)
3838import Text.Pandoc.Builder as B
3939import Text.Pandoc.Class.PandocPure (PandocPure)
4040import Text.Pandoc.Class.PandocMonad (PandocMonad (..), getResourcePath,
41− readFileFromDirs, report,
42− setResourcePath)
43−import Text.Pandoc.Error (PandocError (PandocParseError, PandocParsecError))
41+ report, setResourcePath)
42+import Text.Pandoc.Error (PandocError (PandocParsecError))
4443import Text.Pandoc.Highlighting (languagesByExtension)
4544import Text.Pandoc.ImageSize (numUnit, showFl)
4645import Text.Pandoc.Logging
@@ -61,6 +60,8 @@ import Text.Pandoc.Readers.LaTeX.Lang (inlineLanguageCommands,
6160 enquoteCommands,
6261 babelLangToBCP47, setDefaultLanguage)
6362import Text.Pandoc.Readers.LaTeX.SIunitx (siunitxCommands)
63+import Text.Pandoc.Readers.LaTeX.Include (insertIncluded,
64+ readFileFromTexinputs)
6465import Text.Pandoc.Readers.LaTeX.Inline (acronymCommands, refCommands,
6566 nameCommands, charCommands,
6667 accentCommands,
@@ -235,19 +236,10 @@ mkImage options (T.unpack -> src) = do
235236 _ -> return src
236237 return $ imageWith attr (T.pack src') "" alt
237238
238−doxspace :: PandocMonad m => LP m Inlines
239−doxspace =
240− (space <$ lookAhead (satisfyTok startsWithLetter)) <|> return mempty
241− where startsWithLetter (Tok _ Word t) =
242− case T.uncons t of
243− Just (c, _) | isLetter c -> True
244− _ -> False
245− startsWithLetter _ = False
246−
247239
248240removeDoubleQuotes :: Text -> Text
249241removeDoubleQuotes t =
250− Data.Maybe.fromMaybe t $ T.stripPrefix "\"" t >>= T.stripSuffix "\""
242+ fromMaybe t $ T.stripPrefix "\"" t >>= T.stripSuffix "\""
251243
252244doubleQuote :: PandocMonad m => LP m Inlines
253245doubleQuote =
@@ -406,8 +398,8 @@ inlineCommands = M.unions
406398 link (unescapeURL $ untokenize url) "" <$> tok)
407399 , ("includegraphics", do options <- option [] keyvals
408400 src <- braced
409− mkImage options . unescapeURL . removeDoubleQuotes $
410− untokenize src)
401+ mkImage options . unescapeURL .
402+ removeDoubleQuotes $ untokenize src)
411403 , ("hyperlink", hyperlink)
412404 , ("hypertarget", hypertargetInline)
413405 -- hyphenat
@@ -417,8 +409,6 @@ inlineCommands = M.unions
417409 -- LaTeX colors
418410 , ("textcolor", coloredInline "color")
419411 , ("colorbox", coloredInline "background-color")
420− -- xspace
421− , ("xspace", doxspace)
422412 -- etoolbox
423413 , ("ifstrequal", ifstrequal)
424414 , ("newtoggle", braced >>= newToggle)
@@ -698,39 +688,6 @@ include name = do
698688 mapM_ (insertIncluded defaultExt) fs
699689 return mempty
700690
701−readFileFromTexinputs :: PandocMonad m => FilePath -> LP m (Maybe Text)
702−readFileFromTexinputs fp = do
703− fileContentsMap <- sFileContents <$> getState
704− case M.lookup (T.pack fp) fileContentsMap of
705− Just t -> return (Just t)
706− Nothing -> do
707− dirs <- map T.unpack . splitTextBy (==':') . fromMaybe "."
708− <$> lookupEnv "TEXINPUTS"
709− readFileFromDirs dirs fp
710−
711−insertIncluded :: PandocMonad m
712− => FilePath
713− -> FilePath
714− -> LP m ()
715−insertIncluded defaultExtension f' = do
716− let f = case takeExtension f' of
717− ".tex" -> f'
718− ".sty" -> f'
719− _ -> addExtension f' defaultExtension
720− pos <- getPosition
721− containers <- getIncludeFiles <$> getState
722− when (T.pack f `elem` containers) $
723− throwError $ PandocParseError $ T.pack $ "Include file loop at " ++ show pos
724− updateState $ addIncludeFile $ T.pack f
725− mbcontents <- readFileFromTexinputs f
726− contents <- case mbcontents of
727− Just s -> return s
728− Nothing -> do
729− report $ CouldNotLoadIncludeFile (T.pack f) pos
730− return ""
731− getInput >>= setInput . (tokenize f contents ++)
732− updateState dropLatestIncludeFile
733−
734691authors :: PandocMonad m => LP m ()
735692authors = try $ do
736693 bgroup
src/Text/Pandoc/Readers/LaTeX/Include.hsnew file+66
@@ -0,0 +1,66 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+{- |
3+ Module : Text.Pandoc.Readers.LaTeX.Include
4+ Copyright : Copyright (C) 2006-2021 John MacFarlane
5+ License : GNU GPL, version 2 or above
6+
7+ Maintainer : John MacFarlane <jgm@berkeley.edu>
8+ Stability : alpha
9+ Portability : portable
10+-}
11+module Text.Pandoc.Readers.LaTeX.Include
12+ ( readFileFromTexinputs
13+ , insertIncluded
14+ )
15+where
16+
17+import qualified Data.Map as M
18+import Data.Text (Text)
19+import qualified Data.Text as T
20+import Text.Pandoc.Shared (splitTextBy)
21+import System.FilePath (takeExtension, addExtension)
22+import Control.Monad (when)
23+import Control.Monad.Except (throwError)
24+import Text.Pandoc.Error (PandocError(PandocParseError))
25+import Text.Pandoc.Logging (LogMessage(CouldNotLoadIncludeFile))
26+import Text.Pandoc.Class (PandocMonad (..), readFileFromDirs, report)
27+import Text.Pandoc.Readers.LaTeX.Parsing
28+import Text.Pandoc.Parsing (updateState, getState, getInput, setInput,
29+ getPosition, addIncludeFile, getIncludeFiles,
30+ dropLatestIncludeFile)
31+import Data.Maybe (fromMaybe)
32+
33+readFileFromTexinputs :: PandocMonad m => FilePath -> LP m (Maybe Text)
34+readFileFromTexinputs fp = do
35+ fileContentsMap <- sFileContents <$> getState
36+ case M.lookup (T.pack fp) fileContentsMap of
37+ Just t -> return (Just t)
38+ Nothing -> do
39+ dirs <- map T.unpack . splitTextBy (==':') . fromMaybe "."
40+ <$> lookupEnv "TEXINPUTS"
41+ readFileFromDirs dirs fp
42+
43+insertIncluded :: PandocMonad m
44+ => FilePath
45+ -> FilePath
46+ -> LP m ()
47+insertIncluded defaultExtension f' = do
48+ let f = case takeExtension f' of
49+ ".tex" -> f'
50+ ".sty" -> f'
51+ _ -> addExtension f' defaultExtension
52+ pos <- getPosition
53+ containers <- getIncludeFiles <$> getState
54+ when (T.pack f `elem` containers) $
55+ throwError $ PandocParseError $ T.pack $ "Include file loop at " ++ show pos
56+ updateState $ addIncludeFile $ T.pack f
57+ mbcontents <- readFileFromTexinputs f
58+ contents <- case mbcontents of
59+ Just s -> return s
60+ Nothing -> do
61+ report $ CouldNotLoadIncludeFile (T.pack f) pos
62+ return ""
63+ getInput >>= setInput . (tokenize f contents ++)
64+ updateState dropLatestIncludeFile
65+
66+
src/Text/Pandoc/Readers/LaTeX/Inline.hs+13−2
@@ -35,8 +35,8 @@ import Text.Pandoc.Readers.LaTeX.Parsing
3535import Text.Pandoc.Extensions (extensionEnabled, Extension(..))
3636import Text.Pandoc.Parsing (getOption, updateState, getState, notFollowedBy,
3737 manyTill, getInput, setInput, incSourceColumn,
38− option, many1, try)
39−import Data.Char (isDigit)
38+ option, many1, try, lookAhead)
39+import Data.Char (isDigit, isLetter)
4040import Text.Pandoc.Highlighting (fromListingsLanguage,)
4141import Data.Maybe (maybeToList, fromMaybe)
4242import Text.Pandoc.Options (ReaderOptions(..))
@@ -50,6 +50,15 @@ rawInlineOr name' fallback = do
5050 then rawInline "latex" <$> getRawCommand name' ("\\" <> name')
5151 else fallback
5252
53+doxspace :: PandocMonad m => LP m Inlines
54+doxspace =
55+ (space <$ lookAhead (satisfyTok startsWithLetter)) <|> return mempty
56+ where startsWithLetter (Tok _ Word t) =
57+ case T.uncons t of
58+ Just (c, _) | isLetter c -> True
59+ _ -> False
60+ startsWithLetter _ = False
61+
5362dolabel :: PandocMonad m => LP m Inlines
5463dolabel = do
5564 v <- braced
@@ -280,6 +289,8 @@ charCommands = M.fromList
280289 , ("dothyp", lit ".\173")
281290 , ("colonhyp", lit ":\173")
282291 , ("hyp", lit "-")
292+ -- xspace
293+ , ("xspace", doxspace)
283294 ]
284295
285296biblatexInlineCommands :: PandocMonad m