mirror of
https://github.com/KazooTTT/kazoottt-blog.git
synced 2025-06-16 15:31:21 +08:00
99 lines
2.8 KiB
JavaScript
99 lines
2.8 KiB
JavaScript
// 批量修改 ./src/content/post/* 中的frontmatter中的category
|
|
|
|
const fs = require('fs')
|
|
const path = require('path')
|
|
|
|
const contentDir = path.join(__dirname, '../src/content/post')
|
|
// full path, root path, parent path
|
|
|
|
const getCategoryMode = 'parent'
|
|
const isGetCategoryFromPath = false
|
|
|
|
function toCamelCase(str) {
|
|
return str
|
|
.split(' ')
|
|
.map((word, index) => {
|
|
if (index === 0) return word.toLowerCase()
|
|
return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()
|
|
})
|
|
.join('')
|
|
}
|
|
|
|
function processDirectory(dir) {
|
|
fs.readdirSync(dir).forEach((item) => {
|
|
const itemPath = path.join(dir, item)
|
|
const stats = fs.statSync(itemPath)
|
|
|
|
if (stats.isDirectory()) {
|
|
processDirectory(itemPath)
|
|
} else if (stats.isFile() && path.extname(item) === '.md') {
|
|
processFile(itemPath)
|
|
}
|
|
})
|
|
}
|
|
|
|
function getCategoryFromPath(filePath) {
|
|
const relativePath = path.relative(contentDir, filePath)
|
|
const pathParts = relativePath.split(path.sep)
|
|
|
|
if (pathParts.length > 1) {
|
|
if (getCategoryMode === 'full') {
|
|
// Join all directory parts except the filename and convert to camelCase if contains spaces
|
|
const category = pathParts.slice(0, -1).join('-')
|
|
return category.includes(' ') ? toCamelCase(category) : category
|
|
} else if (getCategoryMode === 'root') {
|
|
// Just use the first directory after "post" and convert to camelCase if contains spaces
|
|
const category = pathParts[0]
|
|
return category.includes(' ') ? toCamelCase(category) : category
|
|
} else if (getCategoryMode === 'parent') {
|
|
// Just use the last directory before the filename
|
|
const category = pathParts[pathParts.length - 2]
|
|
return category.includes(' ') ? toCamelCase(category) : category
|
|
}
|
|
}
|
|
|
|
return null
|
|
}
|
|
|
|
function processFile(filePath) {
|
|
const fileContent = fs.readFileSync(filePath, 'utf8')
|
|
|
|
if (!isGetCategoryFromPath) {
|
|
return
|
|
}
|
|
|
|
const category = getCategoryFromPath(filePath)
|
|
|
|
if (!category) {
|
|
console.log(`No category found for: ${filePath}`)
|
|
return
|
|
}
|
|
|
|
const frontmatter = fileContent.match(/^---\n[\s\S]*?\n---/)
|
|
if (frontmatter) {
|
|
const frontmatterContent = frontmatter[0]
|
|
const frontmatterLines = frontmatterContent.split('\n')
|
|
|
|
let categoryUpdated = false
|
|
const updatedFrontmatterLines = frontmatterLines.map((line) => {
|
|
if (line.startsWith('category:')) {
|
|
categoryUpdated = true
|
|
return `category: ${category}`
|
|
}
|
|
return line
|
|
})
|
|
|
|
// Add category if it doesn't exist
|
|
if (!categoryUpdated) {
|
|
updatedFrontmatterLines.splice(-1, 0, `category: ${category}`)
|
|
}
|
|
|
|
const updatedFrontmatter = updatedFrontmatterLines.join('\n')
|
|
const updatedFileContent = fileContent.replace(frontmatterContent, updatedFrontmatter)
|
|
fs.writeFileSync(filePath, updatedFileContent, 'utf8')
|
|
console.log(`Updated category to '${category}' for: ${filePath}`)
|
|
}
|
|
}
|
|
|
|
processDirectory(contentDir)
|