all repos — grayfriday @ f9b03f67fbe685393bf24c1fd18fbc89da420561

blackfriday fork with a few changes

example/main.go (view raw)

  1//
  2// Black Friday Markdown Processor
  3// Originally based on http://github.com/tanoku/upskirt
  4// by Russ Ross <russ@russross.com>
  5//
  6
  7//
  8//
  9// Example front-end for command-line use
 10//
 11//
 12
 13package main
 14
 15import (
 16	"flag"
 17	"fmt"
 18	"io/ioutil"
 19	"github.com/russross/blackfriday"
 20	"os"
 21)
 22
 23func main() {
 24	// parse command-line options
 25	var page, xhtml, latex, smartypants bool
 26	var css string
 27	var repeat int
 28	flag.BoolVar(&page, "page", false,
 29		"Generate a standalone HTML page (implies -latex=false)")
 30	flag.BoolVar(&xhtml, "xhtml", true,
 31		"Use XHTML-style tags in HTML output")
 32	flag.BoolVar(&latex, "latex", false,
 33		"Generate LaTeX output instead of HTML")
 34	flag.BoolVar(&smartypants, "smartypants", false,
 35		"Apply smartypants-style substitutions")
 36	flag.StringVar(&css, "css", "",
 37		"Link to a CSS stylesheet (implies -page)")
 38	flag.IntVar(&repeat, "repeat", 1,
 39		"Process the input multiple times (for benchmarking)")
 40	flag.Usage = func() {
 41		fmt.Fprintf(os.Stderr, "Usage:\n"+
 42			"  %s [options] [inputfile [outputfile]]\n\n"+
 43			"Options:\n", os.Args[0])
 44		flag.PrintDefaults()
 45	}
 46	flag.Parse()
 47
 48	// enforce implied options
 49	if css != "" {
 50		page = true
 51	}
 52	if page {
 53		latex = false
 54	}
 55
 56	// read the input
 57	var input []byte
 58	var err os.Error
 59	args := flag.Args()
 60	switch len(args) {
 61	case 0:
 62		if input, err = ioutil.ReadAll(os.Stdin); err != nil {
 63			fmt.Fprintln(os.Stderr, "Error reading from Stdin:", err)
 64			os.Exit(-1)
 65		}
 66	case 1, 2:
 67		if input, err = ioutil.ReadFile(args[0]); err != nil {
 68			fmt.Fprintln(os.Stderr, "Error reading from", args[0], ":", err)
 69			os.Exit(-1)
 70		}
 71	default:
 72		flag.Usage()
 73		os.Exit(-1)
 74	}
 75
 76	// set up options
 77	var extensions uint32
 78	extensions |= blackfriday.EXTENSION_NO_INTRA_EMPHASIS
 79	extensions |= blackfriday.EXTENSION_TABLES
 80	extensions |= blackfriday.EXTENSION_FENCED_CODE
 81	extensions |= blackfriday.EXTENSION_AUTOLINK
 82	extensions |= blackfriday.EXTENSION_STRIKETHROUGH
 83	extensions |= blackfriday.EXTENSION_SPACE_HEADERS
 84
 85	var renderer *blackfriday.Renderer
 86	if latex {
 87		// render the data into LaTeX
 88		renderer = blackfriday.LatexRenderer(0)
 89	} else {
 90		// render the data into HTML
 91		html_flags := 0
 92		if xhtml {
 93			html_flags |= blackfriday.HTML_USE_XHTML
 94		}
 95		if smartypants {
 96			html_flags |= blackfriday.HTML_USE_SMARTYPANTS
 97			html_flags |= blackfriday.HTML_SMARTYPANTS_FRACTIONS
 98			html_flags |= blackfriday.HTML_SMARTYPANTS_LATEX_DASHES
 99		}
100		renderer = blackfriday.HtmlRenderer(html_flags)
101	}
102
103	// parse and render
104	var output []byte
105	for i := 0; i < repeat; i++ {
106		output = blackfriday.Markdown(input, renderer, extensions)
107	}
108
109	// output the result
110	var out *os.File
111	if len(args) == 2 {
112		if out, err = os.Create(args[1]); err != nil {
113			fmt.Fprintf(os.Stderr, "Error creating %s: %v", args[1], err)
114			os.Exit(-1)
115		}
116		defer out.Close()
117	} else {
118		out = os.Stdout
119	}
120
121	if page {
122		ending := ""
123		if xhtml {
124			fmt.Fprint(out, "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" ")
125			fmt.Fprintln(out, "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">")
126			fmt.Fprintln(out, "<html xmlns=\"http://www.w3.org/1999/xhtml\">")
127			ending = " /"
128		} else {
129			fmt.Fprint(out, "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" ")
130			fmt.Fprintln(out, "\"http://www.w3.org/TR/html4/strict.dtd\">")
131			fmt.Fprintln(out, "<html>")
132		}
133		fmt.Fprintln(out, "<head>")
134		fmt.Fprintln(out, "  <title></title>")
135		fmt.Fprintf(out, "  <meta name=\"GENERATOR\" content=\"Blackfriday markdown processor\"%s>\n", ending)
136		fmt.Fprintf(out, "  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"%s>\n", ending)
137		if css != "" {
138			fmt.Fprintf(out, "  <link rel=\"stylesheet\" type=\"text/css\" href=\"%s\" />\n", css)
139		}
140		fmt.Fprintln(out, "</head>")
141		fmt.Fprintln(out, "<body>")
142	}
143	if _, err = out.Write(output); err != nil {
144		fmt.Fprintln(os.Stderr, "Error writing output:", err)
145		os.Exit(-1)
146	}
147	if page {
148		fmt.Fprintln(out, "</body>")
149		fmt.Fprintln(out, "</html>")
150	}
151}