Skip to content

Instantly share code, notes, and snippets.

@lierdakil
Last active July 20, 2017 13:39
Show Gist options
  • Select an option

  • Save lierdakil/f4385e3957f39c8aa17b1ea478efb171 to your computer and use it in GitHub Desktop.

Select an option

Save lierdakil/f4385e3957f39c8aa17b1ea478efb171 to your computer and use it in GitHub Desktop.
Pandoc filter to make indexes
import Text.Pandoc
import Text.Pandoc.JSON
import Text.Pandoc.Builder
import Control.Monad.State
import qualified Data.Map as M
main :: IO ()
main = toJSONFilter go
where
go (Just (Format "latex")) p = bottomUp runLatex p
go _ (Pandoc meta body) = Pandoc meta $ runOther body
runLatex s@(Span (_id', cls, _props) val:xs)
| "index" `elem` cls = concat
[ [RawInline (Format "latex") "\\index{"]
, val
, [RawInline (Format "latex") "}"]
, xs
]
| otherwise = s
runLatex x = x
runOther :: [Block] -> [Block]
runOther body = addIndex $ evalState (bottomUpM makeIds body) (1 :: Integer)
addIndex :: [Block] -> [Block]
addIndex bs = bs ++ toList idx
where
idx = header 1 (str "Index") <> definitionList (cat $ queryWith getIdx bs)
makeIds s@(Span (_id', cls, props) val)
| "index" `elem` cls = do
curIdx <- get
put $ curIdx + 1
return $ Span ("index-id-no-" ++ show curIdx, cls, props) val
| otherwise = return s
makeIds x = return x
getIdx :: Inline -> [(Inlines, Inlines)]
getIdx (Span (id', cls, _props) val)
| "index" `elem` cls
= [(strong (fromList val), link ('#' : id') [] (str "idx"))]
| otherwise
= []
getIdx _ = []
cat = M.toList . M.map (return . plain) . M.fromListWith
(\x acc -> acc <> str "," <> space <> x)

[Lorem]{.index} ipsum dolor sit amet, consectetur [adipiscing]{.index} elit. Donec in porttitor massa, [vitae]{.index} semper justo. [Praesent]{.index} aliquet [vitae]{.index} justo in malesuada. Praesent et sem at orci posuere fringilla. Pellentesque in lorem tincidunt, semper velit sed, luctus nulla. Cras lorem justo, bibendum in fringilla in, cursus vel odio. Phasellus vestibulum aliquam congue. Ut aliquet elit id nisl porta, suscipit euismod augue gravida. Duis maximus velit ut convallis mattis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis porta, eros nec sodales malesuada, tellus eros porttitor justo, blandit viverra ante nibh vel ligula. Proin egestas turpis sit amet leo molestie, et venenatis purus maximus. Nunc ex enim, faucibus id metus a, venenatis venenatis neque. Phasellus in ultrices felis. Pellentesque iaculis aliquam odio eu finibus. Ut laoreet arcu id erat facilisis rhoncus. Donec eros mauris, porta id tortor ac, lobortis dictum risus.

Aenean elementum [velit]{.index} [vitae]{.index} tristique varius. Praesent et lectus commodo, efficitur massa non, egestas nisl. Suspendisse bibendum, diam et euismod maximus, neque nulla dictum sem, sed vestibulum lectus enim quis augue. Nulla dignissim tristique posuere. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras varius nibh mattis tortor pharetra tincidunt. Sed id lacus varius, pellentesque risus a, tempus orci. Curabitur eget urna sapien.

Aliquam congue imperdiet felis. Nullam gravida turpis a justo ullamcorper malesuada. Duis consectetur [cursus]{.index} enim. Maecenas enim lorem, elementum ac porttitor eu, cursus nec [orci]{.index}. Morbi sed rutrum ante. Mauris commodo, turpis a fringilla dignissim, libero nisl dictum ex, [vulputate]{.index} tristique augue lorem id enim. Aliquam ac tristique nulla. Nam nec posuere ex. Integer hendrerit cursus dictum. Class aptent taciti [sociosqu]{.index} ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris maximus dapibus leo in consequat.

[Lorem]{#index-id-no-1 .index} ipsum dolor sit amet, consectetur [adipiscing]{#index-id-no-2 .index} elit. Donec in porttitor massa, [vitae]{#index-id-no-3 .index} semper justo. [Praesent]{#index-id-no-4 .index} aliquet [vitae]{#index-id-no-5 .index} justo in malesuada. Praesent et sem at orci posuere fringilla. Pellentesque in lorem tincidunt, semper velit sed, luctus nulla. Cras lorem justo, bibendum in fringilla in, cursus vel odio. Phasellus vestibulum aliquam congue. Ut aliquet elit id nisl porta, suscipit euismod augue gravida. Duis maximus velit ut convallis mattis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis porta, eros nec sodales malesuada, tellus eros porttitor justo, blandit viverra ante nibh vel ligula. Proin egestas turpis sit amet leo molestie, et venenatis purus maximus. Nunc ex enim, faucibus id metus a, venenatis venenatis neque. Phasellus in ultrices felis. Pellentesque iaculis aliquam odio eu finibus. Ut laoreet arcu id erat facilisis rhoncus. Donec eros mauris, porta id tortor ac, lobortis dictum risus.

Aenean elementum [velit]{#index-id-no-6 .index} [vitae]{#index-id-no-7 .index} tristique varius. Praesent et lectus commodo, efficitur massa non, egestas nisl. Suspendisse bibendum, diam et euismod maximus, neque nulla dictum sem, sed vestibulum lectus enim quis augue. Nulla dignissim tristique posuere. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras varius nibh mattis tortor pharetra tincidunt. Sed id lacus varius, pellentesque risus a, tempus orci. Curabitur eget urna sapien.

Aliquam congue imperdiet felis. Nullam gravida turpis a justo ullamcorper malesuada. Duis consectetur [cursus]{#index-id-no-8 .index} enim. Maecenas enim lorem, elementum ac porttitor eu, cursus nec [orci]{#index-id-no-9 .index}. Morbi sed rutrum ante. Mauris commodo, turpis a fringilla dignissim, libero nisl dictum ex, [vulputate]{#index-id-no-10 .index} tristique augue lorem id enim. Aliquam ac tristique nulla. Nam nec posuere ex. Integer hendrerit cursus dictum. Class aptent taciti [sociosqu]{#index-id-no-11 .index} ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris maximus dapibus leo in consequat.

Index

Lorem : idx

Praesent : idx

adipiscing : idx

cursus : idx

orci : idx

sociosqu : idx

velit : idx

vitae : idx, idx, idx

vulputate : idx

\index{Lorem} ipsum dolor sit amet, consectetur \index{adipiscing} elit.
Donec in porttitor massa, \index{vitae} semper justo. \index{Praesent}
aliquet \index{vitae} justo in malesuada. Praesent et sem at orci
posuere fringilla. Pellentesque in lorem tincidunt, semper velit sed,
luctus nulla. Cras lorem justo, bibendum in fringilla in, cursus vel
odio. Phasellus vestibulum aliquam congue. Ut aliquet elit id nisl
porta, suscipit euismod augue gravida. Duis maximus velit ut convallis
mattis. Interdum et malesuada fames ac ante ipsum primis in faucibus.
Duis porta, eros nec sodales malesuada, tellus eros porttitor justo,
blandit viverra ante nibh vel ligula. Proin egestas turpis sit amet leo
molestie, et venenatis purus maximus. Nunc ex enim, faucibus id metus a,
venenatis venenatis neque. Phasellus in ultrices felis. Pellentesque
iaculis aliquam odio eu finibus. Ut laoreet arcu id erat facilisis
rhoncus. Donec eros mauris, porta id tortor ac, lobortis dictum risus.
Aenean elementum \index{velit} \index{vitae} tristique varius. Praesent
et lectus commodo, efficitur massa non, egestas nisl. Suspendisse
bibendum, diam et euismod maximus, neque nulla dictum sem, sed
vestibulum lectus enim quis augue. Nulla dignissim tristique posuere.
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
inceptos himenaeos. Cras varius nibh mattis tortor pharetra tincidunt.
Sed id lacus varius, pellentesque risus a, tempus orci. Curabitur eget
urna sapien.
Aliquam congue imperdiet felis. Nullam gravida turpis a justo
ullamcorper malesuada. Duis consectetur \index{cursus} enim. Maecenas
enim lorem, elementum ac porttitor eu, cursus nec \index{orci}. Morbi
sed rutrum ante. Mauris commodo, turpis a fringilla dignissim, libero
nisl dictum ex, \index{vulputate} tristique augue lorem id enim. Aliquam
ac tristique nulla. Nam nec posuere ex. Integer hendrerit cursus dictum.
Class aptent taciti \index{sociosqu} ad litora torquent per conubia
nostra, per inceptos himenaeos. Mauris maximus dapibus leo in consequat.
@puterleat
Copy link

Thanks! I'm new to Haskell, but have just discovered panflute so might have a bash converting to python

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment