1
CodeMirror.defineMode("gfm", function(config, parserConfig) {
2
var mdMode = CodeMirror.getMode(config, "markdown");
6
json: "application/json",
8
"c++": "text/x-c++src",
10
csharp: "text/x-csharp",
14
// make this lazy so that we don't need to load GFM last
15
var getMode = (function () {
16
var i, modes = {}, mimes = {}, mime;
18
var list = CodeMirror.listModes();
19
for (i = 0; i < list.length; i++) {
20
modes[list[i]] = list[i];
22
var mimesList = CodeMirror.listMIMEs();
23
for (i = 0; i < mimesList.length; i++) {
24
mime = mimesList[i].mime;
25
mimes[mime] = mimesList[i].mime;
28
for (var a in aliases) {
29
if (aliases[a] in modes || aliases[a] in mimes)
30
modes[a] = aliases[a];
33
return function (lang) {
34
return modes[lang] ? CodeMirror.getMode(config, modes[lang]) : null;
38
function markdown(stream, state) {
39
// intercept fenced code blocks
40
if (stream.sol() && stream.match(/^```([\w+#]*)/)) {
42
state.localMode = getMode(RegExp.$1)
44
state.localState = state.localMode.startState();
50
return mdMode.token(stream, state.mdState);
53
function local(stream, state) {
54
if (stream.sol() && stream.match(/^```/)) {
55
state.localMode = state.localState = null;
56
state.token = markdown;
59
else if (state.localMode) {
60
return state.localMode.token(stream, state.localState);
67
// custom handleText to prevent emphasis in the middle of a word
68
// and add autolinking
69
function handleText(stream, mdState) {
71
if (stream.match(/^\w+:\/\/\S+/)) {
74
if (stream.match(/^[^\[*\\<>` _][^\[*\\<>` ]*[^\[*\\<>` _]/)) {
75
return mdMode.getType(mdState);
77
if (match = stream.match(/^[^\[*\\<>` ]+/)) {
79
if (word[0] === '_' && word[word.length-1] === '_') {
80
stream.backUp(word.length);
83
return mdMode.getType(mdState);
85
if (stream.eatSpace()) {
91
startState: function() {
92
var mdState = mdMode.startState();
93
mdState.text = handleText;
94
return {token: markdown, mode: "markdown", mdState: mdState,
95
localMode: null, localState: null};
98
copyState: function(state) {
99
return {token: state.token, mode: state.mode, mdState: CodeMirror.copyState(mdMode, state.mdState),
100
localMode: state.localMode,
101
localState: state.localMode ? CodeMirror.copyState(state.localMode, state.localState) : null};
104
token: function(stream, state) {
105
return state.token(stream, state);