@@ -26,6 +26,7 @@ module Text.Pandoc.Extensions ( Extension(..)
2626 , enableExtension
2727 , disableExtension
2828 , getDefaultExtensions
29+ , getAllExtensions
2930 , pandocExtensions
3031 , plainExtensions
3132 , strictExtensions
@@ -312,12 +313,12 @@ strictExtensions = extensionsFromList
312313
313314-- | Default extensions from format-describing string.
314315getDefaultExtensions :: String -> Extensions
315−getDefaultExtensions "markdown_strict" = strictExtensions
316+getDefaultExtensions "markdown_strict" = strictExtensions
316317getDefaultExtensions "markdown_phpextra" = phpMarkdownExtraExtensions
317−getDefaultExtensions "markdown_mmd" = multimarkdownExtensions
318−getDefaultExtensions "markdown_github" = githubMarkdownExtensions
319−getDefaultExtensions "markdown" = pandocExtensions
320−getDefaultExtensions "ipynb" =
318+getDefaultExtensions "markdown_mmd" = multimarkdownExtensions
319+getDefaultExtensions "markdown_github" = githubMarkdownExtensions
320+getDefaultExtensions "markdown" = pandocExtensions
321+getDefaultExtensions "ipynb" =
321322 extensionsFromList
322323 [ Ext_all_symbols_escapable
323324 , Ext_pipe_tables
@@ -379,16 +380,149 @@ getDefaultExtensions "opml" = pandocExtensions -- affects notes
379380getDefaultExtensions _ = extensionsFromList
380381 [Ext_auto_identifiers]
381382
382−-- | Parse a format-specifying string into a markup format and a function that
383−-- takes Extensions and enables and disables extensions as defined in the format
384−-- spec.
383+allMarkdownExtensions :: Extensions
384+allMarkdownExtensions =
385+ pandocExtensions <>
386+ extensionsFromList
387+ [ Ext_old_dashes
388+ , Ext_angle_brackets_escapable
389+ , Ext_lists_without_preceding_blankline
390+ , Ext_four_space_rule
391+ , Ext_spaced_reference_links
392+ , Ext_hard_line_breaks
393+ , Ext_ignore_line_breaks
394+ , Ext_east_asian_line_breaks
395+ , Ext_emoji
396+ , Ext_tex_math_single_backslash
397+ , Ext_tex_math_double_backslash
398+ , Ext_markdown_attribute
399+ , Ext_mmd_title_block
400+ , Ext_abbreviations
401+ , Ext_autolink_bare_uris
402+ , Ext_mmd_link_attributes
403+ , Ext_mmd_header_identifiers
404+ , Ext_compact_definition_lists
405+ , Ext_gutenberg
406+ , Ext_smart
407+ , Ext_literate_haskell
408+ ]
409+
410+
411+-- | Get all valid extensions for a format. This is used
412+-- mainly in checking format specifications for validity.
413+getAllExtensions :: String -> Extensions
414+getAllExtensions f = universalExtensions <> getAll f
415+ where
416+ autoIdExtensions = extensionsFromList
417+ [ Ext_auto_identifiers
418+ , Ext_gfm_auto_identifiers
419+ , Ext_ascii_identifiers
420+ ]
421+ universalExtensions = extensionsFromList
422+ [ Ext_east_asian_line_breaks ]
423+ getAll "markdown_strict" = allMarkdownExtensions
424+ getAll "markdown_phpextra" = allMarkdownExtensions
425+ getAll "markdown_mmd" = allMarkdownExtensions
426+ getAll "markdown_github" = allMarkdownExtensions
427+ getAll "markdown" = allMarkdownExtensions
428+ getAll "ipynb" = allMarkdownExtensions
429+ getAll "docx" = extensionsFromList
430+ [ Ext_empty_paragraphs
431+ , Ext_styles
432+ ]
433+ getAll "opendocument" = extensionsFromList
434+ [ Ext_empty_paragraphs
435+ , Ext_native_numbering
436+ ]
437+ getAll "odt" = getAll "opendocument" <> autoIdExtensions
438+ getAll "muse" = autoIdExtensions <>
439+ extensionsFromList
440+ [ Ext_amuse ]
441+ getAll "asciidoc" = autoIdExtensions
442+ getAll "plain" = allMarkdownExtensions
443+ getAll "gfm" = githubMarkdownExtensions <>
444+ autoIdExtensions <>
445+ extensionsFromList
446+ [ Ext_raw_html
447+ , Ext_raw_tex -- only supported in writer (for math)
448+ , Ext_hard_line_breaks
449+ , Ext_smart
450+ ]
451+ getAll "commonmark" = getAll "gfm"
452+ getAll "org" = autoIdExtensions <>
453+ extensionsFromList
454+ [ Ext_citations
455+ , Ext_smart
456+ ]
457+ getAll "html" = autoIdExtensions <>
458+ extensionsFromList
459+ [ Ext_native_divs
460+ , Ext_line_blocks
461+ , Ext_native_spans
462+ , Ext_empty_paragraphs
463+ , Ext_raw_html
464+ , Ext_raw_tex
465+ , Ext_task_lists
466+ , Ext_tex_math_dollars
467+ , Ext_tex_math_single_backslash
468+ , Ext_tex_math_double_backslash
469+ , Ext_literate_haskell
470+ , Ext_epub_html_exts
471+ ]
472+ getAll "html4" = getAll "html"
473+ getAll "html5" = getAll "html"
474+ getAll "epub" = getAll "html"
475+ getAll "epub2" = getAll "epub"
476+ getAll "epub3" = getAll "epub"
477+ getAll "latex" = autoIdExtensions <>
478+ extensionsFromList
479+ [ Ext_smart
480+ , Ext_latex_macros
481+ , Ext_raw_tex
482+ , Ext_task_lists
483+ , Ext_literate_haskell
484+ ]
485+ getAll "beamer" = getAll "latex"
486+ getAll "context" = autoIdExtensions <>
487+ extensionsFromList
488+ [ Ext_smart
489+ , Ext_raw_tex
490+ , Ext_ntb
491+ ]
492+ getAll "textile" = autoIdExtensions <>
493+ extensionsFromList
494+ [ Ext_old_dashes
495+ , Ext_smart
496+ , Ext_raw_tex
497+ ]
498+ getAll "opml" = allMarkdownExtensions -- affects notes
499+ getAll "twiki" = autoIdExtensions <>
500+ extensionsFromList
501+ [ Ext_smart ]
502+ getAll "vimwiki" = autoIdExtensions
503+ getAll "dokuwiki" = autoIdExtensions
504+ getAll "tikiwiki" = autoIdExtensions
505+ getAll "rst" = autoIdExtensions <>
506+ extensionsFromList
507+ [ Ext_smart
508+ , Ext_literate_haskell
509+ ]
510+ getAll "mediawiki" = autoIdExtensions <>
511+ extensionsFromList
512+ [ Ext_smart ]
513+ getAll _ = mempty
514+
515+
516+-- | Parse a format-specifying string into a markup format,
517+-- a set of extensions to enable, and a set of extensions to disable.
385518parseFormatSpec :: String
386− -> Either ParseError (String, Extensions -> Extensions)
519+ -> Either ParseError (String, [Extension], [Extension])
387520parseFormatSpec = parse formatSpec ""
388521 where formatSpec = do
389522 name <- formatName
390− extMods <- many extMod
391− return (name, \x -> foldl (flip ($)) x extMods)
523+ (extsToEnable, extsToDisable) <- foldl (flip ($)) ([],[]) <$>
524+ many extMod
525+ return (name, reverse extsToEnable, reverse extsToDisable)
392526 formatName = many1 $ noneOf "-+"
393527 extMod = do
394528 polarity <- oneOf "-+"
@@ -397,10 +531,12 @@ parseFormatSpec = parse formatSpec ""
397531 Just n -> return n
398532 Nothing
399533 | name == "lhs" -> return Ext_literate_haskell
400− | otherwise -> Prelude.fail $ "Unknown extension: " ++ name
401− return $ case polarity of
402− '-' -> disableExtension ext
403− _ -> enableExtension ext
534+ | otherwise -> Prelude.fail $
535+ "Unknown extension: " ++ name
536+ return $ \(extsToEnable, extsToDisable) ->
537+ case polarity of
538+ '+' -> (ext : extsToEnable, extsToDisable)
539+ _ -> (extsToEnable, ext : extsToDisable)
404540
405541#ifdef DERIVE_JSON_VIA_TH
406542$(deriveJSON defaultOptions ''Extension)