UNPKG

6.81 kBJavaScriptView Raw
1// Generated by CoffeeScript 1.12.7
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);