Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80635 views
1
var fs = require('fs')
2
var glob = require('glob');
3
var mkdirp = require('mkdirp');
4
var optimist = require('optimist');
5
var path = require('path');
6
var argv = optimist.argv;
7
8
function splitHeader(content) {
9
var lines = content.split('\n');
10
for (var i = 1; i < lines.length - 1; ++i) {
11
if (lines[i] === '---') {
12
break;
13
}
14
}
15
return {
16
header: lines.slice(1, i + 1).join('\n'),
17
content: lines.slice(i + 1).join('\n')
18
};
19
}
20
21
function backtickify(str) {
22
var escaped = '`' + str.replace(/\\/g, '\\\\').replace(/`/g, '\\`') + '`';
23
// Replace require( with require\( so node-haste doesn't replace example
24
// require calls in the docs
25
return escaped.replace(/require\(/g, 'require\\(');
26
}
27
28
function execute() {
29
var MD_DIR = '../docs/';
30
31
glob('src/flux/docs/*.*', function(er, files) {
32
files.forEach(function(file) {
33
try {
34
fs.unlinkSync(file);
35
} catch(e) {
36
/* seriously, unlink throws when the file doesn't exist :( */
37
}
38
});
39
});
40
41
var metadatas = {
42
files: [],
43
};
44
45
glob(MD_DIR + '**/*.*', function (er, files) {
46
files.forEach(function(file) {
47
var extension = path.extname(file);
48
if (extension === '.md' || extension === '.markdown') {
49
var content = fs.readFileSync(file, {encoding: 'utf8'});
50
var metadata = {};
51
52
// Extract markdown metadata header
53
var both = splitHeader(content);
54
var lines = both.header.split('\n');
55
for (var i = 0; i < lines.length - 1; ++i) {
56
var keyvalue = lines[i].split(':');
57
var key = keyvalue[0].trim();
58
var value = keyvalue.slice(1).join(':').trim();
59
// Handle the case where you have "Community #10"
60
try { value = JSON.parse(value); } catch(e) { }
61
metadata[key] = value;
62
}
63
metadatas.files.push(metadata);
64
65
if (metadata.permalink.match(/^https?:/)) {
66
return;
67
}
68
69
// Create a dummy .js version that just calls the associated layout
70
var layout = metadata.layout[0].toUpperCase() + metadata.layout.substr(1) + 'Layout';
71
72
var content = (
73
'/**\n' +
74
' * @generated\n' +
75
' */\n' +
76
'var React = require("React");\n' +
77
'var Layout = require("' + layout + '");\n' +
78
'var content = ' + backtickify(both.content) + '\n' +
79
'var Post = React.createClass({\n' +
80
' statics: {\n' +
81
' content: content\n' +
82
' },\n' +
83
' render: function() {\n' +
84
' return <Layout metadata={' + JSON.stringify(metadata) + '}>{content}</Layout>;\n' +
85
' }\n' +
86
'});\n' +
87
'module.exports = Post;\n'
88
);
89
90
var targetFile = 'src/flux/' + metadata.permalink.replace(/\.html$/, '.js');
91
mkdirp.sync(targetFile.replace(new RegExp('/[^/]*$'), ''));
92
fs.writeFileSync(targetFile, content);
93
}
94
95
if (extension === '.json') {
96
var content = fs.readFileSync(file, {encoding: 'utf8'});
97
metadatas[path.basename(file, '.json')] = JSON.parse(content);
98
}
99
});
100
101
fs.writeFileSync(
102
'core/metadata.js',
103
'/**\n' +
104
' * @generated\n' +
105
' * @providesModule Metadata\n' +
106
' */\n' +
107
'module.exports = ' + JSON.stringify(metadatas, null, 2) + ';'
108
);
109
});
110
}
111
112
if (argv.convert) {
113
console.log('convert!')
114
execute();
115
}
116
117
module.exports = execute;
118
119