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