toml.js 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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('toml', function () {
  15. return {
  16. startState: function () {
  17. return {
  18. inString: false,
  19. stringType: '',
  20. lhs: true,
  21. inArray: 0,
  22. }
  23. },
  24. token: function (stream, state) {
  25. //check for state changes
  26. if (!state.inString && (stream.peek() == '"' || stream.peek() == "'")) {
  27. state.stringType = stream.peek()
  28. stream.next() // Skip quote
  29. state.inString = true // Update state
  30. }
  31. if (stream.sol() && state.inArray === 0) {
  32. state.lhs = true
  33. }
  34. //return state
  35. if (state.inString) {
  36. while (state.inString && !stream.eol()) {
  37. if (stream.peek() === state.stringType) {
  38. stream.next() // Skip quote
  39. state.inString = false // Clear flag
  40. } else if (stream.peek() === '\\') {
  41. stream.next()
  42. stream.next()
  43. } else {
  44. stream.match(/^.[^\\\"\']*/)
  45. }
  46. }
  47. return state.lhs ? 'property string' : 'string' // Token style
  48. } else if (state.inArray && stream.peek() === ']') {
  49. stream.next()
  50. state.inArray--
  51. return 'bracket'
  52. } else if (state.lhs && stream.peek() === '[' && stream.skipTo(']')) {
  53. stream.next() //skip closing ]
  54. // array of objects has an extra open & close []
  55. if (stream.peek() === ']') stream.next()
  56. return 'atom'
  57. } else if (stream.peek() === '#') {
  58. stream.skipToEnd()
  59. return 'comment'
  60. } else if (stream.eatSpace()) {
  61. return null
  62. } else if (
  63. state.lhs &&
  64. stream.eatWhile(function (c) {
  65. return c != '=' && c != ' '
  66. })
  67. ) {
  68. return 'property'
  69. } else if (state.lhs && stream.peek() === '=') {
  70. stream.next()
  71. state.lhs = false
  72. return null
  73. } else if (!state.lhs && stream.match(/^\d\d\d\d[\d\-\:\.T]*Z/)) {
  74. return 'atom' //date
  75. } else if (!state.lhs && (stream.match('true') || stream.match('false'))) {
  76. return 'atom'
  77. } else if (!state.lhs && stream.peek() === '[') {
  78. state.inArray++
  79. stream.next()
  80. return 'bracket'
  81. } else if (!state.lhs && stream.match(/^\-?\d+(?:\.\d+)?/)) {
  82. return 'number'
  83. } else if (!stream.eatSpace()) {
  84. stream.next()
  85. }
  86. return null
  87. },
  88. }
  89. })
  90. CodeMirror.defineMIME('text/x-toml', 'toml')
  91. })