-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdata.prepare.js
153 lines (134 loc) · 3.81 KB
/
data.prepare.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
150
151
152
153
const frontmatter = require("@github-docs/frontmatter");
const fs = require("fs");
const path = require("path");
/**
* data.prepare
* ----------------------------------------------------------------------
* Define utilidades para conteúdo paginável em Markdown, como o blog.
*/
/**
* Retorna uma versão URL-safe de uma string.
*
* @param {string} value
* Valor a ser limpo
* @param {boolean} trim
* Se executamos trimming
* @returns {string}
*/
const toSafeUrlName = (value, trim = false) => {
let _value = value;
if (typeof _value !== "string" && _value.toString) {
_value = _value.toString();
} else if (!_value.toString) {
return "";
}
if (true === trim) _value = _value.trim();
return _value
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "")
.toLowerCase()
.replace(/[^a-z0-9\s]/g, "")
.replace(/\s\s/g, "-")
.replace(/\s/g, "-");
};
/**
* Define o nome de um indexador JSON dentro da pasta de dados.
*
* Usado para gerar um index para paginação do blog e dados estáticos.
*
* @param {string} indexName
* Nome do arquivo index, deve ser único na pasta
* @returns {string}
* @constructor
*/
const JsonIndex = (indexName = "_index.json") => {
const dirname = path.resolve(__dirname) + "/data/";
return `${dirname}${indexName || "_index.json"}`;
};
exports.JsonIndex = JsonIndex;
/**
* Inicializa o index de paginação de dados estáticos.
*
* Cada chave no index deve pertencer à uma collection específica.
*
* @param {string} indexName
* Nome do arquivo index, deve ser único na pasta `data`
* @constructor
*/
const JsonIndexInit = (indexName = null) => {
const filename = JsonIndex(indexName);
if (!fs.existsSync(filename)) fs.writeFileSync(filename, `{}`);
};
exports.JsonIndexInit = JsonIndexInit;
/**
* Adiciona uma chave/collection ao index.
*
* @param {string} key
* Nome da chave a ser adicionada, deve ser única
* @param {any} data
* Dados da collection
* @param {string} indexName
* Nome do arquivo index, deve ser único na pasta `data`
* @constructor
*/
const JsonIndexWrite = (key, data, indexName = null) => {
JsonIndexInit(indexName);
const filename = JsonIndex(indexName);
const index = require(filename);
const update = Object.assign({}, index, {
[key]: data
});
fs.writeFileSync(filename, JSON.stringify(update));
};
exports.JsonIndexWrite = JsonIndexWrite;
/**
* Realiza a leitura de arquivos markdown dentro da pasta `data`, montando o
* index para paginação e export estático.
*
* @param {string} pathname
* Pasta com arquivos, dentro de `data`
* @returns {any[]}
* @constructor
*/
const IndexMarkdownFiles = (pathname = "") => {
const dirname = path.resolve(__dirname, "data", pathname || "") + `/`;
const scandir = fs.readdirSync(dirname);
const mapped = scandir.map((item, key) => {
const data = fs.readFileSync(`${dirname + item}`).toString();
const fm = frontmatter(data);
const returnable = {
file: path.basename(item, ".md")
};
let id = key + 1;
if (fm.data.date) {
let date = new Date(fm.data.date);
id = date.getTime();
}
returnable.id = id;
return Object.assign({}, returnable, fm.data);
});
const used = [];
for (const item of mapped) {
if (item.title && !item.slug) {
const slug = toSafeUrlName(item.title);
if (!used.includes(slug)) {
used.push(slug);
item.slug = slug;
} else {
let count = 2;
let _slug = `${slug}-${count}`;
if (used.includes(_slug)) {
while (used.includes(_slug)) {
count += 1;
_slug = `${slug}-${count}`;
}
}
used.push(_slug);
item.slug = _slug;
}
}
}
JsonIndexWrite(pathname, mapped);
return mapped;
};
exports.IndexMarkdownFiles = IndexMarkdownFiles;