git.iko.soy/typeable/pandoc
on master help sign in
API change: move extension handling to Text.Pandoc.Extensions

Extension parsing and processing functions were defined in the top-level Text.Pandoc module. These functions are moved to the Extensions submodule as to enable reuse in other submodules.

commit3ac23ab615e67c5d08941fcebeb1d19d37ff1a46 authorAlbert Krewinkel <albert@zeitkraut.de> dateMon 17 Apr 2017, 10:04 (10 years ago) parent9cd20c9
2 files changed+75−64
src/Text/Pandoc.hs+1−60 src/Text/Pandoc/Extensions.hs+74−4
src/Text/Pandoc.hs+1−60
@@ -144,7 +144,6 @@ module Text.Pandoc
144144 -- * Miscellaneous
145145 , getReader
146146 , getWriter
147− , getDefaultExtensions
148147 , pandocVersion
149148 ) where
150149
@@ -175,7 +174,7 @@ import Text.Pandoc.Readers.RST
175174import Text.Pandoc.Readers.Textile
176175import Text.Pandoc.Readers.TWiki
177176import Text.Pandoc.Readers.Txt2Tags
178−import Text.Pandoc.Shared (mapLeft, pandocVersion, safeRead)
177+import Text.Pandoc.Shared (mapLeft, pandocVersion)
179178import Text.Pandoc.Templates
180179import qualified Text.Pandoc.UTF8 as UTF8
181180import Text.Pandoc.Writers.AsciiDoc
@@ -208,29 +207,8 @@ import Text.Pandoc.Writers.TEI
208207import Text.Pandoc.Writers.Texinfo
209208import Text.Pandoc.Writers.Textile
210209import Text.Pandoc.Writers.ZimWiki
211−import Text.Parsec
212210import Text.Parsec.Error
213211
214−parseFormatSpec :: String
215− -> Either ParseError (String, Extensions -> Extensions)
216−parseFormatSpec = parse formatSpec ""
217− where formatSpec = do
218− name <- formatName
219− extMods <- many extMod
220− return (name, \x -> foldl (flip ($)) x extMods)
221− formatName = many1 $ noneOf "-+"
222− extMod = do
223− polarity <- oneOf "-+"
224− name <- many $ noneOf "-+"
225− ext <- case safeRead ("Ext_" ++ name) of
226− Just n -> return n
227− Nothing
228− | name == "lhs" -> return Ext_literate_haskell
229− | otherwise -> fail $ "Unknown extension: " ++ name
230− return $ case polarity of
231− '-' -> disableExtension ext
232− _ -> enableExtension ext
233−
234212data Reader m = StringReader (ReaderOptions -> String -> m Pandoc)
235213 | ByteStringReader (ReaderOptions -> BL.ByteString -> m Pandoc)
236214
@@ -318,43 +296,6 @@ writers = [
318296 ,("muse" , StringWriter writeMuse)
319297 ]
320298
321−getDefaultExtensions :: String -> Extensions
322−getDefaultExtensions "markdown_strict" = strictExtensions
323−getDefaultExtensions "markdown_phpextra" = phpMarkdownExtraExtensions
324−getDefaultExtensions "markdown_mmd" = multimarkdownExtensions
325−getDefaultExtensions "markdown_github" = githubMarkdownExtensions
326−getDefaultExtensions "markdown" = pandocExtensions
327−getDefaultExtensions "plain" = plainExtensions
328−getDefaultExtensions "org" = extensionsFromList
329− [Ext_citations,
330− Ext_auto_identifiers]
331−getDefaultExtensions "html" = extensionsFromList
332− [Ext_auto_identifiers,
333− Ext_native_divs,
334− Ext_native_spans]
335−getDefaultExtensions "html4" = getDefaultExtensions "html"
336−getDefaultExtensions "html5" = getDefaultExtensions "html"
337−getDefaultExtensions "epub" = extensionsFromList
338− [Ext_raw_html,
339− Ext_native_divs,
340− Ext_native_spans,
341− Ext_epub_html_exts]
342−getDefaultExtensions "epub2" = getDefaultExtensions "epub"
343−getDefaultExtensions "epub3" = getDefaultExtensions "epub"
344−getDefaultExtensions "latex" = extensionsFromList
345− [Ext_smart,
346− Ext_auto_identifiers]
347−getDefaultExtensions "context" = extensionsFromList
348− [Ext_smart,
349− Ext_auto_identifiers]
350−getDefaultExtensions "textile" = extensionsFromList
351− [Ext_old_dashes,
352− Ext_smart,
353− Ext_raw_html,
354− Ext_auto_identifiers]
355−getDefaultExtensions _ = extensionsFromList
356− [Ext_auto_identifiers]
357−
358299-- | Retrieve reader based on formatSpec (format+extensions).
359300getReader :: PandocMonad m => String -> Either String (Reader m)
360301getReader s =
src/Text/Pandoc/Extensions.hs+74−4
@@ -1,7 +1,5 @@
1−{-# LANGUAGE DeriveDataTypeable #-}
2−{-# LANGUAGE DeriveGeneric #-}
31{-
4−Copyright (C) 2012-2016 John MacFarlane <jgm@berkeley.edu>
2+Copyright (C) 2012-2017 John MacFarlane <jgm@berkeley.edu>
53
64This program is free software; you can redistribute it and/or modify
75it under the terms of the GNU General Public License as published by
@@ -17,10 +15,12 @@ You should have received a copy of the GNU General Public License
1715along with this program; if not, write to the Free Software
1816Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1917-}
18+{-# LANGUAGE DeriveDataTypeable #-}
19+{-# LANGUAGE DeriveGeneric #-}
2020
2121{- |
2222 Module : Text.Pandoc.Extensions
23− Copyright : Copyright (C) 2012-2016 John MacFarlane
23+ Copyright : Copyright (C) 2012-2017 John MacFarlane
2424 License : GNU GPL, version 2 or above
2525
2626 Maintainer : John MacFarlane <jgm@berkeley.edu>
@@ -33,9 +33,11 @@ module Text.Pandoc.Extensions ( Extension(..)
3333 , Extensions
3434 , emptyExtensions
3535 , extensionsFromList
36+ , parseFormatSpec
3637 , extensionEnabled
3738 , enableExtension
3839 , disableExtension
40+ , getDefaultExtensions
3941 , pandocExtensions
4042 , plainExtensions
4143 , strictExtensions
@@ -47,6 +49,8 @@ import Data.Bits (clearBit, setBit, testBit)
4749import Data.Data (Data)
4850import Data.Typeable (Typeable)
4951import GHC.Generics (Generic)
52+import Text.Pandoc.Shared (safeRead)
53+import Text.Parsec
5054
5155newtype Extensions = Extensions Integer
5256 deriving (Show, Read, Eq, Ord, Data, Typeable, Generic)
@@ -135,6 +139,7 @@ data Extension =
135139 | Ext_old_dashes -- ^ -- = em, - before number = en
136140 deriving (Show, Read, Enum, Eq, Ord, Bounded, Data, Typeable, Generic)
137141
142+-- | Extensions to be used with pandoc-flavored markdown.
138143pandocExtensions :: Extensions
139144pandocExtensions = extensionsFromList
140145 [ Ext_footnotes
@@ -182,6 +187,7 @@ pandocExtensions = extensionsFromList
182187 , Ext_smart
183188 ]
184189
190+-- | Extensions to be used with github-flavored markdown.
185191plainExtensions :: Extensions
186192plainExtensions = extensionsFromList
187193 [ Ext_table_captions
@@ -200,6 +206,7 @@ plainExtensions = extensionsFromList
200206 , Ext_strikeout
201207 ]
202208
209+-- | Extensions to be used with github-flavored markdown.
203210phpMarkdownExtraExtensions :: Extensions
204211phpMarkdownExtraExtensions = extensionsFromList
205212 [ Ext_footnotes
@@ -215,6 +222,7 @@ phpMarkdownExtraExtensions = extensionsFromList
215222 , Ext_shortcut_reference_links
216223 ]
217224
225+-- | Extensions to be used with github-flavored markdown.
218226githubMarkdownExtensions :: Extensions
219227githubMarkdownExtensions = extensionsFromList
220228 [ Ext_angle_brackets_escapable
@@ -234,6 +242,7 @@ githubMarkdownExtensions = extensionsFromList
234242 , Ext_shortcut_reference_links
235243 ]
236244
245+-- | Extensions to be used with multimarkdown.
237246multimarkdownExtensions :: Extensions
238247multimarkdownExtensions = extensionsFromList
239248 [ Ext_pipe_tables
@@ -264,9 +273,70 @@ multimarkdownExtensions = extensionsFromList
264273 , Ext_subscript
265274 ]
266275
276+-- | Language extensions to be used with strict markdown.
267277strictExtensions :: Extensions
268278strictExtensions = extensionsFromList
269279 [ Ext_raw_html
270280 , Ext_shortcut_reference_links
271281 ]
272282
283+-- | Default extensions from format-describing string.
284+getDefaultExtensions :: String -> Extensions
285+getDefaultExtensions "markdown_strict" = strictExtensions
286+getDefaultExtensions "markdown_phpextra" = phpMarkdownExtraExtensions
287+getDefaultExtensions "markdown_mmd" = multimarkdownExtensions
288+getDefaultExtensions "markdown_github" = githubMarkdownExtensions
289+getDefaultExtensions "markdown" = pandocExtensions
290+getDefaultExtensions "plain" = plainExtensions
291+getDefaultExtensions "org" = extensionsFromList
292+ [Ext_citations,
293+ Ext_auto_identifiers]
294+getDefaultExtensions "html" = extensionsFromList
295+ [Ext_auto_identifiers,
296+ Ext_native_divs,
297+ Ext_native_spans]
298+getDefaultExtensions "html4" = getDefaultExtensions "html"
299+getDefaultExtensions "html5" = getDefaultExtensions "html"
300+getDefaultExtensions "epub" = extensionsFromList
301+ [Ext_raw_html,
302+ Ext_native_divs,
303+ Ext_native_spans,
304+ Ext_epub_html_exts]
305+getDefaultExtensions "epub2" = getDefaultExtensions "epub"
306+getDefaultExtensions "epub3" = getDefaultExtensions "epub"
307+getDefaultExtensions "latex" = extensionsFromList
308+ [Ext_smart,
309+ Ext_auto_identifiers]
310+getDefaultExtensions "context" = extensionsFromList
311+ [Ext_smart,
312+ Ext_auto_identifiers]
313+getDefaultExtensions "textile" = extensionsFromList
314+ [Ext_old_dashes,
315+ Ext_smart,
316+ Ext_raw_html,
317+ Ext_auto_identifiers]
318+getDefaultExtensions _ = extensionsFromList
319+ [Ext_auto_identifiers]
320+
321+-- | Parse a format-specifying string into a markup format and a function that
322+-- takes Extensions and enables and disables extensions as defined in the format
323+-- spec.
324+parseFormatSpec :: String
325+ -> Either ParseError (String, Extensions -> Extensions)
326+parseFormatSpec = parse formatSpec ""
327+ where formatSpec = do
328+ name <- formatName
329+ extMods <- many extMod
330+ return (name, \x -> foldl (flip ($)) x extMods)
331+ formatName = many1 $ noneOf "-+"
332+ extMod = do
333+ polarity <- oneOf "-+"
334+ name <- many $ noneOf "-+"
335+ ext <- case safeRead ("Ext_" ++ name) of
336+ Just n -> return n
337+ Nothing
338+ | name == "lhs" -> return Ext_literate_haskell
339+ | otherwise -> fail $ "Unknown extension: " ++ name
340+ return $ case polarity of
341+ '-' -> disableExtension ext
342+ _ -> enableExtension ext