From 56e4ecab20613d86a6660547ed87e7ff4b80d632 Mon Sep 17 00:00:00 2001 From: mpickering Date: Thu, 25 Sep 2014 12:19:52 +0100 Subject: [PATCH 01/10] MediaBag: Fixes Windows specific path problems Changes the internal representation to fix the problem. I haven't tested this on windows. Closes #1597 --- src/Text/Pandoc/MediaBag.hs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Text/Pandoc/MediaBag.hs b/src/Text/Pandoc/MediaBag.hs index 5921b56cf..a55d5417e 100644 --- a/src/Text/Pandoc/MediaBag.hs +++ b/src/Text/Pandoc/MediaBag.hs @@ -51,7 +51,7 @@ import System.IO (stderr) -- mime types. Note that a 'MediaBag' is a Monoid, so 'mempty' -- can be used for an empty 'MediaBag', and '<>' can be used to append -- two 'MediaBag's. -newtype MediaBag = MediaBag (M.Map String (MimeType, BL.ByteString)) +newtype MediaBag = MediaBag (M.Map [String] (MimeType, BL.ByteString)) deriving (Monoid) instance Show MediaBag where @@ -65,7 +65,7 @@ insertMedia :: FilePath -- ^ relative path and canonical name of resource -> MediaBag -> MediaBag insertMedia fp mbMime contents (MediaBag mediamap) = - MediaBag (M.insert fp (mime, contents) mediamap) + MediaBag (M.insert (splitPath fp) (mime, contents) mediamap) where mime = fromMaybe fallback mbMime fallback = case takeExtension fp of ".gz" -> getMimeTypeDef $ dropExtension fp @@ -75,14 +75,14 @@ insertMedia fp mbMime contents (MediaBag mediamap) = lookupMedia :: FilePath -> MediaBag -> Maybe (MimeType, BL.ByteString) -lookupMedia fp (MediaBag mediamap) = M.lookup fp mediamap +lookupMedia fp (MediaBag mediamap) = M.lookup (splitPath fp) mediamap -- | Get a list of the file paths stored in a 'MediaBag', with -- their corresponding mime types and the lengths in bytes of the contents. mediaDirectory :: MediaBag -> [(String, MimeType, Int)] mediaDirectory (MediaBag mediamap) = M.foldWithKey (\fp (mime,contents) -> - ((fp, mime, fromIntegral $ BL.length contents):)) [] mediamap + (((joinPath fp), mime, fromIntegral $ BL.length contents):)) [] mediamap -- | Extract contents of MediaBag to a given directory. Print informational -- messages if 'verbose' is true. @@ -93,7 +93,7 @@ extractMediaBag :: Bool extractMediaBag verbose dir (MediaBag mediamap) = do sequence_ $ M.foldWithKey (\fp (_ ,contents) -> - ((writeMedia verbose dir (fp, contents)):)) [] mediamap + ((writeMedia verbose dir (joinPath fp, contents)):)) [] mediamap writeMedia :: Bool -> FilePath -> (FilePath, BL.ByteString) -> IO () writeMedia verbose dir (subpath, bs) = do From cc07d0c6bfac7081118d3cbf0baea197593adc11 Mon Sep 17 00:00:00 2001 From: mpickering Date: Thu, 25 Sep 2014 12:42:53 +0100 Subject: [PATCH 02/10] Shared: Make collapseFilePath OS-agnostic --- src/Text/Pandoc/Shared.hs | 14 +++++++++----- tests/Tests/Shared.hs | 37 +++++++++++++++++++------------------ 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/Text/Pandoc/Shared.hs b/src/Text/Pandoc/Shared.hs index 2d7c08718..6e1f84335 100644 --- a/src/Text/Pandoc/Shared.hs +++ b/src/Text/Pandoc/Shared.hs @@ -1,5 +1,6 @@ {-# LANGUAGE DeriveDataTypeable, CPP, MultiParamTypeClasses, - FlexibleContexts, ScopedTypeVariables, PatternGuards #-} + FlexibleContexts, ScopedTypeVariables, PatternGuards, + ViewPatterns #-} {- Copyright (C) 2006-2014 John MacFarlane @@ -106,7 +107,7 @@ import Network.URI ( escapeURIString, isURI, nonStrictRelativeTo, unEscapeString, parseURIReference, isAllowedInURI ) import qualified Data.Set as Set import System.Directory -import System.FilePath (joinPath, splitDirectories) +import System.FilePath (joinPath, splitDirectories, pathSeparator, isPathSeparator) import Text.Pandoc.MIME (MimeType, getMimeType) import System.FilePath ( (), takeExtension, dropExtension) import Data.Generics (Typeable, Data) @@ -871,11 +872,14 @@ collapseFilePath = joinPath . reverse . foldl go [] . splitDirectories go rs "." = rs go r@(p:rs) ".." = case p of ".." -> ("..":r) - "/" -> ("..":r) + (checkPathSeperator -> Just True) -> ("..":r) _ -> rs - go _ "/" = ["/"] + go _ (checkPathSeperator -> Just True) = [[pathSeparator]] go rs x = x:rs - + isSingleton [] = Nothing + isSingleton [x] = Just x + isSingleton _ = Nothing + checkPathSeperator = fmap isPathSeparator . isSingleton -- -- Safe read diff --git a/tests/Tests/Shared.hs b/tests/Tests/Shared.hs index b6671835c..9b55b7b1d 100644 --- a/tests/Tests/Shared.hs +++ b/tests/Tests/Shared.hs @@ -9,6 +9,7 @@ import Test.Framework.Providers.HUnit import Test.HUnit ( assertBool, (@?=) ) import Text.Pandoc.Builder import Data.Monoid +import System.FilePath (joinPath) tests :: [Test] tests = [ testGroup "normalize" @@ -40,21 +41,21 @@ p_normalize_no_trailing_spaces ils = null ils' || last ils' /= Space testCollapse :: [Test] testCollapse = map (testCase "collapse") - [ (collapseFilePath "" @?= "") - , (collapseFilePath "./foo" @?= "foo") - , (collapseFilePath "././../foo" @?= "../foo") - , (collapseFilePath "../foo" @?= "../foo") - , (collapseFilePath "/bar/../baz" @?= "/baz") - , (collapseFilePath "/../baz" @?= "/../baz") - , (collapseFilePath "./foo/.././bar/../././baz" @?= "baz") - , (collapseFilePath "./" @?= "") - , (collapseFilePath "././" @?= "") - , (collapseFilePath "../" @?= "..") - , (collapseFilePath ".././" @?= "..") - , (collapseFilePath "./../" @?= "..") - , (collapseFilePath "../../" @?= "../..") - , (collapseFilePath "parent/foo/baz/../bar" @?= "parent/foo/bar") - , (collapseFilePath "parent/foo/baz/../../bar" @?= "parent/bar") - , (collapseFilePath "parent/foo/.." @?= "parent") - , (collapseFilePath "/parent/foo/../../bar" @?= "/bar") - , (collapseFilePath "/./parent/foo" @?= "/parent/foo")] + [ (collapseFilePath (joinPath [ ""]) @?= (joinPath [ ""])) + , (collapseFilePath (joinPath [ ".","foo"]) @?= (joinPath [ "foo"])) + , (collapseFilePath (joinPath [ ".",".","..","foo"]) @?= (joinPath [ joinPath ["..", "foo"]])) + , (collapseFilePath (joinPath [ "..","foo"]) @?= (joinPath [ "..","foo"])) + , (collapseFilePath (joinPath [ "","bar","..","baz"]) @?= (joinPath [ "","baz"])) + , (collapseFilePath (joinPath [ "","..","baz"]) @?= (joinPath [ "","..","baz"])) + , (collapseFilePath (joinPath [ ".","foo","..",".","bar","..",".",".","baz"]) @?= (joinPath [ "baz"])) + , (collapseFilePath (joinPath [ ".",""]) @?= (joinPath [ ""])) + , (collapseFilePath (joinPath [ ".",".",""]) @?= (joinPath [ ""])) + , (collapseFilePath (joinPath [ "..",""]) @?= (joinPath [ ".."])) + , (collapseFilePath (joinPath [ "..",".",""]) @?= (joinPath [ ".."])) + , (collapseFilePath (joinPath [ ".","..",""]) @?= (joinPath [ ".."])) + , (collapseFilePath (joinPath [ "..","..",""]) @?= (joinPath [ "..",".."])) + , (collapseFilePath (joinPath [ "parent","foo","baz","..","bar"]) @?= (joinPath [ "parent","foo","bar"])) + , (collapseFilePath (joinPath [ "parent","foo","baz","..","..","bar"]) @?= (joinPath [ "parent","bar"])) + , (collapseFilePath (joinPath [ "parent","foo",".."]) @?= (joinPath [ "parent"])) + , (collapseFilePath (joinPath [ "","parent","foo","..","..","bar"]) @?= (joinPath [ "","bar"])) + , (collapseFilePath (joinPath [ "",".","parent","foo"]) @?= (joinPath [ "","parent","foo"]))] From c0b9ad4c5df0dd17612d0bd5d82b628a971afcff Mon Sep 17 00:00:00 2001 From: mpickering Date: Thu, 25 Sep 2014 13:33:25 +0100 Subject: [PATCH 03/10] EPUB Tests: Seperating image testing from other features --- tests/Tests/Readers/EPUB.hs | 5 +++-- tests/epub/features.epub | Bin 67495 -> 66370 bytes tests/epub/features.native | 38 +++++------------------------------- tests/epub/img.epub | Bin 0 -> 61768 bytes 4 files changed, 8 insertions(+), 35 deletions(-) create mode 100644 tests/epub/img.epub diff --git a/tests/Tests/Readers/EPUB.hs b/tests/Tests/Readers/EPUB.hs index f27ea979f..0d19a8400 100644 --- a/tests/Tests/Readers/EPUB.hs +++ b/tests/Tests/Readers/EPUB.hs @@ -8,6 +8,7 @@ import qualified Data.ByteString.Lazy as BL import Text.Pandoc.Readers.EPUB import Text.Pandoc.MediaBag (MediaBag, mediaDirectory) import Control.Applicative +import System.FilePath (joinPath) getMediaBag :: FilePath -> IO MediaBag getMediaBag fp = snd . readEPUB def <$> BL.readFile fp @@ -22,12 +23,12 @@ testMediaBag fp bag = do (actBag == bag) featuresBag :: [(String, String, Int)] -featuresBag = [("img/ElementaryMathExample.png","image/png",1331),("img/Maghreb1.png","image/png",2520),("img/check.gif","image/gif",1340),("img/check.jpg","image/jpeg",2661),("img/check.png","image/png",2815),("img/cichons_diagram.png","image/png",7045),("img/complex_number.png","image/png",5238),("img/multiscripts_and_greek_alphabet.png","image/png",10060)] +featuresBag = [(joinPath ["img","check.gif"],"image/gif",1340),(joinPath ["img","check.jpg"],"image/jpeg",2661),(joinPath ["img","check.png"],"image/png",2815),(joinPath ["img","multiscripts_and_greek_alphabet.png"],"image/png",10060)] tests :: [Test] tests = [ testGroup "EPUB Mediabag" [ testCase "features bag" - (testMediaBag "epub/features.epub" featuresBag) + (testMediaBag "epub/img.epub" featuresBag) ] ] diff --git a/tests/epub/features.epub b/tests/epub/features.epub index 8dcae384b89bc4f2e2044efbb79d20331c0bc23c..2690eec8b479caba30912dfad3752dc0aad5c7f8 100644 GIT binary patch delta 5933 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 XI~rs-xEJ$^27CI!L7+UW9R&Ix(%YE2 delta 6966 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 Bz6AgP diff --git a/tests/epub/features.native b/tests/epub/features.native index f01070383..6ccc04f43 100644 --- a/tests/epub/features.native +++ b/tests/epub/features.native @@ -1,5 +1,4 @@ -[Para [Image [] ("img/multiscripts_and_greek_alphabet.png","")] -,Para [Span ("front.xhtml",[],[]) []] +[Para [Span ("front.xhtml",[],[]) []] ,RawBlock (Format "html") "
" ,Header 1 ("",[],[]) [Str "Reflowable",Space,Str "EPUB",Space,Str "3",Space,Str "Conformance",Space,Str "Test",Space,Str "Document:",Space,Str "0100"] ,RawBlock (Format "html") "
" @@ -28,31 +27,6 @@ [[Plain [Str "@@@TODO",Space,Str "provide",Space,Str "info",Space,Str "on",Space,Str "where",Space,Str "to",Space,Str "get",Space,Str "the",Space,Str "results",Space,Str "form"]]])] ,RawBlock (Format "html") "
" ,RawBlock (Format "html") "
" -,Para [Span ("content-images-001.xhtml",[],[]) []] -,RawBlock (Format "html") "
" -,Header 2 ("content-images-001.xhtml#multimedia",[],[]) [Str "Multimedia"] -,RawBlock (Format "html") "
" -,Header 3 ("content-images-001.xhtml#images",[],[]) [Str "Images"] -,RawBlock (Format "html") "
" -,Header 4 ("",[],[]) [Span ("",["nature"],[]) [Str "[REQUIRED]"],Space,Span ("",["test-id"],[]) [Str "img-010"],Space,Str "GIF"] -,Para [Str "Tests",Space,Str "whether",Space,Str "the",Space,Str "GIF",Space,Str "image",Space,Str "format",Space,Str "is",Space,Str "supported."] -,Para [Image [Str "gif",Space,Str "test"] ("img/check.gif","")] -,Para [Str "If",Space,Str "a",Space,Str "checkmark",Space,Str "precedes",Space,Str "this",Space,Str "paragaph,",Space,Str "the",Space,Str "test",Space,Str "passes."] -,RawBlock (Format "html") "
" -,RawBlock (Format "html") "
" -,Header 4 ("",[],[]) [Span ("",["nature"],[]) [Str "[REQUIRED]"],Space,Span ("",["test-id"],[]) [Str "img-020"],Space,Str "PNG"] -,Para [Str "Tests",Space,Str "whether",Space,Str "the",Space,Str "PNG",Space,Str "image",Space,Str "format",Space,Str "is",Space,Str "supported."] -,Para [Image [Str "png",Space,Str "test"] ("img/check.png","")] -,Para [Str "If",Space,Str "a",Space,Str "checkmark",Space,Str "precedes",Space,Str "this",Space,Str "paragaph,",Space,Str "the",Space,Str "test",Space,Str "passes."] -,RawBlock (Format "html") "
" -,RawBlock (Format "html") "
" -,Header 4 ("",[],[]) [Span ("",["nature"],[]) [Str "[REQUIRED]"],Space,Span ("",["test-id"],[]) [Str "img-030"],Space,Str "JPEG"] -,Para [Str "Tests",Space,Str "whether",Space,Str "the",Space,Str "JPEG",Space,Str "image",Space,Str "format",Space,Str "is",Space,Str "supported."] -,Para [Image [Str "jpeg",Space,Str "test"] ("img/check.jpg","")] -,Para [Str "If",Space,Str "a",Space,Str "checkmark",Space,Str "precedes",Space,Str "this",Space,Str "paragaph,",Space,Str "the",Space,Str "test",Space,Str "passes."] -,RawBlock (Format "html") "
" -,RawBlock (Format "html") "
" -,RawBlock (Format "html") "
" ,Para [Span ("content-mathml-001.xhtml",[],[]) []] ,RawBlock (Format "html") "
" ,Header 2 ("content-mathml-001.xhtml#mathml",[],[]) [Str "MathML"] @@ -94,13 +68,13 @@ ,Header 2 ("",[],[]) [Span ("",["nature"],[]) [Str "[REQUIRED]"],Space,Span ("",["test-id"],[]) [Str "mathml-024"],Str "Horizontal",Space,Str "stretch,",Space,Code ("",[],[]) "mover",Str ",",Space,Code ("",[],[]) "munder",Str ",",Space,Str "and",Space,Code ("",[],[]) "mspace",Space,Str "elements"] ,Para [Str "Tests",Space,Str "whether",Space,Str "horizontal",Space,Str "stretch,",Space,Code ("",[],[]) "mover",Str ",",Space,Code ("",[],[]) "munder",Str ",",Space,Code ("",[],[]) "mspace",Space,Str "elements",Space,Str "are",Space,Str "supported."] ,Para [Math DisplayMath "c = \\overset{\\text{complex\\ number}}{\\overbrace{\\underset{\\text{real}}{\\underbrace{\\mspace{20mu} a\\mspace{20mu}}} + \\underset{\\text{imaginary}}{\\underbrace{\\quad b{\\mathbb{i}}\\quad}}}}"] -,Para [Str "The",Space,Str "test",Space,Str "passes",Space,Str "if",Space,Str "the",Space,Str "rendering",Space,Str "looks",Space,Str "like",Space,Image [Str "description",Space,Str "of",Space,Str "imaginary",Space,Str "number:",Space,Str "c",Space,Str "=",Space,Str "a",Space,Str "+bi",Space,Str "with",Space,Str "an",Space,Str "overbrace",Space,Str "reading",Space,Str "'complex",Space,Str "number'",Space,Str "and",Space,Str "underbraces",Space,Str "below",Space,Str "'a'",Space,Str "and",Space,Str "'b",Space,Str "i'",Space,Str "reading",Space,Str "'real'",Space,Str "and",Space,Str "'imaginary'",Space,Str "respectively."] ("img/complex_number.png",""),Str "."] +,Para [Str "The",Space,Str "test",Space,Str "passes",Space,Str "if",Space,Str "the",Space,Str "rendering",Space,Str "looks",Space,Str "like",Space,Str "."] ,RawBlock (Format "html") "
" ,RawBlock (Format "html") "
" ,Header 2 ("",[],[]) [Span ("",["nature"],[]) [Str "[REQUIRED]"],Space,Span ("",["test-id"],[]) [Str "mathml-025"],Str "Testing",Space,Code ("",[],[]) "mtable",Space,Str "with",Space,Code ("",[],[]) "colspan",Space,Str "and",Space,Code ("",[],[]) "rowspan",Space,Str "attributes,",Space,Str "Hebrew",Space,Str "and",Space,Str "Script",Space,Str "fonts"] ,Para [Str "Tests",Space,Str "whether",Space,Code ("",[],[]) "mtable",Space,Str "with",Space,Code ("",[],[]) "colspan",Space,Str "and",Space,Code ("",[],[]) "mspace",Space,Str "attributes",Space,Str "(colum",Space,Str "and",Space,Str "row",Space,Str "spanning)",Space,Str "are",Space,Str "supported;",Space,Str "uses",Space,Str "Hebrew",Space,Str "and",Space,Str "Script",Space,Str "alphabets."] ,Para [Math DisplayMath "\\begin{array}{llllllllll}\n & {\\operatorname{cov}\\left( \\mathcal{L} \\right)} & \\longrightarrow & {\\operatorname{non}\\left( \\mathcal{K} \\right)} & \\longrightarrow & {\\operatorname{cof}\\left( \\mathcal{K} \\right)} & \\longrightarrow & {\\operatorname{cof}\\left( \\mathcal{L} \\right)} & \\longrightarrow & 2^{\\aleph_{0}} \\\\\n & \\uparrow & & \\uparrow & & \\uparrow & & \\uparrow & & \\\\\n & {\\mathfrak{b}} & \\longrightarrow & {\\mathfrak{d}} & & & & & & \\\\\n & \\uparrow & & \\uparrow & & & & & & \\\\\n\\aleph_{1} & \\longrightarrow & {\\operatorname{add}\\left( \\mathcal{L} \\right)} & \\longrightarrow & {\\operatorname{add}\\left( \\mathcal{K} \\right)} & \\longrightarrow & {\\operatorname{cov}\\left( \\mathcal{K} \\right)} & \\longrightarrow & {\\operatorname{non}\\left( \\mathcal{L} \\right)} & \\\\\n\\end{array}"] -,Para [Str "The",Space,Str "test",Space,Str "passes",Space,Str "if",Space,Str "the",Space,Str "rendering",Space,Str "looks",Space,Str "like",Space,Link [Str "Cicho\324's",Space,Str "Diagram"] ("Cicho%C5%84's_diagram",""),Str ":",Space,Image [Str "rendering",Space,Str "of",Space,Str "Cicho\324's",Space,Str "diagram."] ("img/cichons_diagram.png",""),Str "."] +,Para [Str "The",Space,Str "test",Space,Str "passes",Space,Str "if",Space,Str "the",Space,Str "rendering",Space,Str "looks",Space,Str "like",Space,Link [Str "Cicho\324's",Space,Str "Diagram"] ("Cicho%C5%84's_diagram",""),Str ":",Space,Str "."] ,RawBlock (Format "html") "
" ,RawBlock (Format "html") "
" ,Header 2 ("",[],[]) [Span ("",["nature"],[]) [Str "[REQUIRED]"],Space,Span ("",["test-id"],[]) [Str "mathml-026"],Str "BiDi,",Space,Str "RTL",Space,Str "and",Space,Str "Arabic",Space,Str "alphabets"] @@ -111,7 +85,7 @@ ,RawBlock (Format "html") "
" ,Header 2 ("",[],[]) [Span ("",["nature"],[]) [Str "[REQUIRED]"],Space,Span ("",["test-id"],[]) [Str "mathml-027"],Str "Elementary",Space,Str "math:",Space,Str "long",Space,Str "division",Space,Str "notation"] ,Para [Str "Tests",Space,Str "whether",Space,Code ("",[],[]) "mlongdiv",Space,Str "elements",Space,Str "(from",Space,Str "elementary",Space,Str "math)",Space,Str "are",Space,Str "supported."] -,Para [Str "The",Space,Str "test",Space,Str "passes",Space,Str "if",Space,Str "the",Space,Str "rendering",Space,Str "looks",Space,Str "like",Space,Str "the",Space,Str "following",Space,Str "image:",Space,Image [Str "A",Space,Str "long",Space,Str "division",Space,Str "dividing",Space,Str "1306",Space,Str "by",Space,Str "3,",Space,Str "presented",Space,Str "in",Space,Str "'lefttop'",Space,Str "(US)",Space,Str "notation"] ("img/ElementaryMathExample.png",""),Str "."] +,Para [Str "The",Space,Str "test",Space,Str "passes",Space,Str "if",Space,Str "the",Space,Str "rendering",Space,Str "looks",Space,Str "like",Space,Str "the",Space,Str "following",Space,Str "image:",Space,Str "."] ,RawBlock (Format "html") "
" ,RawBlock (Format "html") "
" ,Para [Span ("content-switch-001.xhtml",[],[]) []] @@ -130,6 +104,4 @@ ,Para [Str "If",Space,Str "a",Space,Str "MathML",Space,Str "equation",Space,Str "is",Space,Str "rendered",Space,Str "before",Space,Str "this",Space,Str "paragraph,",Space,Str "the",Space,Str "test",Space,Str "passes."] ,Para [Str "If",Space,Str "test",Space,Code ("",[],[]) "switch-010",Space,Str "did",Space,Str "not",Space,Str "pass,",Space,Str "this",Space,Str "test",Space,Str "should",Space,Str "be",Space,Str "marked",Space,Code ("",[],[]) "Not Supported",Str "."] ,RawBlock (Format "html") "" -,RawBlock (Format "html") "" -,Para [Span ("Maghreb1.png",[],[]) []] -,Para [Image [] ("img/Maghreb1.png","")]] +,RawBlock (Format "html") ""] diff --git a/tests/epub/img.epub b/tests/epub/img.epub new file mode 100644 index 0000000000000000000000000000000000000000..ebe80d9350ac872fde4dbec179c2db9358392166 GIT binary patch literal 61768 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
    JltfIm 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š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 literal 0 HcmV?d00001 From 575c76e36bba6ab6dab5b6e68cffb66a1842d460 Mon Sep 17 00:00:00 2001 From: mpickering Date: Thu, 25 Sep 2014 15:28:50 +0100 Subject: [PATCH 04/10] HTML Writer: MathML now outputted with tex annotation. Closes #1635 --- src/Text/Pandoc/Writers/HTML.hs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Text/Pandoc/Writers/HTML.hs b/src/Text/Pandoc/Writers/HTML.hs index 9ead604d7..8106806cf 100644 --- a/src/Text/Pandoc/Writers/HTML.hs +++ b/src/Text/Pandoc/Writers/HTML.hs @@ -60,6 +60,8 @@ import qualified Text.Blaze.XHtml1.Transitional.Attributes as A import Text.Blaze.Renderer.String (renderHtml) import Text.TeXMath import Text.XML.Light.Output +import Text.XML.Light (unode, elChildren, add_attr, unqual) +import qualified Text.XML.Light as XML import System.FilePath (takeExtension) import Data.Monoid import Data.Aeson (Value) @@ -615,6 +617,18 @@ inlineListToHtml :: WriterOptions -> [Inline] -> State WriterState Html inlineListToHtml opts lst = mapM (inlineToHtml opts) lst >>= return . mconcat +-- | Annotates a MathML expression with the tex source +annotateMML :: XML.Element -> String -> XML.Element +annotateMML e tex = math (unode "semantics" [cs, unode "annotation" (annotAttrs, tex)]) + where + cs = case elChildren e of + [] -> unode "mrow" () + [x] -> x + xs -> unode "mrow" xs + math = add_attr (XML.Attr (unqual "xmlns") "http://www.w3.org/1998/Math/MathML") . unode "math" + annotAttrs = [XML.Attr (unqual "encoding") "application/x-tex"] + + -- | Convert Pandoc inline element to HTML. inlineToHtml :: WriterOptions -> Inline -> State WriterState Html inlineToHtml opts inline = @@ -706,7 +720,7 @@ inlineToHtml opts inline = defaultConfigPP case writeMathML dt <$> readTeX str of Right r -> return $ preEscapedString $ - ppcElement conf r + ppcElement conf (annotateMML r str) Left _ -> inlineListToHtml opts (texMathToInlines t str) >>= return . (H.span ! A.class_ "math") From 515a120d0425318d6c8b95c4d8f8d0b1a48193d2 Mon Sep 17 00:00:00 2001 From: mpickering Date: Thu, 25 Sep 2014 18:23:28 +0100 Subject: [PATCH 05/10] Add support for KaTeX HTML math Closes #1626 --- pandoc.hs | 35 ++++++++++++++++++++++++++++++--- src/Text/Pandoc/Options.hs | 1 + src/Text/Pandoc/Writers/HTML.hs | 19 ++++++++++++++++++ 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/pandoc.hs b/pandoc.hs index a9bea12c6..71d0c4b98 100644 --- a/pandoc.hs +++ b/pandoc.hs @@ -58,7 +58,7 @@ import qualified Control.Exception as E import Control.Exception.Extensible ( throwIO ) import qualified Text.Pandoc.UTF8 as UTF8 import Control.Monad (when, unless, (>=>)) -import Data.Maybe (isJust) +import Data.Maybe (isJust, fromMaybe) import Data.Foldable (foldrM) import Network.URI (parseURI, isURI, URI(..)) import qualified Data.ByteString.Lazy as B @@ -68,7 +68,7 @@ import qualified Data.Map as M import Data.Yaml (decode) import qualified Data.Yaml as Yaml import qualified Data.Text as T -import Control.Applicative ((<$>)) +import Control.Applicative ((<$>), (<|>)) import Text.Pandoc.Readers.Txt2Tags (getT2TMeta) import Data.Monoid @@ -205,6 +205,8 @@ data Opt = Opt , optExtractMedia :: Maybe FilePath -- ^ Path to extract embedded media , optTrace :: Bool -- ^ Print debug information , optTrackChanges :: TrackChanges -- ^ Accept or reject MS Word track-changes. + , optKaTeXStylesheet :: Maybe String -- ^ Path to stylesheet for KaTeX + , optKaTeXJS :: Maybe String -- ^ Path to js file for KaTeX } -- | Defaults for command-line options. @@ -263,6 +265,8 @@ defaultOpts = Opt , optExtractMedia = Nothing , optTrace = False , optTrackChanges = AcceptChanges + , optKaTeXStylesheet = Nothing + , optKaTeXJS = Nothing } -- | A list of functions, each transforming the options data structure @@ -818,6 +822,21 @@ options = return opt { optHTMLMathMethod = MathJax url'}) "URL") "" -- "Use MathJax for HTML math" + , Option "" ["katex"] + (OptArg + (\arg opt -> + return opt + { optKaTeXJS = + arg <|> Just "http://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.1.0/katex.min.js"}) + "URL") + "" -- Use KaTeX for HTML Math + + , Option "" ["katex-stylesheet"] + (ReqArg + (\arg opt -> + return opt { optKaTeXStylesheet = Just arg }) + "URL") + "" -- Set the KaTeX Stylesheet location , Option "" ["gladtex"] (NoArg @@ -860,6 +879,7 @@ options = ] + addMetadata :: String -> MetaValue -> M.Map String MetaValue -> M.Map String MetaValue addMetadata k v m = case M.lookup k m of @@ -1027,7 +1047,7 @@ main = do , optHighlight = highlight , optHighlightStyle = highlightStyle , optChapters = chapters - , optHTMLMathMethod = mathMethod + , optHTMLMathMethod = mathMethod' , optReferenceODT = referenceODT , optReferenceDocx = referenceDocx , optEpubStylesheet = epubStylesheet @@ -1056,6 +1076,8 @@ main = do , optExtractMedia = mbExtractMedia , optTrace = trace , optTrackChanges = trackChanges + , optKaTeXStylesheet = katexStylesheet + , optKaTeXJS = katexJS } = opts when dumpArgs $ @@ -1063,6 +1085,13 @@ main = do mapM_ (\arg -> UTF8.hPutStrLn stdout arg) args exitWith ExitSuccess + let csscdn = "http://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.1.0/katex.min.css" + let mathMethod = + case (katexJS, katexStylesheet) of + (Nothing, _) -> mathMethod' + (Just js, ss) -> KaTeX js (fromMaybe csscdn ss) + + -- --bibliography implies -F pandoc-citeproc for backwards compatibility: let needsCiteproc = isJust (M.lookup "bibliography" metadata) && optCiteMethod opts `notElem` [Natbib, Biblatex] && diff --git a/src/Text/Pandoc/Options.hs b/src/Text/Pandoc/Options.hs index 84ccbbdc9..ebfd8f8a9 100644 --- a/src/Text/Pandoc/Options.hs +++ b/src/Text/Pandoc/Options.hs @@ -251,6 +251,7 @@ data HTMLMathMethod = PlainMath | WebTeX String -- url of TeX->image script. | MathML (Maybe String) -- url of MathMLinHTML.js | MathJax String -- url of MathJax.js + | KaTeX String String -- url of stylesheet and katex.js deriving (Show, Read, Eq) data CiteMethod = Citeproc -- use citeproc to render them diff --git a/src/Text/Pandoc/Writers/HTML.hs b/src/Text/Pandoc/Writers/HTML.hs index 8106806cf..652fc979f 100644 --- a/src/Text/Pandoc/Writers/HTML.hs +++ b/src/Text/Pandoc/Writers/HTML.hs @@ -157,6 +157,10 @@ pandocToHtml opts (Pandoc meta blocks) = do H.script ! A.src (toValue url) ! A.type_ "text/javascript" $ mempty + KaTeX js css -> + (H.script ! A.src (toValue js) $ mempty) <> + (H.link ! A.rel "stylesheet" ! A.href (toValue css)) <> + (H.script ! A.type_ "text/javascript" $ toHtml renderKaTeX) _ -> case lookup "mathml-script" (writerVariables opts) of Just s | not (writerHtml5 opts) -> H.script ! A.type_ "text/javascript" @@ -728,6 +732,10 @@ inlineToHtml opts inline = case t of InlineMath -> "\\(" ++ str ++ "\\)" DisplayMath -> "\\[" ++ str ++ "\\]" + KaTeX _ _ -> return $ H.span ! A.class_ "math" $ + toHtml (case t of + InlineMath -> str + DisplayMath -> "\\displaystyle " ++ str) PlainMath -> do x <- inlineListToHtml opts (texMathToInlines t str) let m = H.span ! A.class_ "math" $ x @@ -829,3 +837,14 @@ blockListToNote opts ref blocks = Just EPUB3 -> noteItem ! customAttribute "epub:type" "footnote" _ -> noteItem return $ nl opts >> noteItem' + +-- Javascript snippet to render all KaTeX elements +renderKaTeX :: String +renderKaTeX = unlines [ + "window.onload = function(){var mathElements = document.getElementsByClassName(\"math\");" + , "for (var i=0; i < mathElements.length; i++)" + , "{" + , " var texText = mathElements[i].firstChild" + , " katex.render(texText.data, mathElements[i])" + , "}}" + ] From 85cff719f667b25131a3e150a5f438fd5be72475 Mon Sep 17 00:00:00 2001 From: mpickering Date: Thu, 25 Sep 2014 18:30:47 +0100 Subject: [PATCH 06/10] Updated README to include information about KaTeX switches --- README | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README b/README index 93fbde8ab..9baa9060a 100644 --- a/README +++ b/README @@ -710,6 +710,16 @@ Math rendering in HTML formulas to images. The formula will be concatenated with the URL provided. If *URL* is not specified, the Google Chart API will be used. +`--katex`[=*URL*] +: Use [KaTeX] to display embedded TeX math in HTML output. + The *URL* should point to the `katex.js` load script. If a *URL* is + not provided, a link to the KaTeX CDN will be inserted. + +`--katex-stylesheet=*URL*` +: The *URL* should point to the `katex.css` stylesheet. If this option is + not specified, a link to the KaTeX CDN will be inserted. Note that this + option does not imply `--katex`. + Options for wrapper scripts --------------------------- @@ -1652,7 +1662,7 @@ proportionally spaced fonts, as it does not require lining up columns. #### Extension: `table_captions` #### -A caption may optionally be provided with all 4 kinds of tables (as +A caption may optionally be provided with all 4 kinds of tables (as illustrated in the examples below). A caption is a paragraph beginning with the string `Table:` (or just `:`), which will be stripped off. It may appear either before or after the table. @@ -3177,3 +3187,4 @@ Rosenthal. [txt2tags]: http://txt2tags.org/ [EPUB]: http://idpf.org/epub [EPUBspine]: http://www.idpf.org/epub/301/spec/epub-publications.html#sec-spine-elem +[KaTeX]: https://github.com/Khan/KaTeX From 1f0ba8ec11763d6f6335e0355402c5f4570850e8 Mon Sep 17 00:00:00 2001 From: mpickering Date: Thu, 25 Sep 2014 18:46:36 +0100 Subject: [PATCH 07/10] HTML Writer: Don't double render when email-obfuscation=none Closes #1625 --- src/Text/Pandoc/Writers/HTML.hs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Text/Pandoc/Writers/HTML.hs b/src/Text/Pandoc/Writers/HTML.hs index 652fc979f..1a00c7660 100644 --- a/src/Text/Pandoc/Writers/HTML.hs +++ b/src/Text/Pandoc/Writers/HTML.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings, CPP #-} +{-# LANGUAGE OverloadedStrings, CPP, ViewPatterns #-} {-# OPTIONS_GHC -fno-warn-deprecations #-} {- Copyright (C) 2006-2014 John MacFarlane @@ -348,10 +348,10 @@ parseMailto s = do _ -> fail "not a mailto: URL" -- | Obfuscate a "mailto:" link. -obfuscateLink :: WriterOptions -> String -> String -> Html +obfuscateLink :: WriterOptions -> Html -> String -> Html obfuscateLink opts txt s | writerEmailObfuscation opts == NoObfuscation = - H.a ! A.href (toValue s) $ toHtml txt -obfuscateLink opts txt s = + H.a ! A.href (toValue s) $ txt +obfuscateLink opts (renderHtml -> txt) s = let meth = writerEmailObfuscation opts s' = map toLower (take 7 s) ++ drop 7 s in case parseMailto s' of @@ -753,7 +753,7 @@ inlineToHtml opts inline = | otherwise -> return mempty (Link txt (s,_)) | "mailto:" `isPrefixOf` s -> do linkText <- inlineListToHtml opts txt - return $ obfuscateLink opts (renderHtml linkText) s + return $ obfuscateLink opts linkText s (Link txt (s,tit)) -> do linkText <- inlineListToHtml opts txt let s' = case s of From 6740a9592a4cc20b501ea5c8d35c9fcb27203af0 Mon Sep 17 00:00:00 2001 From: mpickering Date: Thu, 25 Sep 2014 19:20:12 +0100 Subject: [PATCH 08/10] HTML Reader: Recognise
    tags inside
     blocks
    
    Closes #1620
    ---
     src/Text/Pandoc/Readers/HTML.hs | 7 ++++++-
     1 file changed, 6 insertions(+), 1 deletion(-)
    
    diff --git a/src/Text/Pandoc/Readers/HTML.hs b/src/Text/Pandoc/Readers/HTML.hs
    index 4ea5f41d5..4e0bb375a 100644
    --- a/src/Text/Pandoc/Readers/HTML.hs
    +++ b/src/Text/Pandoc/Readers/HTML.hs
    @@ -440,7 +440,7 @@ pCodeBlock :: TagParser Blocks
     pCodeBlock = try $ do
       TagOpen _ attr <- pSatisfy (~== TagOpen "pre" [])
       contents <- manyTill pAnyTag (pCloses "pre" <|> eof)
    -  let rawText = concatMap fromTagText $ filter isTagText contents
    +  let rawText = concatMap tagToString contents
       -- drop leading newline if any
       let result' = case rawText of
                          '\n':xs  -> xs
    @@ -451,6 +451,11 @@ pCodeBlock = try $ do
                         _        -> result'
       return $ B.codeBlockWith (mkAttr attr) result
     
    +tagToString :: Tag String -> String
    +tagToString (TagText s) = s
    +tagToString (TagOpen "br" _) = "\n"
    +tagToString _ = ""
    +
     inline :: TagParser Inlines
     inline = choice
                [ eNoteref
    
    From 5cb475c37491db4bdffebfd06e55984ff118c10b Mon Sep 17 00:00:00 2001
    From: Matthew Pickering 
    Date: Sat, 27 Sep 2014 22:37:54 +0100
    Subject: [PATCH 09/10] Org Reader: Parse multi-inline terms correctly in
     definition list
    
    Closes #1649
    ---
     src/Text/Pandoc/Readers/Org.hs | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/src/Text/Pandoc/Readers/Org.hs b/src/Text/Pandoc/Readers/Org.hs
    index b07f96846..5c00a1b27 100644
    --- a/src/Text/Pandoc/Readers/Org.hs
    +++ b/src/Text/Pandoc/Readers/Org.hs
    @@ -863,7 +863,7 @@ definitionListItem parseMarkerGetLength = try $ do
       line1 <- anyLineNewline
       blank <- option "" ("\n" <$ blankline)
       cont <- concat <$> many (listContinuation markerLength)
    -  term' <- parseFromString inline term
    +  term' <- parseFromString parseInlines term
       contents' <- parseFromString parseBlocks $ line1 ++ blank ++ cont
       return $ (,) <$> term' <*> fmap (:[]) contents'
     
    
    From fa2d11c9548dbbfb7354be29ceb894cc5d3ccdbf Mon Sep 17 00:00:00 2001
    From: Matthew Pickering 
    Date: Sat, 27 Sep 2014 22:38:58 +0100
    Subject: [PATCH 10/10] Update tests for #1649
    
    ---
     tests/Tests/Readers/Org.hs | 4 +++-
     1 file changed, 3 insertions(+), 1 deletion(-)
    
    diff --git a/tests/Tests/Readers/Org.hs b/tests/Tests/Readers/Org.hs
    index b9896e1b0..92ec8155b 100644
    --- a/tests/Tests/Readers/Org.hs
    +++ b/tests/Tests/Readers/Org.hs
    @@ -702,7 +702,9 @@ tests =
                                          ]
                                        ])
                              ]
    -
    +      , "Definition list with multi-word term" =:
    +        " - Elijah Wood :: He plays Frodo" =?>
    +         definitionList [ ("Elijah" <> space <> "Wood", [plain $ "He" <> space <> "plays" <> space <> "Frodo"])]
           , "Compact definition list" =:
               unlines [ "- ATP :: adenosine 5' triphosphate"
                       , "- DNA :: deoxyribonucleic acid"