package main import ( "fmt" "io/ioutil" "os" "path/filepath" "regexp" "strconv" "strings" ) var pxRegex = regexp.MustCompile(`(\d+\.?\d*)px`) func pxToRem(pxStr string) string { px, err := strconv.ParseFloat(pxStr, 64) if err != nil { return pxStr + "px" } if px == 0 { return "0" } rem := px / 16.0 if rem == float64(int(rem)) { return fmt.Sprintf("%drem", int(rem)) } return fmt.Sprintf("%.2frem", rem) } func convertFile(filePath string) error { content, err := ioutil.ReadFile(filePath) if err != nil { return err } original := string(content) converted := pxRegex.ReplaceAllStringFunc(original, func(match string) string { num := strings.TrimSuffix(match, "px") return pxToRem(num) }) if original == converted { return nil } return ioutil.WriteFile(filePath, []byte(converted), 0644) } func main() { if len(os.Args) < 2 { fmt.Println("Usage: go run convert_units.go ") os.Exit(1) } dir := os.Args[1] count := 0 err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } if !info.IsDir() && strings.HasSuffix(path, ".html") { err := convertFile(path) if err != nil { fmt.Printf("Error converting %s: %v\n", path, err) return nil } count++ fmt.Printf("Converted: %s\n", path) } return nil }) if err != nil { fmt.Printf("Error walking directory: %v\n", err) os.Exit(1) } fmt.Printf("\nTotal files converted: %d\n", count) }