起因:
我在工作中遇到了一个问题, 我最近工作需要输出一个文档,这个文档里面有一些内容是不可对外展示的。这种情况下,一般我需要写两份文档,对于我来说,有点不太能接受。因为两份文档就表明了,我以后的修改内容都需要进行两次修改,工作量翻一倍。所以我需要一个程序将第二个文档自动生成出来。
思考:
将问题提纯:
如何将 markdown 文件内的内容进行分块标记,并且让程序自动识别进行隐藏?
生成代码:
询问 ChatGPT:
问题1:MD 文件一般是什么格式?
问题2:我想用标记语言方式将Markdown 的内容分为对外和对内,被标记语言标注的内容、对外展示时隐藏,用 go 语言写一下
问题3:我希望它可以标记多行,而且标记语言的符号简单一些
问题4:修改一下,markdownContent 的内容是从参数 -I 获取,此参数为文档名称 参数 -O 是文档输出名称 参数 -S 为是否展示隐藏内容
问题5:使用 cobra
问题6:将函数提取一下,我希望以后的命令修改不涉及到main.go 文件
问题7:生成 makefile 文件,支持生成各个架构命令
问题8:整理上述内容,给我一个目录结构以及各个文件的内容
内容就不展示了,浪费流量。
最终结果:
目录结构
markdown-processor/ ├── Makefile ├── main.go └── markdown/ └── processor.go
Makefile:用于构建不同架构的 Go 应用程序。
# 定义变量 APP_NAME = markdownProcessor SRC = main.go markdown/processor.go OUTPUT_DIR = bin BUILD_DIR = $(OUTPUT_DIR)/$(APP_NAME) # 默认目标 all: build # 构建目标 build: linux-amd64 linux-arm64 darwin-amd64 windows-amd64 # 构建 Linux AMD64 linux-amd64: GOOS=linux GOARCH=amd64 go build -o $(BUILD_DIR)-linux-amd64 $(SRC) # 构建 Linux ARM64 linux-arm64: GOOS=linux GOARCH=arm64 go build -o $(BUILD_DIR)-linux-arm64 $(SRC) # 构建 macOS AMD64 darwin-amd64: GOOS=darwin GOARCH=amd64 go build -o $(BUILD_DIR)-darwin-amd64 $(SRC) # 构建 Windows AMD64 windows-amd64: GOOS=windows GOARCH=amd64 go build -o $(BUILD_DIR)-windows-amd64.exe $(SRC) # 清理目标 clean: rm -rf $(OUTPUT_DIR) # 显示帮助信息 help: @echo "Makefile for building markdownProcessor" @echo "Usage:" @echo " make all # Build all targets" @echo " make clean # Clean up build files" @echo " make help # Show this help message"
main.go:主程序,负责命令行解析和调用处理函数。
package main import ( "fmt" "os" "github.com/spf13/cobra" "markdown-processor/markdown" ) func main() { var inputFile string var outputFile string var showHidden bool var rootCmd = &cobra.Command{ Use: "markdownProcessor", Short: "处理 Markdown 文档", Run: func(cmd *cobra.Command, args []string) { // 处理 Markdown 内容 result, err := markdown.ProcessMarkdown(inputFile, outputFile, showHidden) if err != nil { fmt.Println(err) return } fmt.Println("处理完成,输出文件:", outputFile) fmt.Println(result) // 可选:输出处理结果 }, } rootCmd.Flags().StringVarP(&inputFile, "input", "I", "", "输入文档名称") rootCmd.Flags().StringVarP(&outputFile, "output", "O", "", "输出文档名称") rootCmd.Flags().BoolVarP(&showHidden, "show", "S", false, "是否展示隐藏内容") // 检查必需的参数 cobra.OnInitialize(func() { if inputFile == "" || outputFile == "" { fmt.Println("请提供输入和输出文档名称.") os.Exit(1) } }) if err := rootCmd.Execute(); err != nil { fmt.Println(err) os.Exit(1) } }
markdown/processor.go:处理 Markdown 文件的逻辑。
package markdown import ( "fmt" "io/ioutil" "regexp" ) // ProcessMarkdown 处理 Markdown 文件,返回处理后的内容 func ProcessMarkdown(inputFile string, outputFile string, showHidden bool) (string, error) { // 读取输入文件内容 content, err := ioutil.ReadFile(inputFile) if err != nil { return "", fmt.Errorf("读取文件失败: %v", err) } var result string if showHidden { result = string(content) // 如果选择展示隐藏内容,直接返回原内容 } else { // 使用正则表达式匹配对内内容 re := regexp.MustCompile(`\[\[内\]\].*?\[\[/内\]\]`) // 将对内内容替换为空字符串 result = re.ReplaceAllString(string(content), "") } // 将处理后的内容写入输出文件 err = ioutil.WriteFile(outputFile, []byte(result), 0644) if err != nil { return "", fmt.Errorf("写入文件失败: %v", err) } return result, nil }
调试代码:
大部分代码已经编写完成了,如果你有一定的 linux shell 基础,就能看出,这个实现的逻辑不过就是正则表达式替换功能,其实就是一条 sed 命令的事,很失望的结果。另外:linux 三剑客(awk、sed、grep )真是强大。
由于 window 存在我觉得还是用吧。但是我懒得调试了,只把最终代码提交上去了,等有时间我再调试一下。
调试就是验证一下程序,如果有问题的话,进行一下修改。这部分就得靠自己了