@ -0,0 +1,2 @@ | |||
/.stack-work | |||
/agda-reference-filter |
@ -0,0 +1,30 @@ | |||
Copyright Abigail Magalhães (c) 2021 | |||
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 Abigail Magalhães 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. |
@ -0,0 +1,12 @@ | |||
# agda-reference-filter | |||
A Pandoc filter for linking Agda identifiers in inline code blocks. | |||
## Usage | |||
Compile your literate Agda file to Markdown (use `--html-highlight=auto`), then `pandoc --filter agda-reference-filter -i output.md -o output.html` to compile the Markdown to HTML. Inline code spans that are exactly the same as an identifier present in the raw HTML emitted by Agda (that is - either a definition or a reference) will be linked to the same place that Agda linked that identifier to. | |||
```bash | |||
agda --html-highlight=auto --html example.lagda.md | |||
pandoc --filter agda-reference-filter -i example.md -o example.html | |||
``` |
@ -0,0 +1,2 @@ | |||
import Distribution.Simple | |||
main = defaultMain |
@ -0,0 +1,13 @@ | |||
cabal-version: 2.2 | |||
name: agda-reference-filter | |||
version: 0.1.0.0 | |||
executable agda-reference-filter | |||
hs-source-dirs: src | |||
main-is: Main.hs | |||
default-language: Haskell2010 | |||
build-depends: base >= 4.7 && < 5 | |||
, tagsoup | |||
, pandoc-types | |||
, unordered-containers | |||
, text |
@ -0,0 +1,6 @@ | |||
This is a literate Agda file. This span - `span` - will be linked to the record below: | |||
```agda | |||
record span : Set where | |||
constructor hey-look | |||
``` |
@ -0,0 +1,2 @@ | |||
cradle: | |||
stack: |
@ -0,0 +1,47 @@ | |||
{-# LANGUAGE OverloadedStrings #-} | |||
module Main where | |||
import qualified Data.HashMap.Strict as HashMap | |||
import Data.HashMap.Strict (HashMap) | |||
import qualified Data.Text as T | |||
import Data.Text (Text) | |||
import Data.Maybe | |||
import Data.List | |||
import System.Environment | |||
import System.Exit | |||
import Text.Pandoc.Definition | |||
import Text.HTML.TagSoup | |||
import Text.Pandoc.Walk | |||
import Text.Pandoc.JSON | |||
main :: IO () | |||
main = toJSONFilter linkDocument | |||
linkDocument :: Pandoc -> Pandoc | |||
linkDocument (Pandoc meta blocks) = | |||
let hm = parseSymbolRefs blocks | |||
in Pandoc meta (walk (link hm) blocks) | |||
link :: HashMap Text Text -> Inline -> Inline | |||
link hm (Code attrs xs) | |||
| Just sp <- HashMap.lookup xs hm = RawInline (Format "html") sp | |||
link _ x = x | |||
parseSymbolRefs :: [Block] -> HashMap Text Text | |||
parseSymbolRefs = go mempty . concat . mapMaybe getHTML where | |||
getHTML (RawBlock (Format x) xs) | |||
| x == "html" = Just (parseTags (T.unpack xs)) | |||
getHTML _ = Nothing | |||
go map (TagOpen "a" meta:TagText t:TagClose "a":xs) | |||
| Just id <- lookup "id" meta, Just cls <- lookup "class" meta | |||
= go (HashMap.insert (T.pack t) (T.pack (renderTags tags)) map) xs | |||
| otherwise = go map xs | |||
where | |||
tags = [ TagOpen "span" [("class", "Agda")], TagOpen "a" meta', TagText t, TagClose "a", TagClose "span" ] | |||
meta' = filter ((/= "id") . fst) meta | |||
go map (_:xs) = go map xs | |||
go map [] = map |
@ -0,0 +1,5 @@ | |||
resolver: | |||
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/13.yaml | |||
packages: | |||
- . |
@ -0,0 +1,13 @@ | |||
# This file was autogenerated by Stack. | |||
# You should not edit this file by hand. | |||
# For more information, please see the documentation at: | |||
# https://docs.haskellstack.org/en/stable/lock_files | |||
packages: [] | |||
snapshots: | |||
- completed: | |||
size: 586268 | |||
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/13.yaml | |||
sha256: d9e658a22cfe8d87a64fdf219885f942fef5fe2bcb156a9800174911c5da2443 | |||
original: | |||
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/13.yaml |