mirror of
https://github.com/Ionaru/easy-markdown-editor
synced 2025-08-17 06:02:44 -06:00
WIP: Working prototype with selective levels
This commit is contained in:
parent
93c60bcf28
commit
6d0174fd46
@ -2205,18 +2205,51 @@ EasyMDE.prototype.render = function (el) {
|
||||
}
|
||||
if (options.parsingConfig.headingLevels) {
|
||||
// If the *headingLevels* argument is present, set our custom modifiers
|
||||
var makeBiggerHeadline = function(headline, from, to) {
|
||||
var headlineMakeBigger = function(headline, from, to) {
|
||||
headline = headline || '';
|
||||
if (!from || !to) {
|
||||
if (!from || !to || from >= to) {
|
||||
return '';
|
||||
}
|
||||
var level = '';
|
||||
while (from < to) {
|
||||
level += '#';
|
||||
from++;
|
||||
if (!headline.length) {
|
||||
while (from < to) {
|
||||
level += '#';
|
||||
from++;
|
||||
}
|
||||
level += ' ';
|
||||
return level;
|
||||
}
|
||||
else {
|
||||
while (to > 0) {
|
||||
level += '#';
|
||||
to--;
|
||||
}
|
||||
level += ' ';
|
||||
return /#/.test(headline) ? headline.replace(/^[#]+\s*/, level) : level;
|
||||
}
|
||||
};
|
||||
var headlineMakeSmaller = function(headline, from, to) {
|
||||
headline = headline || '';
|
||||
if (!from || !to || from <= to) {
|
||||
return '';
|
||||
}
|
||||
var level = '';
|
||||
if (!headline.length) {
|
||||
while (from > to) {
|
||||
level += '#';
|
||||
from--;
|
||||
}
|
||||
level += ' ';
|
||||
return level;
|
||||
}
|
||||
else {
|
||||
while (to > 0) {
|
||||
level += '#';
|
||||
to--;
|
||||
}
|
||||
level += ' ';
|
||||
return /#/.test(headline) ? headline.replace(/^[#]+\s*/, level) : level;
|
||||
}
|
||||
level += ' ';
|
||||
return /#/.test(headline) ? headline.replace(/#\s*/, level) : level;
|
||||
};
|
||||
var headlineNeedUpdate = function(myCurrHeadline, allowedHeadlingLevels, levelSearchDir) {
|
||||
if (!myCurrHeadline || !allowedHeadlingLevels) {
|
||||
@ -2266,7 +2299,7 @@ EasyMDE.prototype.render = function (el) {
|
||||
diff: Math.abs(newHeadingLevel - currHeadlingLevel),
|
||||
};
|
||||
};
|
||||
var checkNewHeadline = function(cm, obj) {
|
||||
var headlineCheckNew = function(cm, obj) {
|
||||
var myHeadline = cm.getRange({
|
||||
line: obj.from.line,
|
||||
ch: 0,
|
||||
@ -2283,7 +2316,7 @@ EasyMDE.prototype.render = function (el) {
|
||||
if (levels.to > levels.from) {
|
||||
// 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
|
||||
obj.text[0] = makeBiggerHeadline('', levels.from, levels.to);
|
||||
obj.text[0] = headlineMakeBigger('', levels.from, levels.to);
|
||||
}
|
||||
else {
|
||||
// The current level is forbidden and we jump to the closest lower level available
|
||||
@ -2306,7 +2339,7 @@ EasyMDE.prototype.render = function (el) {
|
||||
}
|
||||
return true;
|
||||
};
|
||||
var checkExistingHeadline = function(cm, obj) {
|
||||
var headlineCheckExisting = function(cm, obj) {
|
||||
var myChar = cm.getRange({
|
||||
line: obj.from.line,
|
||||
ch: obj.from.ch,
|
||||
@ -2314,7 +2347,6 @@ EasyMDE.prototype.render = function (el) {
|
||||
line: obj.to.line,
|
||||
ch: obj.to.ch + 1,
|
||||
});
|
||||
// console.log( '==' + myChar + '==' );
|
||||
if (!/\s|#/.test(myChar || '')) {
|
||||
// Don't bother to go further if no headlines were detected
|
||||
return false;
|
||||
@ -2331,7 +2363,7 @@ EasyMDE.prototype.render = function (el) {
|
||||
}
|
||||
else {
|
||||
myText = myText.replace(/#/, '##'); // Increment one sharp sign
|
||||
};
|
||||
}
|
||||
myLevels = headlineNeedUpdate(myText, cm.options.backdrop.headingLevels);
|
||||
if (!myLevels) {
|
||||
return false;
|
||||
@ -2378,50 +2410,99 @@ EasyMDE.prototype.render = function (el) {
|
||||
}
|
||||
}
|
||||
};
|
||||
var headingCheckRow = function(row, cm) {
|
||||
if (!row || !/^#/.test(row.trim())) {
|
||||
return row;
|
||||
}
|
||||
row = row.replace(/^(\s*)#/, '#');
|
||||
var myLevels = headlineNeedUpdate(row, cm.options.backdrop.headingLevels);
|
||||
if (!myLevels || !myLevels.from || !myLevels.to) {
|
||||
return row;
|
||||
}
|
||||
else if (myLevels.from < myLevels.to) {
|
||||
return headlineMakeBigger(row, myLevels.from, myLevels.to);
|
||||
}
|
||||
else if (myLevels.to < myLevels.from) {
|
||||
return headlineMakeSmaller(row, myLevels.from, myLevels.to);
|
||||
}
|
||||
return row;
|
||||
};
|
||||
this.codemirror.on('beforeChange', function (cm, obj) {
|
||||
console.log(obj);
|
||||
if (!obj || !obj.from || !obj.to || !obj.text) {
|
||||
// console.log(obj);
|
||||
if (!obj || !obj.from || !obj.to || !obj.text || !obj.text.length) {
|
||||
// Don't go further 'cause a required argument is missing...
|
||||
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) {
|
||||
// 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;
|
||||
}
|
||||
if (obj.from.ch === 0 && obj.to.ch === 0 && /\s|\b/.test(obj.text[0] || '')) {
|
||||
// Prevent space at the beginning of the line
|
||||
if (obj.from.ch === 0 && obj.to.ch === 0 && /\s/.test(obj.text[0] || '')) {
|
||||
// (Force) Prevent space at the beginning of the line
|
||||
obj.cancel();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!obj.text.length) {
|
||||
// Just in case
|
||||
return false;
|
||||
}
|
||||
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';
|
||||
}
|
||||
if (/input/.test(obj.origin)) { // Something was added
|
||||
if (obj.text.length === 1 && obj.text[0].length === 1) {
|
||||
// Only one character on one line is being updated
|
||||
if (obj.text[0] === ' ') {
|
||||
return checkNewHeadline(cm, obj);
|
||||
return headlineCheckNew(cm, obj);
|
||||
}
|
||||
else if (obj.text[0] === '#') {
|
||||
return checkExistingHeadline(cm, obj);
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
return headlineCheckExisting(cm, obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (/delete/.test(obj.origin)) { // Something was removed
|
||||
if (obj.text.length === 1 && !obj.text[0].length) {
|
||||
// Only one character on one line has been removed
|
||||
return checkExistingHeadline(cm, obj);
|
||||
return headlineCheckExisting(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