github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/cmd/swarm/mimegen/generator.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:33</date> 10 //</624450071282323456> 11 12 package main 13 14 //标准的“mime”包依赖于系统设置,请参阅mime.osinitmime 15 //Swarm将在许多操作系统/平台/Docker上运行,并且必须表现出类似的行为。 16 //此命令生成代码以添加基于mime.types文件的常见mime类型 17 // 18 //mailcap提供的mime.types文件,遵循https://www.iana.org/assignments/media-types/media-types.xhtml 19 // 20 // 21 //docker run--rm-v$(pwd):/tmp-alpine:edge/bin/sh-c“apk-add-u mailcap;mv/etc/mime.types/tmp” 22 23 import ( 24 "bufio" 25 "bytes" 26 "flag" 27 "html/template" 28 "io/ioutil" 29 "strings" 30 31 "log" 32 ) 33 34 var ( 35 typesFlag = flag.String("types", "", "Input mime.types file") 36 packageFlag = flag.String("package", "", "Golang package in output file") 37 outFlag = flag.String("out", "", "Output file name for the generated mime types") 38 ) 39 40 type mime struct { 41 Name string 42 Exts []string 43 } 44 45 type templateParams struct { 46 PackageName string 47 Mimes []mime 48 } 49 50 func main() { 51 //分析并确保指定了所有需要的输入 52 flag.Parse() 53 if *typesFlag == "" { 54 log.Fatalf("--types is required") 55 } 56 if *packageFlag == "" { 57 log.Fatalf("--types is required") 58 } 59 if *outFlag == "" { 60 log.Fatalf("--out is required") 61 } 62 63 params := templateParams{ 64 PackageName: *packageFlag, 65 } 66 67 types, err := ioutil.ReadFile(*typesFlag) 68 if err != nil { 69 log.Fatal(err) 70 } 71 72 scanner := bufio.NewScanner(bytes.NewReader(types)) 73 for scanner.Scan() { 74 txt := scanner.Text() 75 if strings.HasPrefix(txt, "#") || len(txt) == 0 { 76 continue 77 } 78 parts := strings.Fields(txt) 79 if len(parts) == 1 { 80 continue 81 } 82 params.Mimes = append(params.Mimes, mime{parts[0], parts[1:]}) 83 } 84 85 if err = scanner.Err(); err != nil { 86 log.Fatal(err) 87 } 88 89 result := bytes.NewBuffer([]byte{}) 90 91 if err := template.Must(template.New("_").Parse(tpl)).Execute(result, params); err != nil { 92 log.Fatal(err) 93 } 94 95 if err := ioutil.WriteFile(*outFlag, result.Bytes(), 0600); err != nil { 96 log.Fatal(err) 97 } 98 } 99 100 var tpl = `//代码由github.com/ethereum/go-ethereum/cmd/swarm/mimegen生成。不要编辑。 101 102 package {{ .PackageName }} 103 104 import "mime" 105 func init() { 106 var mimeTypes = map[string]string{ 107 {{- range .Mimes -}} 108 {{ $name := .Name -}} 109 {{- range .Exts }} 110 ".{{ . }}": "{{ $name | html }}", 111 {{- end }} 112 {{- end }} 113 } 114 for ext, name := range mimeTypes { 115 if err := mime.AddExtensionType(ext, name); err != nil { 116 panic(err) 117 } 118 } 119 } 120 ` 121