cmark-gfm 0.1.0 → 0.1.1
raw patch · 6 files changed
+43/−37 lines, 6 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- CMarkGFM: Center :: TableCellAlignment
- CMarkGFM: Left :: TableCellAlignment
- CMarkGFM: None :: TableCellAlignment
- CMarkGFM: Right :: TableCellAlignment
- CMarkGFM: registerPlugins :: IO ()
+ CMarkGFM: CenterAligned :: TableCellAlignment
+ CMarkGFM: LeftAligned :: TableCellAlignment
+ CMarkGFM: NoAlignment :: TableCellAlignment
+ CMarkGFM: RightAligned :: TableCellAlignment
Files
- CMarkGFM.hsc +28/−31
- cbits/cmark_export.h +1/−1
- cbits/core-extensions.c +11/−1
- cbits/core-extensions.h +1/−1
- cmark-gfm.cabal +1/−1
- test/test-cmark.hs +1/−2
CMarkGFM.hsc view
@@ -7,7 +7,6 @@ , commonmarkToMan , commonmarkToLaTeX , commonmarkToNode- , registerPlugins , nodeToHtml , nodeToXml , nodeToMan@@ -42,7 +41,6 @@ import qualified System.IO.Unsafe as Unsafe import Data.Maybe (fromMaybe) import GHC.Generics (Generic)-import Data.Maybe (catMaybes) import Data.Data (Data) import Data.Typeable (Typeable) import Data.Text (Text, empty)@@ -54,9 +52,9 @@ #include <cmark.h> #include <core-extensions.h> --- | Register core extensions. This should be done once at program start.-registerPlugins :: IO ()-registerPlugins = c_cmark_register_plugin c_core_extensions_registration+-- | Ensure core extensions are registered.+ensurePluginsRegistered :: IO ()+ensurePluginsRegistered = c_core_extensions_ensure_registered -- | Frees a cmark linked list, produced by extsToLlist. freeLlist :: LlistPtr a -> IO ()@@ -71,21 +69,26 @@ t' <- extsToLlist t c_cmark_llist_append c_CMARK_DEFAULT_MEM_ALLOCATOR t' (castPtr h) --- | Resolves a CMarkExtension to its pointer.-resolveExt :: CMarkExtension -> IO (Maybe ExtensionPtr)-resolveExt e = do- p <- withCString (unCMarkExtension e) c_cmark_find_syntax_extension- return (if p == nullPtr then Nothing else Just p)+-- | Resolves CMarkExtensions to pointers.+resolveExts :: [CMarkExtension] -> IO [ExtensionPtr]+resolveExts exts = do+ ensurePluginsRegistered+ mapM resolveExt exts+ where resolveExt ext = do p <- withCString (unCMarkExtension ext) c_cmark_find_syntax_extension+ if p == nullPtr then+ fail $ "could not load extension " ++ unCMarkExtension ext+ else+ return p -- | Convert CommonMark formatted text to Html, using cmark's -- built-in renderer. commonmarkToHtml :: [CMarkOption] -> [CMarkExtension] -> Text -> Text commonmarkToHtml opts exts = commonmarkToX render_html opts exts Nothing- where exts' = Unsafe.unsafePerformIO $ fmap catMaybes $ mapM resolveExt exts- render_html n o _ = Unsafe.unsafePerformIO $ do+ where exts' = Unsafe.unsafePerformIO $ resolveExts exts+ render_html n o _ = do llist <- extsToLlist exts'- let r = c_cmark_render_html n o llist+ r <- c_cmark_render_html n o llist freeLlist llist return r @@ -109,7 +112,7 @@ -- which can be transformed or rendered using Haskell code. commonmarkToNode :: [CMarkOption] -> [CMarkExtension] -> Text -> Node commonmarkToNode opts exts s = Unsafe.unsafePerformIO $ do- exts' <- fmap catMaybes $ mapM resolveExt exts+ exts' <- resolveExts exts parser <- c_cmark_parser_new (combineOptions opts) mapM_ (c_cmark_parser_attach_syntax_extension parser) exts' TF.withCStringLen s $! \(ptr, len) ->@@ -122,10 +125,10 @@ nodeToHtml :: [CMarkOption] -> [CMarkExtension] -> Node -> Text nodeToHtml opts exts = nodeToX render_html opts Nothing- where exts' = Unsafe.unsafePerformIO $ fmap catMaybes $ mapM resolveExt exts- render_html n o _ = Unsafe.unsafePerformIO $ do+ where exts' = Unsafe.unsafePerformIO $ resolveExts exts+ render_html n o _ = do llist <- extsToLlist exts'- let r = c_cmark_render_html n o llist+ r <- c_cmark_render_html n o llist freeLlist llist return r @@ -161,7 +164,7 @@ commonmarkToX renderer opts exts mbWidth s = Unsafe.unsafePerformIO $ TF.withCStringLen s $ \(ptr, len) -> do let opts' = combineOptions opts- exts' <- fmap catMaybes $ mapM resolveExt exts+ exts' <- resolveExts exts parser <- c_cmark_parser_new opts' mapM_ (c_cmark_parser_attach_syntax_extension parser) exts' c_cmark_parser_feed parser ptr len@@ -185,9 +188,6 @@ data MemPhantom type MemPtr = Ptr MemPhantom -data PluginPhantom-type PluginPtr = Ptr PluginPhantom- data ExtensionPhantom type ExtensionPtr = Ptr ExtensionPhantom @@ -223,7 +223,7 @@ type OnExit = Text -data TableCellAlignment = None | Left | Center | Right+data TableCellAlignment = NoAlignment | LeftAligned | CenterAligned | RightAligned deriving (Show, Read, Eq, Ord, Typeable, Data, Generic) data NodeType =@@ -380,10 +380,10 @@ ncols <- c_cmarkextensions_get_table_columns ptr cols <- c_cmarkextensions_get_table_alignments ptr mapM (fmap ucharToAlignment . peekElemOff cols) [0..(fromIntegral ncols) - 1]- ucharToAlignment (CUChar 108) = CMarkGFM.Left- ucharToAlignment (CUChar 99) = CMarkGFM.Center- ucharToAlignment (CUChar 114) = CMarkGFM.Right- ucharToAlignment _ = None+ ucharToAlignment (CUChar 108) = LeftAligned+ ucharToAlignment (CUChar 99) = CenterAligned+ ucharToAlignment (CUChar 114) = RightAligned+ ucharToAlignment _ = NoAlignment getPosInfo :: NodePtr -> IO (Maybe PosInfo) getPosInfo ptr = do@@ -621,11 +621,8 @@ foreign import ccall "cmark.h &cmark_node_free" c_cmark_node_free :: FunPtr (NodePtr -> IO ()) -foreign import ccall "registry.h cmark_register_plugin"- c_cmark_register_plugin :: FunPtr (PluginPtr -> IO Int) -> IO ()--foreign import ccall "core-extensions.h &core_extensions_registration"- c_core_extensions_registration :: FunPtr (PluginPtr -> IO Int)+foreign import ccall "core-extensions.h core_extensions_ensure_registered"+ c_core_extensions_ensure_registered :: IO () foreign import ccall "cmark_extension_api.h cmark_find_syntax_extension" c_cmark_find_syntax_extension :: CString -> IO ExtensionPtr
cbits/cmark_export.h view
@@ -7,7 +7,7 @@ # define CMARK_NO_EXPORT #else # ifndef CMARK_EXPORT-# ifdef libcmark_EXPORTS+# ifdef libcmark_gfm_EXPORTS /* We are building this library */ # define CMARK_EXPORT __attribute__((visibility("default"))) # else
cbits/core-extensions.c view
@@ -3,12 +3,22 @@ #include "strikethrough.h" #include "table.h" #include "tagfilter.h"+#include "registry.h" -int core_extensions_registration(cmark_plugin *plugin) {+static int core_extensions_registration(cmark_plugin *plugin) { cmark_plugin_register_syntax_extension(plugin, create_table_extension()); cmark_plugin_register_syntax_extension(plugin, create_strikethrough_extension()); cmark_plugin_register_syntax_extension(plugin, create_autolink_extension()); cmark_plugin_register_syntax_extension(plugin, create_tagfilter_extension()); return 1;+}++void core_extensions_ensure_registered(void) {+ static int registered = 0;++ if (!registered) {+ cmark_register_plugin(core_extensions_registration);+ registered = 1;+ } }
cbits/core-extensions.h view
@@ -9,7 +9,7 @@ #include "cmarkextensions_export.h" CMARKEXTENSIONS_EXPORT-int core_extensions_registration(cmark_plugin *plugin);+void core_extensions_ensure_registered(void); CMARKEXTENSIONS_EXPORT uint16_t cmarkextensions_get_table_columns(cmark_node *node);
cmark-gfm.cabal view
@@ -1,5 +1,5 @@ name: cmark-gfm-version: 0.1.0+version: 0.1.1 synopsis: Fast, accurate GitHub Flavored Markdown parser and renderer description: This package provides Haskell bindings for
test/test-cmark.hs view
@@ -7,7 +7,6 @@ main :: IO () main = do- registerPlugins counts' <- runTestTT tests case (errors counts' + failures counts') of 0 -> exitWith ExitSuccess@@ -30,7 +29,7 @@ , "<p><a href=\"http://www.google.com\">www.google.com</a></p>\n" ~=? commonmarkToHtml [] [extAutolink] "www.google.com" , "<p>| a |\n| --- |\n| b |</p>\n" ~=? commonmarkToHtml [] [] "| a |\n| --- |\n| b |\n" , "<table>\n<thead>\n<tr>\n<th>a</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>b</td>\n</tr></tbody></table>\n" ~=? commonmarkToHtml [] [extTable] "| a |\n| --- |\n| b |\n"- , (Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 3, endColumn = 17})) DOCUMENT [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 3, endColumn = 17})) (TABLE [CMarkGFM.Left,Center,None,CMarkGFM.Right]) [Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_ROW [Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "a") []],Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "b") []],Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "c") []],Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "d") []]],Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 17})) TABLE_ROW [Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "y") []],Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "o") []],Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "s") []],Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "h") []]]]]) ~=? commonmarkToNode [] [extTable] "| a | b | c | d |\n| :-- | :-: | --- | --: |\n| y | o | s | h |"+ , (Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 3, endColumn = 17})) DOCUMENT [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 3, endColumn = 17})) (TABLE [LeftAligned,CenterAligned,NoAlignment,RightAligned]) [Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_ROW [Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "a") []],Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "b") []],Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "c") []],Node (Just (PosInfo {startLine = 2, startColumn = 0, endLine = 2, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "d") []]],Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 17})) TABLE_ROW [Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "y") []],Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "o") []],Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "s") []],Node (Just (PosInfo {startLine = 3, startColumn = 0, endLine = 3, endColumn = 0})) TABLE_CELL [Node Nothing (TEXT "h") []]]]]) ~=? commonmarkToNode [] [extTable] "| a | b | c | d |\n| :-- | :-: | --- | --: |\n| y | o | s | h |" , "<xmp>\n" ~=? commonmarkToHtml [] [] "<xmp>" , "<xmp>\n" ~=? commonmarkToHtml [] [extTagfilter] "<xmp>" ]