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