scan.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package main
  2. import (
  3. "bufio"
  4. "unicode"
  5. "unicode/utf8"
  6. )
  7. type scanProvider struct {
  8. isList bool
  9. text string
  10. list []string
  11. scanner *bufio.Scanner
  12. }
  13. func (sp *scanProvider) Scan() bool {
  14. if sp.isList {
  15. for sp.text = ""; len(sp.text) == 0 && len(sp.list) > 0; {
  16. sp.text, sp.list = sp.list[0], sp.list[1:]
  17. }
  18. return len(sp.text) > 0
  19. }
  20. return sp.scanner.Scan()
  21. }
  22. func (sp *scanProvider) Text() string {
  23. if sp.isList {
  24. return sp.text
  25. }
  26. return sp.scanner.Text()
  27. }
  28. func splitFunc(data []byte, atEOF bool) (advance int, token []byte, err error) {
  29. start := 0
  30. for start < len(data) {
  31. r, width := utf8.DecodeRune(data[start:])
  32. if r == '\n' {
  33. return start + width, data[start : start+width], nil
  34. }
  35. if !unicode.IsSpace(r) {
  36. break
  37. }
  38. start += width
  39. }
  40. for i := start; i < len(data); {
  41. r, width := utf8.DecodeRune(data[i:])
  42. if r == '\n' {
  43. return i, data[start:i], nil
  44. }
  45. if unicode.IsSpace(r) {
  46. return i + width, data[start:i], nil
  47. }
  48. i += width
  49. }
  50. if atEOF && len(data) > start {
  51. return len(data), data[start:], nil
  52. }
  53. return start, nil, nil
  54. }