{-# LANGUAGE TemplateHaskell, EmptyDataDecls, NoMonomorphismRestriction #-} module Toc.Semantics.Toc where import Data.HList.Label4 import Data.HList.TypeEqGeneric1 import Data.HList.TypeCastGeneric1 import Language.Grammars.AspectAG import Language.Grammars.AspectAG.Derive import Document.Decl import Document.Semantics.NumberedHeaders $(attLabels ["sToc", "toc", "sInlStr"]) -- Inline string (ignores bold/italics formatting) sInlStr_NTs = nt_InlineL .*. nt_Inline .*. HNil default_sInlStr = use sInlStr sInlStr_NTs (++) "" plain_sInlStr = syn sInlStr $ do str <- at ch_str_plainInl return $ str bold_sInlStr = syn sInlStr $ do inl <- at ch_inlines_boldInl return (inl # sInlStr) italics_sInlStr = syn sInlStr $ do inl <- at ch_inlines_italInl return (inl # sInlStr) -- Synthesized TOC sToc_NTs = nt_Block .*. nt_BlockL .*. HNil default_sToc = use sToc sToc_NTs (++) [] header_sToc = syn sToc $ do loc <- at loc inls <- at ch_inlines_header return [(loc # headerNum, inls # sInlStr)] -- Inherited TOC toc_NTs = nt_Block .*. nt_BlockL .*. HNil document_toc = inh toc toc_NTs $ do bls <- at ch_blocks return $ (ch_blocks .=. bls # sToc) .*. emptyRecord default_toc = copy toc toc_NTs