From c0c070abaf6c8acfac3fe91c777a50b537b240c6 Mon Sep 17 00:00:00 2001 From: Don HO Date: Sun, 11 Oct 2020 02:24:15 +0200 Subject: [PATCH] Split functionList.xml into multifile in "functionList" Folder New "functionList" will be added beside of notepad++.exe or "%APPDATA%\Notepad++\", according the installation mode. If the portable package is used, after removing "doLocalConf.xml", the "functionList" folder should be copied manually from Notepad++ installed directory to "%APPDATA%\Notepad++\" to make function list work again. All splited files are localized in this folder with the explicit language name. "overrideMap.xml" is optional for overriding the default functionList parse rule files, and for adding UDL parse rule files. Close #4896 --- .gitignore | 1 + PowerEditor/Test/FunctionList/bash/unitTest | 12 +- .../Test/FunctionList/functionList.xsd | 117 -- PowerEditor/Test/FunctionList/unitTest.ps1 | 6 +- .../Test/FunctionList/unitTestLauncher.ps1 | 20 +- PowerEditor/gcc/makefile | 2 +- PowerEditor/installer/functionList/asm.xml | 30 + PowerEditor/installer/functionList/autoit.xml | 41 + PowerEditor/installer/functionList/baanc.xml | 183 ++ PowerEditor/installer/functionList/bash.xml | 67 + PowerEditor/installer/functionList/batch.xml | 35 + PowerEditor/installer/functionList/c.xml | 112 ++ .../installer/functionList/cobol-free.xml | 44 + PowerEditor/installer/functionList/cobol.xml | 27 + PowerEditor/installer/functionList/cpp.xml | 304 +++ PowerEditor/installer/functionList/cs.xml | 43 + PowerEditor/installer/functionList/ini.xml | 30 + PowerEditor/installer/functionList/inno.xml | 104 + PowerEditor/installer/functionList/java.xml | 232 +++ .../installer/functionList/javascript.js.xml | 32 + PowerEditor/installer/functionList/krl.xml | 76 + PowerEditor/installer/functionList/nsis.xml | 146 ++ .../installer/functionList/overrideMap.xml | 132 ++ PowerEditor/installer/functionList/perl.xml | 40 + PowerEditor/installer/functionList/php.xml | 52 + .../installer/functionList/powershell.xml | 44 + PowerEditor/installer/functionList/python.xml | 41 + PowerEditor/installer/functionList/ruby.xml | 42 + .../installer/functionList/sinumerik.xml | 29 + PowerEditor/installer/functionList/sql.xml | 25 + .../installer/functionList/universe_basic.xml | 43 + PowerEditor/installer/functionList/vhdl.xml | 39 + PowerEditor/installer/functionList/xml.xml | 45 + PowerEditor/installer/nppSetup.nsi | 3 +- .../installer/nsisInclude/autoCompletion.nsh | 51 - .../installer/nsisInclude/functionList.nsh | 281 +++ .../nsisInclude/mainSectionFuncs.nsh | 2 - PowerEditor/installer/packageAll.bat | 12 +- .../FunctionList/functionListPanel.cpp | 6 +- .../FunctionList/functionParser.cpp | 291 +-- .../WinControls/FunctionList/functionParser.h | 23 +- PowerEditor/src/functionList.xml | 1738 ----------------- PowerEditor/visual.net/notepadPlus.vcxproj | 3 - appveyor.yml | 8 +- 44 files changed, 2557 insertions(+), 2057 deletions(-) delete mode 100644 PowerEditor/Test/FunctionList/functionList.xsd create mode 100644 PowerEditor/installer/functionList/asm.xml create mode 100644 PowerEditor/installer/functionList/autoit.xml create mode 100644 PowerEditor/installer/functionList/baanc.xml create mode 100644 PowerEditor/installer/functionList/bash.xml create mode 100644 PowerEditor/installer/functionList/batch.xml create mode 100644 PowerEditor/installer/functionList/c.xml create mode 100644 PowerEditor/installer/functionList/cobol-free.xml create mode 100644 PowerEditor/installer/functionList/cobol.xml create mode 100644 PowerEditor/installer/functionList/cpp.xml create mode 100644 PowerEditor/installer/functionList/cs.xml create mode 100644 PowerEditor/installer/functionList/ini.xml create mode 100644 PowerEditor/installer/functionList/inno.xml create mode 100644 PowerEditor/installer/functionList/java.xml create mode 100644 PowerEditor/installer/functionList/javascript.js.xml create mode 100644 PowerEditor/installer/functionList/krl.xml create mode 100644 PowerEditor/installer/functionList/nsis.xml create mode 100644 PowerEditor/installer/functionList/overrideMap.xml create mode 100644 PowerEditor/installer/functionList/perl.xml create mode 100644 PowerEditor/installer/functionList/php.xml create mode 100644 PowerEditor/installer/functionList/powershell.xml create mode 100644 PowerEditor/installer/functionList/python.xml create mode 100644 PowerEditor/installer/functionList/ruby.xml create mode 100644 PowerEditor/installer/functionList/sinumerik.xml create mode 100644 PowerEditor/installer/functionList/sql.xml create mode 100644 PowerEditor/installer/functionList/universe_basic.xml create mode 100644 PowerEditor/installer/functionList/vhdl.xml create mode 100644 PowerEditor/installer/functionList/xml.xml create mode 100644 PowerEditor/installer/nsisInclude/functionList.nsh delete mode 100644 PowerEditor/src/functionList.xml diff --git a/.gitignore b/.gitignore index 8008f7a0..8c016ce4 100644 --- a/.gitignore +++ b/.gitignore @@ -69,6 +69,7 @@ PowerEditor/bin/backup/ PowerEditor/bin/localization/ PowerEditor/bin/plugins/ PowerEditor/bin/updater/ +PowerEditor/bin/functionList/ PowerEditor/bin64/ PowerEditor/bin/themes/ PowerEditor/installer/bin/wingup/ diff --git a/PowerEditor/Test/FunctionList/bash/unitTest b/PowerEditor/Test/FunctionList/bash/unitTest index a13d651b..b627d7b0 100644 --- a/PowerEditor/Test/FunctionList/bash/unitTest +++ b/PowerEditor/Test/FunctionList/bash/unitTest @@ -1,5 +1,8 @@ #!/bin/sh +# bash parser should be fixed so we can use the content of "unitTest.expected.result.correct". +# Check the bug here: +# https://github.com/notepad-plus-plus/notepad-plus-plus/issues/9019 setenv() @@ -117,7 +120,6 @@ LIBIFSNAME="/QSYS.LIB/${TARGETLIB}.LIB" # exit 0 (succeeds) if some action has to be taken, else 1. action_needed() - { [ ! -e "${1}" ] && return 0 [ "${2}" ] || return 1 @@ -132,9 +134,7 @@ action_needed() # - Absolute # - No . or .. component. -canonicalize_path() - -{ +canonicalize_path(){ if expr "${1}" : '^/' > /dev/null then P="${1}" else P="`pwd`/${1}" @@ -167,9 +167,7 @@ canonicalize_path() # As side effect, append the module name to variable MODULES. # Set LINK to "YES" if the module has been compiled. -make_module() - -{ +make_module() { MODULES="${MODULES} ${1}" MODIFSNAME="${LIBIFSNAME}/${1}.MODULE" action_needed "${MODIFSNAME}" "${2}" || return 0; diff --git a/PowerEditor/Test/FunctionList/functionList.xsd b/PowerEditor/Test/FunctionList/functionList.xsd deleted file mode 100644 index 40db0474..00000000 --- a/PowerEditor/Test/FunctionList/functionList.xsd +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/PowerEditor/Test/FunctionList/unitTest.ps1 b/PowerEditor/Test/FunctionList/unitTest.ps1 index 2de98e52..f7eb53ab 100644 --- a/PowerEditor/Test/FunctionList/unitTest.ps1 +++ b/PowerEditor/Test/FunctionList/unitTest.ps1 @@ -3,8 +3,10 @@ # .\unit-test.ps1 RELATIVE_PATH LANG # It return 0 if result is OK # -1 if result is KO +# -2 if exception # 1 if unitTest file not found + $testRoot = ".\" $dirName=$args[0] @@ -35,5 +37,5 @@ Try { } Catch { - return -1 -} \ No newline at end of file + return -2 +} diff --git a/PowerEditor/Test/FunctionList/unitTestLauncher.ps1 b/PowerEditor/Test/FunctionList/unitTestLauncher.ps1 index f9026528..996f8af2 100644 --- a/PowerEditor/Test/FunctionList/unitTestLauncher.ps1 +++ b/PowerEditor/Test/FunctionList/unitTestLauncher.ps1 @@ -6,7 +6,7 @@ Foreach-Object { $dirName = (Get-Item $testRoot$_).Name $langName = $dirName $sw = [Diagnostics.Stopwatch]::StartNew() - $result = &.\unitTest.ps1 $dirName $langName + $result = & ".\unitTest.ps1" $dirName $langName $sw.Stop() "Test: " + $sw.Elapsed.TotalMilliseconds + " ms" @@ -19,11 +19,21 @@ Foreach-Object { { "$dirName ... unitTest file not found. Test skipped." } - else + elseif ($result -eq -1) { "$dirName ... KO" - "" - "There are some problems in your functionList.xml" + "result = $result" + "There are some problems in your $dirName.xml" + exit -1 + } + elseif ($result -eq -2) + { + "Exception!" + exit -1 + } + else + { + "It should not happen - check your script." exit -1 } @@ -48,7 +58,7 @@ Foreach-Object { { "$dirName-$subDirName ... KO" "" - "There are some problems in your functionList.xml" + "There are some problems in your $dirName.xml" exit -1 } } diff --git a/PowerEditor/gcc/makefile b/PowerEditor/gcc/makefile index b043233a..a4b5fb03 100644 --- a/PowerEditor/gcc/makefile +++ b/PowerEditor/gcc/makefile @@ -217,7 +217,7 @@ SRC_RES = ./resources.rc OBJ_RES = $(patsubst %.rc,%.res,$(SRC_RES)) # XML config files -SRC_XMLCFG = $(addprefix $(NPP_DIR)/,langs.model.xml stylers.model.xml shortcuts.xml functionList.xml contextMenu.xml) +SRC_XMLCFG = $(addprefix $(NPP_DIR)/,langs.model.xml stylers.model.xml shortcuts.xml contextMenu.xml) DST_XMLCFG = $(subst $(NPP_DIR),../bin,$(SRC_XMLCFG)) DEPS = $(patsubst %.o,%.d,$(OBJS)) diff --git a/PowerEditor/installer/functionList/asm.xml b/PowerEditor/installer/functionList/asm.xml new file mode 100644 index 00000000..9a5d1b00 --- /dev/null +++ b/PowerEditor/installer/functionList/asm.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/autoit.xml b/PowerEditor/installer/functionList/autoit.xml new file mode 100644 index 00000000..33cf35fb --- /dev/null +++ b/PowerEditor/installer/functionList/autoit.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/baanc.xml b/PowerEditor/installer/functionList/baanc.xml new file mode 100644 index 00000000..603612f3 --- /dev/null +++ b/PowerEditor/installer/functionList/baanc.xml @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/bash.xml b/PowerEditor/installer/functionList/bash.xml new file mode 100644 index 00000000..f5e27177 --- /dev/null +++ b/PowerEditor/installer/functionList/bash.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/batch.xml b/PowerEditor/installer/functionList/batch.xml new file mode 100644 index 00000000..eaf027f5 --- /dev/null +++ b/PowerEditor/installer/functionList/batch.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/c.xml b/PowerEditor/installer/functionList/c.xml new file mode 100644 index 00000000..8eaeccba --- /dev/null +++ b/PowerEditor/installer/functionList/c.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/cobol-free.xml b/PowerEditor/installer/functionList/cobol-free.xml new file mode 100644 index 00000000..09506ab2 --- /dev/null +++ b/PowerEditor/installer/functionList/cobol-free.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/cobol.xml b/PowerEditor/installer/functionList/cobol.xml new file mode 100644 index 00000000..d1ec3409 --- /dev/null +++ b/PowerEditor/installer/functionList/cobol.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/cpp.xml b/PowerEditor/installer/functionList/cpp.xml new file mode 100644 index 00000000..b6fd2c99 --- /dev/null +++ b/PowerEditor/installer/functionList/cpp.xml @@ -0,0 +1,304 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/cs.xml b/PowerEditor/installer/functionList/cs.xml new file mode 100644 index 00000000..4ccba041 --- /dev/null +++ b/PowerEditor/installer/functionList/cs.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/ini.xml b/PowerEditor/installer/functionList/ini.xml new file mode 100644 index 00000000..f1c0efc6 --- /dev/null +++ b/PowerEditor/installer/functionList/ini.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/inno.xml b/PowerEditor/installer/functionList/inno.xml new file mode 100644 index 00000000..7b1cf4f9 --- /dev/null +++ b/PowerEditor/installer/functionList/inno.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/java.xml b/PowerEditor/installer/functionList/java.xml new file mode 100644 index 00000000..248e0fed --- /dev/null +++ b/PowerEditor/installer/functionList/java.xml @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/javascript.js.xml b/PowerEditor/installer/functionList/javascript.js.xml new file mode 100644 index 00000000..5b25b7f4 --- /dev/null +++ b/PowerEditor/installer/functionList/javascript.js.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/krl.xml b/PowerEditor/installer/functionList/krl.xml new file mode 100644 index 00000000..16f81118 --- /dev/null +++ b/PowerEditor/installer/functionList/krl.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/nsis.xml b/PowerEditor/installer/functionList/nsis.xml new file mode 100644 index 00000000..a912d577 --- /dev/null +++ b/PowerEditor/installer/functionList/nsis.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/overrideMap.xml b/PowerEditor/installer/functionList/overrideMap.xml new file mode 100644 index 00000000..8ce88900 --- /dev/null +++ b/PowerEditor/installer/functionList/overrideMap.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/PowerEditor/installer/functionList/perl.xml b/PowerEditor/installer/functionList/perl.xml new file mode 100644 index 00000000..8cb430c8 --- /dev/null +++ b/PowerEditor/installer/functionList/perl.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/php.xml b/PowerEditor/installer/functionList/php.xml new file mode 100644 index 00000000..693df268 --- /dev/null +++ b/PowerEditor/installer/functionList/php.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/powershell.xml b/PowerEditor/installer/functionList/powershell.xml new file mode 100644 index 00000000..8cfee9e7 --- /dev/null +++ b/PowerEditor/installer/functionList/powershell.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/python.xml b/PowerEditor/installer/functionList/python.xml new file mode 100644 index 00000000..a0123534 --- /dev/null +++ b/PowerEditor/installer/functionList/python.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/ruby.xml b/PowerEditor/installer/functionList/ruby.xml new file mode 100644 index 00000000..14b8e8d1 --- /dev/null +++ b/PowerEditor/installer/functionList/ruby.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/sinumerik.xml b/PowerEditor/installer/functionList/sinumerik.xml new file mode 100644 index 00000000..b0443b43 --- /dev/null +++ b/PowerEditor/installer/functionList/sinumerik.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/sql.xml b/PowerEditor/installer/functionList/sql.xml new file mode 100644 index 00000000..567adc66 --- /dev/null +++ b/PowerEditor/installer/functionList/sql.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/universe_basic.xml b/PowerEditor/installer/functionList/universe_basic.xml new file mode 100644 index 00000000..04bac047 --- /dev/null +++ b/PowerEditor/installer/functionList/universe_basic.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/vhdl.xml b/PowerEditor/installer/functionList/vhdl.xml new file mode 100644 index 00000000..1b83ea56 --- /dev/null +++ b/PowerEditor/installer/functionList/vhdl.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/functionList/xml.xml b/PowerEditor/installer/functionList/xml.xml new file mode 100644 index 00000000..a0aea6c5 --- /dev/null +++ b/PowerEditor/installer/functionList/xml.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/installer/nppSetup.nsi b/PowerEditor/installer/nppSetup.nsi index b51a4ce1..718eced9 100644 --- a/PowerEditor/installer/nppSetup.nsi +++ b/PowerEditor/installer/nppSetup.nsi @@ -110,7 +110,7 @@ SectionEnd !include "nsisInclude\autoCompletion.nsh" - +!include "nsisInclude\functionList.nsh" !include "nsisInclude\binariesComponents.nsh" @@ -252,6 +252,7 @@ ${MementoSectionDone} !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${explorerContextMenu} 'Explorer context menu entry for Notepad++ : Open whatever you want in Notepad++ from Windows Explorer.' !insertmacro MUI_DESCRIPTION_TEXT ${autoCompletionComponent} 'Install the API files you need for the auto-completion feature (Ctrl+Space).' + !insertmacro MUI_DESCRIPTION_TEXT ${functionListComponent} 'Install the function list files you need for the function list feature (Ctrl+Space).' !insertmacro MUI_DESCRIPTION_TEXT ${Plugins} 'You may need these plugins to extend the capabilities of Notepad++.' !insertmacro MUI_DESCRIPTION_TEXT ${localization} 'To use Notepad++ in your favorite language(s), install all/desired language(s).' !insertmacro MUI_DESCRIPTION_TEXT ${Themes} 'The eye-candy to change visual effects. Use Theme selector to switch among them.' diff --git a/PowerEditor/installer/nsisInclude/autoCompletion.nsh b/PowerEditor/installer/nsisInclude/autoCompletion.nsh index 70062c59..1e6f6a41 100644 --- a/PowerEditor/installer/nsisInclude/autoCompletion.nsh +++ b/PowerEditor/installer/nsisInclude/autoCompletion.nsh @@ -30,151 +30,126 @@ SectionGroup "Auto-completion Files" autoCompletionComponent SetOverwrite off ${MementoSection} "C" C - Delete "$INSTDIR\plugins\APIs\c.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\c.xml" ${MementoSectionEnd} ${MementoSection} "C++" C++ - Delete "$INSTDIR\plugins\APIs\cpp.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\cpp.xml" ${MementoSectionEnd} ${MementoSection} "Java" Java - Delete "$INSTDIR\plugins\APIs\java.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\java.xml" ${MementoSectionEnd} ${MementoSection} "C#" C# - Delete "$INSTDIR\plugins\APIs\cs.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\cs.xml" ${MementoSectionEnd} ${MementoSection} "HTML" HTML - Delete "$INSTDIR\plugins\APIs\html.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\html.xml" ${MementoSectionEnd} ${MementoSection} "RC" RC - Delete "$INSTDIR\plugins\APIs\rc.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\rc.xml" ${MementoSectionEnd} ${MementoSection} "SQL" SQL - Delete "$INSTDIR\plugins\APIs\sql.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\sql.xml" ${MementoSectionEnd} ${MementoSection} "PHP" PHP - Delete "$INSTDIR\plugins\APIs\php.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\php.xml" ${MementoSectionEnd} ${MementoSection} "CSS" CSS - Delete "$INSTDIR\plugins\APIs\css.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\css.xml" ${MementoSectionEnd} ${MementoSection} "VB" VB - Delete "$INSTDIR\plugins\APIs\vb.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\vb.xml" ${MementoSectionEnd} ${MementoSection} "Perl" Perl - Delete "$INSTDIR\plugins\APIs\perl.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\perl.xml" ${MementoSectionEnd} ${MementoSection} "JavaScript" JavaScript - Delete "$INSTDIR\plugins\APIs\javascript.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\javascript.xml" ${MementoSectionEnd} ${MementoSection} "Python" Python - Delete "$INSTDIR\plugins\APIs\python.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\python.xml" ${MementoSectionEnd} ${MementoSection} "ActionScript" ActionScript - Delete "$INSTDIR\plugins\APIs\actionscript.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\actionscript.xml" ${MementoSectionEnd} ${MementoSection} "LISP" LISP - Delete "$INSTDIR\plugins\APIs\lisp.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\lisp.xml" ${MementoSectionEnd} ${MementoSection} "VHDL" VHDL - Delete "$INSTDIR\plugins\APIs\vhdl.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\vhdl.xml" ${MementoSectionEnd} ${MementoSection} "TeX" TeX - Delete "$INSTDIR\plugins\APIs\tex.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\tex.xml" ${MementoSectionEnd} ${MementoSection} "DocBook" DocBook - Delete "$INSTDIR\plugins\APIs\xml.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\xml.xml" ${MementoSectionEnd} ${MementoSection} "NSIS" NSIS - Delete "$INSTDIR\plugins\APIs\nsis.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\nsis.xml" ${MementoSectionEnd} ${MementoSection} "CMAKE" CMAKE - Delete "$INSTDIR\plugins\APIs\cmake.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\cmake.xml" ${MementoSectionEnd} ${MementoSection} "BATCH" BATCH - Delete "$INSTDIR\plugins\APIs\batch.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\batch.xml" ${MementoSectionEnd} ${MementoSection} "CoffeeScript" CoffeeScript - Delete "$INSTDIR\plugins\APIs\coffee.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\coffee.xml" ${MementoSectionEnd} ${MementoSection} "BaanC" BaanC - Delete "$INSTDIR\plugins\APIs\baanc.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\baanc.xml" ${MementoSectionEnd} ${MementoSection} "Lua" Lua - Delete "$INSTDIR\plugins\APIs\lua.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\lua.xml" ${MementoSectionEnd} ${MementoSection} "AutoIt" AutoIt - Delete "$INSTDIR\plugins\APIs\autoit.xml" SetOutPath "$INSTDIR\autoCompletion" File ".\APIs\autoit.xml" ${MementoSectionEnd} @@ -184,128 +159,102 @@ SectionGroupEnd SectionGroup un.autoCompletionComponent Section un.PHP - Delete "$INSTDIR\plugins\APIs\php.xml" Delete "$INSTDIR\autoCompletion\php.xml" SectionEnd Section un.CSS - Delete "$INSTDIR\plugins\APIs\css.xml" Delete "$INSTDIR\autoCompletion\css.xml" SectionEnd Section un.HTML - Delete "$INSTDIR\plugins\APIs\html.xml" Delete "$INSTDIR\autoCompletion\html.xml" SectionEnd Section un.SQL - Delete "$INSTDIR\plugins\APIs\sql.xml" Delete "$INSTDIR\autoCompletion\sql.xml" SectionEnd Section un.RC - Delete "$INSTDIR\plugins\APIs\rc.xml" Delete "$INSTDIR\autoCompletion\rc.xml" SectionEnd Section un.VB - Delete "$INSTDIR\plugins\APIs\vb.xml" Delete "$INSTDIR\autoCompletion\vb.xml" SectionEnd Section un.Perl - Delete "$INSTDIR\plugins\APIs\perl.xml" Delete "$INSTDIR\autoCompletion\perl.xml" SectionEnd Section un.C - Delete "$INSTDIR\plugins\APIs\c.xml" Delete "$INSTDIR\autoCompletion\c.xml" SectionEnd Section un.C++ - Delete "$INSTDIR\plugins\APIs\cpp.xml" Delete "$INSTDIR\autoCompletion\cpp.xml" SectionEnd Section un.Java - Delete "$INSTDIR\plugins\APIs\java.xml" Delete "$INSTDIR\autoCompletion\java.xml" SectionEnd Section un.C# - Delete "$INSTDIR\plugins\APIs\cs.xml" Delete "$INSTDIR\autoCompletion\cs.xml" SectionEnd Section un.JavaScript - Delete "$INSTDIR\plugins\APIs\javascript.xml" Delete "$INSTDIR\autoCompletion\javascript.xml" SectionEnd Section un.Python - Delete "$INSTDIR\plugins\APIs\python.xml" Delete "$INSTDIR\autoCompletion\python.xml" SectionEnd Section un.ActionScript - Delete "$INSTDIR\plugins\APIs\actionscript.xml" Delete "$INSTDIR\autoCompletion\actionscript.xml" SectionEnd Section un.LISP - Delete "$INSTDIR\plugins\APIs\lisp.xml" Delete "$INSTDIR\autoCompletion\lisp.xml" SectionEnd Section un.VHDL - Delete "$INSTDIR\plugins\APIs\vhdl.xml" Delete "$INSTDIR\autoCompletion\vhdl.xml" SectionEnd Section un.TeX - Delete "$INSTDIR\plugins\APIs\tex.xml" Delete "$INSTDIR\autoCompletion\tex.xml" SectionEnd Section un.DocBook - Delete "$INSTDIR\plugins\APIs\xml.xml" Delete "$INSTDIR\autoCompletion\xml.xml" SectionEnd Section un.NSIS - Delete "$INSTDIR\plugins\APIs\nsis.xml" Delete "$INSTDIR\autoCompletion\nsis.xml" SectionEnd Section un.CMAKE - Delete "$INSTDIR\plugins\APIs\cmake.xml" Delete "$INSTDIR\autoCompletion\cmake.xml" SectionEnd Section un.BATCH - Delete "$INSTDIR\plugins\APIs\batch.xml" Delete "$INSTDIR\autoCompletion\batch.xml" SectionEnd Section un.CoffeeScript - Delete "$INSTDIR\plugins\APIs\coffee.xml" Delete "$INSTDIR\autoCompletion\coffee.xml" SectionEnd Section un.BaanC - Delete "$INSTDIR\plugins\APIs\baanc.xml" Delete "$INSTDIR\autoCompletion\baanc.xml" SectionEnd Section un.Lua - Delete "$INSTDIR\plugins\APIs\lua.xml" Delete "$INSTDIR\autoCompletion\lua.xml" SectionEnd - Section un.autoit - Delete "$INSTDIR\plugins\APIs\autoit.xml" Delete "$INSTDIR\autoCompletion\autoit.xml" SectionEnd diff --git a/PowerEditor/installer/nsisInclude/functionList.nsh b/PowerEditor/installer/nsisInclude/functionList.nsh new file mode 100644 index 00000000..2681c63e --- /dev/null +++ b/PowerEditor/installer/nsisInclude/functionList.nsh @@ -0,0 +1,281 @@ +; this file is part of installer for Notepad++ +; Copyright (C)2016 Don HO +; +; This program is free software; you can redistribute it and/or +; modify it under the terms of the GNU General Public License +; as published by the Free Software Foundation; either +; version 2 of the License, or (at your option) any later version. +; +; Note that the GPL places important restrictions on "derived works", yet +; it does not provide a detailed definition of that term. To avoid +; misunderstandings, we consider an application to constitute a +; "derivative work" for the purpose of this license if it does any of the +; following: +; 1. Integrates source code from Notepad++. +; 2. Integrates/includes/aggregates Notepad++ into a proprietary executable +; installer, such as those produced by InstallShield. +; 3. Links to a library or executes a program that does any of the above. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with this program; if not, write to the Free Software +; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + +SectionGroup "Function List Files" functionListComponent + SetOverwrite off + + ; UPDATE_PATH: the value is $UPDATE_PATH if doLocalConf.xml exit, + ; otherwise the value is $APPDATA\${APPNAME} + ${MementoSection} "C" C_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\c.xml" + ${MementoSectionEnd} + + ${MementoSection} "C++" C++_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\cpp.xml" + ${MementoSectionEnd} + + ${MementoSection} "Java" Java_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\java.xml" + ${MementoSectionEnd} + + ${MementoSection} "C#" C#_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\cs.xml" + ${MementoSectionEnd} + + ${MementoSection} "Assembly" Assembly_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\asm.xml" + ${MementoSectionEnd} + + ${MementoSection} "Bash" Bash_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\bash.xml" + ${MementoSectionEnd} + + ${MementoSection} "SQL" SQL_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\sql.xml" + ${MementoSectionEnd} + + ${MementoSection} "PHP" PHP_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\php.xml" + ${MementoSectionEnd} + + ${MementoSection} "COBOL section free" COBOL-section-free + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\cobol-free.xml" + ${MementoSectionEnd} + + ${MementoSection} "COBOL" COBOL_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\cobol.xml" + ${MementoSectionEnd} + + ${MementoSection} "Perl" Perl_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\perl.xml" + ${MementoSectionEnd} + + ${MementoSection} "JavaScript" JavaScript_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\javascript.js.xml" + ${MementoSectionEnd} + + ${MementoSection} "Python" Python_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\python.xml" + ${MementoSectionEnd} + + ${MementoSection} "ini" ini_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\ini.xml" + ${MementoSectionEnd} + + ${MementoSection} "Inno Setup" Innosetup_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\inno.xml" + ${MementoSectionEnd} + + ${MementoSection} "VHDL" VHDL_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\vhdl.xml" + ${MementoSectionEnd} + + ${MementoSection} "KRL" KRL_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\krl.xml" + ${MementoSectionEnd} + + ${MementoSection} "Override Map" OverrideMap_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\overrideMap.xml" + ${MementoSectionEnd} + + ${MementoSection} "NSIS" NSIS_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\nsis.xml" + ${MementoSectionEnd} + + ${MementoSection} "PowerShell" PowerShell_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\powershell.xml" + ${MementoSectionEnd} + + ${MementoSection} "BATCH" BATCH_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\batch.xml" + ${MementoSectionEnd} + + ${MementoSection} "Ruby" Ruby_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\ruby.xml" + ${MementoSectionEnd} + + ${MementoSection} "BaanC" BaanC_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\baanc.xml" + ${MementoSectionEnd} + + ${MementoSection} "Sinumerik" Sinumerik_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\sinumerik.xml" + ${MementoSectionEnd} + + ${MementoSection} "AutoIt" AutoIt_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\autoit.xml" + ${MementoSectionEnd} + + ${MementoSection} "UniVerse BASIC" UniVerseBASIC_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\universe_basic.xml" + ${MementoSectionEnd} + + ${MementoSection} "XML" XML_FL + SetOutPath "$UPDATE_PATH\functionList" + File ".\functionList\xml.xml" + ${MementoSectionEnd} +SectionGroupEnd + + + +SectionGroup un.functionListComponent + Section un.PHP_FL + Delete "$UPDATE_PATH\functionList\php.xml" + SectionEnd + + Section un.Assembly_FL + Delete "$UPDATE_PATH\functionList\asm.xml" + SectionEnd + + Section un.SQL_FL + Delete "$UPDATE_PATH\functionList\sql.xml" + SectionEnd + + Section un.Bash_FL + Delete "$UPDATE_PATH\functionList\bash.xml" + SectionEnd + + Section un.COBOL-section-free_FL + Delete "$UPDATE_PATH\functionList\cobol-free.xml" + SectionEnd + + Section un.Perl_FL + Delete "$UPDATE_PATH\functionList\perl.xml" + SectionEnd + + Section un.C_FL + Delete "$UPDATE_PATH\functionList\c.xml" + SectionEnd + + Section un.C++_FL + Delete "$UPDATE_PATH\functionList\cpp.xml" + SectionEnd + + Section un.Java_FL + Delete "$UPDATE_PATH\functionList\java.xml" + SectionEnd + + Section un.C#_FL + Delete "$UPDATE_PATH\functionList\cs.xml" + SectionEnd + + Section un.JavaScript_FL + Delete "$UPDATE_PATH\functionList\javascript.js.xml" + SectionEnd + + Section un.Python_FL + Delete "$UPDATE_PATH\functionList\python.xml" + SectionEnd + + Section un.COBOL_FL + Delete "$UPDATE_PATH\functionList\cobol.xml" + SectionEnd + + Section un.ini_FL + Delete "$UPDATE_PATH\functionList\ini.xml" + SectionEnd + + Section un.VHDL_FL + Delete "$UPDATE_PATH\functionList\vhdl.xml" + SectionEnd + + Section un.Innosetup_FL + Delete "$UPDATE_PATH\functionList\inno.xml" + SectionEnd + + Section un.XML_FL + Delete "$UPDATE_PATH\functionList\xml.xml" + SectionEnd + + Section un.NSIS_FL + Delete "$UPDATE_PATH\functionList\nsis.xml" + SectionEnd + + Section un.KRL_FL + Delete "$UPDATE_PATH\functionList\krl.xml" + SectionEnd + + Section un.BATCH_FL + Delete "$UPDATE_PATH\functionList\batch.xml" + SectionEnd + + Section un.OverrideMap_FL + Delete "$UPDATE_PATH\functionList\overrideMap.xml" + SectionEnd + + Section un.BaanC_FL + Delete "$UPDATE_PATH\functionList\baanc.xml" + SectionEnd + + Section un.PowerShell_FL + Delete "$UPDATE_PATH\functionList\powershell.xml" + SectionEnd + + Section un.AutoIt_FL + Delete "$UPDATE_PATH\functionList\autoit.xml" + SectionEnd + + Section un.Ruby_FL + Delete "$UPDATE_PATH\functionList\ruby.xml" + SectionEnd + + Section un.UniVerseBASIC_FL + Delete "$UPDATE_PATH\functionList\universe_basic.xml" + SectionEnd + + Section un.Sinumerik_FL + Delete "$UPDATE_PATH\functionList\sinumerik.xml" + SectionEnd + +SectionGroupEnd diff --git a/PowerEditor/installer/nsisInclude/mainSectionFuncs.nsh b/PowerEditor/installer/nsisInclude/mainSectionFuncs.nsh index 45823989..cadb83e2 100644 --- a/PowerEditor/installer/nsisInclude/mainSectionFuncs.nsh +++ b/PowerEditor/installer/nsisInclude/mainSectionFuncs.nsh @@ -85,14 +85,12 @@ Function copyCommonFiles SetOverwrite off SetOutPath "$UPDATE_PATH\" File "..\bin\contextMenu.xml" - File "..\bin\functionList.xml" SetOverwrite on SetOutPath "$INSTDIR\" File "..\bin\langs.model.xml" File "..\bin\stylers.model.xml" File "..\bin\contextMenu.xml" - File "..\bin\functionList.xml" SetOverwrite off File "..\bin\shortcuts.xml" diff --git a/PowerEditor/installer/packageAll.bat b/PowerEditor/installer/packageAll.bat index e2edaabf..4ddb3622 100644 --- a/PowerEditor/installer/packageAll.bat +++ b/PowerEditor/installer/packageAll.bat @@ -129,6 +129,7 @@ mkdir .\zipped.package.release\updater mkdir .\zipped.package.release\localization mkdir .\zipped.package.release\themes mkdir .\zipped.package.release\autoCompletion +mkdir .\zipped.package.release\functionList mkdir .\zipped.package.release\userDefineLangs mkdir .\zipped.package.release\plugins mkdir .\zipped.package.release\plugins\NppExport @@ -146,6 +147,7 @@ mkdir .\zipped.package.release64\updater mkdir .\zipped.package.release64\localization mkdir .\zipped.package.release64\themes mkdir .\zipped.package.release64\autoCompletion +mkdir .\zipped.package.release64\functionList mkdir .\zipped.package.release64\userDefineLangs mkdir .\zipped.package.release64\plugins mkdir .\zipped.package.release64\plugins\NppExport @@ -169,8 +171,6 @@ copy /Y ..\src\contextMenu.xml .\zipped.package.release\ If ErrorLevel 1 goto End copy /Y ..\src\shortcuts.xml .\zipped.package.release\ If ErrorLevel 1 goto End -copy /Y ..\src\functionList.xml .\zipped.package.release\ -If ErrorLevel 1 goto End copy /Y ..\bin\doLocalConf.xml .\zipped.package.release\ If ErrorLevel 1 goto End copy /Y ..\bin\"notepad++.exe" .\zipped.package.release\ @@ -194,8 +194,6 @@ copy /Y ..\src\contextMenu.xml .\zipped.package.release64\ If ErrorLevel 1 goto End copy /Y ..\src\shortcuts.xml .\zipped.package.release64\ If ErrorLevel 1 goto End -copy /Y ..\src\functionList.xml .\zipped.package.release64\ -If ErrorLevel 1 goto End copy /Y ..\bin\doLocalConf.xml .\zipped.package.release64\ If ErrorLevel 1 goto End copy /Y ..\bin64\"notepad++.exe" .\zipped.package.release64\ @@ -232,6 +230,12 @@ If ErrorLevel 1 goto End copy /Y ".\APIs\*.xml" .\zipped.package.release64\autoCompletion\ If ErrorLevel 1 goto End +rem FunctionList files: Copy all files into Notepad++ 32-bit/64-bit package folders +copy /Y ".\functionList\*.xml" .\zipped.package.release\functionList\ +If ErrorLevel 1 goto End +copy /Y ".\functionList\*.xml" .\zipped.package.release64\functionList\ +If ErrorLevel 1 goto End + rem Markdown as UserDefineLanguge: Markdown syntax highlighter into Notepad++ 32-bit/64-bit package folders copy /Y "..\bin\userDefineLangs\userDefinedLang-markdown.default.modern.xml" .\zipped.package.release\userDefineLangs\ If ErrorLevel 1 goto End diff --git a/PowerEditor/src/WinControls/FunctionList/functionListPanel.cpp b/PowerEditor/src/WinControls/FunctionList/functionListPanel.cpp index db0776f6..1db9b073 100644 --- a/PowerEditor/src/WinControls/FunctionList/functionListPanel.cpp +++ b/PowerEditor/src/WinControls/FunctionList/functionListPanel.cpp @@ -478,12 +478,12 @@ void FunctionListPanel::init(HINSTANCE hInst, HWND hPere, ScintillaEditView **pp if (!doLocalConf) { generic_string funcListXmlPath = (NppParameters::getInstance()).getUserPath(); - PathAppend(funcListXmlPath, TEXT("functionList.xml")); + PathAppend(funcListXmlPath, TEXT("functionList")); if (!PathFileExists(funcListXmlPath.c_str())) { generic_string funcListDefaultXmlPath = (NppParameters::getInstance()).getNppPath(); - PathAppend(funcListDefaultXmlPath, TEXT("functionList.xml")); + PathAppend(funcListDefaultXmlPath, TEXT("functionList")); if (PathFileExists(funcListDefaultXmlPath.c_str())) { ::CopyFile(funcListDefaultXmlPath.c_str(), funcListXmlPath.c_str(), TRUE); @@ -498,7 +498,7 @@ void FunctionListPanel::init(HINSTANCE hInst, HWND hPere, ScintillaEditView **pp else { generic_string funcListDefaultXmlPath = (NppParameters::getInstance()).getNppPath(); - PathAppend(funcListDefaultXmlPath, TEXT("functionList.xml")); + PathAppend(funcListDefaultXmlPath, TEXT("functionList")); if (PathFileExists(funcListDefaultXmlPath.c_str())) { _funcParserMgr.init(funcListDefaultXmlPath, ppEditView); diff --git a/PowerEditor/src/WinControls/FunctionList/functionParser.cpp b/PowerEditor/src/WinControls/FunctionList/functionParser.cpp index c173a55f..85e738bc 100644 --- a/PowerEditor/src/WinControls/FunctionList/functionParser.cpp +++ b/PowerEditor/src/WinControls/FunctionList/functionParser.cpp @@ -34,30 +34,19 @@ using namespace std; FunctionParsersManager::~FunctionParsersManager() { - for (size_t i = 0, len = _parsers.size(); i < len; ++i) + for (size_t i = 0, len = L_EXTERNAL + nbMaxUserDefined; i < len; ++i) { - delete _parsers[i]; + if (_parsers[i] != nullptr) + delete _parsers[i]; } - - delete _pXmlFuncListDoc; } -bool FunctionParsersManager::init(const generic_string& xmlPath, ScintillaEditView ** ppEditView) +bool FunctionParsersManager::init(const generic_string& xmlDirPath, ScintillaEditView ** ppEditView) { _ppEditView = ppEditView; - bool loadOkay = false; + _xmlDirPath = xmlDirPath; - if (PathFileExists(xmlPath.c_str())) - { - _pXmlFuncListDoc = new TiXmlDocument(xmlPath); - loadOkay = _pXmlFuncListDoc->LoadFile(); - if (loadOkay) - { - loadOkay = getFuncListFromXmlTree(); - } - } - - return loadOkay; + return getOverrideMapFromXmlTree(); } bool FunctionParsersManager::getZonePaserParameters(TiXmlNode *classRangeParser, generic_string &mainExprStr, generic_string &openSymboleStr, generic_string &closeSymboleStr, std::vector &classNameExprArray, generic_string &functionExprStr, std::vector &functionNameExprArray) @@ -153,20 +142,121 @@ bool FunctionParsersManager::getUnitPaserParameters(TiXmlNode *functionParser, g return true; } -void FunctionParsersManager::writeFunctionListXml(const TCHAR *destFoder) const + +bool FunctionParsersManager::loadFuncListFromXmlTree(LangType lType, const generic_string& overrideId, int udlIndex) { - generic_string dest = destFoder; - PathAppend(dest, TEXT("functionList.xml")); - if (_pXmlFuncListDoc) - _pXmlFuncListDoc->SaveFile(dest.c_str()); + generic_string funcListRulePath = _xmlDirPath; + funcListRulePath += TEXT("\\"); + int index = -1; + if (lType == L_USER) // UDL + { + if (overrideId.empty()) + return false; + + if (udlIndex == -1) + return false; + + index = udlIndex; + funcListRulePath += overrideId; + } + else // Supported Language + { + index = lType; + if (overrideId.empty()) + { + generic_string lexerName = ScintillaEditView::langNames[lType].lexerName; + funcListRulePath += lexerName; + funcListRulePath += TEXT(".xml"); + } + else + { + funcListRulePath += overrideId; + } + } + + if (index > _currentUDIndex) + return false; + + if (_parsers[index] == nullptr) + return false; + + TiXmlDocument xmlFuncListDoc(funcListRulePath); + bool loadOK = xmlFuncListDoc.LoadFile(); + + if (!loadOK) + return false; + + TiXmlNode *root = xmlFuncListDoc.FirstChild(TEXT("NotepadPlus")); + if (!root) + return false; + + root = root->FirstChild(TEXT("functionList")); + if (!root) + return false; + + TiXmlNode *parserRoot = root->FirstChild(TEXT("parser")); + if (!parserRoot) + return false; + + const TCHAR *id = (parserRoot->ToElement())->Attribute(TEXT("id")); + if (!id || !id[0]) + return false; + + generic_string commentExpr(TEXT("")); + const TCHAR *pCommentExpr = (parserRoot->ToElement())->Attribute(TEXT("commentExpr")); + if (pCommentExpr && pCommentExpr[0]) + commentExpr = pCommentExpr; + + std::vector classNameExprArray; + std::vector functionNameExprArray; + + const TCHAR *displayName = (parserRoot->ToElement())->Attribute(TEXT("displayName")); + if (!displayName || !displayName[0]) + displayName = id; + + TiXmlNode *classRangeParser = parserRoot->FirstChild(TEXT("classRange")); + TiXmlNode *functionParser = parserRoot->FirstChild(TEXT("function")); + if (classRangeParser && functionParser) + { + generic_string mainExpr, openSymbole, closeSymbole, functionExpr; + getZonePaserParameters(classRangeParser, mainExpr, openSymbole, closeSymbole, classNameExprArray, functionExpr, functionNameExprArray); + + generic_string mainExpr2; + std::vector classNameExprArray2; + std::vector functionNameExprArray2; + getUnitPaserParameters(functionParser, mainExpr2, functionNameExprArray2, classNameExprArray2); + FunctionUnitParser *funcUnitPaser = new FunctionUnitParser(id, displayName, commentExpr.c_str(), mainExpr2.c_str(), functionNameExprArray2, classNameExprArray2); + + _parsers[index]->_parser = new FunctionMixParser(id, displayName, commentExpr.c_str(), mainExpr.c_str(), openSymbole.c_str(), closeSymbole.c_str(), classNameExprArray, functionExpr.c_str(), functionNameExprArray, funcUnitPaser); + } + else if (classRangeParser) + { + generic_string mainExpr, openSymbole, closeSymbole, functionExpr; + getZonePaserParameters(classRangeParser, mainExpr, openSymbole, closeSymbole, classNameExprArray, functionExpr, functionNameExprArray); + _parsers[index]->_parser = new FunctionZoneParser(id, displayName, commentExpr.c_str(), mainExpr.c_str(), openSymbole.c_str(), closeSymbole.c_str(), classNameExprArray, functionExpr.c_str(), functionNameExprArray); + } + else if (functionParser) + { + generic_string mainExpr; + getUnitPaserParameters(functionParser, mainExpr, functionNameExprArray, classNameExprArray); + _parsers[index]->_parser = new FunctionUnitParser(id, displayName, commentExpr.c_str(), mainExpr.c_str(), functionNameExprArray, classNameExprArray); + } + + return true; } -bool FunctionParsersManager::getFuncListFromXmlTree() +bool FunctionParsersManager::getOverrideMapFromXmlTree() { - if (!_pXmlFuncListDoc) + generic_string funcListRulePath = _xmlDirPath; + funcListRulePath += TEXT("\\overrideMap.xml"); + + TiXmlDocument xmlFuncListDoc(funcListRulePath); + bool loadOK = xmlFuncListDoc.LoadFile(); + + if (!loadOK) return false; - TiXmlNode *root = _pXmlFuncListDoc->FirstChild(TEXT("NotepadPlus")); + TiXmlNode *root = xmlFuncListDoc.FirstChild(TEXT("NotepadPlus")); if (!root) return false; @@ -174,61 +264,6 @@ bool FunctionParsersManager::getFuncListFromXmlTree() if (!root) return false; - TiXmlNode *parserRoot = root->FirstChild(TEXT("parsers")); - if (!parserRoot) - return false; - - - for (TiXmlNode *childNode = parserRoot->FirstChildElement(TEXT("parser")); - childNode; - childNode = childNode->NextSibling(TEXT("parser")) ) - { - const TCHAR *id = (childNode->ToElement())->Attribute(TEXT("id")); - if (!id || !id[0]) - continue; - - generic_string commentExpr(TEXT("")); - const TCHAR *pCommentExpr = (childNode->ToElement())->Attribute(TEXT("commentExpr")); - if (pCommentExpr && pCommentExpr[0]) - commentExpr = pCommentExpr; - - - std::vector classNameExprArray; - std::vector functionNameExprArray; - - const TCHAR *displayName = (childNode->ToElement())->Attribute(TEXT("displayName")); - if (!displayName || !displayName[0]) - displayName = id; - - TiXmlNode *classRangeParser = childNode->FirstChild(TEXT("classRange")); - TiXmlNode *functionParser = childNode->FirstChild(TEXT("function")); - if (classRangeParser && functionParser) - { - generic_string mainExpr, openSymbole, closeSymbole, functionExpr; - getZonePaserParameters(classRangeParser, mainExpr, openSymbole, closeSymbole, classNameExprArray, functionExpr, functionNameExprArray); - - generic_string mainExpr2; - std::vector classNameExprArray2; - std::vector functionNameExprArray2; - getUnitPaserParameters(functionParser, mainExpr2, functionNameExprArray2, classNameExprArray2); - FunctionUnitParser *funcUnitPaser = new FunctionUnitParser(id, displayName, commentExpr.c_str(), mainExpr2.c_str(), functionNameExprArray2, classNameExprArray2); - - _parsers.push_back(new FunctionMixParser(id, displayName, commentExpr.c_str(), mainExpr.c_str(), openSymbole.c_str(), closeSymbole.c_str(), classNameExprArray, functionExpr.c_str(), functionNameExprArray, funcUnitPaser)); - } - else if (classRangeParser) - { - generic_string mainExpr, openSymbole, closeSymbole, functionExpr; - getZonePaserParameters(classRangeParser, mainExpr, openSymbole, closeSymbole, classNameExprArray, functionExpr, functionNameExprArray); - _parsers.push_back(new FunctionZoneParser(id, displayName, commentExpr.c_str(), mainExpr.c_str(), openSymbole.c_str(), closeSymbole.c_str(), classNameExprArray, functionExpr.c_str(), functionNameExprArray)); - } - else if (functionParser) - { - generic_string mainExpr; - getUnitPaserParameters(functionParser, mainExpr, functionNameExprArray, classNameExprArray); - _parsers.push_back(new FunctionUnitParser(id, displayName, commentExpr.c_str(), mainExpr.c_str(), functionNameExprArray, classNameExprArray)); - } - } - TiXmlNode *associationMapRoot = root->FirstChild(TEXT("associationMap")); if (associationMapRoot) { @@ -238,24 +273,29 @@ bool FunctionParsersManager::getFuncListFromXmlTree() { int langID; const TCHAR *langIDStr = (childNode->ToElement())->Attribute(TEXT("langID"), &langID); - const TCHAR *exts = (childNode->ToElement())->Attribute(TEXT("ext")); const TCHAR *id = (childNode->ToElement())->Attribute(TEXT("id")); const TCHAR *userDefinedLangName = (childNode->ToElement())->Attribute(TEXT("userDefinedLangName")); - if (((langIDStr && langIDStr[0]) || (exts && exts[0]) || (userDefinedLangName && userDefinedLangName[0])) && (id && id[0])) + + if (!(id && id[0])) + continue; + + if (langIDStr && langIDStr[0]) { - for (size_t i = 0, len = _parsers.size(); i < len; ++i) + _parsers[langID] = new ParserInfo(id); + } + else if (userDefinedLangName && userDefinedLangName[0]) + { + if (_currentUDIndex < L_EXTERNAL + nbMaxUserDefined) { - if (_parsers[i]->_id == id) - { - _associationMap.push_back(AssociationInfo(static_cast(i), langIDStr ? langID : -1, exts ? exts : TEXT(""), userDefinedLangName ? userDefinedLangName : TEXT(""))); - break; - } + ++_currentUDIndex; + _parsers[_currentUDIndex] = new ParserInfo(id, userDefinedLangName); + } } } } - return (_parsers.size() != 0); + return true; } FunctionParser * FunctionParsersManager::getParser(const AssociationInfo & assoInfo) @@ -263,7 +303,6 @@ FunctionParser * FunctionParsersManager::getParser(const AssociationInfo & assoI const unsigned char doNothing = 0; const unsigned char checkLangID = 1; const unsigned char checkUserDefined = 2; - const unsigned char checkExt = 3; unsigned char choice = doNothing; // langID != -1 && langID != L_USER @@ -272,39 +311,66 @@ FunctionParser * FunctionParsersManager::getParser(const AssociationInfo & assoI // langID == L_USER, we chack the userDefinedLangName else if (assoInfo._langID == L_USER && assoInfo._userDefinedLangName != TEXT("")) choice = checkUserDefined; - // langID == -1, we chack the ext - else if (assoInfo._langID == -1 && assoInfo._ext != TEXT("")) - choice = checkExt; else return NULL; - for (size_t i = 0, len = _associationMap.size(); i < len; ++i) + switch (choice) { - switch (choice) + case checkLangID: { - case checkLangID: + if (_parsers[assoInfo._langID] != nullptr) { - if (assoInfo._langID == _associationMap[i]._langID) - return _parsers[_associationMap[i]._id]; + if (_parsers[assoInfo._langID]->_parser != nullptr) + return _parsers[assoInfo._langID]->_parser; + else + { + // load it + if (loadFuncListFromXmlTree(static_cast(assoInfo._langID), _parsers[assoInfo._langID]->_id)) + return _parsers[assoInfo._langID]->_parser; + } } - break; - - case checkUserDefined: + else { - if (assoInfo._userDefinedLangName == _associationMap[i]._userDefinedLangName) - return _parsers[_associationMap[i]._id]; - } - break; + _parsers[assoInfo._langID] = new ParserInfo; + // load it + if (loadFuncListFromXmlTree(static_cast(assoInfo._langID), _parsers[assoInfo._langID]->_id)) + return _parsers[assoInfo._langID]->_parser; - case checkExt: - { - if (assoInfo._ext == _associationMap[i]._ext) - return _parsers[_associationMap[i]._id]; + return nullptr; } - break; - } + break; + + case checkUserDefined: + { + if (_currentUDIndex == L_EXTERNAL) // no User Defined Language parser + return nullptr; + + for (int i = L_EXTERNAL + 1; i <= _currentUDIndex; ++i) + { + if (_parsers[i]->_userDefinedLangName == assoInfo._userDefinedLangName) + { + if (_parsers[i]->_parser) + { + return _parsers[i]->_parser; + } + else + { + // load it + if (loadFuncListFromXmlTree(static_cast(assoInfo._langID), _parsers[i]->_id, i)) + return _parsers[i]->_parser; + } + + break; + } + } + + return nullptr; + } + break; + } + return NULL; } @@ -427,9 +493,6 @@ generic_string FunctionParser::parseSubLevel(size_t begin, size_t end, std::vect bool FunctionParsersManager::parse(std::vector & foundInfos, const AssociationInfo & assoInfo) { - if (!_pXmlFuncListDoc) - return false; - // Serch the right parser from the given ext in the map FunctionParser *fp = getParser(assoInfo); if (!fp) diff --git a/PowerEditor/src/WinControls/FunctionList/functionParser.h b/PowerEditor/src/WinControls/FunctionList/functionParser.h index b694fc18..78768767 100644 --- a/PowerEditor/src/WinControls/FunctionList/functionParser.h +++ b/PowerEditor/src/WinControls/FunctionList/functionParser.h @@ -139,6 +139,19 @@ struct AssociationInfo final }; }; +const int nbMaxUserDefined = 25; + +struct ParserInfo +{ + generic_string _id; // xml parser rule file name - if empty, then we use default name. Mandatory if _userDefinedLangName is not empty + FunctionParser* _parser = nullptr; + generic_string _userDefinedLangName; + + ParserInfo() {}; + ParserInfo(const generic_string& id): _id(id) {}; + ParserInfo(const generic_string& id, const generic_string& userDefinedLangName): _id(id), _userDefinedLangName(userDefinedLangName) {}; + ~ParserInfo() { if (_parser) delete _parser; } +}; class FunctionParsersManager final { @@ -147,16 +160,16 @@ public: bool init(const generic_string& xmlPath, ScintillaEditView ** ppEditView); bool parse(std::vector & foundInfos, const AssociationInfo & assoInfo); - void writeFunctionListXml(const TCHAR *destFoder) const; private: ScintillaEditView **_ppEditView = nullptr; - std::vector _parsers; - std::vector _associationMap; - TiXmlDocument *_pXmlFuncListDoc = nullptr; + generic_string _xmlDirPath; + ParserInfo* _parsers[L_EXTERNAL + nbMaxUserDefined] = {nullptr}; + int _currentUDIndex = L_EXTERNAL; - bool getFuncListFromXmlTree(); + bool getOverrideMapFromXmlTree(); + bool loadFuncListFromXmlTree(LangType lType, const generic_string& overrideId, int udlIndex = -1); bool getZonePaserParameters(TiXmlNode *classRangeParser, generic_string &mainExprStr, generic_string &openSymboleStr, generic_string &closeSymboleStr, std::vector &classNameExprArray, generic_string &functionExprStr, std::vector &functionNameExprArray); bool getUnitPaserParameters(TiXmlNode *functionParser, generic_string &mainExprStr, std::vector &functionNameExprArray, std::vector &classNameExprArray); FunctionParser * getParser(const AssociationInfo & assoInfo); diff --git a/PowerEditor/src/functionList.xml b/PowerEditor/src/functionList.xml deleted file mode 100644 index 08d6fd95..00000000 --- a/PowerEditor/src/functionList.xml +++ /dev/null @@ -1,1738 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/PowerEditor/visual.net/notepadPlus.vcxproj b/PowerEditor/visual.net/notepadPlus.vcxproj index f784003b..b2cb466a 100755 --- a/PowerEditor/visual.net/notepadPlus.vcxproj +++ b/PowerEditor/visual.net/notepadPlus.vcxproj @@ -217,7 +217,6 @@ copy ..\src\langs.model.xml ..\bin\langs.model.xml copy ..\src\stylers.model.xml ..\bin\stylers.model.xml copy ..\src\shortcuts.xml ..\bin\shortcuts.xml -copy ..\src\functionList.xml ..\bin\functionList.xml copy ..\src\contextMenu.xml ..\bin\contextMenu.xml @@ -270,7 +269,6 @@ copy ..\src\contextMenu.xml ..\bin\contextMenu.xml copy ..\src\langs.model.xml ..\bin64\langs.model.xml copy ..\src\stylers.model.xml ..\bin64\stylers.model.xml copy ..\src\shortcuts.xml ..\bin64\shortcuts.xml -copy ..\src\functionList.xml ..\bin64\functionList.xml copy ..\src\contextMenu.xml ..\bin64\contextMenu.xml @@ -679,7 +677,6 @@ copy ..\src\contextMenu.xml ..\bin64\contextMenu.xml - diff --git a/appveyor.yml b/appveyor.yml index d72f7ddf..b988aa43 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 7.8.{build} +version: 7.9.{build} image: Visual Studio 2017 @@ -62,8 +62,8 @@ after_build: if ($env:PLATFORM_INPUT -eq "Win32" -and $env:CONFIGURATION -eq "Unicode Debug") { Push-AppveyorArtifact "PowerEditor\visual.net\Unicode Debug\Notepad++.exe" -FileName "$nppFileName" - Start-FileDownload 'https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v7.8.9/npp.7.8.9.bin.minimalist.7z' - 7z x -y npp.7.8.9.bin.minimalist.7z | Out-Null + Start-FileDownload 'https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v7.9/npp.7.9.portable.minimalist.7z' + 7z x -y npp.7.9.portable.minimalist.7z | Out-Null #take SciLexer.dll from downloaded version due to dependency of the functionlist tests on a version build with boost regex #what is not the case for the dll build on appveyor CI (would either need a very time consuming boost build or usage of nuget packages) Copy-Item "$env:APPVEYOR_BUILD_FOLDER\SciLexer.dll" -Destination "$env:APPVEYOR_BUILD_FOLDER\PowerEditor\bin" @@ -71,8 +71,8 @@ after_build: Copy-Item "$env:APPVEYOR_BUILD_FOLDER\PowerEditor\src\langs.model.xml" -Destination "$env:APPVEYOR_BUILD_FOLDER\PowerEditor\bin" Copy-Item "$env:APPVEYOR_BUILD_FOLDER\PowerEditor\src\stylers.model.xml" -Destination "$env:APPVEYOR_BUILD_FOLDER\PowerEditor\bin" Copy-Item "$env:APPVEYOR_BUILD_FOLDER\PowerEditor\src\shortcuts.xml" -Destination "$env:APPVEYOR_BUILD_FOLDER\PowerEditor\bin" - Copy-Item "$env:APPVEYOR_BUILD_FOLDER\PowerEditor\src\functionList.xml" -Destination "$env:APPVEYOR_BUILD_FOLDER\PowerEditor\bin" Copy-Item "$env:APPVEYOR_BUILD_FOLDER\PowerEditor\src\contextMenu.xml" -Destination "$env:APPVEYOR_BUILD_FOLDER\PowerEditor\bin" + Copy-Item "$env:APPVEYOR_BUILD_FOLDER\PowerEditor\installer\functionList" -Destination "$env:APPVEYOR_BUILD_FOLDER\PowerEditor\bin" -Recurse cd .\PowerEditor\Test\FunctionList\ .\unitTestLauncher.ps1 .\unitTestLauncher.ps1