目前使用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

image-20250107144700000

代码

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')
}

注意

如果无法创建软链接,请使用管理员权限运行。