@@ -73,6 +73,10 @@ import Text.Pandoc.Writers.Shared (metaValueToInlines)
7373import qualified Data.Map as M
7474import qualified Data.Set as S
7575import Data.Maybe (maybeToList)
76+import Text.Pandoc.Highlighting
77+import qualified Data.Text as T
78+import Control.Applicative ((<|>))
79+import Skylighting
7680
7781data WriterEnv = WriterEnv { envMetadata :: Meta
7882 , envRunProps :: RunProps
@@ -280,6 +284,10 @@ data RunProps = RunProps { rPropBold :: Bool
280284 , rPropCode :: Bool
281285 , rPropBlockQuote :: Bool
282286 , rPropForceSize :: Maybe Pixels
287+ , rSolidFill :: Maybe Color
288+ -- TODO: Make a full underline data type with
289+ -- the different options.
290+ , rPropUnderline :: Bool
283291 } deriving (Show, Eq)
284292
285293instance Default RunProps where
@@ -292,6 +300,8 @@ instance Default RunProps where
292300 , rPropCode = False
293301 , rPropBlockQuote = False
294302 , rPropForceSize = Nothing
303+ , rSolidFill = Nothing
304+ , rPropUnderline = False
295305 }
296306
297307data PicProps = PicProps { picPropLink :: Maybe LinkTarget
@@ -391,8 +401,17 @@ blockToParagraphs (LineBlock ilsList) = do
391401 return [Paragraph pProps parElems]
392402-- TODO: work out the attributes
393403blockToParagraphs (CodeBlock attr str) =
394− local (\r -> r{envParaProps = def{pPropMarginLeft = Just 100}}) $
395− blockToParagraphs $ Para [Code attr str]
404+ local (\r -> r{ envParaProps = def{pPropMarginLeft = Just 100}
405+ , envRunProps = (envRunProps r){rPropCode = True}}) $ do
406+ mbSty <- writerHighlightStyle <$> asks envOpts
407+ synMap <- writerSyntaxMap <$> asks envOpts
408+ case mbSty of
409+ Just sty ->
410+ case highlight synMap (formatSourceLines sty) attr str of
411+ Right pElems -> do pProps <- asks envParaProps
412+ return $ [Paragraph pProps pElems]
413+ Left _ -> blockToParagraphs $ Para [Str str]
414+ Nothing -> blockToParagraphs $ Para [Str str]
396415-- We can't yet do incremental lists, but we should render a
397416-- (BlockQuote List) as a list to maintain compatibility with other
398417-- formats.
@@ -878,3 +897,29 @@ documentToPresentation opts (Pandoc meta blks) =
878897 docProps = metaToDocProps meta
879898 in
880899 (Presentation docProps presSlides, msgs)
900+
901+-- --------------------------------------------------------------
902+
903+applyTokStyToRunProps :: TokenStyle -> RunProps -> RunProps
904+applyTokStyToRunProps tokSty rProps =
905+ rProps{ rSolidFill = tokenColor tokSty <|> rSolidFill rProps
906+ , rPropBold = tokenBold tokSty || rPropBold rProps
907+ , rPropItalics = tokenItalic tokSty || rPropItalics rProps
908+ , rPropUnderline = tokenUnderline tokSty || rPropUnderline rProps
909+ }
910+
911+formatToken :: Style -> Token -> ParaElem
912+formatToken sty (tokType, txt) =
913+ let rProps = def{rPropCode = True, rSolidFill = defaultColor sty}
914+ rProps' = case M.lookup tokType (tokenStyles sty) of
915+ Just tokSty -> applyTokStyToRunProps tokSty rProps
916+ Nothing -> rProps
917+ in
918+ Run rProps' $ T.unpack txt
919+
920+formatSourceLine :: Style -> FormatOptions -> SourceLine -> [ParaElem]
921+formatSourceLine sty _ srcLn = map (formatToken sty) srcLn
922+
923+formatSourceLines :: Style -> FormatOptions -> [SourceLine] -> [ParaElem]
924+formatSourceLines sty opts srcLns = intercalate [Break] $
925+ map (formatSourceLine sty opts) srcLns