Exemplo n.º 1
0
func main() {
	pkg, err := genutil.NewPackage("gnd.la/template")
	if err != nil {
		panic(err)
	}
	var art *article.Article
	if len(os.Args) > 1 {
		art, err = article.OpenFile(os.Args[1])
		if err != nil {
			panic(fmt.Errorf("error loading previous article from %s: %s", os.Args[1], err))
		}
	} else {
		art = &article.Article{}
	}
	abs, err := filepath.Abs("funcs.go")
	if err != nil {
		panic(err)
	}
	f := pkg.ASTFiles()[abs]
	var inMap bool
	var lastPos token.Pos
	docs := make(map[string]*funcDoc)
	ast.Inspect(f, func(n ast.Node) bool {
		if !inMap {
			if vs, ok := n.(*ast.ValueSpec); ok {
				for _, n := range vs.Names {
					if n.Name == "templateFuncs" {
						inMap = true
						lastPos = vs.Pos()
						break
					}
				}
			}
		}
		if inMap {
			if kv, ok := n.(*ast.KeyValueExpr); ok {
				if k := literalString(kv.Key); k != "" {
					if doc := documentFunction(f, pkg, kv.Value, lastPos, kv.Pos()); doc != nil {
						docs[k] = doc
					}
				}
				lastPos = kv.Pos()
			}
		}
		return true
	})
	// Write the markdown
	var buf bytes.Buffer
	chrs := make(map[string]byte)
	names := make([]string, 0, len(docs))
	for k := range docs {
		if k[0] == '#' || k[0] == '!' || k[0] == '@' {
			chr := k[0]
			k = k[1:]
			chrs[k] = chr
		}
		names = append(names, k)
	}
	sort.Strings(names)
	for _, n := range names {
		chr := chrs[n]
		lookup := n
		if chr != 0 {
			lookup = string(chr) + n
		}
		doc := docs[lookup]
		fmt.Fprintf(&buf, "- **%s** *%s*", n, doc.decl)
		buf.WriteString("\n\n\t")
		if doc.alias != "" {
			fmt.Fprintf(&buf, "%s is an alias for [%s](/doc/pkg/%s)", n, doc.alias, linkFunc(doc.alias))
		} else {
			buf.WriteString(doc.doc)
		}
		buf.WriteString("\n\n")
	}
	art.Text = buf.Bytes()
	art.Set("updated", "now")
	var out bytes.Buffer
	if _, err := art.WriteTo(&out); err != nil {
		panic(err)
	}
	if art.Filename != "" {
		if err := ioutil.WriteFile(art.Filename, out.Bytes(), 0644); err != nil {
			panic(err)
		}
	} else {
		io.Copy(os.Stdout, &out)
	}
}