-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
149 lines (116 loc) · 3.87 KB
/
index.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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
'use strict';
const PLUGIN_NAME = 'viur-ignite-html';
var path = require('path'),
fs = require('fs'),
isThere = require('is-there'),
mkdirp = require('mkdirp');
module.exports = {
build: function (options) {
// Set Default Options
var defaultOptions = {
src: './sources/html/',
dest: './appengine/html/'
};
if (typeof options === 'undefined') var options = {};
for (var key in defaultOptions) {
if (typeof options[key] === 'undefined') options[key] = defaultOptions[key];
}
try {
var menuFile = path.join(options.src, '_menu.json');
var layoutFile = path.join(options.src, '_layout.html');
if (!isThere(menuFile)) {
throw new Error("no such file '" + menuFile + "'");
}
if (!isThere(layoutFile)) {
throw new Error("no such file '" + layoutFile + "'");
}
// Get menu(s) and parse as js dictionary
var menus = fs.readFileSync(menuFile, 'utf8');
menus = JSON.parse(menus);
// get template
var layout = fs.readFileSync(layoutFile, 'utf8');
// create an array with all sites of all menus
var allSites = {};
for (var menu in menus) {
var sites = menus[menu];
for(var item in sites) {
allSites[item] = menus[menu][item];
}
}
for (var site in allSites) { // for each sites
var siteTitle = allSites[site];
var siteName = site.split('_')[0];
var siteType = site.split('_')[1];
var contentFile = path.join(options.src, siteName);
console.log('Processing %s', siteName);
if (!isThere(contentFile)) {
throw new Error("no such file '" + contentFile + "'");
}
// get content of file
var content = fs.readFileSync(contentFile, 'utf8');
// replace title and content variables in template
var tmp = layout
.replace( new RegExp('{{title}}', 'g'), siteTitle )
.replace( new RegExp('{{content}}', 'g'), content );
for (var menu in menus) { // for each menu
var menuName = menu.split('_')[0];
var menuType = menu.split('_')[1];
var sites = menus[menu];
var tmpMenu = '';
if (menuType == 'Sort')
sites = sortProperties(sites); // Sort sites by value alphabetically if suffix == sort
for (var tmpSite in sites) { // for each site in this menu build menu item
var tmpSiteTitle = sites[tmpSite];
var tmpSiteName = tmpSite.split('_')[0];
var tmpSiteType = tmpSite.split('_')[1];
tmpMenu += '<li class="menu-item ' + menuName + '-item">' +
'<a class="menu-link' + (tmpSiteType == 'Primary' ? ' is-primary' : '') +
(siteName == tmpSiteName ? ' is-active' : '') + '"' +
' href="' + tmpSiteName + '">' + tmpSiteTitle+ '</a>'+
'</li>' + '\n';
}
// replace menu variable by menu items
tmp = tmp.replace(new RegExp('{{'+menuName+'}}', 'g'), tmpMenu );
}
// create destination folder if doesn't exists
if (!isThere(options.dest)) {
mkdirp(options.dest, function (err) {
if (err) return console.error(err);
writeFiles();
});
} else {
writeFiles();
}
// need function as callback to make sure that writing starts after create folder
function writeFiles() {
// write file in destination folder
fs.writeFile(options.dest + siteName, tmp, function(err) {
if(err) return console.error(err);
});
}
}
} catch(e) {
console.error(e);
process.exit(1);
}
return true;
}
};
function sortProperties(obj) {
var sortable = [];
var dict = {};
// convert object into array
for (var key in obj)
if (obj.hasOwnProperty(key))
sortable.push([key, obj[key]]); // each item is an array in format [key, value]
// sort items by value
sortable.sort(function (a, b) {
var x = a[1].toLowerCase(),
y = b[1].toLowerCase();
return x<y ? -1 : x>y ? 1 : 0;
});
for (var key in sortable) {
dict[sortable[key][0]] = sortable[key][1]; // parse array to dictionary
}
return dict; // sorted dictionary
}