All ProjectsHome
csb
csb/src/csb-index.go
csb-index.go Raw
package main

import (
	"fmt"
	"html/template"
	"io/ioutil"
	"os"
	"path/filepath"

	"github.com/docopt/docopt-go"
	"github.com/russross/blackfriday"
)

type context struct {
	Name    string
	Content template.HTML
}

func buildFrontMatter(infile string, outfile string, templatefile string, name string, additionaldirs []string) error {
	f, err := os.Open(infile)
	if err != nil {
		return err
	}
	defer f.Close()

	data, err := ioutil.ReadAll(f)
	if err != nil {
		return err
	}

	rendered := blackfriday.MarkdownCommon(data)

	templatename := filepath.Base(templatefile)
	t, err := template.ParseFiles(templatefile)
	if err != nil {
		return err
	}
	for _, d := range additionaldirs {
		_, err = t.ParseGlob(d + "/*")
		if err != nil {
			return err
		}
	}

	if name == "" {
		filename := filepath.Base(infile)
		extension := filepath.Ext(filename)
		name = filename[0 : len(filename)-len(extension)]
	}
	c := context{
		Name:    name,
		Content: template.HTML(string(rendered)),
	}

	outFile, err := os.Create(outfile)
	if err != nil {
		return err
	}
	defer outFile.Close()

	return t.ExecuteTemplate(outFile, templatename, c)
}

func main() {
	usage := fmt.Sprintf(`Builds static frontmatter for code repositories

Usage:
  %[1]s <infile> <outfile> <template> [--name=<name>] [--include=<dir>]...
`, filepath.Base(os.Args[0]))

	arguments, err := docopt.Parse(usage, nil, true, "0.1.0", false)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	if arguments["--name"] == nil {
		arguments["--name"] = ""
	}

	err = buildFrontMatter(arguments["<infile>"].(string),
		arguments["<outfile>"].(string),
		arguments["<template>"].(string),
		arguments["--name"].(string),
		arguments["--include"].([]string))
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	os.Exit(0)
}