修改主题路径

This commit is contained in:
xugaoyi 2020-04-21 12:53:33 +08:00
parent 45f0c5846d
commit df1293bbdc
64 changed files with 16 additions and 346 deletions

View File

@ -21,7 +21,7 @@ module.exports = {
markdown: { markdown: {
lineNumbers: true // 代码行号 lineNumbers: true // 代码行号
}, },
theme: require.resolve('../../vdoing/theme-vdoing'), // 使用的主题 theme: require.resolve('../../theme-vdoing'), // 使用的主题
themeConfig: { // 主题配置 themeConfig: { // 主题配置
nav, nav,
sidebarDepth: 2, // 侧边栏显示深度默认1最大2显示到h3标题 sidebarDepth: 2, // 侧边栏显示深度默认1最大2显示到h3标题

View File

@ -2,13 +2,12 @@
"name": "vuepress-theme-vdoing", "name": "vuepress-theme-vdoing",
"version": "1.0.0", "version": "1.0.0",
"scripts": { "scripts": {
"test":"vuepress dev docs", "test": "",
"dev": "vuepress dev docs", "dev": "vuepress dev docs",
"build": "vuepress build docs", "build": "vuepress build docs",
"deploy": "bash deploy.sh", "deploy": "bash deploy.sh",
"updateFm": "node vdoing/utils/frontmatter.js -update", "editFm": "node utils/editFrontmatter.js",
"editFm": "node vdoing/utils/editFrontmatter.js", "baiduPush": "node utils/baiduPush.js https://xugaoyi.com && bash baiduPush.sh"
"baiduPush": "node vdoing/utils/baiduPush.js https://xugaoyi.com && bash baiduPush.sh"
}, },
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {

View File

Before

Width:  |  Height:  |  Size: 108 B

After

Width:  |  Height:  |  Size: 108 B

View File

@ -2,7 +2,7 @@ const fs = require('fs'); // 文件模块
const matter = require('gray-matter'); // FrontMatter解析器 https://github.com/jonschlinkert/gray-matter const matter = require('gray-matter'); // FrontMatter解析器 https://github.com/jonschlinkert/gray-matter
const jsonToYaml = require('json2yaml') const jsonToYaml = require('json2yaml')
const chalk = require('chalk') // 命令行打印美化 const chalk = require('chalk') // 命令行打印美化
const arg = process.argv.splice(2)[0]; // 获取命令行传入的参数 // const arg = process.argv.splice(2)[0]; // 获取命令行传入的参数
const readFileList = require('./modules/readFileList'); const readFileList = require('./modules/readFileList');
const { type, repairDate, dateFormat} = require('./modules/fn'); const { type, repairDate, dateFormat} = require('./modules/fn');
const log = console.log const log = console.log
@ -60,18 +60,18 @@ function setFrontmatter(sourceDir) {
// 更新title和permalink // 更新title和permalink
if (arg === '-update' && matterData.title != file.name){ // 当title和文件名不一致时才更新 // if (arg === '-update' && matterData.title != file.name){ // 当title和文件名不一致时才更新
matterData.title = file.name; // matterData.title = file.name;
if (/pages/.test(matterData.permalink)) { // if (/pages/.test(matterData.permalink)) {
matterData.permalink = file.permalink; // matterData.permalink = file.permalink;
} // }
// 修复date时区和格式被修改的问题 (并非更新date的值) // // 修复date时区和格式被修改的问题 (并非更新date的值)
matterData.date = repairDate(matterData.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; // 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); // 写入 // fs.writeFileSync(file.filePath, newData2); // 写入
log(chalk.blue('tip ') + chalk.green(`update frontmatter title and permalink(更新frontmatter的标题和永久链接)${file.filePath} `)) // log(chalk.blue('tip ') + chalk.green(`update frontmatter title and permalink(更新frontmatter的标题和永久链接)${file.filePath} `))
} // }
} }
}) })

View File

@ -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);
}
})
}

View File

@ -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} `)
})
}

View File

@ -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}`)
}
}
})
}

View File

@ -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;
}