diff --git a/lib/generate_layout.js b/lib/generate_layout.js
index 6f3dde4..da12e85 100644
--- a/lib/generate_layout.js
+++ b/lib/generate_layout.js
@@ -1,6 +1,4 @@
-module.exports = (tree, manifest) => {
- let navigation = generateNavigation(tree);
-
+module.exports = (navigation, manifest) => {
return (page, content) => `
@@ -19,34 +17,3 @@ module.exports = (tree, manifest) => {
`;
};
-
-// TODO: Implement a real generateNavigation function
-function generateNavigation(tree) {
- return ``;
-}
-
-// function generateNavigation(pages) {
-// if(pages.length === 0) {
-// return "";
-// }
-
-// let lis = pages.map(page =>
-// `${generateTitle(page)}${generateNavigation(page.children)}`).
-// join("\n");
-
-// return ``;
-// }
-
-// function generateTitle(page) {
-// return page.file ? `${page.heading}` :
-// `${page.heading}`;
-// }
diff --git a/lib/navigation.js b/lib/navigation.js
new file mode 100644
index 0000000..365ec00
--- /dev/null
+++ b/lib/navigation.js
@@ -0,0 +1,30 @@
+module.exports = class Navigation {
+ constructor({ baseURI }) {
+ this.baseURI = baseURI;
+ }
+
+ generate(tree) {
+ let nodes = tree.children;
+ if(!nodes) {
+ return "";
+ }
+
+ let result = [];
+
+ for(let element of nodes.values()) {
+ result.push(this.item(element, this.generate(element)));
+ }
+
+ return this.list(result);
+ }
+
+ // generate the markup for a node and its rendered children, overwrite at will
+ item(node, children) {
+ return `${node.title}${children}`;
+ }
+
+ // generate the markup for a list of nodes, overwrite at will
+ list(renderedNodes) {
+ return `${renderedNodes.join("")}
`;
+ }
+};
diff --git a/lib/site.js b/lib/site.js
index a15a2d7..9a2b66c 100644
--- a/lib/site.js
+++ b/lib/site.js
@@ -7,6 +7,7 @@ let path = require("path");
let { promisify } = require("util");
let PageRenderer = require("./page_renderer");
let generateLayout = require("./generate_layout");
+let Navigation = require("./navigation");
let writeFile = promisify(fs.writeFile);
@@ -75,7 +76,8 @@ module.exports = class Site {
await Promise.all(preperations);
- let layout = generateLayout(tree, this.assetManager.manifest);
+ let navigation = new Navigation({ baseURI: this.baseURI });
+ let layout = generateLayout(navigation.generate(tree), this.assetManager.manifest);
let pageRenderer = new PageRenderer({ renderers, layout });
let writes = tree.map(async page => {
diff --git a/test/expectations/atoms/button/index.html b/test/expectations/atoms/button/index.html
index 256f32d..9224965 100644
--- a/test/expectations/atoms/button/index.html
+++ b/test/expectations/atoms/button/index.html
@@ -8,16 +8,7 @@
-
+
Button
My favorite button:
diff --git a/test/expectations/atoms/index.html b/test/expectations/atoms/index.html
index 9734dbb..7c72e30 100644
--- a/test/expectations/atoms/index.html
+++ b/test/expectations/atoms/index.html
@@ -8,16 +8,7 @@
-
+
Atoms
indivisible units
diff --git a/test/expectations/atoms/strong/index.html b/test/expectations/atoms/strong/index.html
index f3100a7..3d22b7b 100644
--- a/test/expectations/atoms/strong/index.html
+++ b/test/expectations/atoms/strong/index.html
@@ -8,16 +8,7 @@
-
+
strong
This is how we flex around here.
diff --git a/test/expectations/index.html b/test/expectations/index.html
index dbfd893..9ad5641 100644
--- a/test/expectations/index.html
+++ b/test/expectations/index.html
@@ -8,16 +8,7 @@
-
+
My Style Guide
welcome to your style guide
diff --git a/test/test_navigation.js b/test/test_navigation.js
new file mode 100644
index 0000000..83f0bc3
--- /dev/null
+++ b/test/test_navigation.js
@@ -0,0 +1,16 @@
+/* global describe, it */
+let generatePageTree = require("../lib/tree");
+let Navigation = require("../lib/navigation");
+let { assertSame, fixturesPath, fixturesDir } = require("./util");
+
+describe("navigation", () => {
+ it("should generate a navigation", async () => {
+ let descriptors = require(fixturesPath("pages.js"));
+ let tree = generatePageTree(descriptors, fixturesDir);
+ await Promise.all(tree.map(async page => page.load()));
+
+ let navigation = new Navigation({ baseURI: "/" });
+ let result = navigation.generate(tree);
+ assertSame(result, '');
+ });
+});
diff --git a/test/test_site.js b/test/test_site.js
index 354872a..247da3b 100644
--- a/test/test_site.js
+++ b/test/test_site.js
@@ -25,7 +25,7 @@ describe("site model", () => {
it("generates HTML files", async () => {
let config = {
source: require(fixturesPath("./pages.js")),
- target: "./dist" // FIXME: use temporary directory instead
+ target: "./dist"
};
let site = new Site(config, assetManager);