mirror of
https://github.com/Ionaru/easy-markdown-editor
synced 2025-07-17 06:54:27 -06:00
Hotfix: Fixing Typo
This commit is contained in:
parent
93c60bcf28
commit
b89be938dd
@ -1124,6 +1124,13 @@ function _toggleHeading(cm, direction, size) {
|
|||||||
|
|
||||||
var startPoint = cm.getCursor('start');
|
var startPoint = cm.getCursor('start');
|
||||||
var endPoint = cm.getCursor('end');
|
var endPoint = cm.getCursor('end');
|
||||||
|
var sharpLevels = cm.options.backdrop.headingLevels || [],
|
||||||
|
minLevel = sharpLevels.length ? sharpLevels[0] : 1,
|
||||||
|
maxLevel = sharpLevels.length ? sharpLevels[sharpLevels.length-1] : 6;
|
||||||
|
if (size && sharpLevels.length && sharpLevels.indexOf(size) === -1) {
|
||||||
|
cm.focus();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
for (var i = startPoint.line; i <= endPoint.line; i++) {
|
for (var i = startPoint.line; i <= endPoint.line; i++) {
|
||||||
(function (i) {
|
(function (i) {
|
||||||
var text = cm.getLine(i);
|
var text = cm.getLine(i);
|
||||||
@ -1132,14 +1139,20 @@ function _toggleHeading(cm, direction, size) {
|
|||||||
if (direction !== undefined) {
|
if (direction !== undefined) {
|
||||||
if (currHeadingLevel <= 0) {
|
if (currHeadingLevel <= 0) {
|
||||||
if (direction == 'bigger') {
|
if (direction == 'bigger') {
|
||||||
text = '###### ' + text;
|
text = '#'.repeat(maxLevel) + ' ' + text;
|
||||||
} else {
|
} else {
|
||||||
text = '# ' + text;
|
text = '#'.repeat(minLevel) + ' ' + text;
|
||||||
|
}
|
||||||
|
} else if (currHeadingLevel == maxLevel && direction == 'smaller') {
|
||||||
|
text = text.substr(maxLevel + 1);
|
||||||
|
} else if (currHeadingLevel == minLevel && direction == 'bigger') {
|
||||||
|
text = text.substr(minLevel + 1);
|
||||||
|
} else if (sharpLevels.length) {
|
||||||
|
if (direction == 'bigger') {
|
||||||
|
text = '#'.repeat(sharpLevels[sharpLevels.indexOf(currHeadingLevel)-1]) + text.replace(/^[#]+/, '' );
|
||||||
|
} else {
|
||||||
|
text = '#'.repeat(sharpLevels[sharpLevels.indexOf(currHeadingLevel)+1]) + text.replace(/^[#]+/, '' );
|
||||||
}
|
}
|
||||||
} else if (currHeadingLevel == 6 && direction == 'smaller') {
|
|
||||||
text = text.substr(7);
|
|
||||||
} else if (currHeadingLevel == 1 && direction == 'bigger') {
|
|
||||||
text = text.substr(2);
|
|
||||||
} else {
|
} else {
|
||||||
if (direction == 'bigger') {
|
if (direction == 'bigger') {
|
||||||
text = text.substr(1);
|
text = text.substr(1);
|
||||||
@ -2205,108 +2218,138 @@ EasyMDE.prototype.render = function (el) {
|
|||||||
}
|
}
|
||||||
if (options.parsingConfig.headingLevels) {
|
if (options.parsingConfig.headingLevels) {
|
||||||
// If the *headingLevels* argument is present, set our custom modifiers
|
// If the *headingLevels* argument is present, set our custom modifiers
|
||||||
var makeBiggerHeadline = function(headline, from, to) {
|
var headingMakeBigger = function(heading, from, to) {
|
||||||
headline = headline || '';
|
heading = heading || '';
|
||||||
if (!from || !to) {
|
if (!from || !to || from >= to) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
var level = '';
|
var level = '';
|
||||||
while (from < to) {
|
if (!heading.length) {
|
||||||
level += '#';
|
while (from < to) {
|
||||||
from++;
|
level += '#';
|
||||||
|
from++;
|
||||||
|
}
|
||||||
|
level += ' ';
|
||||||
|
return level;
|
||||||
|
} else {
|
||||||
|
while (to > 0) {
|
||||||
|
level += '#';
|
||||||
|
to--;
|
||||||
|
}
|
||||||
|
level += ' ';
|
||||||
|
return /#/.test(heading) ? heading.replace(/^[#]+\s*/, level) : level;
|
||||||
}
|
}
|
||||||
level += ' ';
|
|
||||||
return /#/.test(headline) ? headline.replace(/#\s*/, level) : level;
|
|
||||||
};
|
};
|
||||||
var headlineNeedUpdate = function(myCurrHeadline, allowedHeadlingLevels, levelSearchDir) {
|
var headingMakeSmaller = function(heading, from, to) {
|
||||||
if (!myCurrHeadline || !allowedHeadlingLevels) {
|
heading = heading || '';
|
||||||
|
if (!from || !to || from <= to) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
var level = '';
|
||||||
|
if (!heading.length) {
|
||||||
|
while (from > to) {
|
||||||
|
level += '#';
|
||||||
|
from--;
|
||||||
|
}
|
||||||
|
level += ' ';
|
||||||
|
return level;
|
||||||
|
} else {
|
||||||
|
while (to > 0) {
|
||||||
|
level += '#';
|
||||||
|
to--;
|
||||||
|
}
|
||||||
|
level += ' ';
|
||||||
|
return /#/.test(heading) ? heading.replace(/^[#]+\s*/, level) : level;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var headingNeedUpdate = function(currHeading, allowedHeadingLevels, levelSearchDir) {
|
||||||
|
if (!currHeading || !allowedHeadingLevels) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
myCurrHeadline = myCurrHeadline.trim();
|
currHeading = currHeading.trim();
|
||||||
if (!/^#+/.test(myCurrHeadline)){
|
if (!/^#+/.test(currHeading)){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
var currHeadlingLevel = (myCurrHeadline.match(/^([#]+)/g) || [''])[0].length;
|
var currHeadingLevel = (currHeading.match(/^([#]+)/g) || [''])[0].length;
|
||||||
if (allowedHeadlingLevels.indexOf(currHeadlingLevel) !== -1) {
|
if (allowedHeadingLevels.indexOf(currHeadingLevel) !== -1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
levelSearchDir = levelSearchDir || 'asc';
|
levelSearchDir = levelSearchDir || 'asc';
|
||||||
var newHeadingLevel = -1, n = 0;
|
var newHeadingLevel = -1, n = 0;
|
||||||
if (levelSearchDir === 'asc') {
|
if (levelSearchDir === 'asc') {
|
||||||
while (n < allowedHeadlingLevels.length) {
|
while (n < allowedHeadingLevels.length) {
|
||||||
if (allowedHeadlingLevels[n] > currHeadlingLevel) {
|
if (allowedHeadingLevels[n] > currHeadingLevel) {
|
||||||
newHeadingLevel = allowedHeadlingLevels[n];
|
newHeadingLevel = allowedHeadingLevels[n];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (newHeadingLevel < 0) {
|
if (newHeadingLevel < 0) {
|
||||||
n = allowedHeadlingLevels.length - 1;
|
n = allowedHeadingLevels.length - 1;
|
||||||
while (n > -1) {
|
while (n > -1) {
|
||||||
if (allowedHeadlingLevels[n] < currHeadlingLevel) {
|
if (allowedHeadingLevels[n] < currHeadingLevel) {
|
||||||
newHeadingLevel = allowedHeadlingLevels[n];
|
newHeadingLevel = allowedHeadingLevels[n];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
n--;
|
n--;
|
||||||
}
|
}
|
||||||
if (levelSearchDir === 'dsc') {
|
if (levelSearchDir === 'dsc') {
|
||||||
currHeadlingLevel += 1;
|
currHeadingLevel += 1;
|
||||||
if (newHeadingLevel < 0) {
|
if (newHeadingLevel < 0) {
|
||||||
newHeadingLevel = 0;
|
newHeadingLevel = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (newHeadingLevel < 0 || newHeadingLevel === currHeadlingLevel) {
|
if (newHeadingLevel < 0 || newHeadingLevel === currHeadingLevel) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
from: currHeadlingLevel,
|
from: currHeadingLevel,
|
||||||
to: newHeadingLevel,
|
to: newHeadingLevel,
|
||||||
diff: Math.abs(newHeadingLevel - currHeadlingLevel),
|
diff: Math.abs(newHeadingLevel - currHeadingLevel),
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
var checkNewHeadline = function(cm, obj) {
|
var headingCheckNew = function(cm, obj) {
|
||||||
var myHeadline = cm.getRange({
|
var currHeading = cm.getRange({
|
||||||
line: obj.from.line,
|
line: obj.from.line,
|
||||||
ch: 0,
|
ch: 0,
|
||||||
}, {
|
}, {
|
||||||
line: obj.to.line,
|
line: obj.to.line,
|
||||||
ch: obj.to.ch,
|
ch: obj.to.ch,
|
||||||
});
|
});
|
||||||
var levels = headlineNeedUpdate(myHeadline, cm.options.backdrop.headingLevels);
|
var myLevels = headingNeedUpdate(currHeading, cm.options.backdrop.headingLevels);
|
||||||
if (!levels || !levels.from || !levels.to) {
|
if (!myLevels || !myLevels.from || !myLevels.to) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (obj.from.line === obj.to.line) {
|
if (obj.from.line === obj.to.line) {
|
||||||
// Most simple case when a modification has occured on a single line
|
// Most simple case when a modification has occured on a single line
|
||||||
if (levels.to > levels.from) {
|
if (myLevels.to > myLevels.from) {
|
||||||
// Current level is forbidden so we jump to the closest upper level allowed
|
// Current level is forbidden so we jump to the closest upper level allowed
|
||||||
// We only need to reset the sharp numbers with the appropriate value before the modification is applied
|
// We only need to reset the sharp numbers with the appropriate value before the modification is applied
|
||||||
obj.text[0] = makeBiggerHeadline('', levels.from, levels.to);
|
obj.text[0] = headingMakeBigger('', myLevels.from, myLevels.to);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
// The current level is forbidden and we jump to the closest lower level available
|
// The current level is forbidden and we jump to the closest lower level available
|
||||||
// A bit more is needed: we have to cancel the requested update and trigger a replacement with the existing sharp signs
|
// A bit more is needed: we have to cancel the requested update and trigger a replacement with the existing sharp signs
|
||||||
obj.cancel();
|
obj.cancel();
|
||||||
var newHeadline = '';
|
var newHeading = '';
|
||||||
while (levels.to > 0) {
|
while (myLevels.to > 0) {
|
||||||
newHeadline += '#';
|
newHeading += '#';
|
||||||
levels.to--;
|
myLevels.to--;
|
||||||
}
|
}
|
||||||
newHeadline += ' ';
|
newHeading += ' ';
|
||||||
cm.doc.replaceRange(newHeadline, {
|
cm.doc.replaceRange(newHeading, {
|
||||||
line: obj.from.line,
|
line: obj.from.line,
|
||||||
ch: 0,
|
ch: 0,
|
||||||
}, {
|
}, {
|
||||||
line: obj.to.line,
|
line: obj.to.line,
|
||||||
ch: obj.to.ch,
|
ch: obj.to.ch,
|
||||||
}, myHeadline ); // 4th arguments to keep a trace in the history when possible
|
}, currHeading ); // 4th arguments to keep a trace in the history when possible
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
var checkExistingHeadline = function(cm, obj) {
|
var headingCheckExisting = function(cm, obj) {
|
||||||
var myChar = cm.getRange({
|
var myChar = cm.getRange({
|
||||||
line: obj.from.line,
|
line: obj.from.line,
|
||||||
ch: obj.from.ch,
|
ch: obj.from.ch,
|
||||||
@ -2314,9 +2357,8 @@ EasyMDE.prototype.render = function (el) {
|
|||||||
line: obj.to.line,
|
line: obj.to.line,
|
||||||
ch: obj.to.ch + 1,
|
ch: obj.to.ch + 1,
|
||||||
});
|
});
|
||||||
// console.log( '==' + myChar + '==' );
|
|
||||||
if (!/\s|#/.test(myChar || '')) {
|
if (!/\s|#/.test(myChar || '')) {
|
||||||
// Don't bother to go further if no headlines were detected
|
// Don't bother to go further if no headling were detected
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ((obj.from.line === obj.to.line) && obj.text.length === 1) {
|
if ((obj.from.line === obj.to.line) && obj.text.length === 1) {
|
||||||
@ -2327,12 +2369,11 @@ EasyMDE.prototype.render = function (el) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!/#/.test(myText)) {
|
if (!/#/.test(myText)) {
|
||||||
myText = '# ' + myText.trim(); // Wasn't headline
|
myText = '# ' + myText.trim(); // Wasn't heading
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
myText = myText.replace(/#/, '##'); // Increment one sharp sign
|
myText = myText.replace(/#/, '##'); // Increment one sharp sign
|
||||||
};
|
}
|
||||||
myLevels = headlineNeedUpdate(myText, cm.options.backdrop.headingLevels);
|
myLevels = headingNeedUpdate(myText, cm.options.backdrop.headingLevels);
|
||||||
if (!myLevels) {
|
if (!myLevels) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -2348,7 +2389,7 @@ EasyMDE.prototype.render = function (el) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (/delete/.test(obj.origin) && obj.text[0] === '') {
|
else if (/delete/.test(obj.origin) && obj.text[0] === '') {
|
||||||
myLevels = headlineNeedUpdate(myText.replace(/#/, ''), cm.options.backdrop.headingLevels, 'dsc');
|
myLevels = headingNeedUpdate(myText.replace(/#/, ''), cm.options.backdrop.headingLevels, 'dsc');
|
||||||
if (!myLevels) {
|
if (!myLevels) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -2378,50 +2419,95 @@ EasyMDE.prototype.render = function (el) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
var headingCheckRow = function(row, cm) {
|
||||||
|
if (!row || !/^#/.test(row.trim())) {
|
||||||
|
return row;
|
||||||
|
}
|
||||||
|
row = row.replace(/^(\s*)#/, '#');
|
||||||
|
var myLevels = headingNeedUpdate(row, cm.options.backdrop.headingLevels);
|
||||||
|
if (!myLevels || !myLevels.from || !myLevels.to) {
|
||||||
|
return row;
|
||||||
|
} else if (myLevels.from < myLevels.to) {
|
||||||
|
return headingMakeBigger(row, myLevels.from, myLevels.to);
|
||||||
|
} else if (myLevels.to < myLevels.from) {
|
||||||
|
return headingMakeSmaller(row, myLevels.from, myLevels.to);
|
||||||
|
}
|
||||||
|
return row;
|
||||||
|
};
|
||||||
this.codemirror.on('beforeChange', function (cm, obj) {
|
this.codemirror.on('beforeChange', function (cm, obj) {
|
||||||
console.log(obj);
|
// console.log(obj);
|
||||||
if (!obj || !obj.from || !obj.to || !obj.text) {
|
if (!obj || !obj.from || !obj.to || !obj.text || !obj.text.length) {
|
||||||
// Don't go further 'cause a required argument is missing...
|
// Don't go further 'cause a required argument is missing...
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ((obj.from.line === obj.to.line) ) {
|
if ((obj.from.line === obj.to.line) && obj.text.length < 2) {
|
||||||
if (obj.to.ch > 6) {
|
if (obj.to.ch > 6) {
|
||||||
// No need to trigger a check if we are on the same line at character 7 or upper
|
// No need to trigger a check if we are on the same line at character 7 or upper
|
||||||
// As we are sure the cursor is not inside a range containing a sharp sign
|
// As we are sure the cursor was not inside a range containing a sharp sign
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (obj.from.ch === 0 && obj.to.ch === 0 && /\s|\b/.test(obj.text[0] || '')) {
|
if (obj.from.ch === 0 && obj.to.ch === 0 && /\s/.test(obj.text[0] || '')) {
|
||||||
// Prevent space at the beginning of the line
|
// (Force) Prevent space at the beginning of the line
|
||||||
obj.cancel();
|
obj.cancel();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!obj.text.length) {
|
|
||||||
// Just in case
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!obj.origin) {
|
if (!obj.origin) {
|
||||||
// Just in case
|
// If a modification was triggered by a code and not an human
|
||||||
|
// The origin can be "undefined", so just in case set one.
|
||||||
obj.origin = '+none';
|
obj.origin = '+none';
|
||||||
}
|
}
|
||||||
if (/input/.test(obj.origin)) { // Something was added
|
if (/input/.test(obj.origin)) { // Something was added
|
||||||
if (obj.text.length === 1 && obj.text[0].length === 1) {
|
if (obj.text.length === 1 && obj.text[0].length === 1) {
|
||||||
// Only one character on one line is being updated
|
// Only one character on one line is being updated
|
||||||
if (obj.text[0] === ' ') {
|
if (obj.text[0] === ' ') {
|
||||||
return checkNewHeadline(cm, obj);
|
return headingCheckNew(cm, obj);
|
||||||
}
|
} else if (obj.text[0] === '#') {
|
||||||
else if (obj.text[0] === '#') {
|
return headingCheckExisting(cm, obj);
|
||||||
return checkExistingHeadline(cm, obj);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (/delete/.test(obj.origin)) { // Something was removed
|
else if (/delete/.test(obj.origin)) { // Something was removed
|
||||||
if (obj.text.length === 1 && !obj.text[0].length) {
|
if (obj.text.length === 1 && !obj.text[0].length) {
|
||||||
// Only one character on one line has been removed
|
// Only one character on one line has been removed
|
||||||
return checkExistingHeadline(cm, obj);
|
return headingCheckExisting(cm, obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (obj.text.length < 2) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Multilines modification like a paste
|
||||||
|
var r;
|
||||||
|
if (obj.from.ch === 0) {
|
||||||
|
// Loop each row and check for headers
|
||||||
|
for (r=0; r<obj.text.length; r++) {
|
||||||
|
obj.text[r] = headingCheckRow(obj.text[r], cm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (obj.from.ch > 7) {
|
||||||
|
// We are sure an existing header is not involved
|
||||||
|
// So exclude the first row from the loop
|
||||||
|
for (r=1; r<obj.text.length; r++) {
|
||||||
|
obj.text[r] = headingCheckRow(obj.text[r], cm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// We need to check the first row in case an existing header is involved
|
||||||
|
var startText, oldText, newText;
|
||||||
|
for (r=0; r<obj.text.length; r++) {
|
||||||
|
if (!r) { // First row
|
||||||
|
startText = cm.getRange({line: obj.from.line, ch: 0}, {line: obj.from.line, ch: obj.from.ch});
|
||||||
|
if (/#/.test(startText)) {
|
||||||
|
oldText = startText + obj.text[r];
|
||||||
|
newText = headingCheckRow(oldText, cm);
|
||||||
|
if (oldText !== newText) { // A modification has been made
|
||||||
|
obj.text[r] = newText;
|
||||||
|
obj.from.ch = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { // 2nd and next rows
|
||||||
|
obj.text[r] = headingCheckRow(obj.text[r], cm);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user