diff options
Diffstat (limited to 'src/Text/Pandoc')
| -rw-r--r-- | src/Text/Pandoc/Biblio.hs | 216 | ||||
| -rw-r--r-- | src/Text/Pandoc/Options.hs | 7 | ||||
| -rw-r--r-- | src/Text/Pandoc/Readers/LaTeX.hs | 5 | ||||
| -rw-r--r-- | src/Text/Pandoc/Readers/Markdown.hs | 5 | ||||
| -rw-r--r-- | src/Text/Pandoc/Readers/TeXMath.hs | 84 | ||||
| -rw-r--r-- | src/Text/Pandoc/Writers/LaTeX.hs | 8 | 
6 files changed, 6 insertions, 319 deletions
| diff --git a/src/Text/Pandoc/Biblio.hs b/src/Text/Pandoc/Biblio.hs deleted file mode 100644 index 1c0975f11..000000000 --- a/src/Text/Pandoc/Biblio.hs +++ /dev/null @@ -1,216 +0,0 @@ -{-# LANGUAGE PatternGuards #-} -{- -Copyright (C) 2008 Andrea Rossato <andrea.rossato@ing.unitn.it> - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA --} - -{- | -   Module      : Text.Pandoc.Biblio -   Copyright   : Copyright (C) 2008-2010 Andrea Rossato -   License     : GNU GPL, version 2 or above - -   Maintainer  : Andrea Rossato <andrea.rossato@unitn.it> -   Stability   : alpha -   Portability : portable --} - -module Text.Pandoc.Biblio ( processBiblio ) where - -import Data.List -import Data.Char ( isDigit, isPunctuation ) -import qualified Data.Map as M -import Text.CSL hiding ( Cite(..), Citation(..), endWithPunct ) -import qualified Text.CSL as CSL ( Cite(..) ) -import Text.Pandoc.Definition -import Text.Pandoc.Generic -import Text.Pandoc.Walk -import Text.Pandoc.Shared (stringify) -import Text.Parsec hiding (State) -import Control.Monad -import Control.Monad.State - --- | Process a 'Pandoc' document by adding citations formatted --- according to a CSL style, using 'citeproc' from citeproc-hs. -processBiblio :: Maybe Style -> [Reference] -> Pandoc -> Pandoc -processBiblio Nothing _ p = p -processBiblio _      [] p = p -processBiblio (Just style) r p = -  let p'         = evalState (bottomUpM setHash p) 1 -      grps       = query getCitation p' -      result     = citeproc procOpts style r (setNearNote style $ -                      map (map toCslCite) grps) -      cits_map   = M.fromList $ zip grps (citations result) -      biblioList = map (renderPandoc' style) (bibliography result) -      Pandoc m b = bottomUp mvPunct . deNote . topDown (processCite style cits_map) $ p' -      (bs, lastb) = case reverse b of -                         x@(Header _ _ _) : xs -> (reverse xs, [x]) -                         _                     -> (b,  []) -  in  Pandoc m $ bs ++ [Div ("",["references"],[]) (lastb ++ biblioList)] - --- | Substitute 'Cite' elements with formatted citations. -processCite :: Style -> M.Map [Citation] [FormattedOutput] -> Inline -> Inline -processCite s cs (Cite t _) = -   case M.lookup t cs of -        Just (x:xs) -          | isTextualCitation t && not (null xs) -> -             let xs' = renderPandoc s xs -             in  if styleClass s == "note" -                    then Cite t (renderPandoc s [x] ++ [Note [Para xs']]) -                    else Cite t (renderPandoc s [x] ++ [Space | not (startWithPunct xs')] ++ xs') -          | otherwise -> if styleClass s == "note" -                            then Cite t [Note [Para $ renderPandoc s (x:xs)]] -                            else Cite t (renderPandoc s (x:xs)) -        _             -> Strong [Str "???"]  -- TODO raise error instead? -processCite _ _ x = x - -isNote :: Inline -> Bool -isNote (Note _) = True -isNote (Cite _ [Note _]) = True -isNote _ = False - -mvPunct :: [Inline] -> [Inline] -mvPunct (Space : Space : xs) = Space : xs -mvPunct (Space : x : ys) | isNote x, startWithPunct ys = -   Str (headInline ys) : x : tailFirstInlineStr ys -mvPunct (Space : x : ys) | isNote x = x : ys -mvPunct xs = xs - --- A replacement for citeproc-hs's endWithPunct, which wrongly treats --- a sentence ending in '.)' as not ending with punctuation, leading --- to an extra period. -endWithPunct :: [Inline] -> Bool -endWithPunct [] = True -endWithPunct xs@(_:_) = case reverse (stringify [last xs]) of -                              []                       -> True -                              (')':c:_) | isEndPunct c -> True -                              (c:_) | isEndPunct c     -> True -                                    | otherwise        -> False -  where isEndPunct c = c `elem` ".,;:!?" - -deNote :: Pandoc -> Pandoc -deNote = topDown go -  where go (Cite (c:cs) [Note xs]) = -            Cite (c:cs) [Note $ bottomUp go' $ sanitize c xs] -        go (Note xs) = Note $ bottomUp go' xs -        go x = x -        go' (Note [Para xs]:ys) = -             if startWithPunct ys && endWithPunct xs -                then initInline xs ++ ys -                else xs ++ ys -        go' xs = xs -        sanitize :: Citation -> [Block] -> [Block] -        sanitize Citation{citationPrefix = pref} [Para xs] = -           case (null pref, endWithPunct xs) of -                (True, False)  -> [Para $ xs ++ [Str "."]] -                (True, True)   -> [Para xs] -                (False, False) -> [Para $ toCapital $ xs ++ [Str "."]] -                (False, True)  -> [Para $ toCapital xs] -        sanitize _ bs = bs - -isTextualCitation :: [Citation] -> Bool -isTextualCitation (c:_) = citationMode c == AuthorInText -isTextualCitation _     = False - --- | Retrieve all citations from a 'Pandoc' docuument. To be used with --- 'query'. -getCitation :: Inline -> [[Citation]] -getCitation i | Cite t _ <- i = [t] -              | otherwise     = [] - -setHash :: Citation -> State Int Citation -setHash c = do -  ident <- get -  put $ ident + 1 -  return c{ citationHash = ident } - -toCslCite :: Citation -> CSL.Cite -toCslCite c -    = let (l, s)  = locatorWords $ citationSuffix c -          (la,lo) = parseLocator l -          s'      = case (l,s) of -                         -- treat a bare locator as if it begins with space -                         -- so @item1 [blah] is like [@item1, blah] -                         ("",(x:_)) -                           | not (isPunct x) -> [Space] ++ s -                         _                   -> s -          isPunct (Str (x:_)) = isPunctuation x -          isPunct _           = False -          citMode = case citationMode c of -                      AuthorInText   -> (True, False) -                      SuppressAuthor -> (False,True ) -                      NormalCitation -> (False,False) -      in   emptyCite { CSL.citeId         = citationId c -                     , CSL.citePrefix     = PandocText $ citationPrefix c -                     , CSL.citeSuffix     = PandocText s' -                     , CSL.citeLabel      = la -                     , CSL.citeLocator    = lo -                     , CSL.citeNoteNumber = show $ citationNoteNum c -                     , CSL.authorInText   = fst citMode -                     , CSL.suppressAuthor = snd citMode -                     , CSL.citeHash       = citationHash c -                     } - -locatorWords :: [Inline] -> (String, [Inline]) -locatorWords inp = -  case parse pLocatorWords "suffix" $ breakup inp of -       Right r   -> r -       Left _    -> ("",inp) -   where breakup [] = [] -         breakup (Str x : xs) = map Str (splitup x) ++ breakup xs -         breakup (x : xs) = x : breakup xs -         splitup = groupBy (\x y -> x /= '\160' && y /= '\160') - -pLocatorWords :: Parsec [Inline] st (String, [Inline]) -pLocatorWords = do -  l <- pLocator -  s <- getInput -- rest is suffix -  if length l > 0 && last l == ',' -     then return (init l, Str "," : s) -     else return (l, s) - -pMatch :: (Inline -> Bool) -> Parsec [Inline] st Inline -pMatch condition = try $ do -  t <- anyToken -  guard $ condition t -  return t - -pSpace :: Parsec [Inline] st Inline -pSpace = pMatch (\t -> t == Space || t == Str "\160") - -pLocator :: Parsec [Inline] st String -pLocator = try $ do -  optional $ pMatch (== Str ",") -  optional pSpace -  f  <- (guardFollowingDigit >> return [Str "p"]) -- "page" the default -     <|> many1 (notFollowedBy pSpace >> anyToken) -  gs <- many1 pWordWithDigits -  return $ stringify f ++ (' ' : unwords gs) - -guardFollowingDigit :: Parsec [Inline] st () -guardFollowingDigit = do -  t <- lookAhead anyToken -  case t of -       Str (d:_) | isDigit d -> return () -       _                     -> mzero - -pWordWithDigits :: Parsec [Inline] st String -pWordWithDigits = try $ do -  optional pSpace -  r <- many1 (notFollowedBy pSpace >> anyToken) -  let s = stringify r -  guard $ any isDigit s -  return s - diff --git a/src/Text/Pandoc/Options.hs b/src/Text/Pandoc/Options.hs index c7c37d6b8..48e418ab2 100644 --- a/src/Text/Pandoc/Options.hs +++ b/src/Text/Pandoc/Options.hs @@ -48,7 +48,6 @@ import Data.Set (Set)  import qualified Data.Set as Set  import Data.Default  import Text.Pandoc.Highlighting (Style, pygments) -import qualified Text.CSL as CSL  -- | Individually selectable syntax extensions.  data Extension = @@ -205,8 +204,6 @@ data ReaderOptions = ReaderOptions{         , readerOldDashes       :: Bool -- ^ Use pandoc <= 1.8.2.1 behavior                                         --   in parsing dashes; -- is em-dash;                                         --   - before numerial is en-dash -       , readerReferences      :: [CSL.Reference]  -- ^ Bibliographic references -       , readerCitationStyle   :: Maybe CSL.Style -- ^ Citation style         , readerApplyMacros     :: Bool -- ^ Apply macros to TeX math         , readerIndentedCodeClasses :: [String] -- ^ Default classes for                                         -- indented code blocks @@ -223,8 +220,6 @@ instance Default ReaderOptions                 , readerColumns               = 80                 , readerTabStop               = 4                 , readerOldDashes             = False -               , readerReferences            = [] -               , readerCitationStyle         = Nothing                 , readerApplyMacros           = True                 , readerIndentedCodeClasses   = []                 , readerDefaultImageExtension = "" @@ -289,7 +284,6 @@ data WriterOptions = WriterOptions    , writerSourceURL        :: Maybe String  -- ^ Absolute URL + directory of 1st source file    , writerUserDataDir      :: Maybe FilePath -- ^ Path of user data directory    , writerCiteMethod       :: CiteMethod -- ^ How to print cites -  , writerBiblioFiles      :: [FilePath] -- ^ Biblio files to use for citations    , writerHtml5            :: Bool       -- ^ Produce HTML5    , writerHtmlQTags        :: Bool       -- ^ Use @<q>@ tags for quotes in HTML    , writerBeamer           :: Bool       -- ^ Produce beamer LaTeX slide show @@ -332,7 +326,6 @@ instance Default WriterOptions where                        , writerSourceURL        = Nothing                        , writerUserDataDir      = Nothing                        , writerCiteMethod       = Citeproc -                      , writerBiblioFiles      = []                        , writerHtml5            = False                        , writerHtmlQTags        = False                        , writerBeamer           = False diff --git a/src/Text/Pandoc/Readers/LaTeX.hs b/src/Text/Pandoc/Readers/LaTeX.hs index b785a9852..9dbcd3644 100644 --- a/src/Text/Pandoc/Readers/LaTeX.hs +++ b/src/Text/Pandoc/Readers/LaTeX.hs @@ -38,7 +38,6 @@ import Text.Pandoc.Definition  import Text.Pandoc.Walk  import Text.Pandoc.Shared  import Text.Pandoc.Options -import Text.Pandoc.Biblio (processBiblio)  import Text.Pandoc.Parsing hiding ((<|>), many, optional, space)  import qualified Text.Pandoc.UTF8 as UTF8  import Data.Char ( chr, ord ) @@ -68,9 +67,7 @@ parseLaTeX = do    eof    st <- getState    let meta = stateMeta st -  refs <- getOption readerReferences -  mbsty <- getOption readerCitationStyle -  let (Pandoc _ bs') = processBiblio mbsty refs $ doc bs +  let (Pandoc _ bs') = doc bs    return $ Pandoc meta bs'  type LP = Parser [Char] ParserState diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs index 05662d9b5..658335202 100644 --- a/src/Text/Pandoc/Readers/Markdown.hs +++ b/src/Text/Pandoc/Readers/Markdown.hs @@ -54,7 +54,6 @@ import Text.Pandoc.Parsing hiding (tableWith)  import Text.Pandoc.Readers.LaTeX ( rawLaTeXInline, rawLaTeXBlock )  import Text.Pandoc.Readers.HTML ( htmlTag, htmlInBalanced, isInlineTag, isBlockTag,                                    isTextTag, isCommentTag ) -import Text.Pandoc.Biblio (processBiblio)  import Data.Monoid (mconcat, mempty)  import Control.Applicative ((<$>), (<*), (*>), (<$))  import Control.Monad @@ -327,9 +326,7 @@ parseMarkdown = do    st <- getState    let meta = runF (stateMeta' st) st    let Pandoc _ bs = B.doc $ runF blocks st -  mbsty <- getOption readerCitationStyle -  refs <- getOption readerReferences -  return $ processBiblio mbsty refs $ Pandoc meta bs +  return $ Pandoc meta bs  addWarning :: Maybe SourcePos -> String -> MarkdownParser ()  addWarning mbpos msg = diff --git a/src/Text/Pandoc/Readers/TeXMath.hs b/src/Text/Pandoc/Readers/TeXMath.hs index fe49a992e..1f7088f72 100644 --- a/src/Text/Pandoc/Readers/TeXMath.hs +++ b/src/Text/Pandoc/Readers/TeXMath.hs @@ -30,93 +30,13 @@ Conversion of TeX math to a list of 'Pandoc' inline elements.  module Text.Pandoc.Readers.TeXMath ( readTeXMath ) where  import Text.Pandoc.Definition -import Text.TeXMath.Types -import Text.TeXMath.Parser +import Text.TeXMath  -- | Converts a raw TeX math formula to a list of 'Pandoc' inlines.  -- Defaults to raw formula between @$@ characters if entire formula  -- can't be converted.  readTeXMath :: String    -- ^ String to parse (assumes @'\n'@ line endings)              -> [Inline] -readTeXMath inp = case texMathToPandoc inp of +readTeXMath inp = case texMathToPandoc DisplayInline inp of                          Left _    -> [Str ("$" ++ inp ++ "$")]                          Right res -> res - -texMathToPandoc :: String -> Either String [Inline] -texMathToPandoc inp = inp `seq` -  case parseFormula inp of -         Left err    -> Left err -         Right exps  -> case expsToInlines exps of -                             Nothing  -> Left "Formula too complex for [Inline]" -                             Just r   -> Right r - -expsToInlines :: [Exp] -> Maybe [Inline] -expsToInlines xs = do -  res <- mapM expToInlines xs -  return (concat res) - -expToInlines :: Exp -> Maybe [Inline] -expToInlines (ENumber s) = Just [Str s] -expToInlines (EIdentifier s) = Just [Emph [Str s]] -expToInlines (EMathOperator s) = Just [Str s] -expToInlines (ESymbol t s) = Just $ addSpace t (Str s) -  where addSpace Op x = [x, thinspace] -        addSpace Bin x = [medspace, x, medspace] -        addSpace Rel x = [widespace, x, widespace] -        addSpace Pun x = [x, thinspace] -        addSpace _ x = [x] -        thinspace = Str "\x2006" -        medspace  = Str "\x2005" -        widespace = Str "\x2004" -expToInlines (EStretchy x) = expToInlines x -expToInlines (EDelimited start end xs) = do -  xs' <- mapM expToInlines xs -  return $ [Str start] ++ concat xs' ++ [Str end] -expToInlines (EGrouped xs) = expsToInlines xs -expToInlines (ESpace "0.167em") = Just [Str "\x2009"] -expToInlines (ESpace "0.222em") = Just [Str "\x2005"] -expToInlines (ESpace "0.278em") = Just [Str "\x2004"] -expToInlines (ESpace "0.333em") = Just [Str "\x2004"] -expToInlines (ESpace "1em")     = Just [Str "\x2001"] -expToInlines (ESpace "2em")     = Just [Str "\x2001\x2001"] -expToInlines (ESpace _)         = Just [Str " "] -expToInlines (EBinary _ _ _) = Nothing -expToInlines (ESub x y) = do -  x' <- expToInlines x -  y' <- expToInlines y -  return $ x' ++ [Subscript y'] -expToInlines (ESuper x y) = do -  x' <- expToInlines x -  y' <- expToInlines y -  return $ x' ++ [Superscript y'] -expToInlines (ESubsup x y z) = do -  x' <- expToInlines x -  y' <- expToInlines y -  z' <- expToInlines z -  return $ x' ++ [Subscript y'] ++ [Superscript z'] -expToInlines (EDown x y) = expToInlines (ESub x y) -expToInlines (EUp x y) = expToInlines (ESuper x y) -expToInlines (EDownup x y z) = expToInlines (ESubsup x y z) -expToInlines (EText TextNormal x) = Just [Str x] -expToInlines (EText TextBold x) = Just [Strong [Str x]] -expToInlines (EText TextMonospace x) = Just [Code nullAttr x] -expToInlines (EText TextItalic x) = Just [Emph [Str x]] -expToInlines (EText _ x) = Just [Str x] -expToInlines (EOver (EGrouped [EIdentifier [c]]) (ESymbol Accent [accent])) = -    case accent of -         '\x203E' -> Just [Emph [Str [c,'\x0304']]]  -- bar -         '\x00B4' -> Just [Emph [Str [c,'\x0301']]]  -- acute -         '\x0060' -> Just [Emph [Str [c,'\x0300']]]  -- grave -         '\x02D8' -> Just [Emph [Str [c,'\x0306']]]  -- breve -         '\x02C7' -> Just [Emph [Str [c,'\x030C']]]  -- check -         '.'      -> Just [Emph [Str [c,'\x0307']]]  -- dot -         '\x00B0' -> Just [Emph [Str [c,'\x030A']]]  -- ring -         '\x20D7' -> Just [Emph [Str [c,'\x20D7']]]  -- arrow right -         '\x20D6' -> Just [Emph [Str [c,'\x20D6']]]  -- arrow left -         '\x005E' -> Just [Emph [Str [c,'\x0302']]]  -- hat -         '\x0302' -> Just [Emph [Str [c,'\x0302']]]  -- hat -         '~'      -> Just [Emph [Str [c,'\x0303']]]  -- tilde -         _        -> Nothing -expToInlines _ = Nothing - - diff --git a/src/Text/Pandoc/Writers/LaTeX.hs b/src/Text/Pandoc/Writers/LaTeX.hs index bf056001f..37ca60ce3 100644 --- a/src/Text/Pandoc/Writers/LaTeX.hs +++ b/src/Text/Pandoc/Writers/LaTeX.hs @@ -43,7 +43,6 @@ import Data.Char ( toLower, isPunctuation )  import Control.Applicative ((<|>))  import Control.Monad.State  import Text.Pandoc.Pretty -import System.FilePath (dropExtension)  import Text.Pandoc.Slides  import Text.Pandoc.Highlighting (highlight, styleToLaTeX,                                   formatLaTeXInline, formatLaTeXBlock, @@ -120,7 +119,6 @@ pandocToLaTeX options (Pandoc meta blocks) = do    (biblioTitle :: String) <- liftM (render colwidth) $ inlineListToLaTeX lastHeader    let main = render colwidth $ vsep body    st <- get -  let biblioFiles = intercalate "," $ map dropExtension $  writerBiblioFiles options    let context  =  defField "toc" (writerTableOfContents options) $                    defField "toc-depth" (show (writerTOCDepth options -                                                if writerChapters options @@ -152,11 +150,9 @@ pandocToLaTeX options (Pandoc meta blocks) = do                                  $ writerHighlightStyle options )                        else id) $                    (case writerCiteMethod options of -                         Natbib   -> defField "biblio-files" biblioFiles . -                                     defField "biblio-title" biblioTitle . +                         Natbib   -> defField "biblio-title" biblioTitle .                                       defField "natbib" True -                         Biblatex -> defField "biblio-files" biblioFiles . -                                     defField "biblio-title" biblioTitle . +                         Biblatex -> defField "biblio-title" biblioTitle .                                       defField "biblatex" True                           _        -> id) $                    metadata | 
