pandoc-link-context (empty) → 1.0.0.0
raw patch · 5 files changed
+130/−0 lines, 5 filesdep +basedep +containersdep +pandoc-typessetup-changed
Dependencies added: base, containers, pandoc-types, relude, text
Files
- CHANGELOG.md +5/−0
- LICENSE +30/−0
- Setup.hs +2/−0
- pandoc-link-context.cabal +41/−0
- src/Text/Pandoc/LinkContext.hs +52/−0
+ CHANGELOG.md view
@@ -0,0 +1,5 @@+# Revision history for pandoc-link-context++## 1.0.0.0++* First version. Released on an unsuspecting world.
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2020, Sridhar Ratnakumar++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Sridhar Ratnakumar nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ pandoc-link-context.cabal view
@@ -0,0 +1,41 @@+cabal-version: 2.2+name: pandoc-link-context+version: 1.0.0.0+synopsis: Extract "contextual links" from Pandoc+description: A library to pull out all links with their surrounding context in your Pandoc documents. Useful for software dealing with wiki-links and Zettelkasten.+category: Text+license: BSD-3-Clause+license-file: LICENSE+author: Sridhar Ratnakumar+maintainer: srid@srid.ca+build-type: Simple+extra-source-files: CHANGELOG.md++library+ default-language: Haskell2010+ hs-source-dirs: src+ exposed-modules: Text.Pandoc.LinkContext+ build-depends:+ base >=4.12 && < 4.15+ , containers+ , pandoc-types+ , relude >=0.7.0.0+ , text++ mixins:+ base hiding (Prelude),+ relude (Relude as Prelude, Relude.Extra)++ default-extensions:+ FlexibleContexts+ FlexibleInstances+ LambdaCase+ OverloadedStrings+ RecordWildCards+ ScopedTypeVariables+ TupleSections+ TypeApplications+ ViewPatterns++ ghc-options:+ -Wall -Wincomplete-record-updates -Wincomplete-uni-patterns
+ src/Text/Pandoc/LinkContext.hs view
@@ -0,0 +1,52 @@+module Text.Pandoc.LinkContext (queryLinksWithContext) where++import Data.List (nub)+import qualified Data.Map.Strict as Map+import qualified Text.Pandoc.Builder as B+import Text.Pandoc.Definition (Block, Inline (Link), Pandoc (..))+import qualified Text.Pandoc.Walk as W++type Url = Text++-- | Query the pandoc document for all links+--+-- Return a map, containing the "surrounding context" (as Pandoc blocks) for+-- each link.+queryLinksWithContext :: Pandoc -> Map Url [Block]+queryLinksWithContext =+ fmap nub+ . Map.fromListWith (<>)+ . fmap (second one)+ . W.query go+ where+ go :: Block -> [(Url, Block)]+ go blk =+ fmap (,blk) $ case blk of+ B.Para is ->+ queryLinkUrls is+ B.Plain is ->+ queryLinkUrls is+ B.LineBlock is ->+ queryLinkUrls is+ B.Header _ _ is ->+ queryLinkUrls is+ B.DefinitionList xs ->+ -- Gather all filenames linked, and have them put (see above) in the+ -- same definition list block.+ concat $+ xs <&> \(is, bss) ->+ let def = queryLinkUrls is+ body = fmap (fmap (fmap fst . go)) bss+ in def <> concat (concat body)+ _ -> mempty++ queryLinkUrls :: W.Walkable Inline b => b -> [Url]+ queryLinkUrls =+ W.query (maybeToList . getLinkUrl)++ getLinkUrl :: Inline -> Maybe Url+ getLinkUrl = \case+ Link _attr _inlines (url, _title) -> do+ pure url+ _ ->+ Nothing