Once a target is compiled, the user usually wants to save it to the disk.
This is where the
Routes type comes in; it determines where a certain
target should be written.
Suppose we have an item
foo/bar.markdown. We can render this to
route "foo/bar.markdown" (setExtension ".html")
If we do not want to change the extension, we can use
idRoute, the simplest
route "foo/bar.markdown" idRoute
That will route
Note that the extension says nothing about the content! If you set the
.html, it is your own responsibility to ensure that the
content is indeed HTML.
Finally, some special cases:
- If there is no route for an item, this item will not be routed, so it will not appear in your site directory.
- If an item matches multiple routes, the first rule will be chosen.
- type UsedMetadata = Bool
- data Routes
- runRoutes :: Routes -> Provider -> Identifier -> IO (Maybe FilePath, UsedMetadata)
- idRoute :: Routes
- setExtension :: String -> Routes
- matchRoute :: Pattern -> Routes -> Routes
- customRoute :: (Identifier -> FilePath) -> Routes
- constRoute :: FilePath -> Routes
- gsubRoute :: String -> (String -> String) -> Routes
- metadataRoute :: (Metadata -> Routes) -> Routes
- composeRoutes :: Routes -> Routes -> Routes
When you ran a route, it's useful to know whether or not this used metadata. This allows us to do more granular dependency analysis.
Type used for a route
Apply a route to an identifier
A route that uses the identifier as filepath. For example, the target with
foo/bar will be written to the file
Set (or replace) the extension of a route.
runRoutes (setExtension "html") "foo/bar"
runRoutes (setExtension "html") "posts/the-art-of-trolling.markdown"
Apply the route if the identifier matches the given pattern, fail otherwise
Create a custom route. This should almost always be used with
A route that always gives the same result. Obviously, you should only use this for a single compilation rule.
Create a gsub route
runRoutes (gsubRoute "rss/" (const "")) "tags/rss/bar.xml"
Get access to the metadata in order to determine the route
Compose routes so that
f `composeRoutes` g is more or less equivalent
g . f.
let routes = gsubRoute "rss/" (const "") `composeRoutes` setExtension "xml" in runRoutes routes "tags/rss/bar"
If the first route given fails, Hakyll will not apply the second route.