Blame src/Text/Pandoc/Extensions.hs

Packit Service d2f85f
{-
Packit Service d2f85f
Copyright (C) 2012-2017 John MacFarlane <jgm@berkeley.edu>
Packit Service d2f85f
Packit Service d2f85f
This program is free software; you can redistribute it and/or modify
Packit Service d2f85f
it under the terms of the GNU General Public License as published by
Packit Service d2f85f
the Free Software Foundation; either version 2 of the License, or
Packit Service d2f85f
(at your option) any later version.
Packit Service d2f85f
Packit Service d2f85f
This program is distributed in the hope that it will be useful,
Packit Service d2f85f
but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service d2f85f
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service d2f85f
GNU General Public License for more details.
Packit Service d2f85f
Packit Service d2f85f
You should have received a copy of the GNU General Public License
Packit Service d2f85f
along with this program; if not, write to the Free Software
Packit Service d2f85f
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit Service d2f85f
-}
Packit Service d2f85f
{-# LANGUAGE DeriveDataTypeable         #-}
Packit Service d2f85f
{-# LANGUAGE DeriveGeneric              #-}
Packit Service d2f85f
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
Packit Service d2f85f
{-# LANGUAGE TemplateHaskell            #-}
Packit Service d2f85f
Packit Service d2f85f
{- |
Packit Service d2f85f
   Module      : Text.Pandoc.Extensions
Packit Service d2f85f
   Copyright   : Copyright (C) 2012-2017 John MacFarlane
Packit Service d2f85f
   License     : GNU GPL, version 2 or above
Packit Service d2f85f
Packit Service d2f85f
   Maintainer  : John MacFarlane <jgm@berkeley.edu>
Packit Service d2f85f
   Stability   : alpha
Packit Service d2f85f
   Portability : portable
Packit Service d2f85f
Packit Service d2f85f
Data structures and functions for representing markup extensions.
Packit Service d2f85f
-}
Packit Service d2f85f
module Text.Pandoc.Extensions ( Extension(..)
Packit Service d2f85f
                              , Extensions
Packit Service d2f85f
                              , emptyExtensions
Packit Service d2f85f
                              , extensionsFromList
Packit Service d2f85f
                              , parseFormatSpec
Packit Service d2f85f
                              , extensionEnabled
Packit Service d2f85f
                              , enableExtension
Packit Service d2f85f
                              , disableExtension
Packit Service d2f85f
                              , getDefaultExtensions
Packit Service d2f85f
                              , pandocExtensions
Packit Service d2f85f
                              , plainExtensions
Packit Service d2f85f
                              , strictExtensions
Packit Service d2f85f
                              , phpMarkdownExtraExtensions
Packit Service d2f85f
                              , githubMarkdownExtensions
Packit Service d2f85f
                              , multimarkdownExtensions )
Packit Service d2f85f
where
Packit Service d2f85f
import Data.Aeson (FromJSON (..), ToJSON (..), defaultOptions)
Packit Service d2f85f
import Data.Aeson.TH (deriveJSON)
Packit Service d2f85f
import Data.Bits (clearBit, setBit, testBit, (.|.))
Packit Service d2f85f
import Data.Data (Data)
Packit Service d2f85f
import Data.Typeable (Typeable)
Packit Service d2f85f
import GHC.Generics (Generic)
Packit Service d2f85f
import Text.Pandoc.Shared (safeRead)
Packit Service d2f85f
import Text.Parsec
Packit Service d2f85f
Packit Service d2f85f
newtype Extensions = Extensions Integer
Packit Service d2f85f
  deriving (Show, Read, Eq, Ord, Data, Typeable, Generic, ToJSON, FromJSON)
Packit Service d2f85f
Packit Service d2f85f
instance Monoid Extensions where
Packit Service d2f85f
  mempty = Extensions 0
Packit Service d2f85f
  mappend (Extensions a) (Extensions b) = Extensions (a .|. b)
Packit Service d2f85f
Packit Service d2f85f
extensionsFromList :: [Extension] -> Extensions
Packit Service d2f85f
extensionsFromList = foldr enableExtension emptyExtensions
Packit Service d2f85f
Packit Service d2f85f
emptyExtensions :: Extensions
Packit Service d2f85f
emptyExtensions = Extensions 0
Packit Service d2f85f
Packit Service d2f85f
extensionEnabled :: Extension -> Extensions -> Bool
Packit Service d2f85f
extensionEnabled x (Extensions exts) = testBit exts (fromEnum x)
Packit Service d2f85f
Packit Service d2f85f
enableExtension :: Extension -> Extensions -> Extensions
Packit Service d2f85f
enableExtension x (Extensions exts) = Extensions (setBit exts (fromEnum x))
Packit Service d2f85f
Packit Service d2f85f
disableExtension :: Extension -> Extensions -> Extensions
Packit Service d2f85f
disableExtension x (Extensions exts) = Extensions (clearBit exts (fromEnum x))
Packit Service d2f85f
Packit Service d2f85f
-- | Individually selectable syntax extensions.
Packit Service d2f85f
data Extension =
Packit Service d2f85f
      Ext_abbreviations       -- ^ PHP markdown extra abbreviation definitions
Packit Service d2f85f
    | Ext_all_symbols_escapable  -- ^ Make all non-alphanumerics escapable
Packit Service d2f85f
    | Ext_amuse -- ^ Enable Text::Amuse extensions to Emacs Muse markup
Packit Service d2f85f
    | Ext_angle_brackets_escapable  -- ^ Make < and > escapable
Packit Service d2f85f
    | Ext_ascii_identifiers   -- ^ ascii-only identifiers for headers
Packit Service d2f85f
    | Ext_auto_identifiers    -- ^ Automatic identifiers for headers
Packit Service d2f85f
    | Ext_autolink_bare_uris  -- ^ Make all absolute URIs into links
Packit Service d2f85f
    | Ext_backtick_code_blocks    -- ^ GitHub style ``` code blocks
Packit Service d2f85f
    | Ext_blank_before_blockquote -- ^ Require blank line before a blockquote
Packit Service d2f85f
    | Ext_blank_before_header     -- ^ Require blank line before a header
Packit Service d2f85f
    | Ext_bracketed_spans         -- ^ Bracketed spans with attributes
Packit Service d2f85f
    | Ext_citations           -- ^ Pandoc/citeproc citations
Packit Service d2f85f
    | Ext_compact_definition_lists  -- ^ Definition lists without space between items,
Packit Service d2f85f
                                    --   and disallow laziness
Packit Service d2f85f
    | Ext_definition_lists    -- ^ Definition lists as in pandoc, mmd, php
Packit Service d2f85f
    | Ext_east_asian_line_breaks  -- ^ Newlines in paragraphs are ignored between
Packit Service d2f85f
                                  --   East Asian wide characters
Packit Service d2f85f
    | Ext_emoji               -- ^ Support emoji like :smile:
Packit Service d2f85f
    | Ext_empty_paragraphs -- ^ Allow empty paragraphs
Packit Service d2f85f
    | Ext_epub_html_exts      -- ^ Recognise the EPUB extended version of HTML
Packit Service d2f85f
    | Ext_escaped_line_breaks     -- ^ Treat a backslash at EOL as linebreak
Packit Service d2f85f
    | Ext_example_lists       -- ^ Markdown-style numbered examples
Packit Service d2f85f
    | Ext_fancy_lists         -- ^ Enable fancy list numbers and delimiters
Packit Service d2f85f
    | Ext_fenced_code_attributes  -- ^ Allow attributes on fenced code blocks
Packit Service d2f85f
    | Ext_fenced_code_blocks  -- ^ Parse fenced code blocks
Packit Service d2f85f
    | Ext_fenced_divs             -- ^ Allow fenced div syntax :::
Packit Service d2f85f
    | Ext_footnotes           -- ^ Pandoc/PHP/MMD style footnotes
Packit Service d2f85f
    | Ext_four_space_rule     -- ^ Require 4-space indent for list contents
Packit Service d2f85f
    | Ext_gfm_auto_identifiers  -- ^ Automatic identifiers for headers, using
Packit Service d2f85f
                                --  GitHub's method for generating identifiers
Packit Service d2f85f
    | Ext_grid_tables         -- ^ Grid tables (pandoc, reST)
Packit Service d2f85f
    | Ext_hard_line_breaks    -- ^ All newlines become hard line breaks
Packit Service d2f85f
    | Ext_header_attributes   -- ^ Explicit header attributes {#id .class k=v}
Packit Service d2f85f
    | Ext_ignore_line_breaks  -- ^ Newlines in paragraphs are ignored
Packit Service d2f85f
    | Ext_implicit_figures    -- ^ A paragraph with just an image is a figure
Packit Service d2f85f
    | Ext_implicit_header_references -- ^ Implicit reference links for headers
Packit Service d2f85f
    | Ext_inline_code_attributes  -- ^ Allow attributes on inline code
Packit Service d2f85f
    | Ext_inline_notes        -- ^ Pandoc-style inline notes
Packit Service d2f85f
    | Ext_intraword_underscores  -- ^ Treat underscore inside word as literal
Packit Service d2f85f
    | Ext_latex_macros        -- ^ Parse LaTeX macro definitions (for math only)
Packit Service d2f85f
    | Ext_line_blocks         -- ^ RST style line blocks
Packit Service d2f85f
    | Ext_link_attributes         -- ^ link and image attributes
Packit Service d2f85f
    | Ext_lists_without_preceding_blankline -- ^ Allow lists without preceding blank
Packit Service d2f85f
    | Ext_literate_haskell    -- ^ Enable literate Haskell conventions
Packit Service d2f85f
    | Ext_markdown_attribute      -- ^ Interpret text inside HTML as markdown iff
Packit Service d2f85f
                                  --   container has attribute 'markdown'
Packit Service d2f85f
    | Ext_markdown_in_html_blocks -- ^ Interpret as markdown inside HTML blocks
Packit Service d2f85f
    | Ext_mmd_header_identifiers -- ^ Multimarkdown style header identifiers [myid]
Packit Service d2f85f
    | Ext_mmd_link_attributes     -- ^ MMD style reference link attributes
Packit Service d2f85f
    | Ext_mmd_title_block     -- ^ Multimarkdown metadata block
Packit Service d2f85f
    | Ext_multiline_tables    -- ^ Pandoc-style multiline tables
Packit Service d2f85f
    | Ext_native_divs             -- ^ Use Div blocks for contents of 
tags
Packit Service d2f85f
    | Ext_native_spans            -- ^ Use Span inlines for contents of 
Packit Service d2f85f
    | Ext_old_dashes          -- ^ -- = em, - before number = en
Packit Service d2f85f
    | Ext_pandoc_title_block  -- ^ Pandoc title block
Packit Service d2f85f
    | Ext_pipe_tables         -- ^ Pipe tables (as in PHP markdown extra)
Packit Service d2f85f
    | Ext_raw_attribute           -- ^ Allow explicit raw blocks/inlines
Packit Service d2f85f
    | Ext_raw_html            -- ^ Allow raw HTML
Packit Service d2f85f
    | Ext_raw_tex             -- ^ Allow raw TeX (other than math)
Packit Service d2f85f
    | Ext_shortcut_reference_links -- ^ Shortcut reference links
Packit Service d2f85f
    | Ext_simple_tables       -- ^ Pandoc-style simple tables
Packit Service d2f85f
    | Ext_smart               -- ^ "Smart" quotes, apostrophes, ellipses, dashes
Packit Service d2f85f
    | Ext_space_in_atx_header -- ^ Require space between # and header text
Packit Service d2f85f
    | Ext_spaced_reference_links -- ^ Allow space between two parts of ref link
Packit Service d2f85f
    | Ext_startnum            -- ^ Make start number of ordered list significant
Packit Service d2f85f
    | Ext_strikeout           -- ^ Strikeout using ~~this~~ syntax
Packit Service d2f85f
    | Ext_subscript           -- ^ Subscript using ~this~ syntax
Packit Service d2f85f
    | Ext_superscript         -- ^ Superscript using ^this^ syntax
Packit Service d2f85f
    | Ext_table_captions      -- ^ Pandoc-style table captions
Packit Service d2f85f
    | Ext_tex_math_dollars    -- ^ TeX math between $..$ or $$..$$
Packit Service d2f85f
    | Ext_tex_math_double_backslash  -- ^ TeX math btw \\(..\\) \\[..\\]
Packit Service d2f85f
    | Ext_tex_math_single_backslash  -- ^ TeX math btw \(..\) \[..\]
Packit Service d2f85f
    | Ext_yaml_metadata_block -- ^ YAML metadata block
Packit Service d2f85f
    deriving (Show, Read, Enum, Eq, Ord, Bounded, Data, Typeable, Generic)
Packit Service d2f85f
Packit Service d2f85f
-- | Extensions to be used with pandoc-flavored markdown.
Packit Service d2f85f
pandocExtensions :: Extensions
Packit Service d2f85f
pandocExtensions = extensionsFromList
Packit Service d2f85f
  [ Ext_footnotes
Packit Service d2f85f
  , Ext_inline_notes
Packit Service d2f85f
  , Ext_pandoc_title_block
Packit Service d2f85f
  , Ext_yaml_metadata_block
Packit Service d2f85f
  , Ext_table_captions
Packit Service d2f85f
  , Ext_implicit_figures
Packit Service d2f85f
  , Ext_simple_tables
Packit Service d2f85f
  , Ext_multiline_tables
Packit Service d2f85f
  , Ext_grid_tables
Packit Service d2f85f
  , Ext_pipe_tables
Packit Service d2f85f
  , Ext_citations
Packit Service d2f85f
  , Ext_raw_tex
Packit Service d2f85f
  , Ext_raw_html
Packit Service d2f85f
  , Ext_tex_math_dollars
Packit Service d2f85f
  , Ext_latex_macros
Packit Service d2f85f
  , Ext_fenced_code_blocks
Packit Service d2f85f
  , Ext_fenced_code_attributes
Packit Service d2f85f
  , Ext_backtick_code_blocks
Packit Service d2f85f
  , Ext_inline_code_attributes
Packit Service d2f85f
  , Ext_raw_attribute
Packit Service d2f85f
  , Ext_markdown_in_html_blocks
Packit Service d2f85f
  , Ext_native_divs
Packit Service d2f85f
  , Ext_fenced_divs
Packit Service d2f85f
  , Ext_native_spans
Packit Service d2f85f
  , Ext_bracketed_spans
Packit Service d2f85f
  , Ext_escaped_line_breaks
Packit Service d2f85f
  , Ext_fancy_lists
Packit Service d2f85f
  , Ext_startnum
Packit Service d2f85f
  , Ext_definition_lists
Packit Service d2f85f
  , Ext_example_lists
Packit Service d2f85f
  , Ext_all_symbols_escapable
Packit Service d2f85f
  , Ext_intraword_underscores
Packit Service d2f85f
  , Ext_blank_before_blockquote
Packit Service d2f85f
  , Ext_blank_before_header
Packit Service d2f85f
  , Ext_space_in_atx_header
Packit Service d2f85f
  , Ext_strikeout
Packit Service d2f85f
  , Ext_superscript
Packit Service d2f85f
  , Ext_subscript
Packit Service d2f85f
  , Ext_auto_identifiers
Packit Service d2f85f
  , Ext_header_attributes
Packit Service d2f85f
  , Ext_link_attributes
Packit Service d2f85f
  , Ext_implicit_header_references
Packit Service d2f85f
  , Ext_line_blocks
Packit Service d2f85f
  , Ext_shortcut_reference_links
Packit Service d2f85f
  , Ext_smart
Packit Service d2f85f
  ]
Packit Service d2f85f
Packit Service d2f85f
-- | Extensions to be used with plain text output.
Packit Service d2f85f
plainExtensions :: Extensions
Packit Service d2f85f
plainExtensions = extensionsFromList
Packit Service d2f85f
  [ Ext_table_captions
Packit Service d2f85f
  , Ext_implicit_figures
Packit Service d2f85f
  , Ext_simple_tables
Packit Service d2f85f
  , Ext_multiline_tables
Packit Service d2f85f
  , Ext_grid_tables
Packit Service d2f85f
  , Ext_latex_macros
Packit Service d2f85f
  , Ext_fancy_lists
Packit Service d2f85f
  , Ext_startnum
Packit Service d2f85f
  , Ext_definition_lists
Packit Service d2f85f
  , Ext_example_lists
Packit Service d2f85f
  , Ext_intraword_underscores
Packit Service d2f85f
  , Ext_blank_before_blockquote
Packit Service d2f85f
  , Ext_blank_before_header
Packit Service d2f85f
  , Ext_strikeout
Packit Service d2f85f
  ]
Packit Service d2f85f
Packit Service d2f85f
-- | Extensions to be used with github-flavored markdown.
Packit Service d2f85f
phpMarkdownExtraExtensions :: Extensions
Packit Service d2f85f
phpMarkdownExtraExtensions = extensionsFromList
Packit Service d2f85f
  [ Ext_footnotes
Packit Service d2f85f
  , Ext_pipe_tables
Packit Service d2f85f
  , Ext_raw_html
Packit Service d2f85f
  , Ext_markdown_attribute
Packit Service d2f85f
  , Ext_fenced_code_blocks
Packit Service d2f85f
  , Ext_definition_lists
Packit Service d2f85f
  , Ext_intraword_underscores
Packit Service d2f85f
  , Ext_header_attributes
Packit Service d2f85f
  , Ext_link_attributes
Packit Service d2f85f
  , Ext_abbreviations
Packit Service d2f85f
  , Ext_shortcut_reference_links
Packit Service d2f85f
  , Ext_spaced_reference_links
Packit Service d2f85f
  ]
Packit Service d2f85f
Packit Service d2f85f
-- | Extensions to be used with github-flavored markdown.
Packit Service d2f85f
githubMarkdownExtensions :: Extensions
Packit Service d2f85f
githubMarkdownExtensions = extensionsFromList
Packit Service d2f85f
  [ Ext_angle_brackets_escapable
Packit Service d2f85f
  , Ext_pipe_tables
Packit Service d2f85f
  , Ext_raw_html
Packit Service d2f85f
  , Ext_fenced_code_blocks
Packit Service d2f85f
  , Ext_gfm_auto_identifiers
Packit Service d2f85f
  , Ext_ascii_identifiers
Packit Service d2f85f
  , Ext_backtick_code_blocks
Packit Service d2f85f
  , Ext_autolink_bare_uris
Packit Service d2f85f
  , Ext_space_in_atx_header
Packit Service d2f85f
  , Ext_intraword_underscores
Packit Service d2f85f
  , Ext_strikeout
Packit Service d2f85f
  , Ext_emoji
Packit Service d2f85f
  , Ext_lists_without_preceding_blankline
Packit Service d2f85f
  , Ext_shortcut_reference_links
Packit Service d2f85f
  ]
Packit Service d2f85f
Packit Service d2f85f
-- | Extensions to be used with multimarkdown.
Packit Service d2f85f
multimarkdownExtensions :: Extensions
Packit Service d2f85f
multimarkdownExtensions = extensionsFromList
Packit Service d2f85f
  [ Ext_pipe_tables
Packit Service d2f85f
  , Ext_raw_html
Packit Service d2f85f
  , Ext_markdown_attribute
Packit Service d2f85f
  , Ext_mmd_link_attributes
Packit Service d2f85f
  -- , Ext_raw_tex
Packit Service d2f85f
  -- Note: MMD's raw TeX syntax requires raw TeX to be
Packit Service d2f85f
  -- enclosed in HTML comment
Packit Service d2f85f
  , Ext_tex_math_double_backslash
Packit Service d2f85f
  , Ext_intraword_underscores
Packit Service d2f85f
  , Ext_mmd_title_block
Packit Service d2f85f
  , Ext_footnotes
Packit Service d2f85f
  , Ext_definition_lists
Packit Service d2f85f
  , Ext_all_symbols_escapable
Packit Service d2f85f
  , Ext_implicit_header_references
Packit Service d2f85f
  , Ext_shortcut_reference_links
Packit Service d2f85f
  , Ext_auto_identifiers
Packit Service d2f85f
  , Ext_mmd_header_identifiers
Packit Service d2f85f
  , Ext_implicit_figures
Packit Service d2f85f
  -- Note: MMD's syntax for superscripts and subscripts
Packit Service d2f85f
  -- is a bit more permissive than pandoc's, allowing
Packit Service d2f85f
  -- e^2 and a~1 instead of e^2^ and a~1~, so even with
Packit Service d2f85f
  -- these options we don't have full support for MMD
Packit Service d2f85f
  -- superscripts and subscripts, but there's no reason
Packit Service d2f85f
  -- not to include these:
Packit Service d2f85f
  , Ext_superscript
Packit Service d2f85f
  , Ext_subscript
Packit Service d2f85f
  , Ext_backtick_code_blocks
Packit Service d2f85f
  , Ext_spaced_reference_links
Packit Service d2f85f
  -- So far only in dev version of mmd:
Packit Service d2f85f
  , Ext_raw_attribute
Packit Service d2f85f
  ]
Packit Service d2f85f
Packit Service d2f85f
-- | Language extensions to be used with strict markdown.
Packit Service d2f85f
strictExtensions :: Extensions
Packit Service d2f85f
strictExtensions = extensionsFromList
Packit Service d2f85f
  [ Ext_raw_html
Packit Service d2f85f
  , Ext_shortcut_reference_links
Packit Service d2f85f
  , Ext_spaced_reference_links
Packit Service d2f85f
  ]
Packit Service d2f85f
Packit Service d2f85f
-- | Default extensions from format-describing string.
Packit Service d2f85f
getDefaultExtensions :: String -> Extensions
Packit Service d2f85f
getDefaultExtensions "markdown_strict" = strictExtensions
Packit Service d2f85f
getDefaultExtensions "markdown_phpextra" = phpMarkdownExtraExtensions
Packit Service d2f85f
getDefaultExtensions "markdown_mmd" = multimarkdownExtensions
Packit Service d2f85f
getDefaultExtensions "markdown_github" = githubMarkdownExtensions
Packit Service d2f85f
getDefaultExtensions "markdown"        = pandocExtensions
Packit Service d2f85f
getDefaultExtensions "muse"            = extensionsFromList
Packit Service d2f85f
                                           [Ext_amuse,
Packit Service d2f85f
                                            Ext_auto_identifiers]
Packit Service d2f85f
getDefaultExtensions "plain"           = plainExtensions
Packit Service d2f85f
getDefaultExtensions "gfm"             = githubMarkdownExtensions
Packit Service d2f85f
getDefaultExtensions "org"             = extensionsFromList
Packit Service d2f85f
                                          [Ext_citations,
Packit Service d2f85f
                                           Ext_auto_identifiers]
Packit Service d2f85f
getDefaultExtensions "html"            = extensionsFromList
Packit Service d2f85f
                                          [Ext_auto_identifiers,
Packit Service d2f85f
                                           Ext_native_divs,
Packit Service d2f85f
                                           Ext_line_blocks,
Packit Service d2f85f
                                           Ext_native_spans]
Packit Service d2f85f
getDefaultExtensions "html4"           = getDefaultExtensions "html"
Packit Service d2f85f
getDefaultExtensions "html5"           = getDefaultExtensions "html"
Packit Service d2f85f
getDefaultExtensions "epub"            = extensionsFromList
Packit Service d2f85f
                                          [Ext_raw_html,
Packit Service d2f85f
                                           Ext_native_divs,
Packit Service d2f85f
                                           Ext_native_spans,
Packit Service d2f85f
                                           Ext_epub_html_exts]
Packit Service d2f85f
getDefaultExtensions "epub2"           = getDefaultExtensions "epub"
Packit Service d2f85f
getDefaultExtensions "epub3"           = getDefaultExtensions "epub"
Packit Service d2f85f
getDefaultExtensions "latex"           = extensionsFromList
Packit Service d2f85f
                                          [Ext_smart,
Packit Service d2f85f
                                           Ext_latex_macros,
Packit Service d2f85f
                                           Ext_auto_identifiers]
Packit Service d2f85f
getDefaultExtensions "context"         = extensionsFromList
Packit Service d2f85f
                                          [Ext_smart,
Packit Service d2f85f
                                           Ext_auto_identifiers]
Packit Service d2f85f
getDefaultExtensions "textile"         = extensionsFromList
Packit Service d2f85f
                                          [Ext_old_dashes,
Packit Service d2f85f
                                           Ext_smart,
Packit Service d2f85f
                                           Ext_raw_html,
Packit Service d2f85f
                                           Ext_auto_identifiers]
Packit Service d2f85f
getDefaultExtensions "opml"            = pandocExtensions -- affects notes
Packit Service d2f85f
getDefaultExtensions _                 = extensionsFromList
Packit Service d2f85f
                                          [Ext_auto_identifiers]
Packit Service d2f85f
Packit Service d2f85f
-- | Parse a format-specifying string into a markup format and a function that
Packit Service d2f85f
-- takes Extensions and enables and disables extensions as defined in the format
Packit Service d2f85f
-- spec.
Packit Service d2f85f
parseFormatSpec :: String
Packit Service d2f85f
                -> Either ParseError (String, Extensions -> Extensions)
Packit Service d2f85f
parseFormatSpec = parse formatSpec ""
Packit Service d2f85f
  where formatSpec = do
Packit Service d2f85f
          name <- formatName
Packit Service d2f85f
          extMods <- many extMod
Packit Service d2f85f
          return (name, \x -> foldl (flip ($)) x extMods)
Packit Service d2f85f
        formatName = many1 $ noneOf "-+"
Packit Service d2f85f
        extMod = do
Packit Service d2f85f
          polarity <- oneOf "-+"
Packit Service d2f85f
          name <- many $ noneOf "-+"
Packit Service d2f85f
          ext <- case safeRead ("Ext_" ++ name) of
Packit Service d2f85f
                       Just n  -> return n
Packit Service d2f85f
                       Nothing
Packit Service d2f85f
                         | name == "lhs" -> return Ext_literate_haskell
Packit Service d2f85f
                         | otherwise -> fail $ "Unknown extension: " ++ name
Packit Service d2f85f
          return $ case polarity of
Packit Service d2f85f
                        '-' -> disableExtension ext
Packit Service d2f85f
                        _   -> enableExtension ext
Packit Service d2f85f
Packit Service d2f85f
$(deriveJSON defaultOptions ''Extension)