首页 > 其他分享 >typechoTohugo

typechoTohugo

时间:2025-01-22 15:32:53浏览次数:1  
标签:文件 err title 数据库 typechoTohugo go fmt

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

相关文章