Added a parameter to pass in highlight.js in from the renderConfig

Previously, if you wanted to use highlight.js to render the preview, you had to have hljs on the window object. In practice, this is poor and negates many of the
principles behind using Browserify. By injecting it in as a parameter, this means the client can avoid adding things to their global scope if they don't/can't
avoid that.

This is a non-breaking change, only adding a new option to an existing API. The default behaviour is unchanged
patch-ionaru
Simon 8 years ago
parent 580a4b0286
commit a987a8bb64

@ -97,7 +97,8 @@ simplemde.value("This text will appear in the editor");
- **previewRender**: Custom function for parsing the plaintext Markdown and returning HTML. Used when user previews. - **previewRender**: Custom function for parsing the plaintext Markdown and returning HTML. Used when user previews.
- **promptURLs**: If set to `true`, a JS alert window appears asking for the link or image URL. Defaults to `false`. - **promptURLs**: If set to `true`, a JS alert window appears asking for the link or image URL. Defaults to `false`.
- **renderingConfig**: Adjust settings for parsing the Markdown during previewing (not editing). - **renderingConfig**: Adjust settings for parsing the Markdown during previewing (not editing).
- **codeSyntaxHighlighting**: If set to `true`, will highlight using [highlight.js](https://github.com/isagalaev/highlight.js). Defaults to `false`. To use this feature you must include highlight.js on your page. For example, include the script and the CSS files like:<br>`<script src="https://cdn.jsdelivr.net/highlight.js/latest/highlight.min.js"></script>`<br>`<link rel="stylesheet" href="https://cdn.jsdelivr.net/highlight.js/latest/styles/github.min.css">` - **codeSyntaxHighlighting**: If set to `true`, will highlight using [highlight.js](https://github.com/isagalaev/highlight.js). Defaults to `false`. To use this feature you must include highlight.js on your page or pass in using the `hljs` parameter. For example, include the script and the CSS files like:<br>`<script src="https://cdn.jsdelivr.net/highlight.js/latest/highlight.min.js"></script>`<br>`<link rel="stylesheet" href="https://cdn.jsdelivr.net/highlight.js/latest/styles/github.min.css">`
- **hljs**: An injectible instance of [highlight.js](https://github.com/isagalaev/highlight.js). If you don't want to rely on getting from `window.hljs`, you can pass in the highlight.js in here. Defaults to `undefined`.
- **markedOptions**: Set the internal Markdown renderer's [options](https://github.com/chjj/marked#options-1). Other `renderingConfig` options will take precedence. - **markedOptions**: Set the internal Markdown renderer's [options](https://github.com/chjj/marked#options-1). Other `renderingConfig` options will take precedence.
- **singleLineBreaks**: If set to `false`, disable parsing GFM single line breaks. Defaults to `true`. - **singleLineBreaks**: If set to `false`, disable parsing GFM single line breaks. Defaults to `true`.
- **shortcuts**: Keyboard shortcuts associated with this instance. Defaults to the [array of shortcuts](#keyboard-shortcuts). - **shortcuts**: Keyboard shortcuts associated with this instance. Defaults to the [array of shortcuts](#keyboard-shortcuts).

@ -94,8 +94,14 @@
.cm-tab { display: inline-block; text-decoration: inherit; } .cm-tab { display: inline-block; text-decoration: inherit; }
.CodeMirror-rulers {
position: absolute;
left: 0; right: 0; top: -50px; bottom: -20px;
overflow: hidden;
}
.CodeMirror-ruler { .CodeMirror-ruler {
border-left: 1px solid #ccc; border-left: 1px solid #ccc;
top: 0; bottom: 0;
position: absolute; position: absolute;
} }
@ -297,7 +303,10 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
visibility: hidden; visibility: hidden;
} }
.CodeMirror-cursor { position: absolute; } .CodeMirror-cursor {
position: absolute;
pointer-events: none;
}
.CodeMirror-measure pre { position: static; } .CodeMirror-measure pre { position: static; }
div.CodeMirror-cursors { div.CodeMirror-cursors {
@ -345,7 +354,6 @@ span.CodeMirror-selectedtext { background: none; }
.CodeMirror { .CodeMirror {
height: auto; height: auto;
min-height: 300px;
border: 1px solid #ddd; border: 1px solid #ddd;
border-bottom-left-radius: 4px; border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px; border-bottom-right-radius: 4px;
@ -354,10 +362,6 @@ span.CodeMirror-selectedtext { background: none; }
z-index: 1; z-index: 1;
} }
.CodeMirror-scroll {
min-height: 300px
}
.CodeMirror-fullscreen { .CodeMirror-fullscreen {
background: #fff; background: #fff;
position: fixed !important; position: fixed !important;
@ -367,6 +371,8 @@ span.CodeMirror-selectedtext { background: none; }
bottom: 0; bottom: 0;
height: auto; height: auto;
z-index: 9; z-index: 9;
border-right: none !important;
border-bottom-right-radius: 0 !important;
} }
.CodeMirror-sided { .CodeMirror-sided {

File diff suppressed because one or more lines are too long

@ -173,7 +173,7 @@ exports.kMaxLength = kMaxLength()
function typedArraySupport () { function typedArraySupport () {
try { try {
var arr = new Uint8Array(1) var arr = new Uint8Array(1)
arr.foo = function () { return 42 } arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
return arr.foo() === 42 && // typed array instances can be augmented return arr.foo() === 42 && // typed array instances can be augmented
typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
@ -317,7 +317,7 @@ function allocUnsafe (that, size) {
assertSize(size) assertSize(size)
that = createBuffer(that, size < 0 ? 0 : checked(size) | 0) that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)
if (!Buffer.TYPED_ARRAY_SUPPORT) { if (!Buffer.TYPED_ARRAY_SUPPORT) {
for (var i = 0; i < size; i++) { for (var i = 0; i < size; ++i) {
that[i] = 0 that[i] = 0
} }
} }
@ -373,7 +373,9 @@ function fromArrayBuffer (that, array, byteOffset, length) {
throw new RangeError('\'length\' is out of bounds') throw new RangeError('\'length\' is out of bounds')
} }
if (length === undefined) { if (byteOffset === undefined && length === undefined) {
array = new Uint8Array(array)
} else if (length === undefined) {
array = new Uint8Array(array, byteOffset) array = new Uint8Array(array, byteOffset)
} else { } else {
array = new Uint8Array(array, byteOffset, length) array = new Uint8Array(array, byteOffset, length)
@ -495,14 +497,14 @@ Buffer.concat = function concat (list, length) {
var i var i
if (length === undefined) { if (length === undefined) {
length = 0 length = 0
for (i = 0; i < list.length; i++) { for (i = 0; i < list.length; ++i) {
length += list[i].length length += list[i].length
} }
} }
var buffer = Buffer.allocUnsafe(length) var buffer = Buffer.allocUnsafe(length)
var pos = 0 var pos = 0
for (i = 0; i < list.length; i++) { for (i = 0; i < list.length; ++i) {
var buf = list[i] var buf = list[i]
if (!Buffer.isBuffer(buf)) { if (!Buffer.isBuffer(buf)) {
throw new TypeError('"list" argument must be an Array of Buffers') throw new TypeError('"list" argument must be an Array of Buffers')
@ -534,7 +536,6 @@ function byteLength (string, encoding) {
switch (encoding) { switch (encoding) {
case 'ascii': case 'ascii':
case 'binary': case 'binary':
// Deprecated
case 'raw': case 'raw':
case 'raws': case 'raws':
return len return len
@ -772,15 +773,16 @@ function arrayIndexOf (arr, val, byteOffset, encoding) {
} }
var foundIndex = -1 var foundIndex = -1
for (var i = 0; byteOffset + i < arrLength; i++) { for (var i = byteOffset; i < arrLength; ++i) {
if (read(arr, byteOffset + i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
if (foundIndex === -1) foundIndex = i if (foundIndex === -1) foundIndex = i
if (i - foundIndex + 1 === valLength) return (byteOffset + foundIndex) * indexSize if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
} else { } else {
if (foundIndex !== -1) i -= i - foundIndex if (foundIndex !== -1) i -= i - foundIndex
foundIndex = -1 foundIndex = -1
} }
} }
return -1 return -1
} }
@ -845,7 +847,7 @@ function hexWrite (buf, string, offset, length) {
if (length > strLen / 2) { if (length > strLen / 2) {
length = strLen / 2 length = strLen / 2
} }
for (var i = 0; i < length; i++) { for (var i = 0; i < length; ++i) {
var parsed = parseInt(string.substr(i * 2, 2), 16) var parsed = parseInt(string.substr(i * 2, 2), 16)
if (isNaN(parsed)) return i if (isNaN(parsed)) return i
buf[offset + i] = parsed buf[offset + i] = parsed
@ -1059,7 +1061,7 @@ function asciiSlice (buf, start, end) {
var ret = '' var ret = ''
end = Math.min(buf.length, end) end = Math.min(buf.length, end)
for (var i = start; i < end; i++) { for (var i = start; i < end; ++i) {
ret += String.fromCharCode(buf[i] & 0x7F) ret += String.fromCharCode(buf[i] & 0x7F)
} }
return ret return ret
@ -1069,7 +1071,7 @@ function binarySlice (buf, start, end) {
var ret = '' var ret = ''
end = Math.min(buf.length, end) end = Math.min(buf.length, end)
for (var i = start; i < end; i++) { for (var i = start; i < end; ++i) {
ret += String.fromCharCode(buf[i]) ret += String.fromCharCode(buf[i])
} }
return ret return ret
@ -1082,7 +1084,7 @@ function hexSlice (buf, start, end) {
if (!end || end < 0 || end > len) end = len if (!end || end < 0 || end > len) end = len
var out = '' var out = ''
for (var i = start; i < end; i++) { for (var i = start; i < end; ++i) {
out += toHex(buf[i]) out += toHex(buf[i])
} }
return out return out
@ -1125,7 +1127,7 @@ Buffer.prototype.slice = function slice (start, end) {
} else { } else {
var sliceLen = end - start var sliceLen = end - start
newBuf = new Buffer(sliceLen, undefined) newBuf = new Buffer(sliceLen, undefined)
for (var i = 0; i < sliceLen; i++) { for (var i = 0; i < sliceLen; ++i) {
newBuf[i] = this[i + start] newBuf[i] = this[i + start]
} }
} }
@ -1352,7 +1354,7 @@ Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
function objectWriteUInt16 (buf, value, offset, littleEndian) { function objectWriteUInt16 (buf, value, offset, littleEndian) {
if (value < 0) value = 0xffff + value + 1 if (value < 0) value = 0xffff + value + 1
for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
(littleEndian ? i : 1 - i) * 8 (littleEndian ? i : 1 - i) * 8
} }
@ -1386,7 +1388,7 @@ Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert
function objectWriteUInt32 (buf, value, offset, littleEndian) { function objectWriteUInt32 (buf, value, offset, littleEndian) {
if (value < 0) value = 0xffffffff + value + 1 if (value < 0) value = 0xffffffff + value + 1
for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
} }
} }
@ -1601,12 +1603,12 @@ Buffer.prototype.copy = function copy (target, targetStart, start, end) {
if (this === target && start < targetStart && targetStart < end) { if (this === target && start < targetStart && targetStart < end) {
// descending copy from end // descending copy from end
for (i = len - 1; i >= 0; i--) { for (i = len - 1; i >= 0; --i) {
target[i + targetStart] = this[i + start] target[i + targetStart] = this[i + start]
} }
} else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
// ascending copy from start // ascending copy from start
for (i = 0; i < len; i++) { for (i = 0; i < len; ++i) {
target[i + targetStart] = this[i + start] target[i + targetStart] = this[i + start]
} }
} else { } else {
@ -1667,7 +1669,7 @@ Buffer.prototype.fill = function fill (val, start, end, encoding) {
var i var i
if (typeof val === 'number') { if (typeof val === 'number') {
for (i = start; i < end; i++) { for (i = start; i < end; ++i) {
this[i] = val this[i] = val
} }
} else { } else {
@ -1675,7 +1677,7 @@ Buffer.prototype.fill = function fill (val, start, end, encoding) {
? val ? val
: utf8ToBytes(new Buffer(val, encoding).toString()) : utf8ToBytes(new Buffer(val, encoding).toString())
var len = bytes.length var len = bytes.length
for (i = 0; i < end - start; i++) { for (i = 0; i < end - start; ++i) {
this[i + start] = bytes[i % len] this[i + start] = bytes[i % len]
} }
} }
@ -1717,7 +1719,7 @@ function utf8ToBytes (string, units) {
var leadSurrogate = null var leadSurrogate = null
var bytes = [] var bytes = []
for (var i = 0; i < length; i++) { for (var i = 0; i < length; ++i) {
codePoint = string.charCodeAt(i) codePoint = string.charCodeAt(i)
// is surrogate component // is surrogate component
@ -1792,7 +1794,7 @@ function utf8ToBytes (string, units) {
function asciiToBytes (str) { function asciiToBytes (str) {
var byteArray = [] var byteArray = []
for (var i = 0; i < str.length; i++) { for (var i = 0; i < str.length; ++i) {
// Node's code seems to be doing this and not & 0x7F.. // Node's code seems to be doing this and not & 0x7F..
byteArray.push(str.charCodeAt(i) & 0xFF) byteArray.push(str.charCodeAt(i) & 0xFF)
} }
@ -1802,7 +1804,7 @@ function asciiToBytes (str) {
function utf16leToBytes (str, units) { function utf16leToBytes (str, units) {
var c, hi, lo var c, hi, lo
var byteArray = [] var byteArray = []
for (var i = 0; i < str.length; i++) { for (var i = 0; i < str.length; ++i) {
if ((units -= 2) < 0) break if ((units -= 2) < 0) break
c = str.charCodeAt(i) c = str.charCodeAt(i)
@ -1820,7 +1822,7 @@ function base64ToBytes (str) {
} }
function blitBuffer (src, dst, offset, length) { function blitBuffer (src, dst, offset, length) {
for (var i = 0; i < length; i++) { for (var i = 0; i < length; ++i) {
if ((i + offset >= dst.length) || (i >= src.length)) break if ((i + offset >= dst.length) || (i >= src.length)) break
dst[i + offset] = src[i] dst[i + offset] = src[i]
} }
@ -3543,7 +3545,7 @@ CodeMirror.overlayMode = function(base, overlay, combine) {
}; };
function hiddenTextarea() { function hiddenTextarea() {
var te = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none"); var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none");
var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
// The textarea is kept positioned near the cursor to prevent the // The textarea is kept positioned near the cursor to prevent the
// fact that it'll be scrolled into view on input from scrolling // fact that it'll be scrolled into view on input from scrolling
@ -5010,6 +5012,16 @@ CodeMirror.overlayMode = function(base, overlay, combine) {
return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}; return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd};
} }
function getUsefulRect(rects, bias) {
var rect = nullRect
if (bias == "left") for (var i = 0; i < rects.length; i++) {
if ((rect = rects[i]).left != rect.right) break
} else for (var i = rects.length - 1; i >= 0; i--) {
if ((rect = rects[i]).left != rect.right) break
}
return rect
}
function measureCharInner(cm, prepared, ch, bias) { function measureCharInner(cm, prepared, ch, bias) {
var place = nodeAndOffsetInLineMap(prepared.map, ch, bias); var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);
var node = place.node, start = place.start, end = place.end, collapse = place.collapse; var node = place.node, start = place.start, end = place.end, collapse = place.collapse;
@ -5019,17 +5031,10 @@ CodeMirror.overlayMode = function(base, overlay, combine) {
for (var i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned for (var i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned
while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) --start; while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) --start;
while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) ++end; while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) ++end;
if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) { if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)
rect = node.parentNode.getBoundingClientRect(); rect = node.parentNode.getBoundingClientRect();
} else if (ie && cm.options.lineWrapping) { else
var rects = range(node, start, end).getClientRects(); rect = getUsefulRect(range(node, start, end).getClientRects(), bias)
if (rects.length)
rect = rects[bias == "right" ? rects.length - 1 : 0];
else
rect = nullRect;
} else {
rect = range(node, start, end).getBoundingClientRect() || nullRect;
}
if (rect.left || rect.right || start == 0) break; if (rect.left || rect.right || start == 0) break;
end = start; end = start;
start = start - 1; start = start - 1;
@ -5255,10 +5260,23 @@ CodeMirror.overlayMode = function(base, overlay, combine) {
for (;;) { for (;;) {
if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) { if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {
var ch = x < fromX || x - fromX <= toX - x ? from : to; var ch = x < fromX || x - fromX <= toX - x ? from : to;
var outside = ch == from ? fromOutside : toOutside
var xDiff = x - (ch == from ? fromX : toX); var xDiff = x - (ch == from ? fromX : toX);
// This is a kludge to handle the case where the coordinates
// are after a line-wrapped line. We should replace it with a
// more general handling of cursor positions around line
// breaks. (Issue #4078)
if (toOutside && !bidi && !/\s/.test(lineObj.text.charAt(ch)) && xDiff > 0 &&
ch < lineObj.text.length && preparedMeasure.view.measure.heights.length > 1) {
var charSize = measureCharPrepared(cm, preparedMeasure, ch, "right");
if (innerOff <= charSize.bottom && innerOff >= charSize.top && Math.abs(x - charSize.right) < xDiff) {
outside = false
ch++
xDiff = x - charSize.right
}
}
while (isExtendingChar(lineObj.text.charAt(ch))) ++ch; while (isExtendingChar(lineObj.text.charAt(ch))) ++ch;
var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside, var pos = PosWithInfo(lineNo, ch, outside, xDiff < -1 ? -1 : xDiff > 1 ? 1 : 0);
xDiff < -1 ? -1 : xDiff > 1 ? 1 : 0);
return pos; return pos;
} }
var step = Math.ceil(dist / 2), middle = from + step; var step = Math.ceil(dist / 2), middle = from + step;
@ -5982,6 +6000,7 @@ CodeMirror.overlayMode = function(base, overlay, combine) {
// Let the drag handler handle this. // Let the drag handler handle this.
if (webkit) display.scroller.draggable = true; if (webkit) display.scroller.draggable = true;
cm.state.draggingText = dragEnd; cm.state.draggingText = dragEnd;
dragEnd.copy = mac ? e.altKey : e.ctrlKey
// IE's approach to draggable // IE's approach to draggable
if (display.scroller.dragDrop) display.scroller.dragDrop(); if (display.scroller.dragDrop) display.scroller.dragDrop();
on(document, "mouseup", dragEnd); on(document, "mouseup", dragEnd);
@ -6212,7 +6231,7 @@ CodeMirror.overlayMode = function(base, overlay, combine) {
try { try {
var text = e.dataTransfer.getData("Text"); var text = e.dataTransfer.getData("Text");
if (text) { if (text) {
if (cm.state.draggingText && !(mac ? e.altKey : e.ctrlKey)) if (cm.state.draggingText && !cm.state.draggingText.copy)
var selected = cm.listSelections(); var selected = cm.listSelections();
setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)); setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));
if (selected) for (var i = 0; i < selected.length; ++i) if (selected) for (var i = 0; i < selected.length; ++i)
@ -6727,7 +6746,7 @@ CodeMirror.overlayMode = function(base, overlay, combine) {
// Revert a change stored in a document's history. // Revert a change stored in a document's history.
function makeChangeFromHistory(doc, type, allowSelectionOnly) { function makeChangeFromHistory(doc, type, allowSelectionOnly) {
if (doc.cm && doc.cm.state.suppressEdits) return; if (doc.cm && doc.cm.state.suppressEdits && !allowSelectionOnly) return;
var hist = doc.history, event, selAfter = doc.sel; var hist = doc.history, event, selAfter = doc.sel;
var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done; var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done;
@ -9252,6 +9271,7 @@ CodeMirror.overlayMode = function(base, overlay, combine) {
var content = elt("span", null, null, webkit ? "padding-right: .1px" : null); var content = elt("span", null, null, webkit ? "padding-right: .1px" : null);
var builder = {pre: elt("pre", [content], "CodeMirror-line"), content: content, var builder = {pre: elt("pre", [content], "CodeMirror-line"), content: content,
col: 0, pos: 0, cm: cm, col: 0, pos: 0, cm: cm,
trailingSpace: false,
splitSpaces: (ie || webkit) && cm.getOption("lineWrapping")}; splitSpaces: (ie || webkit) && cm.getOption("lineWrapping")};
lineView.measure = {}; lineView.measure = {};
@ -9313,7 +9333,7 @@ CodeMirror.overlayMode = function(base, overlay, combine) {
// the line map. Takes care to render special characters separately. // the line map. Takes care to render special characters separately.
function buildToken(builder, text, style, startStyle, endStyle, title, css) { function buildToken(builder, text, style, startStyle, endStyle, title, css) {
if (!text) return; if (!text) return;
var displayText = builder.splitSpaces ? text.replace(/ {3,}/g, splitSpaces) : text; var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text
var special = builder.cm.state.specialChars, mustWrap = false; var special = builder.cm.state.specialChars, mustWrap = false;
if (!special.test(text)) { if (!special.test(text)) {
builder.col += text.length; builder.col += text.length;
@ -9358,6 +9378,7 @@ CodeMirror.overlayMode = function(base, overlay, combine) {
builder.pos++; builder.pos++;
} }
} }
builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32
if (style || startStyle || endStyle || mustWrap || css) { if (style || startStyle || endStyle || mustWrap || css) {
var fullStyle = style || ""; var fullStyle = style || "";
if (startStyle) fullStyle += startStyle; if (startStyle) fullStyle += startStyle;
@ -9369,11 +9390,17 @@ CodeMirror.overlayMode = function(base, overlay, combine) {
builder.content.appendChild(content); builder.content.appendChild(content);
} }
function splitSpaces(old) { function splitSpaces(text, trailingBefore) {
var out = " "; if (text.length > 1 && !/ /.test(text)) return text
for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? " " : "\u00a0"; var spaceBefore = trailingBefore, result = ""
out += " "; for (var i = 0; i < text.length; i++) {
return out; var ch = text.charAt(i)
if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))
ch = "\u00a0"
result += ch
spaceBefore = ch == " "
}
return result
} }
// Work around nonsense dimensions being reported for stretches of // Work around nonsense dimensions being reported for stretches of
@ -9410,6 +9437,7 @@ CodeMirror.overlayMode = function(base, overlay, combine) {
builder.content.appendChild(widget); builder.content.appendChild(widget);
} }
builder.pos += size; builder.pos += size;
builder.trailingSpace = false
} }
// Outputs a number of spans to make up a line, taking highlighting // Outputs a number of spans to make up a line, taking highlighting
@ -10857,8 +10885,9 @@ CodeMirror.overlayMode = function(base, overlay, combine) {
if (badBidiRects != null) return badBidiRects; if (badBidiRects != null) return badBidiRects;
var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA")); var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA"));
var r0 = range(txt, 0, 1).getBoundingClientRect(); var r0 = range(txt, 0, 1).getBoundingClientRect();
if (!r0 || r0.left == r0.right) return false; // Safari returns null in some cases (#2780)
var r1 = range(txt, 1, 2).getBoundingClientRect(); var r1 = range(txt, 1, 2).getBoundingClientRect();
removeChildren(measure);
if (!r0 || r0.left == r0.right) return false; // Safari returns null in some cases (#2780)
return badBidiRects = (r1.right - r0.right < 3); return badBidiRects = (r1.right - r0.right < 3);
} }
@ -11224,7 +11253,7 @@ CodeMirror.overlayMode = function(base, overlay, combine) {
// THE END // THE END
CodeMirror.version = "5.15.2"; CodeMirror.version = "5.17.0";
return CodeMirror; return CodeMirror;
}); });
@ -11427,7 +11456,9 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
list2: "variable-3", list2: "variable-3",
list3: "keyword", list3: "keyword",
hr: "hr", hr: "hr",
image: "tag", image: "image",
imageAltText: "image-alt-text",
imageMarker: "image-marker",
formatting: "formatting", formatting: "formatting",
linkInline: "link", linkInline: "link",
linkEmail: "link", linkEmail: "link",
@ -11677,6 +11708,9 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
if (state.strikethrough) { styles.push(tokenTypes.strikethrough); } if (state.strikethrough) { styles.push(tokenTypes.strikethrough); }
if (state.linkText) { styles.push(tokenTypes.linkText); } if (state.linkText) { styles.push(tokenTypes.linkText); }
if (state.code) { styles.push(tokenTypes.code); } if (state.code) { styles.push(tokenTypes.code); }
if (state.image) { styles.push(tokenTypes.image); }
if (state.imageAltText) { styles.push(tokenTypes.imageAltText, "link"); }
if (state.imageMarker) { styles.push(tokenTypes.imageMarker); }
} }
if (state.header) { styles.push(tokenTypes.header, tokenTypes.header + "-" + state.header); } if (state.header) { styles.push(tokenTypes.header, tokenTypes.header + "-" + state.header); }
@ -11796,12 +11830,29 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
} }
if (ch === '!' && stream.match(/\[[^\]]*\] ?(?:\(|\[)/, false)) { if (ch === '!' && stream.match(/\[[^\]]*\] ?(?:\(|\[)/, false)) {
stream.match(/\[[^\]]*\]/); state.imageMarker = true;
state.image = true;
if (modeCfg.highlightFormatting) state.formatting = "image";
return getType(state);
}
if (ch === '[' && state.imageMarker) {
state.imageMarker = false;
state.imageAltText = true
if (modeCfg.highlightFormatting) state.formatting = "image";
return getType(state);
}
if (ch === ']' && state.imageAltText) {
if (modeCfg.highlightFormatting) state.formatting = "image";
var type = getType(state);
state.imageAltText = false;
state.image = false;
state.inline = state.f = linkHref; state.inline = state.f = linkHref;
return tokenTypes.image; return type;
} }
if (ch === '[' && stream.match(/[^\]]*\](\(.*\)| ?\[.*?\])/, false)) { if (ch === '[' && stream.match(/[^\]]*\](\(.*\)| ?\[.*?\])/, false) && !state.image) {
state.linkText = true; state.linkText = true;
if (modeCfg.highlightFormatting) state.formatting = "link"; if (modeCfg.highlightFormatting) state.formatting = "link";
return getType(state); return getType(state);
@ -15784,8 +15835,10 @@ function _replaceSelection(cm, active, startEnd, url) {
var text; var text;
var start = startEnd[0]; var start = startEnd[0];
var end = startEnd[1]; var end = startEnd[1];
var startPoint = cm.getCursor("start"); var startPoint = {},
var endPoint = cm.getCursor("end"); endPoint = {};
Object.assign(startPoint, cm.getCursor("start"));
Object.assign(endPoint, cm.getCursor("end"));
if(url) { if(url) {
end = end.replace("#url#", url); end = end.replace("#url#", url);
} }
@ -16353,6 +16406,8 @@ function SimpleMDE(options) {
// Merging the shortcuts, with the given options // Merging the shortcuts, with the given options
options.shortcuts = extend({}, shortcuts, options.shortcuts || {}); options.shortcuts = extend({}, shortcuts, options.shortcuts || {});
options.minHeight = options.minHeight || "300px";
// Change unique_id to uniqueId for backwards compatibility // Change unique_id to uniqueId for backwards compatibility
if(options.autosave != undefined && options.autosave.unique_id != undefined && options.autosave.unique_id != "") if(options.autosave != undefined && options.autosave.unique_id != undefined && options.autosave.unique_id != "")
@ -16381,8 +16436,12 @@ function SimpleMDE(options) {
SimpleMDE.prototype.markdown = function(text) { SimpleMDE.prototype.markdown = function(text) {
if(marked) { if(marked) {
// Initialize // Initialize
var markedOptions = {}; var markedOptions;
if(this.options && this.options.renderingConfig && this.options.renderingConfig.markedOptions) {
markedOptions = this.options.renderingConfig.markedOptions;
} else {
markedOptions = {};
}
// Update options // Update options
if(this.options && this.options.renderingConfig && this.options.renderingConfig.singleLineBreaks === false) { if(this.options && this.options.renderingConfig && this.options.renderingConfig.singleLineBreaks === false) {
@ -16391,10 +16450,17 @@ SimpleMDE.prototype.markdown = function(text) {
markedOptions.breaks = true; markedOptions.breaks = true;
} }
if(this.options && this.options.renderingConfig && this.options.renderingConfig.codeSyntaxHighlighting === true && window.hljs) { if(this.options && this.options.renderingConfig && this.options.renderingConfig.codeSyntaxHighlighting === true) {
markedOptions.highlight = function(code) {
return window.hljs.highlightAuto(code).value; /* Get HLJS from config or window */
}; var hljs = this.options.renderingConfig.hljs || window.hljs;
/* Check if HLJS loaded */
if(hljs) {
markedOptions.highlight = function(code) {
return hljs.highlightAuto(code).value;
};
}
} }
@ -16484,6 +16550,8 @@ SimpleMDE.prototype.render = function(el) {
styleSelectedText: (options.styleSelectedText != undefined) ? options.styleSelectedText : true styleSelectedText: (options.styleSelectedText != undefined) ? options.styleSelectedText : true
}); });
this.codemirror.getScrollerElement().style.minHeight = options.minHeight;
if(options.forceSync === true) { if(options.forceSync === true) {
var cm = this.codemirror; var cm = this.codemirror;
cm.on("change", function() { cm.on("change", function() {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -795,7 +795,8 @@ function _replaceSelection(cm, active, startEnd, url) {
var text; var text;
var start = startEnd[0]; var start = startEnd[0];
var end = startEnd[1]; var end = startEnd[1];
var startPoint = {}, endPoint = {}; var startPoint = {},
endPoint = {};
Object.assign(startPoint, cm.getCursor("start")); Object.assign(startPoint, cm.getCursor("start"));
Object.assign(endPoint, cm.getCursor("end")); Object.assign(endPoint, cm.getCursor("end"));
if(url) { if(url) {
@ -1409,10 +1410,17 @@ SimpleMDE.prototype.markdown = function(text) {
markedOptions.breaks = true; markedOptions.breaks = true;
} }
if(this.options && this.options.renderingConfig && this.options.renderingConfig.codeSyntaxHighlighting === true && window.hljs) { if(this.options && this.options.renderingConfig && this.options.renderingConfig.codeSyntaxHighlighting === true) {
markedOptions.highlight = function(code) {
return window.hljs.highlightAuto(code).value; /* Get HLJS from config or window */
}; var hljs = this.options.renderingConfig.hljs || window.hljs;
/* Check if HLJS loaded */
if(hljs) {
markedOptions.highlight = function(code) {
return hljs.highlightAuto(code).value;
};
}
} }
@ -2034,4 +2042,4 @@ SimpleMDE.prototype.toTextArea = function() {
} }
}; };
module.exports = SimpleMDE; module.exports = SimpleMDE;
Loading…
Cancel
Save