git.iko.soy/typeable/pandoc
on master help sign in
Shared: Provide custom isURI that rejects unknown schemes [isURI]
5debb0dAlbert Krewinkel
src/Text/Pandoc/App.hs+2−2
@@ -57,7 +57,7 @@ import Data.Maybe (fromMaybe, isJust, isNothing)
57import qualified Data.Text as T
57import qualified Data.Text as T
58import Data.Yaml (decode)
58import Data.Yaml (decode)
59import qualified Data.Yaml as Yaml
59import qualified Data.Yaml as Yaml
60−import Network.URI (URI (..), isURI, parseURI)
60+import Network.URI (URI (..), parseURI)
61import Paths_pandoc (getDataDir)
61import Paths_pandoc (getDataDir)
62import Skylighting (Style, Syntax (..), defaultSyntaxMap, parseTheme)
62import Skylighting (Style, Syntax (..), defaultSyntaxMap, parseTheme)
63import Skylighting.Parser (missingIncludes, parseSyntaxDefinition,
63import Skylighting.Parser (missingIncludes, parseSyntaxDefinition,
@@ -80,7 +80,7 @@ import Text.Pandoc.Lua ( runLuaFilter )
80import Text.Pandoc.PDF (makePDF)
80import Text.Pandoc.PDF (makePDF)
81import Text.Pandoc.Process (pipeProcess)
81import Text.Pandoc.Process (pipeProcess)
82import Text.Pandoc.SelfContained (makeSelfContained, makeDataURI)
82import Text.Pandoc.SelfContained (makeSelfContained, makeDataURI)
83−import Text.Pandoc.Shared (headerShift, openURL, readDataFile,
83+import Text.Pandoc.Shared (isURI, headerShift, openURL, readDataFile,
84 readDataFileUTF8, safeRead, tabFilter)
84 readDataFileUTF8, safeRead, tabFilter)
85import qualified Text.Pandoc.UTF8 as UTF8
85import qualified Text.Pandoc.UTF8 as UTF8
86import Text.Pandoc.XML (toEntities)
86import Text.Pandoc.XML (toEntities)
src/Text/Pandoc/Parsing.hs+1−26
@@ -465,33 +465,8 @@ emailAddress = try $ toResult <$> mailbox <*> (char '@' *> domain)
465 sepby1 p sep = (:) <$> p <*> (many (try $ sep >> p))
465 sepby1 p sep = (:) <$> p <*> (many (try $ sep >> p))
466
466
467
467
468−-- Schemes from http://www.iana.org/assignments/uri-schemes.html plus
469−-- the unofficial schemes coap, doi, javascript, isbn, pmid
470−schemes :: [String]
471−schemes = ["coap","doi","javascript","aaa","aaas","about","acap","cap","cid",
472− "crid","data","dav","dict","dns","file","ftp","geo","go","gopher",
473− "h323","http","https","iax","icap","im","imap","info","ipp","iris",
474− "iris.beep","iris.xpc","iris.xpcs","iris.lwz","ldap","mailto","mid",
475− "msrp","msrps","mtqp","mupdate","news","nfs","ni","nih","nntp",
476− "opaquelocktoken","pop","pres","rtsp","service","session","shttp","sieve",
477− "sip","sips","sms","snmp","soap.beep","soap.beeps","tag","tel","telnet",
478− "tftp","thismessage","tn3270","tip","tv","urn","vemmi","ws","wss","xcon",
479− "xcon-userid","xmlrpc.beep","xmlrpc.beeps","xmpp","z39.50r","z39.50s",
480− "adiumxtra","afp","afs","aim","apt","attachment","aw","beshare","bitcoin",
481− "bolo","callto","chrome","chrome-extension","com-eventbrite-attendee",
482− "content", "cvs","dlna-playsingle","dlna-playcontainer","dtn","dvb",
483− "ed2k","facetime","feed","finger","fish","gg","git","gizmoproject",
484− "gtalk","hcp","icon","ipn","irc","irc6","ircs","itms","jar","jms",
485− "keyparc","lastfm","ldaps","magnet","maps","market","message","mms",
486− "ms-help","msnim","mumble","mvn","notes","oid","palm","paparazzi",
487− "platform","proxy","psyc","query","res","resource","rmi","rsync",
488− "rtmp","secondlife","sftp","sgn","skype","smb","soldat","spotify",
489− "ssh","steam","svn","teamspeak","things","udp","unreal","ut2004",
490− "ventrilo","view-source","webcal","wtai","wyciwyg","xfire","xri",
491− "ymsgr", "isbn", "pmid"]
492−
493uriScheme :: Stream s m Char => ParserT s st m String
468uriScheme :: Stream s m Char => ParserT s st m String
494−uriScheme = oneOfStringsCI schemes
469+uriScheme = oneOfStringsCI (Set.toList schemes)
495
470
496-- | Parses a URI. Returns pair of original and URI-escaped version.
471-- | Parses a URI. Returns pair of original and URI-escaped version.
497uri :: Stream [Char] m Char => ParserT [Char] st m (String, String)
472uri :: Stream [Char] m Char => ParserT [Char] st m (String, String)
src/Text/Pandoc/Readers/Txt2Tags.hs−1
@@ -42,7 +42,6 @@ import Text.Pandoc.Definition
42import Text.Pandoc.Options
42import Text.Pandoc.Options
43import Text.Pandoc.Parsing hiding (macro, space, spaces, uri)
43import Text.Pandoc.Parsing hiding (macro, space, spaces, uri)
44import Text.Pandoc.Shared (compactify, compactifyDL, escapeURI)
44import Text.Pandoc.Shared (compactify, compactifyDL, escapeURI)
45−--import Network.URI (isURI) -- Not sure whether to use this function
46import Control.Monad (guard, void, when)
45import Control.Monad (guard, void, when)
47import Control.Monad.Reader (Reader, asks, runReader)
46import Control.Monad.Reader (Reader, asks, runReader)
48import Data.Default
47import Data.Default
src/Text/Pandoc/SelfContained.hs+2−2
@@ -42,7 +42,7 @@ import qualified Data.ByteString.Char8 as B
42import qualified Data.ByteString.Lazy as L
42import qualified Data.ByteString.Lazy as L
43import Data.Char (isAlphaNum, isAscii, toLower)
43import Data.Char (isAlphaNum, isAscii, toLower)
44import Data.List (isPrefixOf)
44import Data.List (isPrefixOf)
45−import Network.URI (URI (..), escapeURIString, isURI, parseURI)
45+import Network.URI (URI (..), escapeURIString, parseURI)
46import System.FilePath (takeDirectory, takeExtension, (</>))
46import System.FilePath (takeDirectory, takeExtension, (</>))
47import Text.HTML.TagSoup
47import Text.HTML.TagSoup
48import Text.Pandoc.Class (PandocMonad (..), fetchItem, report)
48import Text.Pandoc.Class (PandocMonad (..), fetchItem, report)
@@ -50,7 +50,7 @@ import Text.Pandoc.Error
50import Text.Pandoc.Logging
50import Text.Pandoc.Logging
51import Text.Pandoc.MIME (MimeType)
51import Text.Pandoc.MIME (MimeType)
52import Text.Pandoc.Options (WriterOptions (..))
52import Text.Pandoc.Options (WriterOptions (..))
53−import Text.Pandoc.Shared (renderTags', trim)
53+import Text.Pandoc.Shared (isURI, renderTags', trim)
54import Text.Pandoc.UTF8 (toString)
54import Text.Pandoc.UTF8 (toString)
55import Text.Parsec (ParsecT, runParserT)
55import Text.Parsec (ParsecT, runParserT)
56import qualified Text.Parsec as P
56import qualified Text.Parsec as P
src/Text/Pandoc/Shared.hs+68−1
@@ -81,6 +81,9 @@ module Text.Pandoc.Shared (
81 openURL,
81 openURL,
82 collapseFilePath,
82 collapseFilePath,
83 filteredFilesFromArchive,
83 filteredFilesFromArchive,
84+ -- * URI handling
85+ schemes,
86+ isURI,
84 -- * Error handling
87 -- * Error handling
85 mapLeft,
88 mapLeft,
86 -- * for squashing blocks
89 -- * for squashing blocks
@@ -104,7 +107,7 @@ import Data.List ( find, stripPrefix, intercalate )
104import Data.Maybe (mapMaybe)
107import Data.Maybe (mapMaybe)
105import Data.Version ( showVersion )
108import Data.Version ( showVersion )
106import qualified Data.Map as M
109import qualified Data.Map as M
107−import Network.URI ( escapeURIString, unEscapeString )
110+import Network.URI ( URI(uriScheme), escapeURIString, unEscapeString, parseURI )
108import qualified Data.Set as Set
111import qualified Data.Set as Set
109import System.Directory
112import System.Directory
110import System.FilePath (splitDirectories, isPathSeparator)
113import System.FilePath (splitDirectories, isPathSeparator)
@@ -774,6 +777,70 @@ filteredFilesFromArchive zf f =
774 fileAndBinary :: Archive -> FilePath -> Maybe (FilePath, BL.ByteString)
777 fileAndBinary :: Archive -> FilePath -> Maybe (FilePath, BL.ByteString)
775 fileAndBinary a fp = findEntryByPath fp a >>= \e -> Just (fp, fromEntry e)
778 fileAndBinary a fp = findEntryByPath fp a >>= \e -> Just (fp, fromEntry e)
776
779
780+
781+--
782+-- IANA URIs
783+--
784+
785+-- | Schemes from http://www.iana.org/assignments/uri-schemes.html plus
786+-- the unofficial schemes doi, javascript, isbn, pmid.
787+schemes :: Set.Set String
788+schemes = Set.fromList
789+ -- Official IANA schemes
790+ [ "aaa", "aaas", "about", "acap", "acct", "acr", "adiumxtra", "afp", "afs"
791+ , "aim", "appdata", "apt", "attachment", "aw", "barion", "beshare", "bitcoin"
792+ , "blob", "bolo", "browserext", "callto", "cap", "chrome", "chrome-extension"
793+ , "cid", "coap", "coaps", "com-eventbrite-attendee", "content", "crid", "cvs"
794+ , "data", "dav", "dict", "dis", "dlna-playcontainer", "dlna-playsingle"
795+ , "dns", "dntp", "dtn", "dvb", "ed2k", "example", "facetime", "fax", "feed"
796+ , "feedready", "file", "filesystem", "finger", "fish", "ftp", "geo", "gg"
797+ , "git", "gizmoproject", "go", "gopher", "graph", "gtalk", "h323", "ham"
798+ , "hcp", "http", "https", "hxxp", "hxxps", "hydrazone", "iax", "icap", "icon"
799+ , "im", "imap", "info", "iotdisco", "ipn", "ipp", "ipps", "irc", "irc6"
800+ , "ircs", "iris", "iris.beep", "iris.lwz", "iris.xpc", "iris.xpcs"
801+ , "isostore", "itms", "jabber", "jar", "jms", "keyparc", "lastfm", "ldap"
802+ , "ldaps", "lvlt", "magnet", "mailserver", "mailto", "maps", "market"
803+ , "message", "mid", "mms", "modem", "mongodb", "moz", "ms-access"
804+ , "ms-browser-extension", "ms-drive-to", "ms-enrollment", "ms-excel"
805+ , "ms-gamebarservices", "ms-getoffice", "ms-help", "ms-infopath"
806+ , "ms-media-stream-id", "ms-officeapp", "ms-project", "ms-powerpoint"
807+ , "ms-publisher", "ms-search-repair", "ms-secondary-screen-controller"
808+ , "ms-secondary-screen-setup", "ms-settings", "ms-settings-airplanemode"
809+ , "ms-settings-bluetooth", "ms-settings-camera", "ms-settings-cellular"
810+ , "ms-settings-cloudstorage", "ms-settings-connectabledevices"
811+ , "ms-settings-displays-topology", "ms-settings-emailandaccounts"
812+ , "ms-settings-language", "ms-settings-location", "ms-settings-lock"
813+ , "ms-settings-nfctransactions", "ms-settings-notifications"
814+ , "ms-settings-power", "ms-settings-privacy", "ms-settings-proximity"
815+ , "ms-settings-screenrotation", "ms-settings-wifi", "ms-settings-workplace"
816+ , "ms-spd", "ms-sttoverlay", "ms-transit-to", "ms-virtualtouchpad"
817+ , "ms-visio", "ms-walk-to", "ms-whiteboard", "ms-whiteboard-cmd", "ms-word"
818+ , "msnim", "msrp", "msrps", "mtqp", "mumble", "mupdate", "mvn", "news", "nfs"
819+ , "ni", "nih", "nntp", "notes", "ocf", "oid", "onenote", "onenote-cmd"
820+ , "opaquelocktoken", "pack", "palm", "paparazzi", "pkcs11", "platform", "pop"
821+ , "pres", "prospero", "proxy", "pwid", "psyc", "qb", "query", "redis"
822+ , "rediss", "reload", "res", "resource", "rmi", "rsync", "rtmfp", "rtmp"
823+ , "rtsp", "rtsps", "rtspu", "secondlife", "service", "session", "sftp", "sgn"
824+ , "shttp", "sieve", "sip", "sips", "skype", "smb", "sms", "smtp", "snews"
825+ , "snmp", "soap.beep", "soap.beeps", "soldat", "spotify", "ssh", "steam"
826+ , "stun", "stuns", "submit", "svn", "tag", "teamspeak", "tel", "teliaeid"
827+ , "telnet", "tftp", "things", "thismessage", "tip", "tn3270", "tool", "turn"
828+ , "turns", "tv", "udp", "unreal", "urn", "ut2004", "v-event", "vemmi"
829+ , "ventrilo", "videotex", "vnc", "view-source", "wais", "webcal", "wpid"
830+ , "ws", "wss", "wtai", "wyciwyg", "xcon", "xcon-userid", "xfire"
831+ , "xmlrpc.beep", "xmlrpc.beeps", "xmpp", "xri", "ymsgr", "z39.50", "z39.50r"
832+ , "z39.50s"
833+ -- Inofficial schemes
834+ , "doi", "isbn", "javascript", "pmid"
835+ ]
836+
837+-- | Check if the string is a valid URL with a IANA or frequently used but
838+-- unofficial scheme (see @schemes@).
839+isURI :: String -> Bool
840+isURI = maybe False hasKnownScheme . parseURI
841+ where
842+ hasKnownScheme = (`Set.member` schemes) . filter (/= ':') . uriScheme
843+
777---
844---
778--- Squash blocks into inlines
845--- Squash blocks into inlines
779---
846---
src/Text/Pandoc/Writers/ConTeXt.hs+1−1
@@ -33,7 +33,7 @@ import Control.Monad.State
33import Data.Char (ord)
33import Data.Char (ord)
34import Data.List (intercalate, intersperse)
34import Data.List (intercalate, intersperse)
35import Data.Maybe (catMaybes)
35import Data.Maybe (catMaybes)
36−import Network.URI (isURI, unEscapeString)
36+import Network.URI (unEscapeString)
37import Text.Pandoc.Class (PandocMonad, report)
37import Text.Pandoc.Class (PandocMonad, report)
38import Text.Pandoc.Logging
38import Text.Pandoc.Logging
39import Text.Pandoc.Definition
39import Text.Pandoc.Definition
src/Text/Pandoc/Writers/DokuWiki.hs+1−2
@@ -44,13 +44,12 @@ import Control.Monad.Reader (ReaderT, ask, local, runReaderT)
44import Control.Monad.State (StateT, evalStateT, gets, modify)
44import Control.Monad.State (StateT, evalStateT, gets, modify)
45import Data.Default (Default (..))
45import Data.Default (Default (..))
46import Data.List (intercalate, intersect, isPrefixOf, transpose)
46import Data.List (intercalate, intersect, isPrefixOf, transpose)
47−import Network.URI (isURI)
48import Text.Pandoc.Class (PandocMonad, report)
47import Text.Pandoc.Class (PandocMonad, report)
49import Text.Pandoc.Logging
48import Text.Pandoc.Logging
50import Text.Pandoc.Definition
49import Text.Pandoc.Definition
51import Text.Pandoc.ImageSize
50import Text.Pandoc.ImageSize
52import Text.Pandoc.Options (WrapOption (..), WriterOptions (writerTableOfContents, writerTemplate, writerWrapText))
51import Text.Pandoc.Options (WrapOption (..), WriterOptions (writerTableOfContents, writerTemplate, writerWrapText))
53−import Text.Pandoc.Shared (camelCaseToHyphenated, escapeURI, linesToPara,
52+import Text.Pandoc.Shared (camelCaseToHyphenated, escapeURI, isURI, linesToPara,
54 removeFormatting, substitute, trimr)
53 removeFormatting, substitute, trimr)
55import Text.Pandoc.Templates (renderTemplate')
54import Text.Pandoc.Templates (renderTemplate')
56import Text.Pandoc.Writers.Shared (defField, metaToJSON)
55import Text.Pandoc.Writers.Shared (defField, metaToJSON)
src/Text/Pandoc/Writers/FB2.hs+1−2
@@ -46,7 +46,6 @@ import Data.Char (isAscii, isControl, isSpace, toLower)
46import Data.Either (lefts, rights)
46import Data.Either (lefts, rights)
47import Data.List (intercalate, intersperse, isPrefixOf, stripPrefix)
47import Data.List (intercalate, intersperse, isPrefixOf, stripPrefix)
48import Network.HTTP (urlEncode)
48import Network.HTTP (urlEncode)
49−import Network.URI (isURI)
50import Text.XML.Light
49import Text.XML.Light
51import qualified Text.XML.Light as X
50import qualified Text.XML.Light as X
52import qualified Text.XML.Light.Cursor as XC
51import qualified Text.XML.Light.Cursor as XC
@@ -57,7 +56,7 @@ import Text.Pandoc.Definition
57import Text.Pandoc.Error
56import Text.Pandoc.Error
58import Text.Pandoc.Logging
57import Text.Pandoc.Logging
59import Text.Pandoc.Options (HTMLMathMethod (..), WriterOptions (..), def)
58import Text.Pandoc.Options (HTMLMathMethod (..), WriterOptions (..), def)
60−import Text.Pandoc.Shared (capitalize, isHeaderBlock, linesToPara,
59+import Text.Pandoc.Shared (capitalize, isHeaderBlock, isURI, linesToPara,
61 orderedListMarkers)
60 orderedListMarkers)
62
61
63-- | Data to be written at the end of the document:
62-- | Data to be written at the end of the document:
src/Text/Pandoc/Writers/Haddock.hs−1
@@ -36,7 +36,6 @@ module Text.Pandoc.Writers.Haddock (writeHaddock) where
36import Control.Monad.State
36import Control.Monad.State
37import Data.Default
37import Data.Default
38import Data.List (intersperse, transpose)
38import Data.List (intersperse, transpose)
39−import Network.URI (isURI)
40import Text.Pandoc.Class (PandocMonad, report)
39import Text.Pandoc.Class (PandocMonad, report)
41import Text.Pandoc.Definition
40import Text.Pandoc.Definition
42import Text.Pandoc.Logging
41import Text.Pandoc.Logging
src/Text/Pandoc/Writers/ICML.hs+1−2
@@ -21,7 +21,6 @@ import Control.Monad.State
21import Data.List (intersperse, isInfixOf, isPrefixOf, stripPrefix)
21import Data.List (intersperse, isInfixOf, isPrefixOf, stripPrefix)
22import qualified Data.Set as Set
22import qualified Data.Set as Set
23import Data.Text as Text (breakOnAll, pack)
23import Data.Text as Text (breakOnAll, pack)
24−import Network.URI (isURI)
25import Text.Pandoc.Class (PandocMonad, report)
24import Text.Pandoc.Class (PandocMonad, report)
26import qualified Text.Pandoc.Class as P
25import qualified Text.Pandoc.Class as P
27import Text.Pandoc.Definition
26import Text.Pandoc.Definition
@@ -29,7 +28,7 @@ import Text.Pandoc.ImageSize
29import Text.Pandoc.Logging
28import Text.Pandoc.Logging
30import Text.Pandoc.Options
29import Text.Pandoc.Options
31import Text.Pandoc.Pretty
30import Text.Pandoc.Pretty
32−import Text.Pandoc.Shared (linesToPara, splitBy)
31+import Text.Pandoc.Shared (isURI, linesToPara, splitBy)
33import Text.Pandoc.Templates (renderTemplate')
32import Text.Pandoc.Templates (renderTemplate')
34import Text.Pandoc.Writers.Math (texMathToInlines)
33import Text.Pandoc.Writers.Math (texMathToInlines)
35import Text.Pandoc.Writers.Shared
34import Text.Pandoc.Writers.Shared
src/Text/Pandoc/Writers/LaTeX.hs+1−1
@@ -43,7 +43,7 @@ import Data.List (foldl', intercalate, intersperse, isInfixOf, nub, nubBy,
43 stripPrefix, (\\))
43 stripPrefix, (\\))
44import Data.Maybe (catMaybes, fromMaybe, isJust)
44import Data.Maybe (catMaybes, fromMaybe, isJust)
45import qualified Data.Text as T
45import qualified Data.Text as T
46−import Network.URI (isURI, unEscapeString)
46+import Network.URI (unEscapeString)
47import Text.Pandoc.Class (PandocMonad, report)
47import Text.Pandoc.Class (PandocMonad, report)
48import Text.Pandoc.Definition
48import Text.Pandoc.Definition
49import Text.Pandoc.Highlighting (formatLaTeXBlock, formatLaTeXInline, highlight,
49import Text.Pandoc.Highlighting (formatLaTeXBlock, formatLaTeXInline, highlight,
src/Text/Pandoc/Writers/Markdown.hs−1
@@ -49,7 +49,6 @@ import qualified Data.Text as T
49import qualified Data.Vector as V
49import qualified Data.Vector as V
50import Data.Yaml (Value (Array, Bool, Number, Object, String))
50import Data.Yaml (Value (Array, Bool, Number, Object, String))
51import Network.HTTP (urlEncode)
51import Network.HTTP (urlEncode)
52−import Network.URI (isURI)
53import Text.HTML.TagSoup (Tag (..), isTagText, parseTags)
52import Text.HTML.TagSoup (Tag (..), isTagText, parseTags)
54import Text.Pandoc.Class (PandocMonad, report)
53import Text.Pandoc.Class (PandocMonad, report)
55import Text.Pandoc.Definition
54import Text.Pandoc.Definition
src/Text/Pandoc/Writers/MediaWiki.hs−1
@@ -34,7 +34,6 @@ import Control.Monad.Reader
34import Control.Monad.State
34import Control.Monad.State
35import Data.List (intercalate)
35import Data.List (intercalate)
36import qualified Data.Set as Set
36import qualified Data.Set as Set
37−import Network.URI (isURI)
38import Text.Pandoc.Class (PandocMonad, report)
37import Text.Pandoc.Class (PandocMonad, report)
39import Text.Pandoc.Logging
38import Text.Pandoc.Logging
40import Text.Pandoc.Definition
39import Text.Pandoc.Definition
src/Text/Pandoc/Writers/RST.hs−1
@@ -35,7 +35,6 @@ import Control.Monad.State
35import Data.Char (isSpace, toLower)
35import Data.Char (isSpace, toLower)
36import Data.List (isPrefixOf, stripPrefix)
36import Data.List (isPrefixOf, stripPrefix)
37import Data.Maybe (fromMaybe)
37import Data.Maybe (fromMaybe)
38−import Network.URI (isURI)
39import qualified Text.Pandoc.Builder as B
38import qualified Text.Pandoc.Builder as B
40import Text.Pandoc.Class (PandocMonad, report)
39import Text.Pandoc.Class (PandocMonad, report)
41import Text.Pandoc.Logging
40import Text.Pandoc.Logging
src/Text/Pandoc/Writers/Texinfo.hs+1−1
@@ -37,7 +37,7 @@ import Data.Char (chr, ord)
37import Data.List (maximumBy, transpose)
37import Data.List (maximumBy, transpose)
38import Data.Ord (comparing)
38import Data.Ord (comparing)
39import qualified Data.Set as Set
39import qualified Data.Set as Set
40−import Network.URI (isURI, unEscapeString)
40+import Network.URI (unEscapeString)
41import System.FilePath
41import System.FilePath
42import Text.Pandoc.Class (PandocMonad, report)
42import Text.Pandoc.Class (PandocMonad, report)
43import Text.Pandoc.Definition
43import Text.Pandoc.Definition
src/Text/Pandoc/Writers/ZimWiki.hs+2−3
@@ -38,14 +38,13 @@ import Data.Default (Default (..))
38import Data.List (intercalate, isInfixOf, isPrefixOf, transpose)
38import Data.List (intercalate, isInfixOf, isPrefixOf, transpose)
39import qualified Data.Map as Map
39import qualified Data.Map as Map
40import Data.Text (breakOnAll, pack)
40import Data.Text (breakOnAll, pack)
41−import Network.URI (isURI)
42import Text.Pandoc.Class (PandocMonad, report)
41import Text.Pandoc.Class (PandocMonad, report)
43import Text.Pandoc.Logging
42import Text.Pandoc.Logging
44import Text.Pandoc.Definition
43import Text.Pandoc.Definition
45import Text.Pandoc.ImageSize
44import Text.Pandoc.ImageSize
46import Text.Pandoc.Options (WrapOption (..), WriterOptions (writerTableOfContents, writerTemplate, writerWrapText))
45import Text.Pandoc.Options (WrapOption (..), WriterOptions (writerTableOfContents, writerTemplate, writerWrapText))
47−import Text.Pandoc.Shared (escapeURI, linesToPara, removeFormatting, substitute,
46+import Text.Pandoc.Shared (isURI, escapeURI, linesToPara, removeFormatting,
48− trimr)
47+ substitute, trimr)
49import Text.Pandoc.Templates (renderTemplate')
48import Text.Pandoc.Templates (renderTemplate')
50import Text.Pandoc.Writers.Shared (defField, metaToJSON)
49import Text.Pandoc.Writers.Shared (defField, metaToJSON)
51
50