packages feed

expand-0.0.1: src/Document/Semantics/Html.hs

{-# LANGUAGE TemplateHaskell, EmptyDataDecls, NoMonomorphismRestriction #-}
module Document.Semantics.Html where

import Control.Monad

import Data.HList.Label4
import Data.HList.TypeEqGeneric1
import Data.HList.TypeCastGeneric1

import Language.Grammars.AspectAG
import Language.Grammars.AspectAG.Derive

import Document.Decl

$(attLabels ["html"])

-- Document production
document_html = syn html $
    do blocks <- at ch_blocks
       return $ blocks # html



-- Blocks productions
blockLnil_html = syn html $ return ""

blockLcons_html = syn html $
    do block  <- at ch_hd_BlockL_Cons
       blocks <- at ch_tl_BlockL_Cons
       return $ block # html ++ blocks # html


--blockLcons_html = use html (nt_BlockL .*. HNil) (++) ""

-- Block productions
header_html = syn html $
    do level  <- at ch_level_header
       inls   <- at ch_inlines_header
       return $ "<h" ++ show level ++ ">" 
                 ++ inls # html
                 ++ "</h" ++ show level ++ ">"
                 ++ "\n"

paragraph_html = syn html $
    do inls <- at ch_inlines_par
       return $ "<p>" 
              ++ inls # html
              ++ "</p>"
              ++ "\n"



-- Inline productions

inlineLnil_html = syn html $ return ""
inlineLcons_html = syn html $
    do inl  <- at ch_hd_InlineL_Cons
       inls <- at ch_tl_InlineL_Cons
       return $ inl # html ++ inls # html


plain_html = syn html $ at ch_str_plainInl


bold_html  = syn html $ 
                    do inls <- at ch_inlines_boldInl
                       return $ "<b>" 
                              ++ inls # html 
                              ++ "</b>"

italics_html  = syn html $ 
                    do inls <- at ch_inlines_italInl
                       return $ "<i>" 
                              ++ inls # html
                              ++ "</i>"




-----------------------
-- building the record

{- 
aspDocument     = document_html
aspBlockL_Nil   = blockLnil_html
aspBlockL_Cons  = blockLcons_html
aspHeader       = header_html
aspParagraph    = paragraph_html
aspInlineL_Nil  = inlineLnil_html
aspInlineL_Cons = inlineLcons_html
aspPlain        = plain_html
aspBold         = bold_html
aspItalics      = italics_html
-}
semHtml = mkDoc' blockLcons_html blockLnil_html bold_html
                 document_html header_html inlineLcons_html inlineLnil_html
                 italics_html paragraph_html plain_html


-- slightly edited mkDoc (from TH splice)
mkDoc'
      _BlockL_Cons
      _BlockL_Nil
      _Bold
      _Document
      _Header
      _InlineL_Cons
      _InlineL_Nil
      _Italics
      _Paragraph
      _Plain
      = DocSF
          {pBlockL_Cons = semP_BlockL_Cons _BlockL_Cons,
           pBlockL_Nil = semP_BlockL_Nil _BlockL_Nil, pBold = semP_Bold _Bold,
           pDocument = semP_Document _Document, pHeader = semP_Header _Header . sem_Lit,
           pInlineL_Cons = semP_InlineL_Cons _InlineL_Cons,
           pInlineL_Nil = semP_InlineL_Nil _InlineL_Nil,
           pItalics = semP_Italics _Italics,
           pParagraph = semP_Paragraph _Paragraph, pPlain = semP_Plain _Plain . sem_Lit}



{- -- OLD, not extensible
semHtmlNotExtensible :: Document -> String
semHtmlNotExtensible doc = sem_Document asp_html doc () # html




------------------------------------------
-- Initial aspect html (synthesized html)
------------------------------------------

-- The aspect is a heterogenous list of pairs of production and rule
asp_html =  (p_Document     .=. document_html) 
         .*. (p_BlockL_Nil   .=. blockLnil_html)
         .*. (p_BlockL_Cons  .=. blockLcons_html)
         .*. (p_Header       .=. header_html) 
         .*. (p_Paragraph    .=. paragraph_html)
         .*. (p_InlineL_Nil  .=. inlineLnil_html)
         .*. (p_InlineL_Cons .=. inlineLcons_html)
         .*. (p_Plain        .=. plain_html)
         .*. (p_Bold         .=. bold_html) 
         .*. (p_Italics      .=. italics_html)
         .*. emptyRecord
-}