commonmark-pandoc 0.3 → 0.3.0.1
raw patch · 3 files changed
+40/−24 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- changelog.md +23/−0
- commonmark-pandoc.cabal +1/−1
- src/Commonmark/Pandoc.hs +16/−23
changelog.md view
@@ -1,5 +1,28 @@ # Changelog for commonmark-pandoc +## 0.3.0.1++ * keep task-list checkbox attached under source positions.+ With sourcepos enabled, an item's first Plain/Para has already been+ wrapped in a Div (wrapper="1") by addBlockAttrs before taskList runs,+ so toTaskListItem's Plain/Para patterns never matched and the+ checkbox was emitted as a separate Plain block preceding the item+ contents. Recognize the wrapper Div and insert the checkbox into+ the Plain/Para inside it.++ * Use B.text for resolved entities. B.str put whitespace inside Str+ nodes for entities like   and , violating pandoc AST+ conventions; B.text produces proper Space/SoftBreak elements.++ * Remove redundant illegalCodePoint check.++ * Don't duplicate classes and keys in `addToPandocAttr`.+ Matches the HTML backend's incorporateAttribute, which never+ produces duplicate classes or attribute keys.++ * Make the wrapper `data-pos` suppression robust. Don't rely on the+ wrapper marker being the first entry in the key-value list.+ ## 0.3 * Define Applicative instances of IsBlock, IsInline etc.
commonmark-pandoc.cabal view
@@ -1,5 +1,5 @@ name: commonmark-pandoc-version: 0.3+version: 0.3.0.1 synopsis: Bridge between commonmark and pandoc AST. description: This library provides typeclasses for rendering commonmark to Pandoc types.
src/Commonmark/Pandoc.hs view
@@ -15,7 +15,6 @@ import Data.Maybe (fromMaybe) import qualified Data.Text as T-import qualified Data.Text.Read as TR import Text.Pandoc.Definition import Text.Pandoc.Walk import qualified Text.Pandoc.Builder as B@@ -47,9 +46,7 @@ lineBreak = Cm B.linebreak softBreak = Cm B.softbreak str t = Cm $ B.text t- entity t- | illegalCodePoint t = Cm $ B.str "\xFFFD"- | otherwise = Cm $ B.str $ fromMaybe t $ lookupEntity (T.drop 1 t)+ entity t = Cm $ B.text $ fromMaybe t $ lookupEntity (T.drop 1 t) escapedChar c = Cm $ B.str $ T.singleton c emph ils = B.emph <$> ils strong ils = B.strong <$> ils@@ -172,8 +169,15 @@ case B.toList $ coerce item of (Plain ils : rest) -> Plain (checkbox : Space : ils) : rest (Para ils : rest) -> Para (checkbox : Space : ils) : rest+ -- with source positions, the item's first block has been wrapped+ -- in a Div by addBlockAttrs; insert the checkbox inside it:+ (Div attr (Plain ils : ds) : rest) | isWrapperAttr attr+ -> Div attr (Plain (checkbox : Space : ils) : ds) : rest+ (Div attr (Para ils : ds) : rest) | isWrapperAttr attr+ -> Div attr (Para (checkbox : Space : ils) : ds) : rest bs -> Plain [checkbox] : bs where checkbox = Str (if checked then "\9746" else "\9744")+ isWrapperAttr (_,_,kvs) = lookup "wrapper" kvs == Just "1" instance Rangeable (Cm a B.Blocks) => HasDiv (Cm a B.Blocks) where@@ -224,34 +228,23 @@ addToPandocAttr :: Attributes -> Attr -> Attr -- avoid adding spurious extra data-pos to wrapper div (#159):-addToPandocAttr [("data-pos", _)] attrs@(_,_,("wrapper","1"):_) = attrs+addToPandocAttr [("data-pos", _)] attrs@(_, _, kvs)+ | lookup "wrapper" kvs == Just "1" = attrs addToPandocAttr attrs attr = foldr go attr attrs where go ("id", v) (_, cls, kvs) = (v, cls, kvs)- go ("class", v) (ident, cls, kvs) = (ident, v:cls, kvs)- go (k, v) (ident, cls, kvs) = (ident, cls, (k,v):kvs)+ go ("class", v) (ident, cls, kvs)+ | v `elem` cls = (ident, cls, kvs)+ | otherwise = (ident, v:cls, kvs)+ go (k, v) (ident, cls, kvs)+ | k `elem` map fst kvs = (ident, cls, kvs)+ | otherwise = (ident, cls, (k,v):kvs) instance (Rangeable (Cm a B.Inlines), Rangeable (Cm a B.Blocks)) => HasFootnote (Cm a B.Inlines) (Cm a B.Blocks) where footnote _num _lab _x = mempty footnoteList _xs = mempty footnoteRef _num _lab contents = B.note . walk deNote <$> contents--illegalCodePoint :: T.Text -> Bool-illegalCodePoint t =- "&#" `T.isPrefixOf` t &&- let t' = T.drop 2 $ T.filter (/=';') t- badvalue (n, r) = not (T.null r) ||- n < 1 ||- n > (0x10FFFF :: Integer)- in- case T.uncons t' of- Nothing -> True- Just (x, rest)- | x == 'x' || x == 'X'- -> either (const True) badvalue (TR.hexadecimal rest)- | otherwise- -> either (const True) badvalue (TR.decimal t') stringify :: Walkable Inline a => a -> T.Text stringify = query go . walk (deNote . deQuote)