修改主题路径
This commit is contained in:
parent
45f0c5846d
commit
df1293bbdc
|
|
@ -21,7 +21,7 @@ module.exports = {
|
|||
markdown: {
|
||||
lineNumbers: true // 代码行号
|
||||
},
|
||||
theme: require.resolve('../../vdoing/theme-vdoing'), // 使用的主题
|
||||
theme: require.resolve('../../theme-vdoing'), // 使用的主题
|
||||
themeConfig: { // 主题配置
|
||||
nav,
|
||||
sidebarDepth: 2, // 侧边栏显示深度,默认1,最大2(显示到h3标题)
|
||||
|
|
|
|||
|
|
@ -2,13 +2,12 @@
|
|||
"name": "vuepress-theme-vdoing",
|
||||
"version": "1.0.0",
|
||||
"scripts": {
|
||||
"test":"vuepress dev docs",
|
||||
"test": "",
|
||||
"dev": "vuepress dev docs",
|
||||
"build": "vuepress build docs",
|
||||
"deploy": "bash deploy.sh",
|
||||
"updateFm": "node vdoing/utils/frontmatter.js -update",
|
||||
"editFm": "node vdoing/utils/editFrontmatter.js",
|
||||
"baiduPush": "node vdoing/utils/baiduPush.js https://xugaoyi.com && bash baiduPush.sh"
|
||||
"editFm": "node utils/editFrontmatter.js",
|
||||
"baiduPush": "node utils/baiduPush.js https://xugaoyi.com && bash baiduPush.sh"
|
||||
},
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 108 B After Width: | Height: | Size: 108 B |
|
|
@ -2,7 +2,7 @@ const fs = require('fs'); // 文件模块
|
|||
const matter = require('gray-matter'); // FrontMatter解析器 https://github.com/jonschlinkert/gray-matter
|
||||
const jsonToYaml = require('json2yaml')
|
||||
const chalk = require('chalk') // 命令行打印美化
|
||||
const arg = process.argv.splice(2)[0]; // 获取命令行传入的参数
|
||||
// const arg = process.argv.splice(2)[0]; // 获取命令行传入的参数
|
||||
const readFileList = require('./modules/readFileList');
|
||||
const { type, repairDate, dateFormat} = require('./modules/fn');
|
||||
const log = console.log
|
||||
|
|
@ -60,18 +60,18 @@ function setFrontmatter(sourceDir) {
|
|||
|
||||
|
||||
// 更新title和permalink
|
||||
if (arg === '-update' && matterData.title != file.name){ // 当title和文件名不一致时才更新
|
||||
matterData.title = file.name;
|
||||
if (/pages/.test(matterData.permalink)) {
|
||||
matterData.permalink = file.permalink;
|
||||
}
|
||||
// 修复date时区和格式被修改的问题 (并非更新date的值)
|
||||
matterData.date = repairDate(matterData.date);
|
||||
// if (arg === '-update' && matterData.title != file.name){ // 当title和文件名不一致时才更新
|
||||
// matterData.title = file.name;
|
||||
// if (/pages/.test(matterData.permalink)) {
|
||||
// matterData.permalink = file.permalink;
|
||||
// }
|
||||
// // 修复date时区和格式被修改的问题 (并非更新date的值)
|
||||
// matterData.date = repairDate(matterData.date);
|
||||
|
||||
const newData2 = jsonToYaml.stringify(JSON.parse(JSON.stringify(matterData))).replace(/\n\s{2}/g,"\n").replace(/"/g,"") + '---\r\n' + fileMatterObj.content;
|
||||
fs.writeFileSync(file.filePath, newData2); // 写入
|
||||
log(chalk.blue('tip ') + chalk.green(`update frontmatter title and permalink(更新frontmatter的标题和永久链接):${file.filePath} `))
|
||||
}
|
||||
// const newData2 = jsonToYaml.stringify(JSON.parse(JSON.stringify(matterData))).replace(/\n\s{2}/g,"\n").replace(/"/g,"") + '---\r\n' + fileMatterObj.content;
|
||||
// fs.writeFileSync(file.filePath, newData2); // 写入
|
||||
// log(chalk.blue('tip ') + chalk.green(`update frontmatter title and permalink(更新frontmatter的标题和永久链接):${file.filePath} `))
|
||||
// }
|
||||
|
||||
}
|
||||
})
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
/**
|
||||
* 生成百度链接推送文件
|
||||
*/
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const logger = require('tracer').colorConsole();
|
||||
const matter = require('gray-matter'); // FrontMatter解析器 https://github.com/jonschlinkert/gray-matter
|
||||
const readFileList = require('./modules/readFileList');
|
||||
const urlsRoot = path.join(__dirname, '..', '..', 'urls.txt'); // 百度链接推送文件
|
||||
const DOMAIN = process.argv.splice(2)[0]; // 获取命令行传入的参数
|
||||
|
||||
if (!DOMAIN) {
|
||||
logger.error('请在运行此文件时指定一个你要进行百度推送的域名参数,例:node utils/baiduPush.js https://xugaoyi.com')
|
||||
return
|
||||
}
|
||||
|
||||
main();
|
||||
|
||||
/**
|
||||
* 主体函数
|
||||
*/
|
||||
function main() {
|
||||
fs.writeFileSync(urlsRoot, DOMAIN)
|
||||
const files = readFileList(); // 读取所有md文件数据
|
||||
|
||||
files.forEach( file => {
|
||||
const { data } = matter(fs.readFileSync(file.filePath, 'utf8'));
|
||||
|
||||
if (data.permalink) {
|
||||
const link = `\r\n${DOMAIN}${data.permalink}/`;
|
||||
console.log(link)
|
||||
fs.appendFileSync(urlsRoot, link);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
@ -1,85 +0,0 @@
|
|||
/**
|
||||
* 批量添加和修改front matter ,需要配置 ./config.yml 文件。
|
||||
*/
|
||||
const fs = require('fs'); // 文件模块
|
||||
const path = require('path'); // 路径模块
|
||||
const matter = require('gray-matter'); // front matter解析器 https://github.com/jonschlinkert/gray-matter
|
||||
const jsonToYaml = require('json2yaml')
|
||||
const yamlToJs = require('yamljs')
|
||||
const inquirer = require('inquirer') // 命令行操作
|
||||
const chalk = require('chalk') // 命令行打印美化
|
||||
const readFileList = require('./modules/readFileList');
|
||||
const { type, repairDate} = require('./modules/fn');
|
||||
const log = console.log
|
||||
|
||||
const configPath = path.join(__dirname, 'config.yml') // 配置文件的路径
|
||||
|
||||
main();
|
||||
|
||||
/**
|
||||
* 主体函数
|
||||
*/
|
||||
async function main() {
|
||||
|
||||
const promptList = [{
|
||||
type: "confirm",
|
||||
message: "批量操作frontmatter有修改数据的风险,确定要继续吗?",
|
||||
name: "edit",
|
||||
}];
|
||||
let edit = true;
|
||||
|
||||
await inquirer.prompt(promptList).then(answers => {
|
||||
edit = answers.edit
|
||||
})
|
||||
|
||||
if(!edit) { // 退出操作
|
||||
return
|
||||
}
|
||||
|
||||
const config = yamlToJs.load(configPath) // 解析配置文件的数据转为js对象
|
||||
|
||||
if (type(config.path) !== 'array') {
|
||||
log(chalk.red('路径配置有误,path字段应该是一个数组'))
|
||||
return
|
||||
}
|
||||
|
||||
const filePath = path.join(__dirname, '..', 'docs', ...config.path); // 要批量修改的文件路径
|
||||
const files = readFileList(filePath); // 读取所有md文件数据
|
||||
|
||||
files.forEach(file => {
|
||||
let dataStr = fs.readFileSync(file.filePath, 'utf8');// 读取每个md文件的内容
|
||||
const fileMatterObj = matter(dataStr) // 解析md文件的front Matter。 fileMatterObj => {content:'剔除frontmatter后的文件内容字符串', data:{<frontmatter对象>}, ...}
|
||||
let matterData = fileMatterObj.data; // 得到md文件的front Matter
|
||||
|
||||
let mark = false
|
||||
// 删除操作
|
||||
if (config.delete) {
|
||||
if( type(config.delete) !== 'array' ) {
|
||||
log(chalk.yellow('未能完成删除操作,delete字段的值应该是一个数组!'))
|
||||
} else {
|
||||
config.delete.forEach(item => {
|
||||
delete matterData[item]
|
||||
})
|
||||
mark = true
|
||||
}
|
||||
}
|
||||
|
||||
// 添加、修改操作
|
||||
if (type(config.data) === 'object') {
|
||||
Object.assign(matterData, config.data) // 将配置数据合并到front Matter对象
|
||||
mark = true
|
||||
}
|
||||
|
||||
// 没有任何操作时跳出
|
||||
if (!mark) {
|
||||
return
|
||||
}
|
||||
|
||||
if(matterData.date && type(matterData.date) === 'date') {
|
||||
matterData.date = repairDate(matterData.date) // 修复时间格式
|
||||
}
|
||||
const newData = jsonToYaml.stringify(matterData).replace(/\n\s{2}/g,"\n").replace(/"/g,"") + '---\r\n' + fileMatterObj.content;
|
||||
fs.writeFileSync(file.filePath, newData); // 写入
|
||||
log(`update frontmatter:${file.filePath} `)
|
||||
})
|
||||
}
|
||||
|
|
@ -1,86 +0,0 @@
|
|||
/**
|
||||
* 生成front matter (标题、日期、永久链接)
|
||||
*/
|
||||
const fs = require('fs'); // 文件模块
|
||||
const logger = require('tracer').colorConsole(); // 控制台工具(用于控制台打印信息包含时间、打印类型、文件及代码行号、对象、颜色)
|
||||
const matter = require('gray-matter'); // FrontMatter解析器 https://github.com/jonschlinkert/gray-matter
|
||||
const jsonToYaml = require('json2yaml')
|
||||
const arg = process.argv.splice(2)[0]; // 获取命令行传入的参数
|
||||
const readFileList = require('./modules/readFileList');
|
||||
const { type, repairDate, dateFormat} = require('./modules/fn');
|
||||
|
||||
main();
|
||||
|
||||
/**
|
||||
* 主体函数
|
||||
*/
|
||||
function main() {
|
||||
const files = readFileList(); // 读取所有md文件数据
|
||||
|
||||
files.forEach(file => {
|
||||
let dataStr = fs.readFileSync(file.filePath, 'utf8');// 读取每个md文件内容
|
||||
|
||||
/**
|
||||
* fileMatterObj => {content:'剔除frontmatter后的文件内容字符串', data:{<frontmatter对象>}, ...}
|
||||
*/
|
||||
const fileMatterObj = matter(dataStr);
|
||||
|
||||
if (Object.keys(fileMatterObj.data).length === 0) { // 未定义FrontMatter数据
|
||||
const stat = fs.statSync(file.filePath);
|
||||
const dateStr = dateFormat(stat.birthtime);// 文件的创建时间
|
||||
const newData = `---\r\ntitle: ${file.name}\r\ndate: ${dateStr}\r\npermalink: ${file.permalink}\r\n---\r\n` + fileMatterObj.content;
|
||||
fs.writeFileSync(file.filePath, newData); // 写入
|
||||
console.log(`write frontmatter:${file.filePath} `)
|
||||
|
||||
} else { // 已有FrontMatter
|
||||
const matterData = fileMatterObj.data;
|
||||
let mark = false;
|
||||
|
||||
// 已有FrontMatter,但是没有title、date、permalink数据的
|
||||
if (!matterData.hasOwnProperty('title')) {
|
||||
matterData.title = file.name;
|
||||
mark = true;
|
||||
}
|
||||
|
||||
if (!matterData.hasOwnProperty('date')) {
|
||||
const stat = fs.statSync(file.filePath);
|
||||
matterData.date = dateFormat(stat.birthtime);
|
||||
mark = true;
|
||||
}
|
||||
|
||||
if (!matterData.hasOwnProperty('permalink')) {
|
||||
matterData.permalink = file.permalink;
|
||||
mark = true;
|
||||
}
|
||||
|
||||
if (mark) {
|
||||
if(matterData.date && type(matterData.date) === 'date') {
|
||||
matterData.date = repairDate(matterData.date) // 修复时间格式
|
||||
}
|
||||
const newData = jsonToYaml.stringify(matterData).replace(/\n\s{2}/g,"\n").replace(/"/g,"") + '---\r\n' + fileMatterObj.content;
|
||||
fs.writeFileSync(file.filePath, newData); // 写入
|
||||
console.log(`update frontmatter:${file.filePath} `)
|
||||
}
|
||||
|
||||
|
||||
// 更新title和permalink
|
||||
if (arg === '-update' && matterData.title != file.name){ // 当title和文件名不一致时才更新
|
||||
matterData.title = file.name;
|
||||
if (/pages/.test(matterData.permalink)) {
|
||||
matterData.permalink = file.permalink;
|
||||
}
|
||||
// 修复date时区和格式被修改的问题 (并非更新date的值)
|
||||
matterData.date = repairDate(matterData.date);
|
||||
|
||||
const newData2 = jsonToYaml.stringify(JSON.parse(JSON.stringify(matterData))).replace(/\n\s{2}/g,"\n").replace(/"/g,"") + '---\r\n' + fileMatterObj.content;
|
||||
fs.writeFileSync(file.filePath, newData2); // 写入
|
||||
console.log(`update FrontMatter title and permalink:${file.filePath}`)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1,123 +0,0 @@
|
|||
/**
|
||||
* 生成侧边栏数据
|
||||
*/
|
||||
|
||||
const fs = require('fs'); // 文件模块
|
||||
const path = require('path'); // 路径模块
|
||||
const ejs = require('ejs'); // ejs模板引擎
|
||||
const logger = require('tracer').colorConsole(); // 控制台工具(用于控制台打印信息包含时间、打印类型、文件及代码行号、对象、颜色)
|
||||
const matter = require('gray-matter'); // FrontMatter解析器
|
||||
|
||||
const docsRoot = path.join(__dirname, '..', '..', 'docs'); // docs文件路径
|
||||
const sidebarPath = path.join(__dirname, '..', '..', 'docs', '.vuepress', 'config', 'sidebar-auto.js'); // 侧边栏js文件要保存的路径
|
||||
const catalogueData = {}; // 目录页数据
|
||||
|
||||
// sidebar-auto.js代码模板
|
||||
const sidebarTemplate = `
|
||||
/**
|
||||
* 自动生成的侧边栏
|
||||
* 说明:
|
||||
* 1. 最里边的数组,格式:[<path>, <title>, <permalink>],其中permalink并非侧边栏所需,而是提供给其他页面(目录页)使用
|
||||
* 2. catalogue属性是提供给面包屑所需的目录页数据
|
||||
*/
|
||||
module.exports = {
|
||||
<% for (let item of sidebarData) { %>
|
||||
"<%- item.path %>": <%- JSON.stringify(item.sidebarArr) %>,
|
||||
<% } %>
|
||||
"catalogue": <%- JSON.stringify(catalogueData) %>
|
||||
}`;
|
||||
|
||||
main();
|
||||
|
||||
/**
|
||||
* 主体函数
|
||||
*/
|
||||
function main() {
|
||||
const sidebarData = [];
|
||||
|
||||
const tocs = readTocs(docsRoot); // 得到一个对路路径目录数组
|
||||
tocs.forEach(toc => { // toc为每个目录的绝对路径
|
||||
const sidebarArr = mapTocToSidebar(toc);
|
||||
if (!sidebarArr.length) {
|
||||
logger.warn(`该目录 "${toc}" 内部没有任何文件,将忽略生成对应侧边栏`);
|
||||
return;
|
||||
}
|
||||
sidebarData.push({
|
||||
path: `/${path.basename(toc)}/`, // basename返回绝对路径的文件名
|
||||
// name: path.basename(toc).replace(/ /g, '_'), // 替换空格
|
||||
sidebarArr
|
||||
})
|
||||
})
|
||||
|
||||
const sidebarDataTem = ejs.render(sidebarTemplate, { sidebarData, catalogueData });
|
||||
fs.writeFileSync(sidebarPath, sidebarDataTem); // 同步写入文件, 参数一:写入到的文件, 参数二:写入的数据
|
||||
logger.info('add sidebar-auto.js (侧边栏生成成功!)')
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取指定目录下的文件绝对路径
|
||||
* @param {String} root 指定的目录
|
||||
*/
|
||||
function readTocs(root){
|
||||
const result = [];
|
||||
const files = fs.readdirSync(root); // 方法:读取目录,返回数组,成员是root底下所有的目录名 (包含文件文件夹和文件)
|
||||
files.forEach(name => {
|
||||
const file = path.resolve(root, name); // 方法:将路径或路径片段的序列解析为绝对路径
|
||||
if (fs.statSync(file).isDirectory() && name !== '.vuepress') { // 是否为文件夹目录,并排除.vuepress文件
|
||||
result.push(file);
|
||||
}
|
||||
})
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 将对应目录映射为对应的侧边栏配置
|
||||
* @param {String} root
|
||||
* @param {String} prefix
|
||||
*/
|
||||
function mapTocToSidebar(root, prefix){
|
||||
prefix = prefix || '';
|
||||
let sidebar = [];
|
||||
const files = fs.readdirSync(root); // 读取目录(文件和文件夹),返回数组
|
||||
files.forEach(filename => {
|
||||
const file = path.resolve(root, filename); // 方法:将路径或路径片段的序列解析为绝对路径
|
||||
const stat = fs.statSync(file); // 文件信息
|
||||
let [order, title, type] = filename.split('.');
|
||||
order = parseInt(order, 10);
|
||||
if (isNaN(order) || order < 0) {
|
||||
logger.error(`该文件 "${file}" 序号出错,请填写正确的序号,序号约定请查看:https://github.com/xugaoyi/vuepress-theme-vdoing/issues/113`);
|
||||
return;
|
||||
}
|
||||
if (sidebar[order]) { // sidebar数组的order位置的数据的布尔值
|
||||
logger.warn(`该文件 "${file}" 的序号在同一级别中有重复出现,将会被覆盖`);
|
||||
}
|
||||
if(stat.isDirectory()){ // 是否为文件夹目录
|
||||
sidebar[order] = {
|
||||
title,
|
||||
collapsable: false, // 是否可折叠,默认true
|
||||
children: mapTocToSidebar(file, prefix + filename + '/') // 子栏路径添加前缀
|
||||
}
|
||||
} else { // 是文件
|
||||
if (type !== 'md') {
|
||||
// 控制台错误信息
|
||||
logger.error(`该文件 "${file}" 非md文件,不支持非md文件类型`);
|
||||
return;
|
||||
}
|
||||
const contentStr = fs.readFileSync(file, 'utf8') // 读取md文件内容,返回字符串
|
||||
const { data } = matter(contentStr) // 解析出front matter数据
|
||||
const permalink = data.permalink || ''
|
||||
sidebar[order] = [prefix + filename, title, permalink ]; // [<路径>, <文件标题>, <永久链接>]
|
||||
|
||||
// 目录页和永久链接,用于给面包屑提供数据
|
||||
const pageComponent = data.pageComponent
|
||||
if (pageComponent && pageComponent.name && pageComponent.name === "Catalogue") {
|
||||
catalogueData[title] = permalink
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
sidebar = sidebar.filter(item => item !== null && item !== undefined);
|
||||
return sidebar;
|
||||
}
|
||||
Loading…
Reference in New Issue