2013-04-07 2 views
6

Я хочу изменить следующий код, чтобы вместо создания ссылок на последние три сообщения на сайте он воспроизводил тело сообщений полностью, как в традиционном блоге. Мне немного сложно понять, что происходит внизу, и каковы будут необходимые изменения.Изменение сайта примера Hakyll

match "index.html" $ do 
    route idRoute 
    compile $ do 
     let indexCtx = field "posts" $ \_ -> 
          postList $ fmap (take 3) . recentFirst 

     getResourceBody 
      >>= applyAsTemplate indexCtx 
      >>= loadAndApplyTemplate "templates/default.html" postCtx 
      >>= relativizeUrls 

ответ

3

Это не совсем тривиально. На первом этапе вводится snapshots.

Как объяснено в учебнике, это гарантирует, что вы можете включать в себя почтовые индексы по вашему индексу без, имеющих шаблоны, применяемые к HTML. Таким образом, вы получите что-то вроде:

match "posts/*" $ do 
    route $ setExtension "html" 
    compile $ pandocCompiler 
     >>= loadAndApplyTemplate "templates/post.html" postCtx 
     >>= saveSnapshot "content" 
     >>= loadAndApplyTemplate "templates/default.html" postCtx 
     >>= relativizeUrls 

Теперь для того, чтобы отобразить сообщения на индексной странице, вы сможете использовать весь $body$ должностей. Для того, чтобы сделать это, вы просто должны обновить templates/post-item.html в нечто вроде:

<div> 
    <a href="$url$"><h2>$title$</h2></a> 
    $body$ 
</div> 
+1

Выполнение этого, кажется, воспроизводит все заголовки в дополнение к содержимому каждого сообщения. – pgay

1

Я знаю, что этот пост немного старый, но так как это, кажется, не быть решены здесь, как я пошел об этом.

Сначала сохраните снимок, как описано @jaspervdj:

match "posts/*" $ do 
    route $ setExtension "html" 
    compile $ pandocCompiler 
    >>= loadAndApplyTemplate "templates/post.html" postCtx 
    >>= saveSnapshot "content" 
    >>= loadAndApplyTemplate "templates/default.html" postCtx 
    >>= relativizeUrls 

Тогда для index.html нагрузок всех почтовых снимков с loadAllSnapshots:

match "index.html" $ do 
    route idRoute 
    compile $ do 
    posts <- recentFirst =<< loadAllSnapshots "posts/*" "content" 
    let indexCtx = listField "posts" postCtx (return posts) `mappend` 
        defaultContext 

Поскольку снимка перед нанесением default шаблона, то значение $body$ в пределах $for(posts)$ будет только содержанием каждого шаблона сообщения без примененного шаблона по умолчанию.

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