1 | fs = require('fs')
|
2 | path = require('path')
|
3 | _ = require('lodash')
|
4 | consolidate = require('consolidate')
|
5 |
|
6 | Metalsmith = require('metalsmith')
|
7 | dynamic = require('metalsmith-dynamic')
|
8 | markdown = require('metalsmith-markdown')
|
9 | permalinks = require('metalsmith-permalinks')
|
10 | layouts = require('metalsmith-layouts')
|
11 | inplace = require('metalsmith-in-place')
|
12 | headings = require('metalsmith-headings')
|
13 | prefixoid = require('metalsmith-prefixoid')
|
14 | Plugins = require('./metalsmith-plugins')
|
15 |
|
16 | { defaultPartialsSearch } = require('@resin.io/doxx-utils')
|
17 | HbHelper = require('@resin.io/doxx-handlebars-helper')
|
18 |
|
19 | require('handlebars-helpers')({
|
20 | handlebars: HbHelper.Handlebars
|
21 | })
|
22 |
|
23 | require('./extra-handlebars-helpers')({
|
24 | handlebars: HbHelper.Handlebars
|
25 | })
|
26 |
|
27 | Nav = require('./nav')
|
28 | Dicts = require('./dictionaries')
|
29 | SwigHelper = require('./swig-helper')
|
30 | { refToFilename, filenameToRef } = require('./util')
|
31 |
|
32 | module.exports = (cb) ->
|
33 | config = this.config
|
34 |
|
35 | navTree = null
|
36 | if config.parseNav
|
37 | navTree = Nav.parse(config)
|
38 |
|
39 | plugins = Plugins(config, navTree)
|
40 |
|
41 | SwigHelper.register(consolidate, config)
|
42 | HbHelper.registerConsolidate(consolidate, {
|
43 | beforeRun: ->
|
44 | if not this.dynamic
|
45 | console.warn("Warning! Using import in non-dynamic page #{this.ref}.")
|
46 | })
|
47 |
|
48 | console.log('Building HTML...')
|
49 | metalsmith = Metalsmith(config.rootDir)
|
50 | .source(config.sourceDir)
|
51 | .destination(config.destDir)
|
52 |
|
53 | use = (condition, plugin, pluginArgs...) ->
|
54 | if condition
|
55 | metalsmith = metalsmith.use(plugin(pluginArgs...))
|
56 |
|
57 | use(true, plugins.skipPrivate)
|
58 |
|
59 | use(true, defaultPartialsSearch)
|
60 | use(true, dynamic, {
|
61 | dictionaries: Dicts(config)
|
62 | populateFields: [ '$partials_search' ]
|
63 | tokenizeFields: [ '$switch_text' ]
|
64 | refToFilename, filenameToRef
|
65 | })
|
66 |
|
67 | use(true, plugins.populateFileMeta)
|
68 |
|
69 | use(config.parseNav, plugins.parseNav)
|
70 | use(config.parseNav, plugins.populateFileNavMeta)
|
71 | use(config.serializeNav, plugins.serializeNav)
|
72 |
|
73 | use(true, inplace, {
|
74 | engine: 'handlebars'
|
75 | pattern: '**/*.' + config.docsExt
|
76 | partials: config.partialsDir
|
77 | })
|
78 | use(config.buildLunrIndex, plugins.buildSearchIndex)
|
79 |
|
80 | use(true, markdown)
|
81 | use(true, permalinks)
|
82 |
|
83 | use(true, headings, 'h2')
|
84 |
|
85 | use(true, layouts, {
|
86 | engine: 'swig'
|
87 | directory: config.templatesDir
|
88 | default: config.defaultTemplate
|
89 | locals: this.getLocals({ nav: navTree })
|
90 | })
|
91 |
|
92 | if config.pathPrefix
|
93 | use(true, prefixoid, {
|
94 | prefix: config.pathPrefix
|
95 | })
|
96 |
|
97 | use(true, prefixoid, {
|
98 | prefix: config.pathPrefix
|
99 | tag: 'img'
|
100 | attr: 'src'
|
101 | })
|
102 |
|
103 | use(true, prefixoid, {
|
104 | prefix: config.pathPrefix
|
105 | tag: 'script'
|
106 | attr: 'src'
|
107 | })
|
108 |
|
109 | use(true, prefixoid, {
|
110 | prefix: config.pathPrefix
|
111 | tag: 'div'
|
112 | attr: 'data-url-template'
|
113 | })
|
114 |
|
115 | use(true, prefixoid, {
|
116 | prefix: config.pathPrefix
|
117 | tag: 'link'
|
118 | })
|
119 |
|
120 | metalsmith.build (err) ->
|
121 | return cb(err) if err
|
122 | console.log('Done')
|
123 | cb()
|