func Print(s *Scanner, w io.Writer) error { var p syntaxhighlight.Printer = HTMLPrinter(gfmDiff) for s.Scan() { tok, kind := s.Token() err := p.Print(w, kind, string(tok)) if err != nil { return err } } return s.Err() }
func Print(src []byte, w io.Writer, p syntaxhighlight.Printer) error { var s scanner.Scanner fset := token.NewFileSet() file := fset.AddFile("", fset.Base(), len(src)) s.Init(file, src, nil, scanner.ScanComments) var lastOffset int for { pos, tok, lit := s.Scan() if tok == token.EOF { break } var tokString string if lit != "" { tokString = lit } else { tokString = tok.String() } // TODO: Clean this up. //if tok == token.SEMICOLON { if tok == token.SEMICOLON && lit == "\n" { continue } // Whitespace between previous and current tokens. offset := fset.Position(pos).Offset if whitespace := string(src[lastOffset:offset]); whitespace != "" { err := p.Print(w, syntaxhighlight.Whitespace, whitespace) if err != nil { return err } } lastOffset = offset + len(tokString) err := p.Print(w, TokenKind(tok, lit), tokString) if err != nil { return err } } // Print final whitespace after the last token. if whitespace := string(src[lastOffset:]); whitespace != "" { err := p.Print(w, syntaxhighlight.Whitespace, whitespace) if err != nil { return err } } return nil }