summaryrefslogtreecommitdiff
path: root/src/edit/enhancers.go
blob: b732ab251913e09c09a7d86b3a5566586bd1b946 (plain)
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
70
71
72
73
74
75
76
77
78
79
package main

import (
	"io"
	"io/ioutil"
	"os"
	"mime/multipart"
	"strings"
	"path"

	"fmt"
)

type enhancer struct {
	pattern []string
	head    string
	tail    string
}

func loadEnhancers(filename string) []enhancer {
	file, err := os.Open(filename)
	errcheck(err)

	reader := multipart.NewReader(file, "boundary")
	
	var s uint8 = 0
	var e enhancer
	var ret []enhancer
	for {
		part, err := reader.NextPart()
		if err == io.EOF {
			return ret
		}
		errcheck(err)
		
		k := part.Header.Get("X-Thing")
		v, err := ioutil.ReadAll(part)
		errcheck(err)

		switch k {
		case "Pattern":
			patterns := strings.Split(string(v), ";")
			for i := range patterns {
				patterns[i] = strings.TrimSpace(patterns[i])
			}
			s |= 1<<0
			e.pattern = patterns
		case "Head":
			s |= 1<<1
			e.head = string(v)
		case "Tail":
			s |= 1<<2
			e.tail = string(v)
		default:
			panic("unknown X-Thing: "+k)
		}
		if s == 1<<0 | 1<<1 | 1<<2 {
			ret = append(ret, e)
			s = 0
		}
	}
}

var enhancers = loadEnhancers("enhancers.txt")

func getEnhancer(ctype string) (head, tail string) {
	fmt.Fprintf(os.Stderr, "enhancers = %q\n", enhancers)
	for _, enhancer := range enhancers {
		for _, pattern := range enhancer.pattern {
			matched, err := path.Match(pattern, ctype)
			errcheck(err)
			fmt.Fprintf(os.Stderr, "Match(%q, %q) => %q\n", pattern, ctype, matched)
			if matched {
				return enhancer.head, enhancer.tail
			}
		}
	}
	return "", ""
}