Skip to content

Instantly share code, notes, and snippets.

@mattmccray
Last active February 4, 2018 22:07
Show Gist options
  • Save mattmccray/98c6c2ec33051df3ec6320dbb7fbc659 to your computer and use it in GitHub Desktop.
Save mattmccray/98c6c2ec33051df3ec6320dbb7fbc659 to your computer and use it in GitHub Desktop.
Updated YamlFrontMatter mode for CodeMirror that includes the trailing "---" in the yaml block.
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE
(function (mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"), require("../yaml/yaml"))
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror", "../yaml/yaml"], mod)
else // Plain browser env
mod(CodeMirror)
})(function (CodeMirror) {
var START = 0, FRONTMATTER = 1, BODY = 2, TRANSITION = 3
// a mixed mode for Markdown text with an optional YAML front matter
CodeMirror.defineMode("yaml-frontmatter", function (config, parserConfig) {
var yamlMode = CodeMirror.getMode(config, "yaml")
var innerMode = CodeMirror.getMode(config, parserConfig && parserConfig.base || "gfm")
function curMode(state) {
return state.state == BODY ? innerMode : yamlMode
}
return {
startState: function () {
return {
state: START,
inner: CodeMirror.startState(yamlMode)
}
},
copyState: function (state) {
return {
state: state.state,
inner: CodeMirror.copyState(curMode(state), state.inner)
}
},
token: function (stream, state) {
if (state.state == START) {
if (stream.match(/---/, false)) {
state.state = FRONTMATTER
return yamlMode.token(stream, state.inner)
} else {
state.state = BODY
state.inner = CodeMirror.startState(innerMode)
return innerMode.token(stream, state.inner)
}
} else if (state.state == FRONTMATTER) {
var end = stream.sol() && stream.match(/---/, false)
var style = yamlMode.token(stream, state.inner)
if (end) {
state.state = TRANSITION
// state.inner = CodeMirror.startState(innerMode)
}
// if (end) {
// state.state = BODY
// state.inner = CodeMirror.startState(innerMode)
// }
return style
} else if (state.state == TRANSITION) {
// var style = yamlMode.token(stream, state.inner)
state.state = BODY
state.inner = CodeMirror.startState(innerMode)
return innerMode.token(stream, state.inner)
// return style
} else {
return innerMode.token(stream, state.inner)
}
},
innerMode: function (state) {
return { mode: curMode(state), state: state.inner }
},
blankLine: function (state) {
var mode = curMode(state)
if (mode.blankLine) return mode.blankLine(state.inner)
}
}
})
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment