htmlembedded.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. (function(mod) {
  2. if (typeof exports == "object" && typeof module == "object") // CommonJS
  3. mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"));
  4. else if (typeof define == "function" && define.amd) // AMD
  5. define(["../../lib/codemirror", "../htmlmixed/htmlmixed"], mod);
  6. else // Plain browser env
  7. mod(CodeMirror);
  8. })(function(CodeMirror) {
  9. "use strict";
  10. CodeMirror.defineMode("htmlembedded", function(config, parserConfig) {
  11. //config settings
  12. var scriptStartRegex = parserConfig.scriptStartRegex || /^<%/i,
  13. scriptEndRegex = parserConfig.scriptEndRegex || /^%>/i;
  14. //inner modes
  15. var scriptingMode, htmlMixedMode;
  16. //tokenizer when in html mode
  17. function htmlDispatch(stream, state) {
  18. if (stream.match(scriptStartRegex, false)) {
  19. state.token=scriptingDispatch;
  20. return scriptingMode.token(stream, state.scriptState);
  21. }
  22. else
  23. return htmlMixedMode.token(stream, state.htmlState);
  24. }
  25. //tokenizer when in scripting mode
  26. function scriptingDispatch(stream, state) {
  27. if (stream.match(scriptEndRegex, false)) {
  28. state.token=htmlDispatch;
  29. return htmlMixedMode.token(stream, state.htmlState);
  30. }
  31. else
  32. return scriptingMode.token(stream, state.scriptState);
  33. }
  34. return {
  35. startState: function() {
  36. scriptingMode = scriptingMode || CodeMirror.getMode(config, parserConfig.scriptingModeSpec);
  37. htmlMixedMode = htmlMixedMode || CodeMirror.getMode(config, "htmlmixed");
  38. return {
  39. token : parserConfig.startOpen ? scriptingDispatch : htmlDispatch,
  40. htmlState : CodeMirror.startState(htmlMixedMode),
  41. scriptState : CodeMirror.startState(scriptingMode)
  42. };
  43. },
  44. token: function(stream, state) {
  45. return state.token(stream, state);
  46. },
  47. indent: function(state, textAfter) {
  48. if (state.token == htmlDispatch)
  49. return htmlMixedMode.indent(state.htmlState, textAfter);
  50. else if (scriptingMode.indent)
  51. return scriptingMode.indent(state.scriptState, textAfter);
  52. },
  53. copyState: function(state) {
  54. return {
  55. token : state.token,
  56. htmlState : CodeMirror.copyState(htmlMixedMode, state.htmlState),
  57. scriptState : CodeMirror.copyState(scriptingMode, state.scriptState)
  58. };
  59. },
  60. innerMode: function(state) {
  61. if (state.token == scriptingDispatch) return {state: state.scriptState, mode: scriptingMode};
  62. else return {state: state.htmlState, mode: htmlMixedMode};
  63. }
  64. };
  65. }, "htmlmixed");
  66. CodeMirror.defineMIME("application/x-ejs", { name: "htmlembedded", scriptingModeSpec:"javascript"});
  67. CodeMirror.defineMIME("application/x-aspx", { name: "htmlembedded", scriptingModeSpec:"text/x-csharp"});
  68. CodeMirror.defineMIME("application/x-jsp", { name: "htmlembedded", scriptingModeSpec:"text/x-java"});
  69. CodeMirror.defineMIME("application/x-erb", { name: "htmlembedded", scriptingModeSpec:"ruby"});
  70. });