From 6d0174fd4648335930264dea79ebcd19ea149f08 Mon Sep 17 00:00:00 2001 From: Pierre-Henri Lavigne Date: Thu, 12 Sep 2024 09:41:10 +0900 Subject: [PATCH] WIP: Working prototype with selective levels --- src/js/easymde.js | 139 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 110 insertions(+), 29 deletions(-) diff --git a/src/js/easymde.js b/src/js/easymde.js index 8e73d6e..f574d7e 100644 --- a/src/js/easymde.js +++ b/src/js/easymde.js @@ -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 7) { + // We are sure an existing header is not involved + // So exclude the first row from the loop + for (r=1; r