我正在尝试构建一个包含7页的网站。每个页面都使用.markdown输入定义。在每个页面上,我想要一个标题,其中包含指向所有其他页面的链接。
现在,这似乎是不可能的,因为哈基尔告诉我,我有一个递归的依赖。
[ERROR] Hakyll.Core.Runtime.chase: Dependency cycle detected: posts/page1.markdown depends on posts/page1.markdown
我已经确定了对此代码段的递归依赖。
match "posts/*" $ do
route $ setExtension "html"
compile $ do
posts <- loadAll "posts/*"
let indexCtx =
listField "posts" postCtx (return posts) `mappend`
constField "title" "Home" `mappend`
defaultContext
pandocCompiler >>= loadAndApplyTemplate "templates/post.html" indexCtx
>>= loadAndApplyTemplate "templates/default.html" indexCtx
>>= relativizeUrls
我想问题是我不允许在加载的同一模板上匹配。
那么如何为生成帖子时使用的所有帖子构建一个包含listField的上下文。
我想另一种方法是首先生成链接,以某种方式存储它们然后将它们包含在帖子中。但是我该怎么做呢?
答案 0 :(得分:2)
通过调用public class Test {
public static void main(String[] args) {
List<Person> persons = Arrays.asList(
new Person("e1", "l1"),
new Person("e2", "l1"),
new Person("e3", "l2"),
new Person("e4", "l2")
);
List<Employee> employees = persons.stream()
.filter(p -> p.getLastName().equals("l1"))
.map(p -> new Employee(p.getName(), p.getLastName(), 1000))
.collect(Collectors.toList());
System.out.println(employees);
}
}
class Person {
private String name;
private String lastName;
public Person(String name, String lastName) {
this.name = name;
this.lastName = lastName;
}
// Getter & Setter
}
class Employee extends Person {
private double salary;
public Employee(String name, String lastName, double salary) {
super(name, lastName);
this.salary = salary;
}
// Getter & Setter
}
,您可以在编译当前版本之前加载每个完全编译的帖子,因此它是一个循环依赖项。
最直接的解决方案是定义帖子的另一个版本:
loadAll "posts/*"
然后你可以加载它们而不会触发循环依赖:
match "posts/*" $ version "titleLine" $ do
-- route
-- compiler, maybe generate a link to real page here from file path
但是,您可能必须从文件路径手动生成正确的URL,而不同的版本是具有不同URL的不同页面。如果为多个页面设置相同的路由,则编译的最后一个将覆盖所有其他页面。
在你的情况下没关系,因为非标记版本依赖于“titleLine”版本,因此稍后编译,但通常对不同页面具有相同的路由是危险的,没有这样的依赖match "posts/*" $ do
-- route
compile $ do
postList <- loadAll ("posts/*" .&&. hasVersion "titleLine")
-- render the page
标记页面是总是在以后编译。