@@ -37,33 +37,60 @@ import (
3737 "strings"
3838)
3939
40+ var output = flag .String ("o" , "" , "output file (empty means stdout)" )
41+
4042func main () {
43+ flag .Usage = func () {
44+ fmt .Fprintf (flag .CommandLine .Output (), "usage: weave [flags] <input.md>\n \n flags:\n " )
45+ flag .PrintDefaults ()
46+ }
4147 flag .Parse ()
42- log .SetFlags (0 )
43- log .SetPrefix ("weave: " )
4448 if flag .NArg () != 1 {
45- log .Fatal ("usage: weave input.md\n " )
49+ flag .Usage ()
50+ os .Exit (2 )
4651 }
4752
48- f , err := os .Open (flag .Arg (0 ))
53+ log .SetFlags (0 )
54+ log .SetPrefix ("weave: " )
55+
56+ wd , err := os .Getwd ()
4957 if err != nil {
5058 log .Fatal (err )
5159 }
52- defer f . Close ( )
60+ curDir := filepath . Base ( wd )
5361
54- wd , err := os .Getwd ( )
62+ in , err := os .Open ( flag . Arg ( 0 ) )
5563 if err != nil {
5664 log .Fatal (err )
5765 }
58- curDir := filepath . Base ( wd )
66+ defer in . Close ( )
5967
60- fmt .Println ("<!-- Autogenerated by weave; DO NOT EDIT -->" )
68+ out := os .Stdout
69+ if * output != "" {
70+ out , err = os .Create (* output )
71+ if err != nil {
72+ log .Fatal (err )
73+ }
74+ defer func () {
75+ if err := out .Close (); err != nil {
76+ log .Fatal (err )
77+ }
78+ }()
79+ }
80+
81+ printf := func (format string , args ... any ) {
82+ if _ , err := fmt .Fprintf (out , format , args ... ); err != nil {
83+ log .Fatalf ("writing failed: %v" , err )
84+ }
85+ }
86+
87+ printf ("<!-- Autogenerated by weave; DO NOT EDIT -->" )
6188
6289 // Pass 1: extract table of contents.
6390 var toc []string
64- in := bufio .NewScanner (f )
65- for in .Scan () {
66- line := in .Text ()
91+ scanner := bufio .NewScanner (in )
92+ for scanner .Scan () {
93+ line := scanner .Text ()
6794 if line == "" || (line [0 ] != '#' && line [0 ] != '%' ) {
6895 continue
6996 }
@@ -84,21 +111,21 @@ func main() {
84111 toc = append (toc , line )
85112 }
86113 }
87- if in .Err () != nil {
88- log .Fatal (in .Err ())
114+ if scanner .Err () != nil {
115+ log .Fatal (scanner .Err ())
89116 }
90117
91118 // Pass 2.
92- if _ , err := f .Seek (0 , io .SeekStart ); err != nil {
119+ if _ , err := in .Seek (0 , io .SeekStart ); err != nil {
93120 log .Fatalf ("can't rewind input: %v" , err )
94121 }
95- in = bufio .NewScanner (f )
96- for in .Scan () {
97- line := in .Text ()
122+ scanner = bufio .NewScanner (in )
123+ for scanner .Scan () {
124+ line := scanner .Text ()
98125 switch {
99126 case strings .HasPrefix (line , "%toc" ): // ToC
100127 for _ , h := range toc {
101- fmt . Println ( h )
128+ printf ( "%s \n " , h )
102129 }
103130 case strings .HasPrefix (line , "%include" ):
104131 words := strings .Fields (line )
@@ -125,23 +152,23 @@ func main() {
125152 filename := words [1 ]
126153
127154 if caption {
128- fmt . Printf (" // go get golang.org/x/example/%s/%s\n \n " ,
155+ printf (" // go get golang.org/x/example/%s/%s\n \n " ,
129156 curDir , filepath .Dir (filename ))
130157 }
131158
132159 s , err := include (filename , section )
133160 if err != nil {
134161 log .Fatal (err )
135162 }
136- fmt . Println ("```go" )
137- fmt . Println ( cleanListing (s )) // TODO(adonovan): escape /^```/ in s
138- fmt . Println ("```" )
163+ printf ("```go\n " )
164+ printf ( "%s \n " , cleanListing (s )) // TODO(adonovan): escape /^```/ in s
165+ printf ("```\n " )
139166 default :
140- fmt . Println ( line )
167+ printf ( "%s \n " , line )
141168 }
142169 }
143- if in .Err () != nil {
144- log .Fatal (in .Err ())
170+ if scanner .Err () != nil {
171+ log .Fatal (scanner .Err ())
145172 }
146173}
147174
0 commit comments