hexo-plugin-aurora
Version:
A plugin for Hexo Aurora theme
211 lines (168 loc) • 5.01 kB
JavaScript
const crypto = require('crypto');
const { tocObj, escapeHTML, encodeURL } = require('hexo-util');
const chalk = require('chalk');
exports.md5 = function (str, len = 20) {
return crypto.createHash('md5').update(str).digest('hex').substring(0, len);
};
exports.base64 = function (str) {
return Buffer.from(str).toString('base64').replace(/=/g, '');
};
exports.getToc = function (str, options = {}) {
options = Object.assign(
{
min_depth: 1,
max_depth: 6,
class: 'toc',
list_number: false
},
options
);
const data = tocObj(str, {
min_depth: options.min_depth,
max_depth: options.max_depth
});
if (!data.length) return '';
const className = escapeHTML(options.class);
const listNumber = options.list_number;
let result = `<ol class="${className}">`;
const lastNumber = [0, 0, 0, 0, 0, 0];
let firstLevel = 0;
let lastLevel = 0;
for (let i = 0, len = data.length; i < len; i++) {
const el = data[i];
const { level, id, text } = el;
const href = id ? `#${encodeURL(id)}` : null;
lastNumber[level - 1]++;
for (let i = level; i <= 5; i++) {
lastNumber[i] = 0;
}
if (firstLevel) {
for (let i = level; i < lastLevel; i++) {
result += '</li></ol>';
}
if (level > lastLevel) {
result += `<ol class="${className}-child">`;
} else {
result += '</li>';
}
} else {
firstLevel = level;
}
result += `<li class="${className}-item ${className}-level-${level}">`;
if (href) {
result += `<a class="${className}-link" href="${href}">`;
} else {
result += `<a class="${className}-link">`;
}
if (listNumber) {
result += `<span class="${className}-number">`;
for (let i = firstLevel - 1; i < level; i++) {
result += `${lastNumber[i]}.`;
}
result += '</span> ';
}
result += `<span class="${className}-text">${text}</span></a>`;
lastLevel = level;
}
for (let i = firstLevel - 1; i < lastLevel; i++) {
result += '</li></ol>';
}
return result;
};
exports.filterHTMLCharacters = function (str) {
// Removing all html tags
// Removing all line breakers.
return String(str)
.replace(/( |<([^>]+)>)/gi, '')
.replace('/\n/gm', ' ');
};
exports.generateUid = function (str) {
return crypto.createHash('md5').update(str).digest('hex');
};
exports.fetchCovers = function (str, size = 0) {
let temp,
imgURLs = [],
rex = /<img[^>]+src="?([^"\s]+)"(.*)>/g;
while ((temp = rex.exec(str))) {
imgURLs.push(temp[1]);
}
if ((size = 0)) return imgURLs ? imgURLs[0] : null;
return imgURLs.length > 0 ? imgURLs.slice(0, size) : null;
};
exports.isEmptyObject = function (value) {
if (!exports.isObject(value)) return false;
for (const key in value) return false;
return true;
};
exports.formatNumber = function (value) {
if (value > 9999) {
value = Math.round(value / 1000) + 'k'; // > 9999 => 11k
} else if (value > 999) {
value = Math.round(value / 100) / 10 + 'k'; // > 999 => 1.1k
} // < 999 => 111
return value;
};
exports.throwError = function (type, msg) {
console.error(`${chalk.red(`[${type}]`)} ${chalk.yellow(msg)}`);
console.error(
`${chalk.red('[ERROR]')} ${chalk.yellow(
`Please create an issue @ https://github.com/auroral-ui/hexo-plugin-aurora/issues with the above error message. Thanks!
请在 @https://github.com/auroral-ui/hexo-plugin-aurora/issues 提交一个 issue, 并附带以上报错信息, 谢谢!`
)}`
);
};
exports.throwWarning = function (type, msg) {
console.warn(`${chalk.yellow(`[${type}]`)} ${chalk.white(msg)}`);
};
exports.throwInfo = function (type, msg) {
console.error(`${chalk.blue(`[${type}]`)} ${chalk.white(msg)}`);
};
exports.categorize = function (key, data) {
const keyArr = new Set();
var newData = {};
for (var item of data) {
const dataKey = item[key];
if (!keyArr.has(dataKey)) {
keyArr.add(dataKey);
newData = { ...newData, [dataKey]: [item] };
} else {
newData[dataKey].push(item);
}
}
return newData;
};
exports.avatarWall = function (data) {
if (data.length === 0) return;
var newData = [];
var requiredSize = 48;
var sizeCount = 0;
var arrKey = 0;
function addingItem(source) {
for (var item of source) {
if (sizeCount === requiredSize) return;
if (!newData[arrKey]) {
newData.push([item]);
sizeCount++;
} else if (newData[arrKey].length < 2) {
newData[arrKey].push(item);
sizeCount++;
arrKey++;
}
}
}
while (sizeCount < requiredSize) {
if (sizeCount === requiredSize) return;
addingItem(data);
}
while (sizeCount < requiredSize) {
if (sizeCount === requiredSize) return;
addingItem(data);
}
sizeCount = 0;
requiredSize = 24;
while (sizeCount < requiredSize) {
if (sizeCount === requiredSize) return;
addingItem(data);
}
return newData;
};