2013-04-07 24 views
6

Chciałbym zmodyfikować poniższy kod, aby zamiast tworzyć linki do najnowszych trzech postów na stronie, reprodukował on treść postów w całości, tak jak w tradycyjnym blogu. Mam trochę trudności ze zrozumieniem, co się dzieje poniżej i jakie będą konieczne zmiany.Modyfikowanie przykładowej witryny 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 

Odpowiedz

3

To nie jest całkowicie banalne. Pierwszym krokiem jest wprowadzenie snapshots.

Jak wyjaśniono w samouczku, zapewnia to włączenie blogposts na indeksie bez o szablonach zastosowanych do HTML w pierwszej kolejności. Więc dostaniesz coś takiego:

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

Teraz, w celu wyświetlenia wiadomości na stronie indeksu, będzie w stanie wykorzystać całą $body$ z słupkami. Aby to zrobić, musisz po prostu zaktualizować templates/post-item.html w coś podobnego:

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

W ten sposób wydaje się odtworzyć wszystkie nagłówki oprócz zawartości każdego wpisu. – pgay

1

Znam ten post jest trochę stary, ale ponieważ nie wydaje się być rozwiązany oto jak poszedłem na ten temat.

Najpierw zapisać migawkę jak opisał @jaspervdj:

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

następnie przez index.html obciążeniem wszystkie zrzuty post z loadAllSnapshots:

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

Ponieważ migawka została podjęta przed nałożeniem default szablonu, wartość $body$ w ramach $for(posts)$ będzie tylko zawartością każdego szablonu posta bez zastosowanego szablonu domyślnego.