feat: 更新配置

pull/32/merge
dunwu 2023-08-18 20:37:16 +08:00
parent c82e9d737a
commit 4c3ab73e81
12 changed files with 209 additions and 104 deletions

3
.babelrc 100644
View File

@ -0,0 +1,3 @@
{
"compact": false
}

View File

@ -15,7 +15,7 @@ jobs:
strategy: strategy:
matrix: matrix:
node-version: [14.x] node-version: [16.x]
steps: steps:
# 使用的动作。格式userName/repoName。作用检出仓库获取源码。 官方actions库https://github.com/actions # 使用的动作。格式userName/repoName。作用检出仓库获取源码。 官方actions库https://github.com/actions

View File

@ -12,7 +12,10 @@ module.exports = {
// 注入到页面<head> 中的标签,格式[tagName, { attrName: attrValue }, innerHTML?] // 注入到页面<head> 中的标签,格式[tagName, { attrName: attrValue }, innerHTML?]
['link', { rel: 'icon', href: '/img/favicon.ico' }], //favicons资源放在public文件夹 ['link', { rel: 'icon', href: '/img/favicon.ico' }], //favicons资源放在public文件夹
['meta', { name: 'keywords', content: 'vuepress,theme,blog,vdoing' }], ['meta', { name: 'keywords', content: 'vuepress,theme,blog,vdoing' }],
['meta', { name: 'theme-color', content: '#11a8cd' }] // 移动浏览器主题颜色 ['meta', { name: 'theme-color', content: '#11a8cd' }], // 移动浏览器主题颜色
['meta', { name: 'wwads-cn-verify', content: 'mxqWx62nfQQ9ocT4e5DzISHzOWyF4s' }], // 广告相关,你可以去掉
['script', { src: 'https://cdn.wwads.cn/js/makemoney.js', type: 'text/javascript' }], // 广告相关,你可以去掉
], ],
markdown: { markdown: {
// lineNumbers: true, // lineNumbers: true,
@ -63,9 +66,10 @@ module.exports = {
editLinkText: '📝 帮助改善此页面!', editLinkText: '📝 帮助改善此页面!',
// 以下配置是Vdoing主题改动的和新增的配置 // 以下配置是Vdoing主题改动的和新增的配置
sidebar: { mode: 'structuring', collapsable: false }, // 侧边栏 'structuring' | { mode: 'structuring', collapsable: Boolean} | 'auto' | 自定义 温馨提示:目录页数据依赖于结构化的侧边栏数据,如果你不设置为'structuring',将无法使用目录页 sidebar: { mode: 'structuring', collapsable: true }, // 侧边栏 'structuring' | { mode: 'structuring', collapsable:
// Boolean} | 'auto' | 自定义 温馨提示:目录页数据依赖于结构化的侧边栏数据,如果你不设置为'structuring',将无法使用目录页
// sidebarOpen: false, // 初始状态是否打开侧边栏默认true sidebarOpen: true, // 初始状态是否打开侧边栏默认true
updateBar: { updateBar: {
// 最近更新栏 // 最近更新栏
showToArticle: true // 显示到文章页底部默认true showToArticle: true // 显示到文章页底部默认true

View File

@ -20,25 +20,42 @@
module.exports = { module.exports = {
// 万维广告 // 万维广告
pageB: ` // pageT: `
<div class="wwads-cn wwads-horizontal pageB" data-id="136" style="width:100%;max-height:80px;min-height:auto;"></div> // <div class="wwads-cn wwads-horizontal page-wwads" data-id="261"></div>
<style> // <style>
.pageB img{width:80px!important;} // .page-wwads{
.wwads-horizontal .wwads-text, .wwads-content .wwads-text{line-height:1;} // width:100%!important;
</style> // min-height: 0;
`, // margin: 0;
// }
// .page-wwads .wwads-img img{
// width:80px!important;
// }
// .page-wwads .wwads-poweredby{
// width: 40px;
// position: absolute;
// right: 25px;
// bottom: 3px;
// }
// .wwads-content .wwads-text, .page-wwads .wwads-text{
// height: 100%;
// padding-top: 5px;
// display: block;
// }
// </style>
// `,
windowRB: ` windowRB: `
<div class="wwads-cn wwads-vertical windowRB" data-id="136" style="max-width:160px; <div class="wwads-cn wwads-vertical windowRB" data-id="261" style="max-width:160px;
min-width: auto;min-height:auto;"></div> min-width: auto;min-height:auto;"></div>
<style> <style>
.windowRB{ padding: 0;} .windowRB{ padding: 0;}
.windowRB .wwads-img{margin-top: 10px;} .windowRB .wwads-img{margin-top: 10px;}
.windowRB .wwads-content{margin: 0 10px 10px 10px;} .windowRB .wwads-content{margin: 0 10px 40px 10px;}
.custom-html-window-rb .close-but{ .custom-html-window-rb .close-but{
display: none; display: none;
} }
</style> </style>
` `,
} }
// module.exports = { // module.exports = {

View File

@ -1,9 +1,59 @@
// import vue from 'vue/dist/vue.esm.browser' /**
* to主题使用者你可以去掉本文件的所有代码
*/
export default ({ export default ({
Vue, // VuePress 正在使用的 Vue 构造函数 Vue, // VuePress 正在使用的 Vue 构造函数
options, // 附加到根实例的一些选项 options, // 附加到根实例的一些选项
router, // 当前应用的路由实例 router, // 当前应用的路由实例
siteData // 站点元数据 siteData, // 站点元数据
isServer // 当前应用配置是处于 服务端渲染 还是 客户端
}) => { }) => {
// window.Vue = vue // 使页面中可以使用Vue构造函数 使页面中的vue demo生效
// 用于监控在路由变化时检查广告拦截器 (to主题使用者你可以去掉本文件的所有代码)
if (!isServer) {
router.afterEach(() => {
//check if wwads' fire function was blocked after document is ready with 3s timeout (waiting the ad loading)
docReady(function () {
setTimeout(function () {
if (window._AdBlockInit === undefined) {
ABDetected();
}
}, 3000);
});
// 删除事件改为隐藏事件
setTimeout(() => {
const pageAD = document.querySelector('.page-wwads');
if (!pageAD) return;
const btnEl = pageAD.querySelector('.wwads-hide');
if (btnEl) {
btnEl.onclick = () => {
pageAD.style.display = 'none';
}
}
// 显示广告模块
if (pageAD.style.display === 'none') {
pageAD.style.display = 'flex';
}
}, 900);
})
}
}
function ABDetected() {
const h = "<style>.wwads-horizontal,.wwads-vertical{background-color:#f4f8fa;padding:5px;min-height:120px;margin-top:20px;box-sizing:border-box;border-radius:3px;font-family:sans-serif;display:flex;min-width:150px;position:relative;overflow:hidden;}.wwads-horizontal{flex-wrap:wrap;justify-content:center}.wwads-vertical{flex-direction:column;align-items:center;padding-bottom:32px}.wwads-horizontal a,.wwads-vertical a{text-decoration:none}.wwads-horizontal .wwads-img,.wwads-vertical .wwads-img{margin:5px}.wwads-horizontal .wwads-content,.wwads-vertical .wwads-content{margin:5px}.wwads-horizontal .wwads-content{flex:130px}.wwads-vertical .wwads-content{margin-top:10px}.wwads-horizontal .wwads-text,.wwads-content .wwads-text{font-size:14px;line-height:1.4;color:#0e1011;-webkit-font-smoothing:antialiased}.wwads-horizontal .wwads-poweredby,.wwads-vertical .wwads-poweredby{display:block;font-size:11px;color:#a6b7bf;margin-top:1em}.wwads-vertical .wwads-poweredby{position:absolute;left:10px;bottom:10px}.wwads-horizontal .wwads-poweredby span,.wwads-vertical .wwads-poweredby span{transition:all 0.2s ease-in-out;margin-left:-1em}.wwads-horizontal .wwads-poweredby span:first-child,.wwads-vertical .wwads-poweredby span:first-child{opacity:0}.wwads-horizontal:hover .wwads-poweredby span,.wwads-vertical:hover .wwads-poweredby span{opacity:1;margin-left:0}.wwads-horizontal .wwads-hide,.wwads-vertical .wwads-hide{position:absolute;right:-23px;bottom:-23px;width:46px;height:46px;border-radius:23px;transition:all 0.3s ease-in-out;cursor:pointer;}.wwads-horizontal .wwads-hide:hover,.wwads-vertical .wwads-hide:hover{background:rgb(0 0 0 /0.05)}.wwads-horizontal .wwads-hide svg,.wwads-vertical .wwads-hide svg{position:absolute;left:10px;top:10px;fill:#a6b7bf}.wwads-horizontal .wwads-hide:hover svg,.wwads-vertical .wwads-hide:hover svg{fill:#3E4546}</style><a href='https://wwads.cn/page/whitelist-wwads' class='wwads-img' target='_blank' rel='nofollow'><img src='https://fastly.jsdelivr.net/gh/xugaoyi/image_store@master/blog/wwads.2a3pidhlh4ys.webp' width='130'></a><div class='wwads-content'><a href='https://wwads.cn/page/whitelist-wwads' class='wwads-text' target='_blank' rel='nofollow'>为了本站的长期运营,请将我们的网站加入广告拦截器的白名单,感谢您的支持!<span style='color: #11a8cd'>如何添加白名单?</span></a><a href='https://wwads.cn/page/end-user-privacy' class='wwads-poweredby' title='万维广告 让广告更优雅,且有用' target='_blank'><span>广告</span></a></div><a class='wwads-hide' onclick='parentNode.remove()' title='隐藏广告'><svg xmlns='http://www.w3.org/2000/svg' width='6' height='7'><path d='M.879.672L3 2.793 5.121.672a.5.5 0 11.707.707L3.708 3.5l2.12 2.121a.5.5 0 11-.707.707l-2.12-2.12-2.122 2.12a.5.5 0 11-.707-.707l2.121-2.12L.172 1.378A.5.5 0 01.879.672z'></path></svg></a>";
const wwadsEl = document.getElementsByClassName("wwads-cn");
const wwadsContentEl = document.querySelector('.wwads-content');
if (wwadsEl[0] && !wwadsContentEl) {
wwadsEl[0].innerHTML = h;
}
};
//check document ready
function docReady(t) {
"complete" === document.readyState ||
"interactive" === document.readyState
? setTimeout(t, 1)
: document.addEventListener("DOMContentLoaded", t);
} }

View File

@ -1,11 +1,11 @@
{ {
"name": "java-tutorial", "name": "db-tutorial",
"version": "1.0.0", "version": "1.0.0",
"private": true, "private": true,
"scripts": { "scripts": {
"clean": "rimraf docs/.temp", "clean": "rimraf docs/.temp",
"start": "vuepress dev docs", "start": "node --max_old_space_size=4096 ./node_modules/vuepress/cli.js dev docs",
"build": "vuepress build docs", "build": "node --max_old_space_size=4096 ./node_modules/vuepress/cli.js build docs",
"deploy": "bash scripts/deploy.sh", "deploy": "bash scripts/deploy.sh",
"updateTheme": "yarn remove vuepress-theme-vdoing && rm -rf node_modules && yarn && yarn add vuepress-theme-vdoing -D", "updateTheme": "yarn remove vuepress-theme-vdoing && rm -rf node_modules && yarn && yarn add vuepress-theme-vdoing -D",
"editFm": "node utils/editFrontmatter.js", "editFm": "node utils/editFrontmatter.js",
@ -15,19 +15,23 @@
"view-info": "vuepress view-info ./ --temp docs/.temp" "view-info": "vuepress view-info ./ --temp docs/.temp"
}, },
"devDependencies": { "devDependencies": {
"dayjs": "^1.9.7", "dayjs": "^1.11.7",
"inquirer": "^7.1.0", "inquirer": "^9.1.4",
"json2yaml": "^1.1.0", "json2yaml": "^1.1.0",
"vuepress": "1.9.2", "markdownlint-cli": "^0.33.0",
"markdownlint-rule-emphasis-style": "^1.0.1",
"rimraf": "^4.1.2",
"vue-toasted": "^1.1.25",
"vuepress": "1.9.9",
"vuepress-plugin-baidu-tongji": "^1.0.1", "vuepress-plugin-baidu-tongji": "^1.0.1",
"vuepress-plugin-comment": "^0.7.3", "vuepress-plugin-comment": "^0.7.3",
"vuepress-plugin-demo-block": "^0.7.2", "vuepress-plugin-demo-block": "^0.7.2",
"vuepress-plugin-flowchart": "^1.4.2",
"vuepress-plugin-fulltext-search": "^2.2.1", "vuepress-plugin-fulltext-search": "^2.2.1",
"vuepress-plugin-one-click-copy": "^1.0.2", "vuepress-plugin-one-click-copy": "^1.0.2",
"vuepress-plugin-thirdparty-search": "^1.0.2", "vuepress-plugin-thirdparty-search": "^1.0.2",
"vuepress-plugin-zooming": "^1.1.7", "vuepress-plugin-zooming": "^1.1.7",
"vuepress-plugin-flowchart": "^1.4.2", "vuepress-theme-vdoing": "^1.12.9",
"vuepress-theme-vdoing": "^1.10.3",
"yamljs": "^0.3.0", "yamljs": "^0.3.0",
"markdownlint-cli": "^0.25.0", "markdownlint-cli": "^0.25.0",
"markdownlint-rule-emphasis-style": "^1.0.1", "markdownlint-rule-emphasis-style": "^1.0.1",

10
prettier.config.js 100644
View File

@ -0,0 +1,10 @@
/**
* @see https://prettier.io/docs/en/options.html
* @see https://prettier.io/docs/en/configuration.html
*/
module.exports = {
tabWidth: 2,
semi: false,
singleQuote: true,
trailingComma: 'none'
}

View File

@ -2,7 +2,7 @@
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# gh-pages 部署脚本 # gh-pages 部署脚本
# @author Zhang Peng # @author <a href="mailto:forbreak@163.com">Zhang Peng</a>
# @since 2020/2/10 # @since 2020/2/10
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------

View File

@ -1,14 +1,15 @@
#批量添加和修改、删除front matter配置文件 # 批量添加和修改、删除front matter配置文件
# 需要批量处理的路径docs文件夹内的文件夹 (数组。映射路径docs/arr[0]/arr[1] ... ) # 需要批量处理的路径docs文件夹内的文件夹 (数组映射路径path[0]/path[1]/path[2] ... )
path: path:
- docs # 第一个成员必须是docs - docs # 第一个成员必须是docs
# 要删除的字段 (数组) # 要删除的字段 (数组)
delete: delete:
# - test
# - tags # - tags
# 要添加、修改front matter的数据 front matter中没有的数据则添加已有的数据则覆盖 # 要添加、修改front matter的数据 front matter中没有的数据则添加已有的数据则覆盖
data: data:
article: false # author:
# name: xugaoyi
# link: https://github.com/xugaoyi

View File

@ -1,41 +1,43 @@
/** /**
* 批量添加和修改front matter 需要配置 ./config.yml 文件 * 批量添加和修改front matter 需要配置 ./config.yml 文件
*/ */
const fs = require('fs'); // 文件模块 const fs = require('fs') // 文件模块
const path = require('path'); // 路径模块 const path = require('path') // 路径模块
const matter = require('gray-matter'); // front matter解析器 https://github.com/jonschlinkert/gray-matter const matter = require('gray-matter') // front matter解析器 https://github.com/jonschlinkert/gray-matter
const jsonToYaml = require('json2yaml') const jsonToYaml = require('json2yaml')
const yamlToJs = require('yamljs') const yamlToJs = require('yamljs')
const inquirer = require('inquirer') // 命令行操作 const inquirer = require('inquirer') // 命令行操作
const chalk = require('chalk') // 命令行打印美化 const chalk = require('chalk') // 命令行打印美化
const readFileList = require('./modules/readFileList'); const readFileList = require('./modules/readFileList')
const { type, repairDate} = require('./modules/fn'); const { type, repairDate } = require('./modules/fn')
const log = console.log const log = console.log
const configPath = path.join(__dirname, 'config.yml') // 配置文件的路径 const configPath = path.join(__dirname, 'config.yml') // 配置文件的路径
main(); main()
/** /**
* 主体函数 * 主体函数
*/ */
async function main() { async function main() {
const promptList = [
{
type: 'confirm',
message: chalk.yellow('批量操作frontmatter有修改数据的风险确定要继续吗'),
name: 'edit'
}
]
let edit = true
const promptList = [{ await inquirer.prompt(promptList).then((answers) => {
type: "confirm",
message: chalk.yellow('批量操作frontmatter有修改数据的风险确定要继续吗'),
name: "edit",
}];
let edit = true;
await inquirer.prompt(promptList).then(answers => {
edit = answers.edit edit = answers.edit
}) })
if(!edit) { // 退出操作 if (!edit) {
// 退出操作
return return
} }
const config = yamlToJs.load(configPath) // 解析配置文件的数据转为js对象 const config = yamlToJs.load(configPath) // 解析配置文件的数据转为js对象
if (type(config.path) !== 'array') { if (type(config.path) !== 'array') {
@ -48,27 +50,26 @@ async function main() {
return return
} }
const filePath = path.join(__dirname, '..', ...config.path); // 要批量修改的文件路径 const filePath = path.join(__dirname, '..', ...config.path) // 要批量修改的文件路径
const files = readFileList(filePath); // 读取所有md文件数据 const files = readFileList(filePath) // 读取所有md文件数据
files.forEach(file => { files.forEach((file) => {
let dataStr = fs.readFileSync(file.filePath, 'utf8');// 读取每个md文件的内容 let dataStr = fs.readFileSync(file.filePath, 'utf8') // 读取每个md文件的内容
const fileMatterObj = matter(dataStr) // 解析md文件的front Matter。 fileMatterObj => {content:'剔除frontmatter后的文件内容字符串', data:{<frontmatter对象>}, ...} const fileMatterObj = matter(dataStr) // 解析md文件的front Matter。 fileMatterObj => {content:'剔除frontmatter后的文件内容字符串', data:{<frontmatter对象>}, ...}
let matterData = fileMatterObj.data; // 得到md文件的front Matter let matterData = fileMatterObj.data // 得到md文件的front Matter
let mark = false let mark = false
// 删除操作 // 删除操作
if (config.delete) { if (config.delete) {
if( type(config.delete) !== 'array' ) { if (type(config.delete) !== 'array') {
log(chalk.yellow('未能完成删除操作delete字段的值应该是一个数组')) log(chalk.yellow('未能完成删除操作delete字段的值应该是一个数组'))
} else { } else {
config.delete.forEach(item => { config.delete.forEach((item) => {
if (matterData[item]) { if (matterData[item]) {
delete matterData[item] delete matterData[item]
mark = true mark = true
} }
}) })
} }
} }
@ -77,16 +78,21 @@ async function main() {
Object.assign(matterData, config.data) // 将配置数据合并到front Matter对象 Object.assign(matterData, config.data) // 将配置数据合并到front Matter对象
mark = true mark = true
} }
// 有操作时才继续 // 有操作时才继续
if (mark) { if (mark) {
if(matterData.date && type(matterData.date) === 'date') { if (matterData.date && type(matterData.date) === 'date') {
matterData.date = repairDate(matterData.date) // 修复时间格式 matterData.date = repairDate(matterData.date) // 修复时间格式
} }
const newData = jsonToYaml.stringify(matterData).replace(/\n\s{2}/g,"\n").replace(/"/g,"") + '---\r\n' + fileMatterObj.content; const newData =
fs.writeFileSync(file.filePath, newData); // 写入 jsonToYaml
.stringify(matterData)
.replace(/\n\s{2}/g, '\n')
.replace(/"/g, '') +
'---\r\n' +
fileMatterObj.content
fs.writeFileSync(file.filePath, newData) // 写入
log(chalk.green(`update frontmatter${file.filePath} `)) log(chalk.green(`update frontmatter${file.filePath} `))
} }
}) })
} }

View File

@ -1,21 +1,25 @@
// 类型判断 // 类型判断
exports.type = function (o){ exports.type = function (o) {
var s = Object.prototype.toString.call(o) var s = Object.prototype.toString.call(o)
return s.match(/\[object (.*?)\]/)[1].toLowerCase() return s.match(/\[object (.*?)\]/)[1].toLowerCase()
} }
// 修复date时区格式的问题 // 修复date时区格式的问题
exports.repairDate = function (date) { exports.repairDate = function (date) {
date = new Date(date); date = new Date(date)
return `${date.getUTCFullYear()}-${zero(date.getUTCMonth()+1)}-${zero(date.getUTCDate())} ${zero(date.getUTCHours())}:${zero(date.getUTCMinutes())}:${zero(date.getUTCSeconds())}`; return `${date.getUTCFullYear()}-${zero(date.getUTCMonth() + 1)}-${zero(date.getUTCDate())} ${zero(
date.getUTCHours()
)}:${zero(date.getUTCMinutes())}:${zero(date.getUTCSeconds())}`
} }
// 日期的格式 // 日期的格式
exports.dateFormat = function (date) { exports.dateFormat = function (date) {
return `${date.getFullYear()}-${zero(date.getMonth()+1)}-${zero(date.getDate())} ${zero(date.getHours())}:${zero(date.getMinutes())}:${zero(date.getSeconds())}` return `${date.getFullYear()}-${zero(date.getMonth() + 1)}-${zero(date.getDate())} ${zero(date.getHours())}:${zero(
date.getMinutes()
)}:${zero(date.getSeconds())}`
} }
// 小于10补0 // 小于10补0
function zero(d){ function zero(d) {
return d.toString().padStart(2,'0') return d.toString().padStart(2, '0')
} }

View File

@ -1,43 +1,49 @@
/** /**
* 读取所有md文件数据 * 读取所有md文件数据
*/ */
const fs = require('fs'); // 文件模块 const fs = require('fs') // 文件模块
const path = require('path'); // 路径模块 const path = require('path') // 路径模块
const docsRoot = path.join(__dirname, '..', '..', 'docs'); // docs文件路径 const docsRoot = path.join(__dirname, '..', '..', 'docs') // docs文件路径
function readFileList(dir = docsRoot, filesList = []) { function readFileList(dir = docsRoot, filesList = []) {
const files = fs.readdirSync(dir); const files = fs.readdirSync(dir)
files.forEach( (item, index) => { files.forEach((item, index) => {
let filePath = path.join(dir, item); let filePath = path.join(dir, item)
const stat = fs.statSync(filePath); const stat = fs.statSync(filePath)
if (stat.isDirectory() && item !== '.vuepress') { if (stat.isDirectory() && item !== '.vuepress') {
readFileList(path.join(dir, item), filesList); //递归读取文件 readFileList(path.join(dir, item), filesList) //递归读取文件
} else { } else {
if(path.basename(dir) !== 'docs'){ // 过滤docs目录级下的文件 if (path.basename(dir) !== 'docs') {
// 过滤docs目录级下的文件
const fileNameArr = path.basename(filePath).split('.') const filename = path.basename(filePath)
let name = null, type = null; const fileNameArr = filename.split('.')
if (fileNameArr.length === 2) { // 没有序号的文件 const firstDotIndex = filename.indexOf('.')
name = fileNameArr[0] const lastDotIndex = filename.lastIndexOf('.')
type = fileNameArr[1]
} else if (fileNameArr.length === 3) { // 有序号的文件
name = fileNameArr[1]
type = fileNameArr[2]
} else { // 超过两个‘.’的
log(chalk.yellow(`warning: 该文件 "${filePath}" 没有按照约定命名,将忽略生成相应数据。`))
return
}
if(type === 'md'){ // 过滤非md文件
filesList.push({
name,
filePath
});
}
let name = null,
type = null
if (fileNameArr.length === 2) {
// 没有序号的文件
name = fileNameArr[0]
type = fileNameArr[1]
} else if (fileNameArr.length >= 3) {
// 有序号的文件(或文件名中间有'.')
name = filename.substring(firstDotIndex + 1, lastDotIndex)
type = filename.substring(lastDotIndex + 1)
} }
}
}); if (type === 'md') {
return filesList; // 过滤非md文件
filesList.push({
name,
filePath
})
}
}
}
})
return filesList
} }
module.exports = readFileList; module.exports = readFileList