packages feed

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 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>"   , "&lt;xmp>\n" ~=? commonmarkToHtml [] [extTagfilter] "<xmp>"   ]