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
foo/bar.html
using:
route "foo/bar.markdown" (setExtension ".html")
If we do not want to change the extension, we can use idRoute
, the simplest
route available:
route "foo/bar.markdown" idRoute
That will route foo/bar.markdown
to foo/bar.markdown
.
Note that the extension says nothing about the content! If you set the
extension to .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.
- data Routes
- runRoutes :: Routes -> Identifier -> Maybe FilePath
- idRoute :: Routes
- setExtension :: String -> Routes
- matchRoute :: Pattern -> Routes -> Routes
- customRoute :: (Identifier -> FilePath) -> Routes
- gsubRoute :: String -> (String -> String) -> Routes
- composeRoutes :: Routes -> Routes -> Routes
Documentation
A route that uses the identifier as filepath. For example, the target with
ID foo/bar
will be written to the file foo/bar
.
setExtension :: String -> RoutesSource
Set (or replace) the extension of a route.
Example:
runRoute (setExtension "html") "foo/bar"
Result:
Just "foo/bar.html"
Example:
runRoute (setExtension "html") "posts/the-art-of-trolling.markdown"
Result:
Just "posts/the-art-of-trolling.html"
matchRoute :: Pattern -> Routes -> RoutesSource
Apply the route if the identifier matches the given pattern, fail otherwise
customRoute :: (Identifier -> FilePath) -> RoutesSource
Create a custom route. This should almost always be used with
matchRoute
Create a gsub route
Example:
runRoutes (gsubRoute "rss/" (const "")) "tags/rss/bar.xml"
Result:
Just "tags/bar.xml"
Compose routes so that f
is more or less equivalent
with composeRoutes
gf >>> g
.
Example:
let routes = gsubRoute "rss/" (const "") `composeRoutes` setExtension "xml" in runRoutes routes "tags/rss/bar"
Result:
Just "tags/bar.xml"
If the first route given fails, Hakyll will not apply the second route.