2016-09-19 4 views
0

Ich möchte ein Feld zu defaultContext hinzufügen, das eine Liste von Links für alle Seiten verfügbar machen wird. Da ich nicht glaube, dass ich defaultContext selbst ändern kann, habe ich eine Funktion erstellt, die listField zu defaultContext hinzufügt und alle Referenzen auf defaultContext damit ersetzt. Während das Programm übereinstimmt, ist meine neue listField leer.listField immer leer

Dies ist mein letzter Versuch.

-- site.hs 
match "index.html" $ do 
    route idRoute 
    compile $ do 
     links <- sortByTitle =<< loadAll "links/*" 
     let indexCtx = 
       listField "links" linkCtx (return links) `mappend` 
       constField "title" "Home"    `mappend` 
       myCtx 

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

match "templates/*" $ compile templateBodyCompiler 

myCtx = 
    listField "navItems" defaultContext (loadAll "nav/*") `mappend` 
    defaultContext 

-- nav/item.markdown 
--- 
title: nav item 1 
--- 

-- templates/default.html 
<ul> 
    $for(navItems)$ 
     $title$ 
    $endfor$ 
</ul> 

Antwort

1

Wenn Sie ein Element laden, müssen Sie mit diesem Element eine Compilation Ziel angeben - load Funktion sehen.

Last :: (Binary a, typisierbarer a) => Identifier -> Compiler (Punkt a)

lädt ein Element an anderer Stelle zusammengestellt. Wenn das erforderliche Element noch nicht kompiliert wurde, wird das Build-System automatisch dafür sorgen.

ein einfaches Hinzufügen (kein route erforderlich) Compiler sollte es beheben:

match "nav/*" $ compile pandocCompiler 
+0

Das tat es. Vielen Dank! :) – pdoherty926

+0

Leider ist mein Beispiel Hakyll-Projekt ein bisschen zu künstlich. In der Praxis werden diese "Links" tatsächlich Posts sein, die auch als ihr eigener "Match" -Eintrag der obersten Ebene existieren. Wenn ich sie in 'myCtx' einführe, bekomme ich einen Kompilierungsfehler" Abhängigkeitszyklus ". Weißt du, wie ich das ansprechen würde? Ich freue mich, eine weitere Frage zu stellen, wenn es sich lohnt. – pdoherty926

+1

Dies kann mit [Snapshots] (https://jaspervdj.be/hakyll/tutorials/05-snapshots-feeds.html) erfolgen. –