go实现
typecho转换为md
package main
import (
"database/sql"
"fmt"
"os"
"strings"
"time"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 配置数据库连接信息
dbHost := "localhost" // 数据库主机
dbUser := "root" // 数据库用户名
dbPass := "password123" // 数据库密码
dbName := "typecho_db" // 数据库名称
// 连接到数据库
dsn := fmt.Sprintf("%s:%s@tcp(%s:3306)/%s", dbUser, dbPass, dbHost, dbName)
db, err := sql.Open("mysql", dsn)
if err != nil {
fmt.Println("无法连接数据库:", err)
return
}
defer db.Close()
// 确保连接成功
if err := db.Ping(); err != nil {
fmt.Println("数据库连接失败:", err)
return
}
// 执行查询,获取文章的标题、内容、创建时间、分类、标签
sqlQuery := `
SELECT c.title, c.text, c.created, t1.category, t1.tags
FROM typecho_contents c
JOIN (
SELECT r.cid, GROUP_CONCAT(m.name) AS tags
FROM typecho_metas m
JOIN typecho_relationships r ON m.mid = r.mid
WHERE m.type = 'tag'
GROUP BY r.cid
) t1 ON c.cid = t1.cid
JOIN (
SELECT r.cid, m.name AS category
FROM typecho_metas m
JOIN typecho_relationships r ON m.mid = r.mid
WHERE m.type = 'category'
) t2 ON c.cid = t2.cid
`
rows, err := db.Query(sqlQuery)
if err != nil {
fmt.Println("查询执行失败:", err)
return
}
defer rows.Close()
// 创建 content/posts 目录(如果不存在)
if err := os.MkdirAll("content/posts", os.ModePerm); err != nil {
fmt.Println("创建目录失败:", err)
return
}
// 处理查询结果
for rows.Next() {
var title, text, category, tags string
var created int64
if err := rows.Scan(&title, &text, &created, &category, &tags); err != nil {
fmt.Println("读取行数据失败:", err)
continue
}
// 格式化创建时间
createdTime := time.Unix(created, 0).Format("2006-01-02 15:04:05")
// 格式化 Markdown 文件内容
frontMatter := fmt.Sprintf(`---
title: "%s"
categories: [%s]
tags: [%s]
date: %s
---
`, title, category, tags, createdTime)
// 去除 Typecho 内容中的 <!--markdown--> 标签
body := strings.Replace(text, "<!--markdown-->", "", -1)
// 生成 Markdown 文件内容
content := frontMatter + body
// 替换不合法的文件名字符
fileName := sanitizeFileName(title)
filePath := fmt.Sprintf("content/posts/%s.md", fileName)
// 将 Markdown 内容写入文件
if err := os.WriteFile(filePath, []byte(content), 0644); err != nil {
fmt.Println("写入文件失败:", err)
continue
}
// 输出生成文件的名称
fmt.Println("生成文件:", filePath)
}
// 检查查询是否有错误
if err := rows.Err(); err != nil {
fmt.Println("查询结果处理失败:", err)
}
}
// sanitizeFileName 用于替换文件名中的不合法字符
func sanitizeFileName(title string) string {
// 替换不合法的字符为空格或其他字符
replacements := map[string]string{
" ": "-", "?": "-", "\\": "-", "/": "-", ":": "-", "|": "-",
"*": "-", "<": "-", ">": "-", "\"": "-", "'": "-", "&": "-",
}
for old, new := range replacements {
title = strings.ReplaceAll(title, old, new)
}
return title
}
代码说明
代码说明:
数据库连接:
使用 github.com/go-sql-driver/mysql 连接 MySQL 数据库。你可以通过 go get github.com/go-sql-driver/mysql 安装该驱动。
数据库连接的 DSN(Data Source Name)包括数据库主机、用户名、密码和数据库名称。
SQL 查询:
查询语句与 PHP 版本的查询类似,从 Typecho 数据库中提取文章的标题、内容、创建时间、分类和标签。
生成 Markdown 文件:
根据查询结果生成 Markdown 文件。文件的 front matter 部分包括文章的标题、分类、标签和创建时间。
文章正文部分是 Typecho 文章的内容,移除了 <!--markdown--> 标签。
文件名处理:
使用 sanitizeFileName 函数替换文件名中的不合法字符,如空格、问号、斜杠、冒号等。
文件写入:
将生成的 Markdown 文件内容写入到 content/posts/ 目录下,每个文章生成一个 .md 文件。
目录创建:
如果 content/posts/ 目录不存在,程序会自动创建它。
使用方法
安装 Go MySQL 驱动: 执行以下命令来安装 Go 的 MySQL 驱动:
bash
复制代码
go get github.com/go-sql-driver/mysql
修改数据库连接信息: 打开代码,修改 dbHost、dbUser、dbPass 和 dbName 变量,填写你的数据库连接信息。
运行 Go 程序: 保存文件为 converter.go,然后使用以下命令运行它:
bash
复制代码
go run converter.go
查看生成的 Markdown 文件: 程序执行后,你会在 content/posts/ 目录下看到生成的 .md 文件,每个文件对应一篇 Typecho 文章。
注意事项:
数据库权限:确保你使用的数据库用户具有查询 Typecho 数据表的权限。
文件名合法性:Go 代码中已经处理了文件名中的不合法字符,但是请确保文件路径符合操作系统的要求。
数据库表前缀:如果你的 Typecho 数据库表使用了不同的前缀,记得修改 SQL 查询中的 typecho_ 部分为正确的前缀。
标签:文件,err,title,数据库,typechoTohugo,go,fmt
From: https://www.cnblogs.com/iXiAo9/p/18686140