internal/cmd/weave: minor improvements

- Add some documentation.
- Check bufio.Scanner errors.
- Generalize the package path in caption output.

Change-Id: I1f30b555ec8533464fb29af05fdcb0c5d926c18e
Reviewed-on: https://go-review.googlesource.com/c/example/+/494596
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Jonathan Amsterdam <jba@google.com>
Reviewed-by: Alan Donovan <adonovan@google.com>
diff --git a/internal/cmd/weave/weave.go b/internal/cmd/weave/weave.go
index bf8264a..07ed8bf 100644
--- a/internal/cmd/weave/weave.go
+++ b/internal/cmd/weave/weave.go
@@ -3,7 +3,25 @@
 //
 // Example usage:
 //
-//	$ go run weave.go go-types.md > README.md
+//	$ go run internal/cmd/weave go-types.md > README.md
+//
+// The weave command copies lines of the input file to standard output, with two
+// exceptions:
+//
+// If a line begins with "%toc", it is replaced with a table of contents
+// consisting of links to the top two levels of headers ("#" and "##").
+//
+// If a line begins with "%include FILENAME TAG", it is replaced with the lines
+// of the file between lines containing "!+TAG" and  "!-TAG". TAG can be omitted,
+// in which case the delimiters are simply "!+" and "!-".
+//
+// Before the included lines, a line of the form
+//
+//	// go get PACKAGE
+//
+// is output, where PACKAGE is constructed from the module path, the
+// base name of the current directory, and the directory of FILENAME.
+// This caption can be supressed by putting "-" as the final word of the %include line.
 package main
 
 import (
@@ -30,9 +48,15 @@
 	}
 	defer f.Close()
 
+	wd, err := os.Getwd()
+	if err != nil {
+		log.Fatal(err)
+	}
+	curDir := filepath.Base(wd)
+
 	fmt.Println("<!-- Autogenerated by weave; DO NOT EDIT -->")
 
-	// Pass 1.
+	// Pass 1: extract table of contents.
 	var toc []string
 	in := bufio.NewScanner(f)
 	for in.Scan() {
@@ -56,6 +80,9 @@
 			toc = append(toc, line)
 		}
 	}
+	if in.Err() != nil {
+		log.Fatal(in.Err())
+	}
 
 	// Pass 2.
 	if _, err := f.Seek(0, os.SEEK_SET); err != nil {
@@ -78,8 +105,8 @@
 
 			// Show caption unless '-' follows.
 			if len(words) < 4 || words[3] != "-" {
-				fmt.Printf("	// go get golang.org/x/example/gotypes/%s\n\n",
-					filepath.Dir(filename))
+				fmt.Printf("	// go get golang.org/x/example/%s/%s\n\n",
+					curDir, filepath.Dir(filename))
 			}
 
 			section := ""
@@ -96,7 +123,9 @@
 		default:
 			fmt.Println(line)
 		}
-
+	}
+	if in.Err() != nil {
+		log.Fatal(in.Err())
 	}
 }
 
@@ -135,6 +164,9 @@
 			text.WriteByte('\n')
 		}
 	}
+	if in.Err() != nil {
+		return "", in.Err()
+	}
 	if text.Len() == 0 {
 		return "", fmt.Errorf("no lines of %s matched tag %q", file, tag)
 	}