目前使用hugo作为博客系统,使用typora作为博客的编辑器。书接上文Hugo使用技巧,之前每次都需要在博客根目录执行
hugo new posts/文章标题/index.md
创建新的文章。感觉很麻烦。所以想写个工具简化这个过程。
思路
输入文件标题后执行创建文章的命令,然后生成新的文章的快捷方式,方便使用typora进行编辑。
代码
使用Claude生成的,很方便。
如果是windows平台,使用
go build -o HugoHelper.exe main.go
进行编译。
使用前需要配置blog环境变量,key为blog,value为你的项目的根路径
比如我的根目录是C:\UGit\qvqw.date
代码
package main
import (
"bufio"
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"
)
func main() {
// 获取当前程序执行路径
execPath, err := os.Getwd()
if err != nil {
fmt.Printf("错误: 获取当前路径失败: %v\n", err)
os.Exit(1)
}
// 从环境变量获取博客路径
blogPath := os.Getenv("blog")
if blogPath == "" {
fmt.Println("错误: 环境变量 'blog' 未设置")
os.Exit(1)
}
// 验证博客路径是否存在
if _, err := os.Stat(blogPath); os.IsNotExist(err) {
fmt.Printf("错误: 博客路径不存在: %s\n", blogPath)
os.Exit(1)
}
// 获取用户输入的文章标题
reader := bufio.NewReader(os.Stdin)
fmt.Print("请输入文章标题: ")
title, err := reader.ReadString('\n')
if err != nil {
fmt.Printf("错误: 读取输入失败: %v\n", err)
os.Exit(1)
}
// 清理标题(移除空白字符和换行符)
title = strings.TrimSpace(title)
if title == "" {
fmt.Println("错误: 标题不能为空")
os.Exit(1)
}
// 构建 hugo 命令
cmd := exec.Command("hugo", "new", fmt.Sprintf("posts/%s/index.md", title))
cmd.Dir = blogPath
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
// 执行命令
if err := cmd.Run(); err != nil {
fmt.Printf("错误: 创建文章失败: %v\n", err)
os.Exit(1)
}
// 源文件路径(Hugo 创建的文件)
sourceFile := filepath.Join(blogPath, "content", "posts", title, "index.md")
// 目标软链接路径(在当前目录)
linkName := filepath.Join(execPath, fmt.Sprintf("%s.md", title))
// 删除已存在的软链接(如果有的话)
_ = os.Remove(linkName)
// 创建软链接
err = os.Symlink(sourceFile, linkName)
if err != nil {
fmt.Printf("警告: 创建软链接失败: %v\n", err)
} else {
fmt.Printf("成功创建软链接: %s -> %s\n", linkName, sourceFile)
}
fmt.Printf("成功创建文章: %s\n", sourceFile)
// 等待用户按回车键后退出
waitExit := bufio.NewReader(os.Stdin)
fmt.Print("按回车键退出...")
waitExit.ReadString('\n')
}
注意
如果无法创建软链接,请使用管理员权限运行。