spreadsheet.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // CodeMirror, copyright (c) by Marijn Haverbeke and others
  2. // Distributed under an MIT license: https://codemirror.net/LICENSE
  3. ;(function (mod) {
  4. if (typeof exports == 'object' && typeof module == 'object')
  5. // CommonJS
  6. mod(require('../../lib/codemirror'))
  7. else if (typeof define == 'function' && define.amd)
  8. // AMD
  9. define(['../../lib/codemirror'], mod)
  10. // Plain browser env
  11. else mod(CodeMirror)
  12. })(function (CodeMirror) {
  13. 'use strict'
  14. CodeMirror.defineMode('spreadsheet', function () {
  15. return {
  16. startState: function () {
  17. return {
  18. stringType: null,
  19. stack: [],
  20. }
  21. },
  22. token: function (stream, state) {
  23. if (!stream) return
  24. //check for state changes
  25. if (state.stack.length === 0) {
  26. //strings
  27. if (stream.peek() == '"' || stream.peek() == "'") {
  28. state.stringType = stream.peek()
  29. stream.next() // Skip quote
  30. state.stack.unshift('string')
  31. }
  32. }
  33. //return state
  34. //stack has
  35. switch (state.stack[0]) {
  36. case 'string':
  37. while (state.stack[0] === 'string' && !stream.eol()) {
  38. if (stream.peek() === state.stringType) {
  39. stream.next() // Skip quote
  40. state.stack.shift() // Clear flag
  41. } else if (stream.peek() === '\\') {
  42. stream.next()
  43. stream.next()
  44. } else {
  45. stream.match(/^.[^\\\"\']*/)
  46. }
  47. }
  48. return 'string'
  49. case 'characterClass':
  50. while (state.stack[0] === 'characterClass' && !stream.eol()) {
  51. if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) state.stack.shift()
  52. }
  53. return 'operator'
  54. }
  55. var peek = stream.peek()
  56. //no stack
  57. switch (peek) {
  58. case '[':
  59. stream.next()
  60. state.stack.unshift('characterClass')
  61. return 'bracket'
  62. case ':':
  63. stream.next()
  64. return 'operator'
  65. case '\\':
  66. if (stream.match(/\\[a-z]+/)) return 'string-2'
  67. else {
  68. stream.next()
  69. return 'atom'
  70. }
  71. case '.':
  72. case ',':
  73. case ';':
  74. case '*':
  75. case '-':
  76. case '+':
  77. case '^':
  78. case '<':
  79. case '/':
  80. case '=':
  81. stream.next()
  82. return 'atom'
  83. case '$':
  84. stream.next()
  85. return 'builtin'
  86. }
  87. if (stream.match(/\d+/)) {
  88. if (stream.match(/^\w+/)) return 'error'
  89. return 'number'
  90. } else if (stream.match(/^[a-zA-Z_]\w*/)) {
  91. if (stream.match(/(?=[\(.])/, false)) return 'keyword'
  92. return 'variable-2'
  93. } else if (['[', ']', '(', ')', '{', '}'].indexOf(peek) != -1) {
  94. stream.next()
  95. return 'bracket'
  96. } else if (!stream.eatSpace()) {
  97. stream.next()
  98. }
  99. return null
  100. },
  101. }
  102. })
  103. CodeMirror.defineMIME('text/x-spreadsheet', 'spreadsheet')
  104. })