2017-02-06 2 views
0
import Data.String.Conversions 
import Data.Maybe (isJust) 
import qualified Heist 
import qualified Heist.Interpreted as I 
import qualified Heist.Compiled as HeistCom 
import Heist.Internal.Types 
import qualified Text.XmlHtml as X 
import Data.List (sortBy) 
import Data.Map.Syntax 
import Data.ByteString.Builder (toLazyByteString) 

renderTemplate :: String -> (HeistState IO -> HeistState IO) -> ActionM() 
renderTemplate fileName hsBinding = do 
    let emptyI = return() :: MapSyntax Text (I.Splice IO) 
    let emptyC = return() :: MapSyntax Text (HeistCom.Splice IO) 
    let emptyA = return() :: MapSyntax Text (AttrSplice IO) 
    let spliceConfig = SpliceConfig emptyI emptyI emptyC emptyA [] (\_ -> False):: SpliceConfig IO 
    heist <- lift $ Heist.initHeist (HeistConfig spliceConfig "" True) 
    case heist of 
    Right heist' -> do 
     rendered <- lift $ I.renderTemplate (hsBinding heist') $ convertString fileName 
     case (rendered) of 
     Just (builder, _) -> do 
      lift $ print $ toLazyByteString builder 
     Nothing -> error "heist error" 
    Left a -> error . convertString $ show a 

Я вызываю функцию таким образом:Rendering шаблона Heist ничего не возвращает

renderTemplate "templates/compareForm" $ I.bindSplice "test" $ I.textSplice "abcxyz" 

Я предполагаю, что это делать с конфигурацией. Я не продумал эту конфигурацию.

К сожалению, приведенное выше просто порождает ошибку «ошибка heist» (вторая последняя строка). Так почему мой вопрос? Следующим шагом будет исследование функции Heist.Interpreted.renderTemplate.

+0

ли 'renderTemplate' работу с очень простым шаблоном без какого-либо сращивания (может быть, даже просто' ') и' id' для '(HeistState IO -> HeistState IO) 'функция? – Libby

+0

Тот же результат с приведенными выше предложениями. –

ответ

1

Наконец понял это ... мне нужно, чтобы указать местоположение шаблона ...

renderTemplate :: String -> (HeistState IO -> HeistState IO) -> ActionM() 
renderTemplate fileName hsBinding = do 
    let emptyI = return() :: MapSyntax Text (I.Splice IO) 
    let emptyC = return() :: MapSyntax Text (HeistCom.Splice IO) 
    let emptyA = return() :: MapSyntax Text (AttrSplice IO) 
    let templateLocations = [Heist.loadTemplates "templates/"] 
    let spliceConfig = SpliceConfig emptyI emptyI emptyC emptyA templateLocations (\_ -> False):: SpliceConfig IO 
    heist <- lift $ Heist.initHeist (HeistConfig spliceConfig "" True) 
    case heist of 
    Right heist' -> do 
     rendered <- lift $ I.renderTemplate (hsBinding heist') $ convertString fileName 
     case (rendered) of 
     Just (builder, _) -> do 
      html . convertString $ toLazyByteString builder 
     Nothing -> error "heist error" 
    Left a -> error . convertString $ show a 

И рендер путь не должен быть указан в каталоге:

renderTemplate "compareForm" $ I.bindSplice "test" $ I.textSplice "abcxyz" 

выше, возможно, не работа для скомпилированных шаблонов, возможно, потребуется изменить эту строку (возможно, (\_ -> False): let spliceConfig = SpliceConfig emptyI emptyI emptyC emptyA templateLocations (\_ -> False):: SpliceConfig IO

потенциальные последствия с производительностью выше, см https://github.com/snapframework/heist/issues/102

Смежные вопросы