@@ -29,6 +29,12 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2929Data structures and functions for representing markup extensions.
3030-}
3131module Text.Pandoc.Extensions ( Extension(..)
32+ , Extensions
33+ , emptyExtensions
34+ , extensionsFromList
35+ , extensionEnabled
36+ , enableExtension
37+ , disableExtension
3238 , pandocExtensions
3339 , plainExtensions
3440 , strictExtensions
@@ -36,15 +42,29 @@ module Text.Pandoc.Extensions ( Extension(..)
3642 , githubMarkdownExtensions
3743 , multimarkdownExtensions )
3844where
39−import Data.LargeWord (Word256)
40−import Data.Bits ()
41−import Data.Set (Set)
42−import qualified Data.Set as Set
45+import Data.Word (Word64)
46+import Data.Bits (testBit, setBit, clearBit)
4347import Data.Data (Data)
4448import Data.Typeable (Typeable)
4549import GHC.Generics (Generic)
4650
47−newtype Extensions = Extensions { unExtensions :: Word256 }
51+newtype Extensions = Extensions Word64
52+ deriving (Show, Read, Eq, Ord, Bounded, Data, Typeable, Generic)
53+
54+extensionsFromList :: [Extension] -> Extensions
55+extensionsFromList = foldr enableExtension emptyExtensions
56+
57+emptyExtensions :: Extensions
58+emptyExtensions = Extensions 0
59+
60+extensionEnabled :: Extension -> Extensions -> Bool
61+extensionEnabled x (Extensions exts) = testBit exts (fromEnum x)
62+
63+enableExtension :: Extension -> Extensions -> Extensions
64+enableExtension x (Extensions exts) = Extensions (setBit exts (fromEnum x))
65+
66+disableExtension :: Extension -> Extensions -> Extensions
67+disableExtension x (Extensions exts) = Extensions (clearBit exts (fromEnum x))
4868
4969-- | Individually selectable syntax extensions.
5070data Extension =
@@ -112,8 +132,8 @@ data Extension =
112132 | Ext_shortcut_reference_links -- ^ Shortcut reference links
113133 deriving (Show, Read, Enum, Eq, Ord, Bounded, Data, Typeable, Generic)
114134
115−pandocExtensions :: Set Extension
116−pandocExtensions = Set.fromList
135+pandocExtensions :: Extensions
136+pandocExtensions = extensionsFromList
117137 [ Ext_footnotes
118138 , Ext_inline_notes
119139 , Ext_pandoc_title_block
@@ -157,8 +177,8 @@ pandocExtensions = Set.fromList
157177 , Ext_shortcut_reference_links
158178 ]
159179
160−plainExtensions :: Set Extension
161−plainExtensions = Set.fromList
180+plainExtensions :: Extensions
181+plainExtensions = extensionsFromList
162182 [ Ext_table_captions
163183 , Ext_implicit_figures
164184 , Ext_simple_tables
@@ -175,8 +195,8 @@ plainExtensions = Set.fromList
175195 , Ext_strikeout
176196 ]
177197
178−phpMarkdownExtraExtensions :: Set Extension
179−phpMarkdownExtraExtensions = Set.fromList
198+phpMarkdownExtraExtensions :: Extensions
199+phpMarkdownExtraExtensions = extensionsFromList
180200 [ Ext_footnotes
181201 , Ext_pipe_tables
182202 , Ext_raw_html
@@ -190,8 +210,8 @@ phpMarkdownExtraExtensions = Set.fromList
190210 , Ext_shortcut_reference_links
191211 ]
192212
193−githubMarkdownExtensions :: Set Extension
194−githubMarkdownExtensions = Set.fromList
213+githubMarkdownExtensions :: Extensions
214+githubMarkdownExtensions = extensionsFromList
195215 [ Ext_angle_brackets_escapable
196216 , Ext_pipe_tables
197217 , Ext_raw_html
@@ -208,8 +228,8 @@ githubMarkdownExtensions = Set.fromList
208228 , Ext_shortcut_reference_links
209229 ]
210230
211−multimarkdownExtensions :: Set Extension
212−multimarkdownExtensions = Set.fromList
231+multimarkdownExtensions :: Extensions
232+multimarkdownExtensions = extensionsFromList
213233 [ Ext_pipe_tables
214234 , Ext_raw_html
215235 , Ext_markdown_attribute
@@ -237,8 +257,8 @@ multimarkdownExtensions = Set.fromList
237257 , Ext_subscript
238258 ]
239259
240−strictExtensions :: Set Extension
241−strictExtensions = Set.fromList
260+strictExtensions :: Extensions
261+strictExtensions = extensionsFromList
242262 [ Ext_raw_html
243263 , Ext_shortcut_reference_links
244264 ]