util.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package js
  2. import (
  3. "io"
  4. )
  5. // AsIdentifierName returns true if a valid identifier name is given.
  6. func AsIdentifierName(b []byte) bool {
  7. if len(b) == 0 || !identifierStartTable[b[0]] {
  8. return false
  9. }
  10. i := 1
  11. for i < len(b) {
  12. if identifierTable[b[i]] {
  13. i++
  14. } else {
  15. return false
  16. }
  17. }
  18. return true
  19. }
  20. // AsDecimalLiteral returns true if a valid decimal literal is given.
  21. func AsDecimalLiteral(b []byte) bool {
  22. if len(b) == 0 || (b[0] < '0' || '9' < b[0]) && (b[0] != '.' || len(b) == 1) {
  23. return false
  24. } else if b[0] == '0' {
  25. return len(b) == 1
  26. }
  27. i := 1
  28. for i < len(b) && '0' <= b[i] && b[i] <= '9' {
  29. i++
  30. }
  31. if i < len(b) && b[i] == '.' && b[0] != '.' {
  32. i++
  33. for i < len(b) && '0' <= b[i] && b[i] <= '9' {
  34. i++
  35. }
  36. }
  37. return i == len(b)
  38. }
  39. type Indenter struct {
  40. w io.Writer
  41. b []byte
  42. }
  43. func NewIndenter(w io.Writer, n int) Indenter {
  44. if wi, ok := w.(Indenter); ok {
  45. w = wi.w
  46. n += len(wi.b)
  47. }
  48. b := make([]byte, n)
  49. for i := range b {
  50. b[i] = ' '
  51. }
  52. return Indenter{
  53. w: w,
  54. b: b,
  55. }
  56. }
  57. func (in Indenter) Write(b []byte) (int, error) {
  58. n, j := 0, 0
  59. for i, c := range b {
  60. if c == '\n' {
  61. m, _ := in.w.Write(b[j : i+1])
  62. n += m
  63. m, _ = in.w.Write(in.b)
  64. n += m
  65. j = i + 1
  66. }
  67. }
  68. m, err := in.w.Write(b[j:])
  69. return n + m, err
  70. }