From fc1dd837d4a3d1639914923201e853e55a865143 Mon Sep 17 00:00:00 2001 From: wbfsa Date: Fri, 16 Oct 2020 23:22:35 +0800 Subject: [PATCH] fix(sheet name contains squotes bug): formla can not execute, when sheet name contains squotes input formula controller --- src/controllers/handler.js | 9 ++++++++- src/controllers/keyboard.js | 12 ++++++++++-- src/controllers/sheetBar.js | 7 ++++++- src/function/func.js | 4 ++++ src/global/formula.js | 21 +++++++++++++++++---- src/locale/en.js | 1 + src/locale/es.js | 1 + src/locale/zh.js | 2 +- 8 files changed, 48 insertions(+), 9 deletions(-) diff --git a/src/controllers/handler.js b/src/controllers/handler.js index b770cd2..432681d 100644 --- a/src/controllers/handler.js +++ b/src/controllers/handler.js @@ -469,7 +469,14 @@ export default function luckysheetHandler() { } else if (event.ctrlKey && $("#luckysheet-rich-text-editor").find("span").last().text() != ",") { //按住ctrl 选择选区时 先处理上一个选区 - let vText = $("#luckysheet-rich-text-editor").text() + ","; + let vText = $("#luckysheet-rich-text-editor").text(); + + if(vText.length > 0){ + let lastWord = vText.substr(vText.length-1,1); + if(lastWord!="," && lastWord!="=" && lastWord!="("){ + vText += ","; + } + } if (vText.length > 0 && vText.substr(0, 1) == "=") { vText = formula.functionHTMLGenerate(vText); diff --git a/src/controllers/keyboard.js b/src/controllers/keyboard.js index 76f5da5..db26b42 100644 --- a/src/controllers/keyboard.js +++ b/src/controllers/keyboard.js @@ -92,7 +92,7 @@ function formulaMoveEvent(dir, ctrlKey, shiftKey, event){ } else if(formula.israngeseleciton()){ let anchor = $(window.getSelection().anchorNode); - + // console.log(anchor.parent().next().text()); if(anchor.parent().next().text() == null || anchor.parent().next().text() == ""){ let vText = $("#luckysheet-input-box #luckysheet-input-box-index").text(); let range = formula.getcellrange(vText); @@ -162,8 +162,10 @@ function formulaMoveEvent(dir, ctrlKey, shiftKey, event){ luckysheetMoveHighlightCell(dir_n, step, "rangeOfFormula"); } + + event.preventDefault(); } - event.preventDefault(); + } else if(!ctrlKey && !shiftKey){ let anchor = $(window.getSelection().anchorNode); @@ -228,6 +230,9 @@ function formulaMoveEvent(dir, ctrlKey, shiftKey, event){ event.preventDefault(); } + else{ + formula.rangeHightlightselected($("#luckysheet-rich-text-editor")); + } } else if(dir == 'right'){ if(anchor.parent().is("span") && anchor.parent().next().length == 0 && anchorOffset > 0){ @@ -248,6 +253,9 @@ function formulaMoveEvent(dir, ctrlKey, shiftKey, event){ event.preventDefault(); } + else{ + formula.rangeHightlightselected($("#luckysheet-rich-text-editor")); + } } } } diff --git a/src/controllers/sheetBar.js b/src/controllers/sheetBar.js index cfcb4cb..9df8d67 100644 --- a/src/controllers/sheetBar.js +++ b/src/controllers/sheetBar.js @@ -222,7 +222,12 @@ export function initialSheetBar(){ } let $t = $(this); let txt = $t.text(), oldtxt = $t.data("oldtxt"); - + var reg1 = new RegExp("[\\[\\]:\\?*\/'\"]"); + if(reg1.test(txt)){ + alert(locale_sheetconfig.sheetNameSpecCharError); + return; + } + let index = getSheetIndex(Store.currentSheetIndex); for (let i = 0; i < Store.luckysheetfile.length; i++) { if (index != i && Store.luckysheetfile[i].name == txt) { diff --git a/src/function/func.js b/src/function/func.js index f988a4d..fcf2247 100644 --- a/src/function/func.js +++ b/src/function/func.js @@ -1607,6 +1607,10 @@ function luckysheet_getcelldata(txt) { if (val.length > 1) { sheettxt = val[0]; rangetxt = val[1]; + + if(sheettxt.substr(0,1)=="'" && sheettxt.substr(sheettxt.length-1,1)=="'"){ + sheettxt = sheettxt.substring(1,sheettxt.length-1); + } for (let i in luckysheetfile) { if (sheettxt == luckysheetfile[i].name) { diff --git a/src/global/formula.js b/src/global/formula.js index e97299d..cbca4d4 100644 --- a/src/global/formula.js +++ b/src/global/formula.js @@ -705,7 +705,9 @@ const luckysheetformula = { rangetxt = val[1]; - + if(sheettxt.substr(0,1)=="'" && sheettxt.substr(sheettxt.length-1,1)=="'"){ + sheettxt = sheettxt.substring(1,sheettxt.length-1); + } for (let i in luckysheetfile) { if (sheettxt == luckysheetfile[i].name) { sheetIndex = luckysheetfile[i].index; @@ -1210,6 +1212,7 @@ const luckysheetformula = { $("#luckysheet-formula-search-c, #luckysheet-formula-help-c").hide(); _this.helpFunctionExe($editer, currSelection); + console.log(currSelection, $(currSelection).closest(".luckysheet-formula-functionrange-cell").length); if ($(currSelection).closest(".luckysheet-formula-functionrange-cell").length == 0) { _this.searchFunction($editer); return; @@ -3877,6 +3880,16 @@ const luckysheetformula = { matchConfig.dquote += 1; } } + else if (s == "'") { + str += "'"; + + if (matchConfig.squote > 0) { + matchConfig.squote -= 1; + } + else { + matchConfig.squote += 1; + } + } else if (s == ',' && matchConfig.dquote == 0 && matchConfig.braces == 0) { if(bracket.length <= 1){ function_str += _this.functionParser(str,cellRangeFunction) + ","; @@ -3958,7 +3971,7 @@ const luckysheetformula = { } } else { - if (matchConfig.dquote == 0) { + if (matchConfig.dquote == 0 && matchConfig.squote==0) { str += $.trim(s); } else { @@ -3971,7 +3984,7 @@ const luckysheetformula = { if (_this.iscelldata($.trim(str))) { let str_nb = $.trim(str); - endstr = "luckysheet_getcelldata('" +str_nb + "')"; + endstr = "luckysheet_getcelldata('" +str_nb.replace(/'/g, "\\'") + "')"; if(typeof(cellRangeFunction)=="function"){ cellRangeFunction(str_nb); } @@ -4025,7 +4038,7 @@ const luckysheetformula = { i++; } - // console.log(function_str); + console.log(function_str); return function_str; }, insertUpdateDynamicArray: function(dynamicArrayItem) { diff --git a/src/locale/en.js b/src/locale/en.js index 1d24368..dc00356 100644 --- a/src/locale/en.js +++ b/src/locale/en.js @@ -9509,6 +9509,7 @@ export default { redoDelete:"Can be undo by Ctrl+Z", noHide:"Can't hide, at least keep one sheet tag", chartEditNoOpt:"This operation is not allowed in chart editing mode!", + sheetNameSpecCharError:"The name cannot contain:[ ] : \ ? * / ' \"", }, conditionformat: { conditionformat_greaterThan: 'Conditionformat-GreaterThan', diff --git a/src/locale/es.js b/src/locale/es.js index 5b6064a..35a63d4 100644 --- a/src/locale/es.js +++ b/src/locale/es.js @@ -9508,6 +9508,7 @@ export default { redoDelete:"Se puede deshacer con Ctrl+Z", noHide:"No se puede ocultar, al menos conserva una etiqueta de hoja", chartEditNoOpt:"¡Esta operación no está permitida en el modo de edición de gráficos!", + sheetNameSpecCharError:"El nombre no puede contener:[ ] : \ ? * / ' \"", }, conditionformat: { conditionformat_greaterThan: 'Conditionformat-GreaterThan', diff --git a/src/locale/zh.js b/src/locale/zh.js index 6274c6a..f9e0cfe 100644 --- a/src/locale/zh.js +++ b/src/locale/zh.js @@ -9752,7 +9752,7 @@ export default { redoDelete:"可以通过Ctrl+Z撤销删除", noHide:"不能隐藏, 至少保留一个sheet标签", chartEditNoOpt:"图表编辑模式下不允许该操作!", - + sheetNameSpecCharError:"名称不能包含:[ ] : \ ? * / ' \"", }, conditionformat: { conditionformat_greaterThan: '条件格式——大于',