forked from ramda/ramda.github.io
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpublish.js
121 lines (103 loc) · 2.91 KB
/
publish.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
const fs = require('fs');
const path = require('path');
const R = require('ramda');
const {defaultTo, map, pipe, prop} = R
const handlebars = require('handlebars');
const hljs = require('highlight.js');
const helper = require('jsdoc/util/templateHelper');
const marked = require('marked');
const version = require('./package.json').devDependencies.ramda
const prettifyCode = R.pipe(
R.join('\n'),
R.replace(/^[ ]{5}/gm, ''),
s => hljs.highlight('javascript', s).value
)
const prettifySig = R.pipe(
R.replace(/[.][.][.]/g, '\u2026'),
R.replace(/->/g, '\u2192')
)
// simplifySee :: Array String -> Array String
//
// Handles any combination of comma-separated and multi-line @see annotations.
const simplifySee = R.pipe(R.chain(R.split(/\s*,\s*/)), R.map(R.replace(/^R[.]/, '')))
const titleFilter = pipe(R.propEq('title'), R.filter)
const valueProp = R.chain(prop('value'))
const simplifyData = R.applySpec({
aka: pipe(
prop('tags'),
titleFilter('aka'),
valueProp,
R.chain(R.split(/,\s*/))
),
category: pipe(
prop('tags'),
titleFilter('category'),
valueProp,
R.head,
defaultTo('')
),
deprecated: pipe(prop('deprecated'), defaultTo('')),
description: pipe(
prop('description'),
R.defaultTo(''),
marked
),
example: pipe(
prop('examples'),
R.defaultTo(''),
prettifyCode
),
name: pipe(prop('name'), defaultTo('')),
params: pipe(
prop('params'),
defaultTo([]),
map(R.applySpec({
description: pipe(
prop('description'),
defaultTo(''),
marked
),
name: pipe(prop('name'), defaultTo('')),
type: pipe(R.path(['type', 'names', 0]), defaultTo(''))
}))
),
returns: {
description: pipe(R.path(['returns', 0, 'description']), defaultTo('')),
type: pipe(R.path(['returns', 0, 'type', 'names', 0]), defaultTo(''))
},
see: pipe(
prop('see'),
defaultTo(''),
simplifySee
),
sigs: pipe(
prop('tags'),
titleFilter('sig'),
valueProp,
map(prettifySig)
),
since: pipe(prop('since'), defaultTo('')),
typedefns: pipe(
prop('tags'),
titleFilter('typedefn'),
valueProp,
map(prettifySig)
)
})
exports.publish = (data, opts) => {
const templateFile = path.resolve(opts.destination, 'index.html.handlebars')
const templateContent = fs.readFileSync(templateFile, {encoding: 'utf8'})
const docs = helper.prune(data)()
.order('name, version, since')
.filter({kind: ['function', 'constant']})
.get()
.filter(x => x.access !== 'private')
.map(simplifyData)
const context = {
docs: docs,
version: version
}
const outputContent = handlebars.compile(templateContent)(context)
const outputFile = path.resolve(opts.destination, 'index.html')
fs.writeFileSync(outputFile, outputContent, {encoding: 'utf8'});
}