1 |
|
2 | (function() {
|
3 | var Dicts, HbHelper, LunrIndex, _, extractTitleFromText, filenameToRef, fs, getValue, path, ref1, ref2, refToFilename, replacePlaceholders, slugify, tokenize, walkFiles, walkTree,
|
4 | slice = [].slice;
|
5 |
|
6 | path = require('path');
|
7 |
|
8 | fs = require('fs');
|
9 |
|
10 | _ = require('lodash');
|
11 |
|
12 | HbHelper = require('@resin.io/doxx-handlebars-helper');
|
13 |
|
14 | ref1 = require('@resin.io/doxx-utils'), walkFiles = ref1.walkFiles, walkTree = ref1.walkTree;
|
15 |
|
16 | LunrIndex = require('./lunr-index');
|
17 |
|
18 | Dicts = require('./dictionaries');
|
19 |
|
20 | tokenize = require('metalsmith-dynamic').util.tokenize;
|
21 |
|
22 | ref2 = require('./util'), extractTitleFromText = ref2.extractTitleFromText, slugify = ref2.slugify, replacePlaceholders = ref2.replacePlaceholders, filenameToRef = ref2.filenameToRef, refToFilename = ref2.refToFilename, getValue = ref2.getValue;
|
23 |
|
24 | module.exports = function(config, navTree) {
|
25 | var dicts, exports, fileByRef, navByRef;
|
26 | dicts = Dicts(config);
|
27 | exports = {};
|
28 | exports.skipPrivate = walkFiles(function(file, files) {
|
29 | if (path.parse(file).name.match(/^_/)) {
|
30 | return delete files[file];
|
31 | }
|
32 | });
|
33 | fileByRef = {};
|
34 | exports.populateFileMeta = walkFiles(function(file, files) {
|
35 | var excerpt, obj, ref3, title;
|
36 | obj = files[file];
|
37 | _.assign(obj, getValue(config.metaExtra, file, obj));
|
38 | title = obj.title || extractTitleFromText(obj.contents.toString());
|
39 | excerpt = obj.excerpt;
|
40 | obj.title = HbHelper.render(title, obj);
|
41 | obj.excerpt = HbHelper.render(excerpt, obj);
|
42 | ref3 = filenameToRef(file), obj.ref = ref3[0], obj.ext = ref3[1];
|
43 | return fileByRef[obj.ref] = obj;
|
44 | });
|
45 | exports.buildSearchIndex = function() {
|
46 | var searchIndex;
|
47 | console.log('Building search index...');
|
48 | searchIndex = LunrIndex.create();
|
49 | return function(files, metalsmith, done) {
|
50 | var file, indexFilePath, obj;
|
51 | for (file in files) {
|
52 | obj = files[file];
|
53 | searchIndex.add({
|
54 | id: obj.ref,
|
55 | title: obj.title,
|
56 | body: obj.contents.toString()
|
57 | });
|
58 | }
|
59 | indexFilePath = config.buildLunrIndex;
|
60 | return searchIndex.write(indexFilePath, function(err) {
|
61 | if (err) {
|
62 | throw err;
|
63 | }
|
64 | console.log('Successfully finished indexing.');
|
65 | return done();
|
66 | });
|
67 | };
|
68 | };
|
69 | navByRef = null;
|
70 | exports.parseNav = function() {
|
71 | var addNavParents, fixNavNodeTitleAndSetSlug, setRef, setRefRec, setRefs;
|
72 | setRefRec = function(ref, node, remainingVariables) {
|
73 | var j, len, nextVariable, obj1, ref3, ref4, results, value;
|
74 | if (!(remainingVariables != null ? remainingVariables.length : void 0)) {
|
75 | return setRef(ref, node);
|
76 | }
|
77 | ref3 = remainingVariables, nextVariable = ref3[0], remainingVariables = 2 <= ref3.length ? slice.call(ref3, 1) : [];
|
78 | ref4 = dicts.getValues(nextVariable);
|
79 | results = [];
|
80 | for (j = 0, len = ref4.length; j < len; j++) {
|
81 | value = ref4[j];
|
82 | results.push(setRefRec(replacePlaceholders(ref, (
|
83 | obj1 = {},
|
84 | obj1["" + nextVariable] = value,
|
85 | obj1
|
86 | )), node, remainingVariables));
|
87 | }
|
88 | return results;
|
89 | };
|
90 | setRef = function(ref, node) {
|
91 | var i, t, tokens;
|
92 | if (ref == null) {
|
93 | return;
|
94 | }
|
95 | if (ref.indexOf('$') >= 0) {
|
96 | tokens = (function() {
|
97 | var j, len, ref3, results;
|
98 | ref3 = tokenize(ref);
|
99 | results = [];
|
100 | for (i = j = 0, len = ref3.length; j < len; i = ++j) {
|
101 | t = ref3[i];
|
102 | if (i % 2) {
|
103 | results.push(t);
|
104 | }
|
105 | }
|
106 | return results;
|
107 | })();
|
108 | return setRefRec(ref, node, tokens);
|
109 | } else {
|
110 | return navByRef[ref] = node;
|
111 | }
|
112 | };
|
113 | setRefs = walkTree({
|
114 | visitNode: function(node) {
|
115 | if (node.level != null) {
|
116 | return setRef(node.ref, node);
|
117 | }
|
118 | }
|
119 | });
|
120 | fixNavNodeTitleAndSetSlug = walkTree({
|
121 | visitNode: function(node) {
|
122 | var ref3;
|
123 | if (node.level != null) {
|
124 | node.title || (node.title = (ref3 = fileByRef[node.ref]) != null ? ref3.title : void 0);
|
125 | return node.slug = slugify(node.title);
|
126 | }
|
127 | }
|
128 | });
|
129 | addNavParents = walkTree({
|
130 | visitNode: function(node, parents) {
|
131 | if (node.level != null) {
|
132 | return node.parents = parents.concat(node);
|
133 | }
|
134 | },
|
135 | buildNextArgs: function(node, parents) {
|
136 | if (node.level != null) {
|
137 | return [parents.concat(node)];
|
138 | } else {
|
139 | return [parents];
|
140 | }
|
141 | }
|
142 | });
|
143 | return function(files, metalsmith, done) {
|
144 | console.log('Parsing navigation...');
|
145 | fixNavNodeTitleAndSetSlug(navTree);
|
146 | addNavParents(navTree, []);
|
147 | navByRef = {};
|
148 | setRefs(navTree);
|
149 | console.log('Navigation parsed and indexed.');
|
150 | return done();
|
151 | };
|
152 | };
|
153 | exports.serializeNav = function() {
|
154 | var removeBackRefs;
|
155 | removeBackRefs = walkTree({
|
156 | visitNode: function(node) {
|
157 | delete node.parent;
|
158 | return delete node.parents;
|
159 | }
|
160 | });
|
161 | return function(files, metalsmith, done) {
|
162 | var filename;
|
163 | removeBackRefs(navTree);
|
164 | filename = config.serializeNav;
|
165 | fs.writeFile(filename, JSON.stringify(navTree), function(err) {
|
166 | if (err) {
|
167 | throw err;
|
168 | }
|
169 | return console.log('Successfully serialized navigation tree.');
|
170 | });
|
171 | return done();
|
172 | };
|
173 | };
|
174 | exports.populateFileNavMeta = walkFiles(function(file, files) {
|
175 | var bc, j, len, nav, navNode, node, obj, parents, ref;
|
176 | obj = files[file];
|
177 | ref = obj.ref;
|
178 | navNode = navByRef[ref];
|
179 | obj.$nav = nav = {
|
180 | url: "/" + obj.ref
|
181 | };
|
182 | parents = navNode != null ? navNode.parents : void 0;
|
183 | if (parents != null) {
|
184 | nav.path = {};
|
185 | for (j = 0, len = parents.length; j < len; j++) {
|
186 | node = parents[j];
|
187 | nav.path[node.$id] = true;
|
188 | }
|
189 | }
|
190 | obj.breadcrumbs = bc = parents != null ? parents.map(function(node) {
|
191 | return node.title;
|
192 | }) : void 0;
|
193 | if (navNode != null ? navNode.isDynamic : void 0) {
|
194 | nav.title = HbHelper.render(navNode.titleTemplate, obj);
|
195 | if (bc != null ? bc.length : void 0) {
|
196 | return bc[bc.length - 1] = nav.title;
|
197 | }
|
198 | } else {
|
199 | return nav.title = navNode != null ? navNode.title : void 0;
|
200 | }
|
201 | });
|
202 | return exports;
|
203 | };
|
204 |
|
205 | }).call(this);
|