-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathcharfilt.go
69 lines (59 loc) · 1.18 KB
/
charfilt.go
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package main
import (
"bufio"
"flag"
"fmt"
"os"
"sort"
"strings"
"unicode"
)
func main() {
filter := flag.String("f", "ascii", "filter to use")
flag.Usage = usage
flag.Parse()
is := funcs[*filter]
r := bufio.NewReader(os.Stdin)
w := bufio.NewWriter(os.Stdout)
defer w.Flush()
for {
c, _, err := r.ReadRune()
if err != nil {
break
}
if is != nil && is(c) {
continue
}
w.WriteRune(c)
}
}
func usage() {
fmt.Fprintln(os.Stderr, "usage: [options]")
flag.PrintDefaults()
strlist := []string{}
for key := range funcs {
strlist = append(strlist, key)
}
sort.Strings(strlist)
fmt.Fprintf(os.Stderr, "available filters: %s\n", strings.Join(strlist, " "))
os.Exit(2)
}
func isascii(r rune) bool {
return r >= 0x80
}
var funcs = map[string]func(r rune) bool{
"ascii": isascii,
"control": unicode.IsControl,
"digit": unicode.IsDigit,
"graphic": unicode.IsGraphic,
"letter": unicode.IsLetter,
"lower": unicode.IsLower,
"mark": unicode.IsMark,
"number": unicode.IsNumber,
"upper": unicode.IsUpper,
"space": unicode.IsSpace,
"symbol": unicode.IsSymbol,
"print": unicode.IsPrint,
"punct": unicode.IsPunct,
"title": unicode.IsTitle,
}