package main import ( "flag" "io/ioutil" "log" "os" "os/exec" "path/filepath" "regexp" "gopkg.in/yaml.v2" ) // Assumes we're getting a pageName ending in .page func convertPage(newDir, pageName string) error { yamlName := pageName[:len(pageName)-5] + ".yml" headName := pageName[:len(pageName)-5] + ".head" newPageName := pageName[:len(pageName)-5] + ".md" hasHead := false headBytes := []byte{} if _, err := os.Stat(headName); err == nil { hasHead = true } if hasHead { var err error headBytes, err = ioutil.ReadFile(headName) if err != nil { return err } } y, err := yaml.Marshal(map[string]string{ "head": string(headBytes), }) if err != nil { return err } cmd := exec.Command("mkdir", "-p", filepath.Join(newDir, filepath.Dir(pageName))) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err = cmd.Run() if err != nil { return err } cmd = exec.Command("cp", "-v", pageName, filepath.Join(newDir, newPageName)) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err = cmd.Run() if err != nil { return err } if len(headBytes) == 0 { return nil } else { return ioutil.WriteFile(newDir+"/"+yamlName, y, 0644) } } func main() { fl := flag.NewFlagSet("Website converter", flag.ExitOnError) origDirectory := fl.String("d", ".", "Directory to read from") newDirectory := fl.String("D", ".", "Directory to write to") _ = fl.Parse(os.Args[1:]) newDir, _ := filepath.Abs(*newDirectory) origDir, _ := filepath.Abs(*origDirectory) if err := os.Chdir(origDir); err != nil { log.Fatal(err) } pageRe := regexp.MustCompile(`\.page$`) _ = filepath.Walk(".", func(path string, info os.FileInfo, err error) error { if err != nil { // Prevents panic log.Println(err) return err } if pageRe.MatchString(info.Name()) { if err := convertPage(newDir, path); err != nil { log.Println(err) return err } } return nil }) }