toml.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. (function(mod) {
  2. if (typeof exports == "object" && typeof module == "object") // CommonJS
  3. mod(require("../../lib/codemirror"));
  4. else if (typeof define == "function" && define.amd) // AMD
  5. define(["../../lib/codemirror"], mod);
  6. else // Plain browser env
  7. mod(CodeMirror);
  8. })(function(CodeMirror) {
  9. "use strict";
  10. CodeMirror.defineMode("toml", function () {
  11. return {
  12. startState: function () {
  13. return {
  14. inString: false,
  15. stringType: "",
  16. lhs: true,
  17. inArray: 0
  18. };
  19. },
  20. token: function (stream, state) {
  21. //check for state changes
  22. if (!state.inString && ((stream.peek() == '"') || (stream.peek() == "'"))) {
  23. state.stringType = stream.peek();
  24. stream.next(); // Skip quote
  25. state.inString = true; // Update state
  26. }
  27. if (stream.sol() && state.inArray === 0) {
  28. state.lhs = true;
  29. }
  30. //return state
  31. if (state.inString) {
  32. while (state.inString && !stream.eol()) {
  33. if (stream.peek() === state.stringType) {
  34. stream.next(); // Skip quote
  35. state.inString = false; // Clear flag
  36. } else if (stream.peek() === '\\') {
  37. stream.next();
  38. stream.next();
  39. } else {
  40. stream.match(/^.[^\\\"\']*/);
  41. }
  42. }
  43. return state.lhs ? "property string" : "string"; // Token style
  44. } else if (state.inArray && stream.peek() === ']') {
  45. stream.next();
  46. state.inArray--;
  47. return 'bracket';
  48. } else if (state.lhs && stream.peek() === '[' && stream.skipTo(']')) {
  49. stream.next();//skip closing ]
  50. // array of objects has an extra open & close []
  51. if (stream.peek() === ']') stream.next();
  52. return "atom";
  53. } else if (stream.peek() === "#") {
  54. stream.skipToEnd();
  55. return "comment";
  56. } else if (stream.eatSpace()) {
  57. return null;
  58. } else if (state.lhs && stream.eatWhile(function (c) { return c != '=' && c != ' '; })) {
  59. return "property";
  60. } else if (state.lhs && stream.peek() === "=") {
  61. stream.next();
  62. state.lhs = false;
  63. return null;
  64. } else if (!state.lhs && stream.match(/^\d\d\d\d[\d\-\:\.T]*Z/)) {
  65. return 'atom'; //date
  66. } else if (!state.lhs && (stream.match('true') || stream.match('false'))) {
  67. return 'atom';
  68. } else if (!state.lhs && stream.peek() === '[') {
  69. state.inArray++;
  70. stream.next();
  71. return 'bracket';
  72. } else if (!state.lhs && stream.match(/^\-?\d+(?:\.\d+)?/)) {
  73. return 'number';
  74. } else if (!stream.eatSpace()) {
  75. stream.next();
  76. }
  77. return null;
  78. }
  79. };
  80. });
  81. CodeMirror.defineMIME('text/x-toml', 'toml');
  82. });