1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
package main
import (
"fmt"
"io"
"log"
"os"
"strings"
"github.com/charmbracelet/x/exp/term/ansi"
"github.com/rivo/uniseg"
)
func wc(data []byte) {
s := string(data)
var words int
var chars int
lines := strings.Split(s, "\n")
for _, line := range lines {
l := ansi.Strip(line)
words += len(strings.Fields(l))
chars += uniseg.StringWidth(l)
}
fmt.Println("\t", len(lines)-1, "\t", words, "\t", chars)
}
func main() {
if len(os.Args) > 1 {
for _, file := range os.Args[1:] {
data, err := os.ReadFile(file)
if err != nil {
log.Fatalf("error reading file: %v", err)
}
wc(data)
}
} else {
data, err := io.ReadAll(os.Stdin)
if err != nil {
log.Fatalf("error reading from stdin: %v", err)
}
wc(data)
}
}
|