// formatGoSource HTML-escapes Go source text and writes it to w, // decorating it with the specified analysis links. // func formatGoSource(buf *bytes.Buffer, text []byte, links []analysis.Link, pattern string, selection Selection) { // Emit to a temp buffer so that we can add line anchors at the end. saved, buf := buf, new(bytes.Buffer) var i int var link analysis.Link // shared state of the two funcs below segmentIter := func() (seg Segment) { if i < len(links) { link = links[i] i++ seg = Segment{link.Start(), link.End()} } return } linkWriter := func(w io.Writer, offs int, start bool) { link.Write(w, offs, start) } comments := tokenSelection(text, token.COMMENT) var highlights Selection if pattern != "" { highlights = regexpSelection(text, pattern) } FormatSelections(buf, text, linkWriter, segmentIter, selectionTag, comments, highlights, selection) // Now copy buf to saved, adding line anchors. // The lineSelection mechanism can't be composed with our // linkWriter, so we have to add line spans as another pass. n := 1 for _, line := range bytes.Split(buf.Bytes(), []byte("\n")) { fmt.Fprintf(saved, "<span id=\"L%d\" class=\"ln\">%6d</span>\t", n, n) n++ saved.Write(line) saved.WriteByte('\n') } }
// formatGoSource HTML-escapes Go source text and writes it to w, // decorating it with the specified analysis links. // func formatGoSource(buf *bytes.Buffer, text []byte, links []analysis.Link, pattern string, selection Selection) { var i int var link analysis.Link // shared state of the two funcs below segmentIter := func() (seg Segment) { if i < len(links) { link = links[i] i++ seg = Segment{link.Start(), link.End()} } return } linkWriter := func(w io.Writer, offs int, start bool) { link.Write(w, offs, start) } comments := tokenSelection(text, token.COMMENT) var highlights Selection if pattern != "" { highlights = regexpSelection(text, pattern) } FormatSelections(buf, text, linkWriter, segmentIter, selectionTag, comments, highlights, selection) }