Merge pull request #3453 from RaiKoHoff/Dev_RC1

Update Lexilla Lib (bug fixes for Lexer:  Markdown, Cmd/Batch)
This commit is contained in:
Rainer Kottenhoff 2021-05-25 14:18:46 +02:00 committed by GitHub
commit ac1c7940d4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
31 changed files with 1995 additions and 121 deletions

View File

@ -146,7 +146,7 @@
<LanguageStandard_C>stdc17</LanguageStandard_C>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<GenerateDebugInformation>DebugFull</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<TargetMachine>MachineX86</TargetMachine>
<AdditionalDependencies>shlwapi.lib;Urlmon.lib;UxTheme.lib;%(AdditionalDependencies)</AdditionalDependencies>
@ -174,7 +174,7 @@
<LanguageStandard_C>stdc17</LanguageStandard_C>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<GenerateDebugInformation>DebugFull</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<AdditionalDependencies>shlwapi.lib;Urlmon.lib;UxTheme.lib;%(AdditionalDependencies)</AdditionalDependencies>
<CETCompat>true</CETCompat>

View File

@ -950,6 +950,7 @@
#define IDS_LEX_PRISM_CSV 63050
#define IDS_LEX_DART_SRC 63051
#define IDS_LEX_KOTLIN_SRC 63052
#define IDS_LEX_JULIA_SCR 63053
#define IDS_LEX_STD_STYLE 63100
#define IDS_LEX_STD_MARGIN 63101

View File

@ -127,6 +127,7 @@ BEGIN
IDS_LEX_TOML_CFG "TOML"
IDS_LEX_DART_SRC "Dart Source Code"
IDS_LEX_KOTLIN_SRC "Kotlin Source Code"
IDS_LEX_JULIA_SCR "Julia Script"
END
STRINGTABLE

View File

@ -127,6 +127,7 @@ BEGIN
IDS_LEX_TOML_CFG "TOML"
IDS_LEX_DART_SRC "Dart Source Code"
IDS_LEX_KOTLIN_SRC "Kotlin Source Code"
IDS_LEX_JULIA_SCR "Julia Script"
END
STRINGTABLE

View File

@ -66,6 +66,7 @@
<ClCompile Include="lexers\LexDiff.cxx" />
<ClCompile Include="lexers\LexHTML.cxx" />
<ClCompile Include="lexers\LexInno.cxx" />
<ClCompile Include="lexers\LexJulia.cxx" />
<ClCompile Include="lexers\LexLaTeX.cxx" />
<ClCompile Include="lexers\LexLua.cxx" />
<ClCompile Include="lexers\LexMake.cxx" />
@ -231,13 +232,14 @@
<StringPooling>true</StringPooling>
<FloatingPointModel>Precise</FloatingPointModel>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<FunctionLevelLinking>false</FunctionLevelLinking>
<EnableEnhancedInstructionSet />
<OmitFramePointers />
<MinimalRebuild>false</MinimalRebuild>
<SmallerTypeCheck>false</SmallerTypeCheck>
<TreatWarningAsError>true</TreatWarningAsError>
<LanguageStandard_C>stdc17</LanguageStandard_C>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
@ -338,12 +340,13 @@
<StringPooling>true</StringPooling>
<FloatingPointModel>Precise</FloatingPointModel>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<FunctionLevelLinking>false</FunctionLevelLinking>
<EnableEnhancedInstructionSet />
<MinimalRebuild>false</MinimalRebuild>
<SmallerTypeCheck>false</SmallerTypeCheck>
<TreatWarningAsError>true</TreatWarningAsError>
<LanguageStandard_C>stdc17</LanguageStandard_C>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>

View File

@ -263,6 +263,9 @@
<ClCompile Include="lexers_x\LexerUtils.cxx">
<Filter>lexers_x</Filter>
</ClCompile>
<ClCompile Include="lexers\LexJulia.cxx">
<Filter>lexers</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="src\LexillaVersion.rc">

View File

@ -32,7 +32,9 @@ constParameter:lexilla/lexers/LexBash.cxx
uninitMemberVar:lexilla/lexers/LexBash.cxx
variableScope:lexilla/lexers/LexBash.cxx
variableScope:lexilla/lexers/LexBatch.cxx
knownConditionTrueFalse:lexilla/lexers/LexBatch.cxx
knownConditionTrueFalse:lexilla/lexers/LexBibTeX.cxx
constStatement:lexilla/lexers/LexCaml.cxx
variableScope:lexilla/lexers/LexCmake.cxx
knownConditionTrueFalse:lexilla/lexers/LexCmake.cxx
constParameter:lexilla/lexers/LexCLW.cxx
@ -52,6 +54,9 @@ constParameter:lexilla/lexers/LexHaskell.cxx
constParameter:lexilla/lexers/LexHex.cxx
constParameter:lexilla/lexers/LexHTML.cxx
variableScope:lexilla/lexers/LexInno.cxx
variableScope:lexilla/lexers/LexJulia.cxx
constParameter:lexilla/lexers/LexJulia.cxx
unreadVariable:lexilla/lexers/LexJulia.cxx
variableScope:lexilla/lexers/LexLaTeX.cxx
constParameter:lexilla/lexers/LexLaTeX.cxx
constParameter:lexilla/lexers/LexLisp.cxx

View File

@ -562,6 +562,9 @@
<td>Derek Brown</td>
</tr><tr>
<td>Robert Di Pardo</td>
<td>riQQ</td>
<td>YX Hao</td>
<td>Bertrand Lacoste</td>
</tr>
</table>
<h2>Releases</h2>
@ -576,16 +579,37 @@
Add namespace feature with GetNameSpace function.
</li>
<li>
Add Julia lexer.
<a href="https://sourceforge.net/p/scintilla/feature-requests/1380/">Feature #1380</a>.
</li>
<li>
Fix transition to comment for --> inside JavaScript string.
<a href="https://sourceforge.net/p/scintilla/bugs/2207/">Bug #2207</a>.
</li>
<li>
Fix variable expansion in Batch.
<a href="https://github.com/ScintillaOrg/lexilla/issues/4">Issue #4</a>.
</li>
<li>
Fix empty link titles in Markdown.
<a href="https://sourceforge.net/p/scintilla/bugs/2235/">Bug #2235</a>.
Also fix detection of whether the previous line had content which treated '\n' and '\r\n' line endings differently.
</li>
<li>
Remove nested comment and long string support as these were removed from Lua.
<a href="https://sourceforge.net/p/scintilla/bugs/2205/">Bug #2205</a>.
</li>
<li>
Update to Unicode 13.
<a href="https://sourceforge.net/p/scintilla/feature-requests/1379/">Feature #1379</a>.
</li>
<li>
AddStaticLexerModule function adds a static lexer to Lexilla's list.
</li>
<li>
On Win32 enable hardware-enforced stack protection.
<a href="https://sourceforge.net/p/scintilla/feature-requests/1405/">Feature #1405</a>.
</li>
</ul>
<h3>
<a href="https://www.scintilla.org/lexilla502.zip">Release 5.0.2</a>

View File

@ -141,6 +141,7 @@ val SCLEX_DATAFLEX=129
val SCLEX_HOLLYWOOD=130
val SCLEX_RAKU=131
val SCLEX_FSHARP=132
val SCLEX_JULIA=133
# When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
# value assigned in sequence from SCLEX_AUTOMATIC+1.
@ -1047,6 +1048,28 @@ val SCE_ERLANG_MODULES_ATT=24
val SCE_ERLANG_UNKNOWN=31
# Lexical states for SCLEX_OCTAVE are identical to MatLab
lex Octave=SCLEX_OCTAVE SCE_MATLAB_
# Lexical states for SCLEX_JULIA
lex Julia=SCLEX_JULIA SCE_JULIA_
val SCE_JULIA_DEFAULT=0
val SCE_JULIA_COMMENT=1
val SCE_JULIA_NUMBER=2
val SCE_JULIA_KEYWORD1=3
val SCE_JULIA_KEYWORD2=4
val SCE_JULIA_KEYWORD3=5
val SCE_JULIA_CHAR=6
val SCE_JULIA_OPERATOR=7
val SCE_JULIA_BRACKET=8
val SCE_JULIA_IDENTIFIER=9
val SCE_JULIA_STRING=10
val SCE_JULIA_SYMBOL=11
val SCE_JULIA_MACRO=12
val SCE_JULIA_STRINGINTERP=13
val SCE_JULIA_DOCSTRING=14
val SCE_JULIA_STRINGLITERAL=15
val SCE_JULIA_COMMAND=16
val SCE_JULIA_COMMANDLITERAL=17
val SCE_JULIA_TYPEANNOT=18
val SCE_JULIA_LEXERROR=19
# Lexical states for SCLEX_MSSQL
lex MSSQL=SCLEX_MSSQL SCE_MSSQL_
val SCE_MSSQL_DEFAULT=0

View File

@ -145,6 +145,7 @@
#define SCLEX_HOLLYWOOD 130
#define SCLEX_RAKU 131
#define SCLEX_FSHARP 132
#define SCLEX_JULIA 133
#define SCLEX_AUTOMATIC 1000
#define SCE_P_DEFAULT 0
#define SCE_P_COMMENTLINE 1
@ -932,6 +933,26 @@
#define SCE_ERLANG_MODULES 23
#define SCE_ERLANG_MODULES_ATT 24
#define SCE_ERLANG_UNKNOWN 31
#define SCE_JULIA_DEFAULT 0
#define SCE_JULIA_COMMENT 1
#define SCE_JULIA_NUMBER 2
#define SCE_JULIA_KEYWORD1 3
#define SCE_JULIA_KEYWORD2 4
#define SCE_JULIA_KEYWORD3 5
#define SCE_JULIA_CHAR 6
#define SCE_JULIA_OPERATOR 7
#define SCE_JULIA_BRACKET 8
#define SCE_JULIA_IDENTIFIER 9
#define SCE_JULIA_STRING 10
#define SCE_JULIA_SYMBOL 11
#define SCE_JULIA_MACRO 12
#define SCE_JULIA_STRINGINTERP 13
#define SCE_JULIA_DOCSTRING 14
#define SCE_JULIA_STRINGLITERAL 15
#define SCE_JULIA_COMMAND 16
#define SCE_JULIA_COMMANDLITERAL 17
#define SCE_JULIA_TYPEANNOT 18
#define SCE_JULIA_LEXERROR 19
#define SCE_MSSQL_DEFAULT 0
#define SCE_MSSQL_COMMENT 1
#define SCE_MSSQL_LINE_COMMENT 2

View File

@ -423,14 +423,54 @@ static void ColouriseBatchDoc(
// Reset Offset to re-process remainder of word
offset -= (wbl - 2);
// Check for Expanded Argument (%~...) / Variable (%%~...)
// Expanded Argument: %~[<path-operators>]<single digit>
// Expanded Variable: %%~[<path-operators>]<single identifier character>
// Path operators are exclusively alphabetic.
// Expanded arguments have a single digit at the end.
// Expanded variables have a single identifier character as variable name.
} else if (((wbl > 1) && (wordBuffer[1] == '~')) ||
((wbl > 2) && (wordBuffer[1] == '%') && (wordBuffer[2] == '~'))) {
// Check for External Command / Program
if (cmdLoc == offset - wbl) {
cmdLoc = offset - (wbl - wbo);
}
// Colorize Expanded Argument / Variable
styler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_IDENTIFIER);
bool isArgument = (wordBuffer[1] == '~');
if (isArgument) {
Sci_PositionU expansionStopOffset = 2;
bool isValid = false;
for (; expansionStopOffset < wbl; expansionStopOffset++) {
if (isArgument && Is0To9(wordBuffer[expansionStopOffset])) {
expansionStopOffset++;
isValid = true;
wbo = expansionStopOffset;
// Colorize Expanded Argument
styler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_IDENTIFIER);
break;
}
}
if (!isValid) {
// not a valid expanded argument or variable
styler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_DEFAULT);
}
// Expanded Variable
} else {
// start after ~
wbo = 3;
// Search to end of word for another % (can be a long path)
while ((wbo < wbl) &&
(wordBuffer[wbo] != '%') &&
(!IsBOperator(wordBuffer[wbo])) &&
(!IsBSeparator(wordBuffer[wbo]))) {
wbo++;
}
if (wbo > 3) {
// Colorize Expanded Variable
styler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_IDENTIFIER);
} else {
// not a valid expanded argument or variable
styler.ColourTo(startLine + offset - 1 - (wbl - wbo), SCE_BAT_DEFAULT);
}
}
// Reset Offset to re-process remainder of word
offset -= (wbl - wbo);
// Check for Environment Variable (%x...%)

1220
lexilla/lexers/LexJulia.cxx Normal file

File diff suppressed because it is too large Load Diff

View File

@ -69,17 +69,15 @@ static void ColouriseLuaDoc(
CharacterSet setEscapeSkip(CharacterSet::setNone, "\"'\\");
Sci_Position currentLine = styler.GetLine(startPos);
// Initialize long string [[ ... ]] or block comment --[[ ... ]] nesting level,
// Initialize long string [[ ... ]] or block comment --[[ ... ]],
// if we are inside such a string. Block comment was introduced in Lua 5.0,
// blocks with separators [=[ ... ]=] in Lua 5.1.
// Continuation of a string (\z whitespace escaping) is controlled by stringWs.
int nestLevel = 0;
int sepCount = 0;
int stringWs = 0;
if (initStyle == SCE_LUA_LITERALSTRING || initStyle == SCE_LUA_COMMENT ||
initStyle == SCE_LUA_STRING || initStyle == SCE_LUA_CHARACTER) {
const int lineState = styler.GetLineState(currentLine - 1);
nestLevel = lineState >> 9;
sepCount = lineState & 0xFF;
stringWs = lineState & 0x100;
}
@ -110,7 +108,7 @@ static void ColouriseLuaDoc(
case SCE_LUA_STRING:
case SCE_LUA_CHARACTER:
// Inside a literal string, block comment or string, we set the line state
styler.SetLineState(currentLine, (nestLevel << 9) | stringWs | sepCount);
styler.SetLineState(currentLine, stringWs | sepCount);
break;
default:
// Reset the line state
@ -254,25 +252,11 @@ static void ColouriseLuaDoc(
sc.ChangeState(SCE_LUA_STRINGEOL);
sc.ForwardSetState(SCE_LUA_DEFAULT);
}
} else if (sc.state == SCE_LUA_LITERALSTRING || sc.state == SCE_LUA_COMMENT) {
if (sc.ch == '[') {
const int sep = LongDelimCheck(sc);
if (sep == 1 && sepCount == 1) { // [[-only allowed to nest
nestLevel++;
sc.Forward();
}
} else if (sc.ch == ']') {
int sep = LongDelimCheck(sc);
if (sep == 1 && sepCount == 1) { // un-nest with ]]-only
nestLevel--;
sc.Forward();
if (nestLevel == 0) {
sc.ForwardSetState(SCE_LUA_DEFAULT);
}
} else if (sep > 1 && sep == sepCount) { // ]=]-style delim
sc.Forward(sep);
sc.ForwardSetState(SCE_LUA_DEFAULT);
}
} else if (sc.ch == ']' && (sc.state == SCE_LUA_LITERALSTRING || sc.state == SCE_LUA_COMMENT)) {
const int sep = LongDelimCheck(sc);
if (sep == sepCount) { // ]=]-style delim
sc.Forward(sep);
sc.ForwardSetState(SCE_LUA_DEFAULT);
}
}
@ -356,7 +340,6 @@ static void ColouriseLuaDoc(
if (sepCount == 0) {
sc.SetState(SCE_LUA_OPERATOR);
} else {
nestLevel = 1;
sc.SetState(SCE_LUA_LITERALSTRING);
sc.Forward(sepCount);
}
@ -366,7 +349,6 @@ static void ColouriseLuaDoc(
sc.Forward(2);
sepCount = LongDelimCheck(sc);
if (sepCount > 0) {
nestLevel = 1;
sc.ChangeState(SCE_LUA_COMMENT);
sc.Forward(sepCount);
}
@ -384,7 +366,7 @@ static void ColouriseLuaDoc(
sc.Complete();
}
static void FoldLuaDoc(Sci_PositionU startPos, Sci_Position length, int /* initStyle */, WordList *[],
static void FoldLuaDoc(Sci_PositionU startPos, Sci_Position length, int initStyle, WordList *[],
Accessor &styler) {
const Sci_PositionU lengthDoc = startPos + length;
int visibleChars = 0;
@ -393,12 +375,14 @@ static void FoldLuaDoc(Sci_PositionU startPos, Sci_Position length, int /* initS
int levelCurrent = levelPrev;
char chNext = styler[startPos];
const bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
int style = initStyle;
int styleNext = styler.StyleAt(startPos);
for (Sci_PositionU i = startPos; i < lengthDoc; i++) {
const char ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
const int style = styleNext;
const int stylePrev = style;
style = styleNext;
styleNext = styler.StyleAt(i + 1);
const bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
if (style == SCE_LUA_WORD) {
@ -426,9 +410,9 @@ static void FoldLuaDoc(Sci_PositionU startPos, Sci_Position length, int /* initS
levelCurrent--;
}
} else if (style == SCE_LUA_LITERALSTRING || style == SCE_LUA_COMMENT) {
if (ch == '[') {
if (stylePrev != style) {
levelCurrent++;
} else if (ch == ']') {
} else if (styleNext != style) {
levelCurrent--;
}
}

View File

@ -76,38 +76,25 @@ static bool FollowToLineEnd(const int ch, const int state, const Sci_PositionU e
// Set the state on text section from current to length characters,
// then set the rest until the newline to default, except for any characters matching token
#if 0
constexpr bool IsHdrToken(const int ch, const int tok) noexcept {
return ((ch == tok) || (ch == ' ') || (ch == '\n') || (ch == '\r'));
}
static void SetStateAndZoom(const int state, const Sci_Position length, const int token, StyleContext &sc) {
sc.SetState(state);
sc.Forward(length);
bool tokenState = true;
while (sc.More() && !sc.atLineStart) {
if (IsHdrToken(sc.ch, token) && !tokenState) {
sc.SetState(SCE_MARKDOWN_DEFAULT);
sc.Forward();
bool started = false;
while (sc.More() && !IsNewline(sc.ch)) {
if (sc.ch == token && !started) {
sc.SetState(state);
tokenState = true;
started = true;
}
else if (!IsHdrToken(sc.ch, token) && tokenState) {
sc.SetState(SCE_MARKDOWN_HDRTEXT);
tokenState = false;
else if (sc.ch != token) {
sc.SetState(SCE_MARKDOWN_DEFAULT);
started = false;
}
sc.Forward();
}
sc.SetState(SCE_MARKDOWN_LINE_BEGIN);
}
#endif
static void SetStateAndZoom(const int state, const Sci_Position length, const int token, StyleContext &sc) {
(void)(token);
sc.SetState(state);
sc.Forward(length);
while (sc.More() && !sc.atLineStart) { sc.Forward(); }
sc.SetState(SCE_MARKDOWN_LINE_BEGIN);
}
// Does the previous line have more than spaces and tabs?
static bool HasPrevLineContent(StyleContext &sc) {
@ -116,9 +103,10 @@ static bool HasPrevLineContent(StyleContext &sc) {
while ((--i + (Sci_Position)sc.currentPos) >= 0 && !IsNewline(sc.GetRelative(i)))
;
while ((--i + (Sci_Position)sc.currentPos) >= 0) {
if (IsNewline(sc.GetRelative(i)))
const int ch = sc.GetRelative(i);
if (ch == '\n')
break;
if (!IsASpaceOrTab(sc.GetRelative(i)))
if (!((ch == '\r' || IsASpaceOrTab(ch))))
return true;
}
return false;
@ -252,36 +240,24 @@ static void ColorizeMarkdownDoc(Sci_PositionU startPos, Sci_Position length, int
}
else if (sc.state == SCE_MARKDOWN_LINE_BEGIN) {
// Header
if (sc.Match("######")) {
SetStateAndZoom(SCE_MARKDOWN_HEADER6, 6, '#', sc);
freezeCursor = true;
}
else if (sc.Match("#####")) {
SetStateAndZoom(SCE_MARKDOWN_HEADER5, 5, '#', sc);
freezeCursor = true;
}
else if (sc.Match("####")) {
SetStateAndZoom(SCE_MARKDOWN_HEADER4, 4, '#', sc);
freezeCursor = true;
}
else if (sc.Match("###")) {
SetStateAndZoom(SCE_MARKDOWN_HEADER3, 3, '#', sc);
freezeCursor = true;
}
else if (sc.Match("##")) {
SetStateAndZoom(SCE_MARKDOWN_HEADER2, 2, '#', sc);
freezeCursor = true;
}
if (sc.Match("######"))
SetStateAndZoom(SCE_MARKDOWN_HEADER6, 6, '#', sc);
else if (sc.Match("#####"))
SetStateAndZoom(SCE_MARKDOWN_HEADER5, 5, '#', sc);
else if (sc.Match("####"))
SetStateAndZoom(SCE_MARKDOWN_HEADER4, 4, '#', sc);
else if (sc.Match("###"))
SetStateAndZoom(SCE_MARKDOWN_HEADER3, 3, '#', sc);
else if (sc.Match("##"))
SetStateAndZoom(SCE_MARKDOWN_HEADER2, 2, '#', sc);
else if (sc.Match("#")) {
// Catch the special case of an unordered list
if (sc.chNext == '.' && IsASpaceOrTab(sc.GetRelative(2))) {
precharCount = 0;
sc.SetState(SCE_MARKDOWN_PRECHAR);
}
else {
SetStateAndZoom(SCE_MARKDOWN_HEADER1, 1, '#', sc);
freezeCursor = true;
}
else
SetStateAndZoom(SCE_MARKDOWN_HEADER1, 1, '#', sc);
}
// Code block
else if (sc.Match("~~~")) {
@ -313,12 +289,12 @@ static void ColorizeMarkdownDoc(Sci_PositionU startPos, Sci_Position length, int
}
// The header lasts until the newline
else if (sc.state == SCE_MARKDOWN_HEADER1 || sc.state == SCE_MARKDOWN_HEADER2 ||
sc.state == SCE_MARKDOWN_HEADER3 || sc.state == SCE_MARKDOWN_HEADER4 ||
sc.state == SCE_MARKDOWN_HEADER5 || sc.state == SCE_MARKDOWN_HEADER6) {
if (IsNewline(sc.ch))
sc.SetState(SCE_MARKDOWN_LINE_BEGIN);
}
else if (sc.state == SCE_MARKDOWN_HEADER1 || sc.state == SCE_MARKDOWN_HEADER2 ||
sc.state == SCE_MARKDOWN_HEADER3 || sc.state == SCE_MARKDOWN_HEADER4 ||
sc.state == SCE_MARKDOWN_HEADER5 || sc.state == SCE_MARKDOWN_HEADER6) {
if (IsNewline(sc.ch))
sc.SetState(SCE_MARKDOWN_LINE_BEGIN);
}
// New state only within the initial whitespace
if (sc.state == SCE_MARKDOWN_PRECHAR) {
@ -366,21 +342,22 @@ static void ColorizeMarkdownDoc(Sci_PositionU startPos, Sci_Position length, int
// Any link
if (sc.state == SCE_MARKDOWN_LINK) {
if (sc.Match("](") && sc.GetRelative(-1) != '\\') {
sc.Forward();
sc.Forward(2);
isLinkNameDetecting = true;
}
else if (sc.Match("]:") && sc.GetRelative(-1) != '\\') {
sc.ForwardSetState(SCE_MARKDOWN_DEFAULT);
sc.Forward(2);
sc.SetState(SCE_MARKDOWN_DEFAULT);
}
else if (!isLinkNameDetecting && sc.ch == ']' && sc.GetRelative(-1) != '\\') {
sc.ForwardSetState(SCE_MARKDOWN_DEFAULT);
freezeCursor = true;
sc.Forward();
sc.SetState(SCE_MARKDOWN_DEFAULT);
}
else if (isLinkNameDetecting && sc.ch == ')' && sc.GetRelative(-1) != '\\') {
sc.ForwardSetState(SCE_MARKDOWN_DEFAULT);
freezeCursor = true;
isLinkNameDetecting = false;
}
sc.Forward();
sc.SetState(SCE_MARKDOWN_DEFAULT);
isLinkNameDetecting = false;
}
}
// New state anywhere in doc
@ -392,7 +369,7 @@ static void ColorizeMarkdownDoc(Sci_PositionU startPos, Sci_Position length, int
// Links and Images
if (sc.Match("![")) {
sc.SetState(SCE_MARKDOWN_LINK);
sc.Forward();
sc.Forward(1);
}
else if (sc.ch == '[' && sc.GetRelative(-1) != '\\') {
sc.SetState(SCE_MARKDOWN_LINK);
@ -409,7 +386,7 @@ static void ColorizeMarkdownDoc(Sci_PositionU startPos, Sci_Position length, int
else if (sc.Match("**") && sc.GetRelative(2) != ' ' && AtTermStart(sc)) {
sc.SetState(SCE_MARKDOWN_STRONG1);
sc.Forward();
}
}
else if (sc.Match("__") && sc.GetRelative(2) != ' ' && AtTermStart(sc)) {
sc.SetState(SCE_MARKDOWN_STRONG2);
sc.Forward();
@ -431,12 +408,10 @@ static void ColorizeMarkdownDoc(Sci_PositionU startPos, Sci_Position length, int
sc.SetState(SCE_MARKDOWN_LINE_BEGIN);
}
}
// Advance if not holding back the cursor for this iteration.
if (!freezeCursor)
sc.Forward();
else
freezeCursor = false;
freezeCursor = false;
}
sc.Complete();
}

View File

@ -9,8 +9,7 @@ import os, pathlib, sys
sys.path.append(os.path.join("..", "..", "scintilla", "scripts"))
import Face
from FileGenerator import UpdateFile, Generate, Regenerate, UpdateLineInFile, lineEnd
import FileGenerator
def printLexHFile(f):
out = []
@ -21,10 +20,10 @@ def printLexHFile(f):
out.append("#define " + name + " " + v["Value"])
return out
def RegenerateAll(root, showMaxID):
def RegenerateAll(root, _showMaxID):
f = Face.Face()
f.ReadFromFile(root / "include/LexicalStyles.iface")
Regenerate(root / "include/SciLexer.h", "/* ", printLexHFile(f))
FileGenerator.Regenerate(root / "include/SciLexer.h", "/* ", printLexHFile(f))
if __name__ == "__main__":
RegenerateAll(pathlib.Path(__file__).resolve().parent.parent, True)

View File

@ -173,7 +173,7 @@ def FindCredits(historyFile):
credit = l[4:-5]
if "<a" in l:
title, a, rest = credit.partition("<a href=")
urlplus, bracket, end = rest.partition(">")
urlplus, _bracket, end = rest.partition(">")
name = end.split("<")[0]
url = urlplus[1:-1]
credit = title.strip()

View File

@ -48,6 +48,7 @@ extern LexerModule lmDiff;
extern LexerModule lmHTML;
extern LexerModule lmInno;
extern LexerModule lmJSON;
extern LexerModule lmJulia;
extern LexerModule lmKotlin;
extern LexerModule lmLatex;
extern LexerModule lmLua;
@ -112,6 +113,7 @@ void AddEachLexer() {
&lmHTML,
&lmInno,
&lmJSON,
&lmJulia,
&lmKotlin,
&lmLatex,
&lmLua,

View File

@ -158,6 +158,7 @@
F6224FEE88B39060046EEBB0 /* LexerUtils.cxx in Sources */ = {isa = PBXBuildFile; fileRef = B70142AEAD02FCCC38C95437 /* LexerUtils.cxx */; };
20734B2BAC0066B302C5F572 /* LexKotlin.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4B244DD685C45BD626DFCBFA /* LexKotlin.cxx */; };
173A4B628003CD6778153F13 /* LexTOML.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 8FE446A1AD4BC789488C9865 /* LexTOML.cxx */; };
98684028BA6245805B2034D1 /* LexJulia.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9AA44B1D90573293F9570B5E /* LexJulia.cxx */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@ -314,6 +315,7 @@
B70142AEAD02FCCC38C95437 /* LexerUtils.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LexerUtils.cxx; path = ../../lexers/LexerUtils.cxx; sourceTree = SOURCE_ROOT; };
4B244DD685C45BD626DFCBFA /* LexKotlin.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LexKotlin.cxx; path = ../../lexers/LexKotlin.cxx; sourceTree = SOURCE_ROOT; };
8FE446A1AD4BC789488C9865 /* LexTOML.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LexTOML.cxx; path = ../../lexers/LexTOML.cxx; sourceTree = SOURCE_ROOT; };
9AA44B1D90573293F9570B5E /* LexJulia.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LexJulia.cxx; path = ../../lexers/LexJulia.cxx; sourceTree = SOURCE_ROOT; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -413,6 +415,7 @@
28BA72EA24E34D9300272C2D /* LexIndent.cxx */,
28BA730524E34D9400272C2D /* LexInno.cxx */,
28BA733024E34D9600272C2D /* LexJSON.cxx */,
9AA44B1D90573293F9570B5E /* LexJulia.cxx */,
28BA731124E34D9500272C2D /* LexKix.cxx */,
4B244DD685C45BD626DFCBFA /* LexKotlin.cxx */,
28BA72F824E34D9300272C2D /* LexKVIrc.cxx */,
@ -736,6 +739,7 @@
F6224FEE88B39060046EEBB0 /* LexerUtils.cxx in Sources */,
20734B2BAC0066B302C5F572 /* LexKotlin.cxx in Sources */,
173A4B628003CD6778153F13 /* LexTOML.cxx in Sources */,
98684028BA6245805B2034D1 /* LexJulia.cxx in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View File

@ -277,6 +277,22 @@ LexInno.o: \
../lexlib/StyleContext.h \
../lexlib/CharacterSet.h \
../lexlib/LexerModule.h
LexJulia.o: \
../lexers/LexJulia.cxx \
../../scintilla/include/ILexer.h \
../../scintilla/include/Sci_Position.h \
../../scintilla/include/Scintilla.h \
../include/SciLexer.h \
../lexlib/PropSetSimple.h \
../lexlib/WordList.h \
../lexlib/LexAccessor.h \
../lexlib/Accessor.h \
../lexlib/StyleContext.h \
../lexlib/CharacterSet.h \
../lexlib/CharacterCategory.h \
../lexlib/LexerModule.h \
../lexlib/OptionSet.h \
../lexlib/DefaultLexer.h
LexLaTeX.o: \
../lexers/LexLaTeX.cxx \
../../scintilla/include/ILexer.h \

View File

@ -27,17 +27,20 @@ SUBSYSTEM=-SUBSYSTEM:WINDOWS,5.02
!ELSE
SUBSYSTEM=-SUBSYSTEM:WINDOWS,5.01
!ENDIF
!ELSEIFDEF ARM64
!ELSE
CETCOMPAT=-CETCOMPAT
!IFDEF ARM64
ADD_DEFINE=-D_ARM64_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1
SUBSYSTEM=-SUBSYSTEM:WINDOWS,10.00
!ENDIF
!ENDIF
CRTFLAGS=-D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1 -D_CRT_SECURE_NO_DEPRECATE=1 -D_SCL_SECURE_NO_WARNINGS=1 $(ADD_DEFINE)
CXXFLAGS=-Zi -TP -MP -W4 -EHsc -std:c++17 $(CRTFLAGS)
CXXDEBUG=-Od -MTd -DDEBUG
CXXNDEBUG=-O1 -MT -DNDEBUG -GL
NAME=-Fo
LDFLAGS=-OPT:REF -LTCG -IGNORE:4197 -DEBUG $(SUBSYSTEM)
LDFLAGS=-OPT:REF -LTCG -IGNORE:4197 -DEBUG $(SUBSYSTEM) $(CETCOMPAT)
LDDEBUG=
LIBS=
NOLOGO=-nologo
@ -85,6 +88,7 @@ LEX_OBJS=\
$(DIR_O)\LexDiff.obj \
$(DIR_O)\LexHTML.obj \
$(DIR_O)\LexInno.obj \
$(DIR_O)\LexJulia.obj \
$(DIR_O)\LexLaTeX.obj \
$(DIR_O)\LexLua.obj \
$(DIR_O)\LexMake.obj \

View File

@ -277,6 +277,22 @@ $(DIR_O)/LexInno.obj: \
../lexlib/StyleContext.h \
../lexlib/CharacterSet.h \
../lexlib/LexerModule.h
$(DIR_O)/LexJulia.obj: \
../lexers/LexJulia.cxx \
../../scintilla/include/ILexer.h \
../../scintilla/include/Sci_Position.h \
../../scintilla/include/Scintilla.h \
../include/SciLexer.h \
../lexlib/PropSetSimple.h \
../lexlib/WordList.h \
../lexlib/LexAccessor.h \
../lexlib/Accessor.h \
../lexlib/StyleContext.h \
../lexlib/CharacterSet.h \
../lexlib/CharacterCategory.h \
../lexlib/LexerModule.h \
../lexlib/OptionSet.h \
../lexlib/DefaultLexer.h
$(DIR_O)/LexLaTeX.obj: \
../lexers/LexLaTeX.cxx \
../../scintilla/include/ILexer.h \

View File

@ -143,7 +143,7 @@
<AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
<AdditionalDependencies>shlwapi.lib;muiload.lib;psapi.lib;legacy_stdio_definitions.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<GenerateDebugInformation>DebugFull</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<LinkTimeCodeGeneration>Default</LinkTimeCodeGeneration>
<ManifestFile />

View File

@ -169,7 +169,7 @@
<ClCompile>
<AdditionalIncludeDirectories>include;src;../lexilla/inclide;../oniguruma/src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<Optimization>Disabled</Optimization>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
@ -183,7 +183,7 @@
</EnableEnhancedInstructionSet>
<FloatingPointModel>Precise</FloatingPointModel>
<LanguageStandard>stdcpp17</LanguageStandard>
<FunctionLevelLinking>true</FunctionLevelLinking>
<FunctionLevelLinking>false</FunctionLevelLinking>
<MinimalRebuild>false</MinimalRebuild>
<TreatWarningAsError>true</TreatWarningAsError>
<LanguageStandard_C>stdc17</LanguageStandard_C>
@ -210,7 +210,7 @@
<StringPooling>true</StringPooling>
<FloatingPointModel>Precise</FloatingPointModel>
<LanguageStandard>stdcpp17</LanguageStandard>
<FunctionLevelLinking>true</FunctionLevelLinking>
<FunctionLevelLinking>false</FunctionLevelLinking>
<EnableEnhancedInstructionSet />
<MinimalRebuild>false</MinimalRebuild>
<TreatWarningAsError>true</TreatWarningAsError>

View File

@ -1551,7 +1551,7 @@ HWND InitInstance(const HINSTANCE hInstance, LPCWSTR pszCmdLine, int nCmdShow)
if (s_lpSchemeArg) {
Style_SetLexerFromName(Globals.hwndEdit,Paths.CurrentFile,s_lpSchemeArg);
LocalFree(s_lpSchemeArg); // StrDup()
} else if ((s_iInitialLexer >= 0) && (s_iInitialLexer < NUMLEXERS)) {
} else if ((s_iInitialLexer >= 0) && (s_iInitialLexer < Style_NumOfLexers())) {
Style_SetLexerFromID(Globals.hwndEdit, s_iInitialLexer);
}
s_flagLexerSpecified = false;
@ -3138,7 +3138,7 @@ LRESULT MsgCopyData(HWND hwnd, WPARAM wParam, LPARAM lParam)
StringCchCopy(wchExt, COUNTOF(wchExt), L".");
StringCchCopyN(CharNext(wchExt), 32, StrEnd(&params->wchData, 0) + 1, 31);
Style_SetLexerFromName(Globals.hwndEdit, &params->wchData, wchExt);
} else if (params->iInitialLexer >= 0 && params->iInitialLexer < NUMLEXERS) {
} else if (params->iInitialLexer >= 0 && params->iInitialLexer < Style_NumOfLexers()) {
Style_SetLexerFromID(Globals.hwndEdit, params->iInitialLexer);
}
}

View File

@ -174,7 +174,7 @@
</ClCompile>
<Link>
<AdditionalDependencies>ntdll.lib;comctl32.lib;imm32.lib;shlwapi.lib;muiload.lib;scintilla.lib;lexilla.lib;%(AdditionalDependencies)</AdditionalDependencies>
<GenerateDebugInformation>Debug</GenerateDebugInformation>
<GenerateDebugInformation>DebugFull</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<TargetMachine>MachineX86</TargetMachine>
<AdditionalLibraryDirectories>$(IntermediateOutputPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -248,7 +248,7 @@
</ClCompile>
<Link>
<AdditionalDependencies>ntdll.lib;comctl32.lib;imm32.lib;shlwapi.lib;muiload.lib;scintilla.lib;lexilla.lib;%(AdditionalDependencies)</AdditionalDependencies>
<GenerateDebugInformation>Debug</GenerateDebugInformation>
<GenerateDebugInformation>DebugFull</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<TargetMachine>MachineX64</TargetMachine>
<AdditionalLibraryDirectories>$(IntermediateOutputPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -624,6 +624,7 @@
<ClCompile Include="crypto\sha-256.c" />
<ClCompile Include="StyleLexers\EditLexer.c" />
<ClCompile Include="StyleLexers\styleLexDart.c" />
<ClCompile Include="StyleLexers\styleLexJulia.c" />
<ClCompile Include="StyleLexers\styleLexKotlin.c" />
<ClCompile Include="tinyexpr\tinyexpr.c" />
<ClCompile Include="uchardet\uchardet\src\CharDistribution.cpp" />

View File

@ -414,6 +414,9 @@
<ClCompile Include="StyleLexers\EditLexer.c">
<Filter>Source Files\StyleLexers</Filter>
</ClCompile>
<ClCompile Include="StyleLexers\styleLexJulia.c">
<Filter>Source Files\StyleLexers</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Dlapi.h">

View File

@ -113,6 +113,7 @@ extern EDITLEXER lexINNO; // Inno Setup Script
extern EDITLEXER lexJAVA; // Java Source Code
extern EDITLEXER lexJS; // JavaScript
extern EDITLEXER lexJSON; // JSON
extern EDITLEXER lexJulia; // JSON
extern EDITLEXER lexKotlin; // Kotlin
extern EDITLEXER lexLATEX; // LaTeX Files
extern EDITLEXER lexLUA; // Lua Script

View File

@ -0,0 +1,88 @@
#include "StyleLexers.h"
// ----------------------------------------------------------------------------
//KEYWORDLIST KeyWords_Julia = EMPTY_KEYWORDLIST;
KEYWORDLIST KeyWords_Julia =
{
// 0 Primary keywords and identifiers
"abstract baremodule begin break catch const continue do else elseif end export finally for function global "
"if import in isa let local macro module mutable primitive quote return struct try type using var where while "
, // 1 Built in types
"AbstractArray AbstractArrayStyle AbstractChannel AbstractChar AbstractDict AbstractDisplay AbstractFloat "
"AbstractIrrational AbstractLock AbstractLogger AbstractMatrix AbstractRNG AbstractRange "
"AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange "
"AbstractVecOrMat AbstractVector AbstractWorkerPool Adjoint Anonymous Any ArgumentError Array ArrayStyle "
"AssertionError AsyncCondition Atomic "
"Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitSet BitVector Bool BoundsError "
"BroadcastStyle "
"CFunction CapturedException CartesianIndex CartesianIndices Cchar Cdouble Cfloat Channel Char Cint Cintmax_t "
"Clong Clonglong ClusterManager Cmd "
"Colon Complex ComplexF16 ComplexF32 ComplexF64 CompositeException CompoundPeriod Condition ConsoleLogger Cptrdiff_t "
"Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring "
"DataType Date DateFormat DateTime Day DefaultArrayStyle DenseArray DenseMatrix DenseVecOrMat DenseVector "
"Diagonal Dict DimensionMismatch Dims DivideError DomainError "
"EOFError Enum EnvDict ErrorException Event Exception ExponentialBackOff Expr Float16 Float32 Float64 Function Future "
"Givens GlobalRef Hermitian Hour "
"IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IdDict ImmutableDict IndexCartesian IndexLinear IndexStyle InexactError "
"InitError Instant Int Int128 Int16 Int32 Int64 Int8 Integer InterruptException InvalidStateException Irrational "
"IteratorEltype IteratorSize "
"KeyError LinRange LineNumberNode LinearIndices LoadError LogLevel LowerTriangular "
"MIME Matrix MersenneTwister Method MethodError Microsecond Millisecond Minute Missing MissingException Module Month "
"Mutex "
"NTuple NamedTuple Nanosecond Nothing NullLogger Number OneTo OrdinalRange OutOfMemoryError OverflowError "
"Pair Pairs PartialQuickSort Period PermutedDimsArray Pipe PipeBuffer PosDefException ProcessFailedException Ptr "
"QR QRCompactWY QRPivoted QuoteNode "
"Random RandomDevice Rational RawFD "
"ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RoundingMode "
"Second SegmentationFault Semaphore Serialization Set SharedArray SharedMatrix SharedVector "
"Signed SimpleLogger SingularException Some SparseMatrixCSC SparseVector SpinLock "
"StackFrame StackOverflowError StackTrace Stateful StepRange StepRangeLen "
"StridedArray StridedMatrix StridedVecOrMat StridedVector String StringIndexError SubArray SubString SubstitutionString "
"SymTridiagonal Symbol Symmetric SystemError "
"TCPSocket Task TextDisplay Time TimeType Timer TmStruct Transpose Tridiagonal Tuple Type TypeError TypeVar "
"UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UTInstant "
"UndefInitializer UndefKeywordError UndefRefError UndefVarError "
"UniformScaling Union UnionAll UnitLowerTriangular UnitRange UnitUpperTriangular Unsigned UpperTriangular "
"Val Vararg VecElement VecOrMat Vector VersionNumber WeakKeyDict WeakRef Week WorkerConfig WorkerPool Year "
, // 2 Other keywords
"allocated assert async boundscheck cfunction debug deprecate distributed dump "
"elapsed enum error eval evalpoly everywhere fastmath fetch generated gensym goto "
"inbounds inferred info inline isdefined label logmsg lower macroexpand macroexpand1 noinline nospecialize "
"polly preserve printf profile propagate_inbounds pure show spawn spawnat specialize sprintf static sync "
"task test test_broken test_deprecated test_logs test_nowarn test_skip test_throws test_warn testset threads "
"time timed timev "
"view views warn "
, // 3 Raw string literals
"raw "
, NULL
};
EDITLEXER lexJulia =
{
SCLEX_JULIA, "julia", IDS_LEX_JULIA_SCR, L"Julia Script", L"jl", L"",
&KeyWords_Julia, {
{ { STYLE_DEFAULT }, IDS_LEX_STR_63126, L"Default", L"", L"" },
//{ {SCE_JULIA_DEFAULT}, IDS_LEX_STR_63126, L"Default", L"", L"" },
{ { SCE_JULIA_COMMENT }, IDS_LEX_STR_63127, L"Comment", L"fore:#608060", L"" },
{ { SCE_JULIA_NUMBER }, IDS_LEX_STR_63130, L"Number", L"fore:#FF0000", L"" },
{ { SCE_JULIA_KEYWORD1 }, IDS_LEX_STR_63128, L"Keyword", L"bold; fore:#0000FF", L"" },
{ { MULTI_STYLE(SCE_JULIA_KEYWORD2, SCE_JULIA_KEYWORD3, 0, 0) }, IDS_LEX_STR_63260, L"Keyword 2nd", L"bold; fore:#8A008A", L"" },
{ { MULTI_STYLE(SCE_JULIA_CHAR, SCE_JULIA_STRING, 0, 0) }, IDS_LEX_STR_63131, L"String", L"fore:#BB2F00", L"" },
{ { MULTI_STYLE(SCE_JULIA_OPERATOR, SCE_JULIA_BRACKET, 0, 0) }, IDS_LEX_STR_63132, L"Operator", L"fore:#B53A00", L"" },
{ { SCE_JULIA_IDENTIFIER }, IDS_LEX_STR_63129, L"Identifier", L"fore:#00007B", L"" },
{ { SCE_JULIA_SYMBOL }, IDS_LEX_STR_63293, L"Symbol", L"fore:#C0A030", L"" },
{ { SCE_JULIA_MACRO }, IDS_LEX_STR_63280, L"Macro Def", L"fore:#0080FF", L"" },
{ { SCE_JULIA_DOCSTRING }, IDS_LEX_STR_63259, L"Comment Doc", L"fore:#808080", L"" },
{ { MULTI_STYLE(SCE_JULIA_STRINGINTERP, SCE_JULIA_STRINGLITERAL, 0, 0) }, IDS_LEX_STR_63301, L"Literal String", L"fore:#B000B0", L"" },
{ { MULTI_STYLE(SCE_JULIA_COMMAND, SCE_JULIA_COMMANDLITERAL, 0, 0) }, IDS_LEX_STR_63236, L"Command", L"bold; fore:#0000DD", L"" },
{ { SCE_JULIA_TYPEANNOT }, IDS_LEX_STR_63370, L"Annotation", L"fore:#FF8000", L"" },
{ { SCE_JULIA_LEXERROR }, IDS_LEX_STR_63252, L"Parsing Error", L"fore:#FFFF00; back:#A00000; eolfilled", L"" },
EDITLEXER_SENTINEL
}
};

View File

@ -49,7 +49,7 @@ extern COLORREF g_colorCustom[16];
// This array holds all the lexers...
// Don't forget to change the number of the lexer for HTML and XML
// in Notepad2.c ParseCommandLine() if you change this array!
static PEDITLEXER g_pLexArray[NUMLEXERS] = {
static PEDITLEXER g_pLexArray[] = {
&lexStandard, // Default Text
&lexStandard2nd, // 2nd Default Text
&lexTEXT, // Pure Text Files (Constants.StdDefaultLexerID = 2)
@ -76,6 +76,7 @@ static PEDITLEXER g_pLexArray[NUMLEXERS] = {
&lexJAVA, // Java Source Code
&lexJS, // JavaScript
&lexJSON, // JSON
&lexJulia, // Julia
&lexKotlin, // Kotlin
&lexLATEX, // LaTeX Files
&lexLUA, // Lua Script
@ -105,6 +106,10 @@ static PEDITLEXER g_pLexArray[NUMLEXERS] = {
&lexYAML, // YAML
};
int Style_NumOfLexers() {
return COUNTOF(g_pLexArray);
}
// Currently used lexer
static PEDITLEXER s_pLexCurrent = &lexStandard;
@ -3940,7 +3945,7 @@ INT_PTR CALLBACK Style_CustomizeSchemesDlgProc(HWND hwnd, UINT umsg, WPARAM wPar
static HBRUSH hbrBack = { 0 };
static bool bIsStyleSelected = false;
static bool bWarnedNoIniFile = false;
static WCHAR* Style_StylesBackup[NUMLEXERS * AVG_NUM_OF_STYLES_PER_LEXER];
static WCHAR *Style_StylesBackup[COUNTOF(g_pLexArray) * AVG_NUM_OF_STYLES_PER_LEXER];
static WCHAR tchTmpBuffer[max(BUFSIZE_STYLE_VALUE, BUFZIZE_STYLE_EXTENTIONS)] = {L'\0'};
@ -3978,7 +3983,7 @@ INT_PTR CALLBACK Style_CustomizeSchemesDlgProc(HWND hwnd, UINT umsg, WPARAM wPar
SetDlgItemText(hwnd, IDC_STYLEEDIT_HELP, tchTmpBuffer);
// Backup Styles
ZeroMemory(&Style_StylesBackup, NUMLEXERS * AVG_NUM_OF_STYLES_PER_LEXER * sizeof(WCHAR*));
ZeroMemory(&Style_StylesBackup, COUNTOF(g_pLexArray) * AVG_NUM_OF_STYLES_PER_LEXER * sizeof(WCHAR*));
int cnt = 0;
for (int iLexer = 0; iLexer < COUNTOF(g_pLexArray); ++iLexer) {
Style_StylesBackup[cnt++] = StrDup(g_pLexArray[iLexer]->szExtensions);

View File

@ -28,8 +28,8 @@
#define NUMBER_OF_MARGINS 3
// Number of Lexers in pLexArray
#define NUMLEXERS 53
#define AVG_NUM_OF_STYLES_PER_LEXER 20
int Style_NumOfLexers();
void Style_Load();
bool Style_Import(HWND hwnd);

View File

@ -0,0 +1,434 @@
# Comment here
const bar = '\n'
"""
test_fun(a::Int)
For test only
"""
function test_fun(a::Int, b::T) where T <: Number
println(a)
println("foo $(bar)")
end
@enum Unicode α=1 β=2
res = [i for i in 1:10]
#= Dummy function =#
test_fun²(:sym, true, raw"test", `echo 1`)
# function to calculate the volume of a sphere
function sphere_vol(r)
# julia allows Unicode names (in UTF-8 encoding)
# so either "pi" or the symbol π can be used
return 4/3*pi*r^3
end
# functions can also be defined more succinctly
quadratic(a, sqr_term, b) = (-b + sqr_term) / 2a
# calculates x for 0 = a*x^2+b*x+c, arguments types can be defined in function definitions
function quadratic2(a::Float64, b::Float64, c::Float64)
# unlike other languages 2a is equivalent to 2*a
# a^2 is used instead of a**2 or pow(a,2)
sqr_term = sqrt(b^2-4a*c)
r1 = quadratic(a, sqr_term, b)
r2 = quadratic(a, -sqr_term, b)
# multiple values can be returned from a function using tuples
# if the return keyword is omitted, the last term is returned
r1, r2
end
vol = sphere_vol(3)
# @printf allows number formatting but does not automatically append the \n to statements, see below
using Printf
@printf "volume = %0.3f\n" vol
#> volume = 113.097
quad1, quad2 = quadratic2(2.0, -2.0, -12.0)
println("result 1: ", quad1)
#> result 1: 3.0
println("result 2: ", quad2)
#> result 2: -2.0
s1 = "The quick brown fox jumps over the lazy dog α,β,γ"
# search returns the first index of a char
i = findfirst(isequal('b'), s1)
println(i)
#> 11
# the second argument is equivalent to the second argument of split, see below
# or a range if called with another string
r = findfirst("brown", s1)
println(r)
#> 11:15
# string replace is done thus:
r = replace(s1, "brown" => "red")
show(r); println()
#> "The quick red fox jumps over the lazy dog α,β,γ"
# search and replace can also take a regular expressions by preceding the string with 'r'
r = findfirst(r"b[\w]*n", s1)
println(r)
#> 11:15
# again with a regular expression
r = replace(s1, r"b[\w]*n" => "red")
show(r); println()
#> "The quick red fox jumps over the lazy dog α,β,γ"
# there are also functions for regular expressions that return RegexMatch types
# match scans left to right for the first match (specified starting index optional)
r = match(r"b[\w]*n", s1)
println(r)
#> RegexMatch("brown")
# RegexMatch types have a property match that holds the matched string
show(r.match); println()
#> "brown"
# eachmatch returns an iterator over all the matches
r = eachmatch(r"[\w]{4,}", s1)
for i in r print("\"$(i.match)\" ") end
#> "quick" "brown" "jumps" "over" "lazy"
println()
r = collect(m.match for m = eachmatch(r"[\w]{4,}", s1))
println(r)
#> SubString{String}["quick", "brown", "jumps", "over", "lazy"]
# a string can be repeated using the repeat function,
# or more succinctly with the ^ syntax:
r = "hello "^3
show(r); println() #> "hello hello hello "
# the strip function works the same as python:
# e.g., with one argument it strips the outer whitespace
r = strip("hello ")
show(r); println() #> "hello"
# or with a second argument of an array of chars it strips any of them;
r = strip("hello ", ['h', ' '])
show(r); println() #> "ello"
# (note the array is of chars and not strings)
# similarly split works in basically the same way as python:
r = split("hello, there,bob", ',')
show(r); println() #> SubString{String}["hello", " there", "bob"]
r = split("hello, there,bob", ", ")
show(r); println() #> SubString{String}["hello", "there,bob"]
r = split("hello, there,bob", [',', ' '], limit=0, keepempty=false)
show(r); println() #> SubString{String}["hello", "there", "bob"]
# (the last two arguements are limit and include_empty, see docs)
# the opposite of split: join is simply
r = join(collect(1:10), ", ")
println(r) #> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
function printsum(a)
# summary generates a summary of an object
println(summary(a), ": ", repr(a))
end
# arrays can be initialised directly:
a1 = [1,2,3]
printsum(a1)
#> 3-element Array{Int64,1}: [1, 2, 3]
# or initialised empty:
a2 = []
printsum(a2)
#> 0-element Array{Any,1}: Any[]
# since this array has no type, functions like push! (see below) don't work
# instead arrays can be initialised with a type:
a3 = Int64[]
printsum(a3)
#> 0-element Array{Int64,1}: Int64[]
# ranges are different from arrays:
a4 = 1:20
printsum(a4)
#> 20-element UnitRange{Int64}: 1:20
# however they can be used to create arrays thus:
a4 = collect(1:20)
printsum(a4)
#> 20-element Array{Int64,1}: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
#> 15, 16, 17, 18, 19, 20]
# arrays can also be generated from comprehensions:
a5 = [2^i for i = 1:10]
printsum(a5)
#> 10-element Array{Int64,1}: [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]
# arrays can be any type, so arrays of arrays can be created:
a6 = (Array{Int64, 1})[]
printsum(a6)
#> 0-element Array{Array{Int64,1},1}: Array{Int64,1}[]
# (note this is a "jagged array" (i.e., an array of arrays), not a multidimensional array,
# these are not covered here)
# Julia provided a number of "Dequeue" functions, the most common
# for appending to the end of arrays is push!
# ! at the end of a function name indicates that the first argument is updated.
push!(a1, 4)
printsum(a1)
#> 4-element Array{Int64,1}: [1, 2, 3, 4]
# push!(a2, 1) would cause error:
push!(a3, 1)
printsum(a3) #> 1-element Array{Int64,1}: [1]
#> 1-element Array{Int64,1}: [1]
push!(a6, [1,2,3])
printsum(a6)
#> 1-element Array{Array{Int64,1},1}: Array{Int64,1}[[1, 2, 3]]
# using repeat() to create arrays
# you must use the keywords "inner" and "outer"
# all arguments must be arrays (not ranges)
a7 = repeat(a1,inner=[2],outer=[1])
printsum(a7)
#> 8-element Array{Int64,1}: [1, 1, 2, 2, 3, 3, 4, 4]
a8 = repeat(collect(4:-1:1),inner=[1],outer=[2])
printsum(a8)
#> 8-element Array{Int64,1}: [4, 3, 2, 1, 4, 3, 2, 1]
# try, catch can be used to deal with errors as with many other languages
try
push!(a,1)
catch err
showerror(stdout, err, backtrace());println()
end
#> UndefVarError: a not defined
#> Stacktrace:
#> [1] top-level scope at C:\JuliaByExample\src\error_handling.jl:5
#> [2] include at .\boot.jl:317 [inlined]
#> [3] include_relative(::Module, ::String) at .\loading.jl:1038
#> [4] include(::Module, ::String) at .\sysimg.jl:29
#> [5] exec_options(::Base.JLOptions) at .\client.jl:229
#> [6] _start() at .\client.jl:421
println("Continuing after error")
#> Continuing after error
# repeat can be useful to expand a grid
# as in R's expand.grid() function:
m1 = hcat(repeat([1,2],inner=[1],outer=[3*2]),
repeat([1,2,3],inner=[2],outer=[2]),
repeat([1,2,3,4],inner=[3],outer=[1]))
printsum(m1)
#> 12×3 Array{Int64,2}: [1 1 1; 2 1 1; 1 2 1; 2 2 2; 1 3 2; 2 3 2; 1 1 3; 2 1 3;
#> 1 2 3; 2 2 4; 1 3 4; 2 3 4]
# for simple repetitions of arrays,
# use repeat
m2 = repeat(m1,1,2) # replicate a9 once into dim1 and twice into dim2
println("size: ", size(m2))
#> size: (12, 6)
m3 = repeat(m1,2,1) # replicate a9 twice into dim1 and once into dim2
println("size: ", size(m3))
#> size: (24, 3)
# Julia comprehensions are another way to easily create
# multidimensional arrays
m4 = [i+j+k for i=1:2, j=1:3, k=1:2] # creates a 2x3x2 array of Int64
m5 = ["Hi Im # $(i+2*(j-1 + 3*(k-1)))" for i=1:2, j=1:3, k=1:2]
# expressions are very flexible
# you can specify the type of the array by just
# placing it in front of the expression
import LegacyStrings
m5 = LegacyStrings.ASCIIString["Hi Im element # $(i+2*(j-1 + 3*(k-1)))" for i=1:2, j=1:3, k=1:2]
printsum(m5)
#> 2×3×2 Array{LegacyStrings.ASCIIString,3}: LegacyStrings.ASCIIString[
#> "Hi Im element # 1" "Hi Im element # 3" "Hi Im element # 5";
#> "Hi Im element # 2" "Hi Im element # 4" "Hi Im element # 6"]
#>
#> LegacyStrings.ASCIIString["Hi Im element # 7" "Hi Im element # 9"
#> "Hi Im element # 11"; "Hi Im element # 8" "Hi Im element # 10" "Hi Im element # 12"]
# Array reductions
# many functions in Julia have an array method
# to be applied to specific dimensions of an array:
sum(m4, dims=3) # takes the sum over the third dimension
sum(m4, dims=(1,3)) # sum over first and third dim
maximum(m4, dims=2) # find the max elt along dim 2
findmax(m4, dims=3) # find the max elt and its index along dim 3
# (available only in very recent Julia versions)
# Broadcasting
# when you combine arrays of different sizes in an operation,
# an attempt is made to "spread" or "broadcast" the smaller array
# so that the sizes match up. broadcast operators are preceded by a dot:
m4 .+ 3 # add 3 to all elements
m4 .+ [1,2] # adds vector [1,2] to all elements along first dim
# slices and views
m4=m4[:,:,1] # holds dim 3 fixed
m4[:,2,:] # that's a 2x1x2 array. not very intuititive to look at
# get rid of dimensions with size 1:
dropdims(m4[:,2,:], dims=2) # that's better
# assign new values to a certain view
m4[:,:,1] = rand(1:6,2,3)
printsum(m4)
#> 2×3 Array{Int64,2}: [3 5 3; 1 3 5]
# (for more examples of try, catch see Error Handling above)
try
# this will cause an error, you have to assign the correct type
m4[:,:,1] = rand(2,3)
catch err
println(err)
end
#> InexactError(:Int64, Int64, 0.7603891754678744)
try
# this will cause an error, you have to assign the right shape
m4[:,:,1] = rand(1:6,3,2)
catch err
println(err)
end
#> DimensionMismatch("tried to assign 3×2 array to 2×3×1 destination")
# dicts can be initialised directly:
a1 = Dict(1=>"one", 2=>"two")
printsum(a1)
#> Dict{Int64,String} with 2 entries: Dict(2=>"two",1=>"one")
# then added to:
a1[3]="three"
printsum(a1)
#> Dict{Int64,String} with 3 entries: Dict(2=>"two",3=>"three",1=>"one")
# (note dicts cannot be assumed to keep their original order)
# dicts may also be created with the type explicitly set
a2 = Dict{Int64, AbstractString}()
a2[0]="zero"
printsum(a2)
#> Dict{Int64,AbstractString} with 1 entry: Dict{Int64,AbstractString}(0=>"zero")
# dicts, like arrays, may also be created from comprehensions
using Printf
a3 = Dict([i => @sprintf("%d", i) for i = 1:10])
printsum(a3)
#> Dict{Int64,String} with 10 entries: Dict(7=>"7",4=>"4",9=>"9",10=>"10",
#> 2=>"2",3=>"3",5=>"5",8=>"8",6=>"6",1=>"1")
# as you would expect, Julia comes with all the normal helper functions
# for dicts, e.g., haskey
println(haskey(a1,1)) #> true
# which is equivalent to
println(1 in keys(a1)) #> true
# where keys creates an iterator over the keys of the dictionary
# similar to keys, values get iterators over the dict's values:
printsum(values(a1))
#> Base.ValueIterator for a Dict{Int64,String} with 3 entries: ["two", "three", "one"]
# use collect to get an array:
printsum(collect(values(a1)))
#> 3-element Array{String,1}: ["two", "three", "one"]
if true
println("It's true!")
else
println("It's false!")
end
#> It's true!
if false
println("It's true!")
else
println("It's false!")
end
#> It's false!
# Numbers can be compared with opperators like <, >, ==, !=
1 == 1.
#> true
1 > 2
#> false
"foo" != "bar"
#> true
# and many functions return boolean values
occursin("that", "this and that")
#> true
# More complex logical statments can be achieved with `elseif`
function checktype(x)
if x isa Int
println("Look! An Int!")
elseif x isa AbstractFloat
println("Look! A Float!")
elseif x isa Complex
println("Whoa, that's complex!")
else
println("I have no idea what that is")
end
end
checktype(2)
#> Look! An Int!
checktype(2)
#> Look! A Float!
checktype(Complex(-2))
#> Whoa, that's complex!
checktype("who am I?")
#> I have no idea what that is
# For simple logical statements, one can be more terse using the "ternary operator",
# which takes the form `predicate ? do_if_true : do_if_false`
1 > 2 ? println("that's true!") : println("that's false!")
#> that's false!
noisy_sqrt(x) = x 0 ? sqrt(x) : "That's negative!"
noisy_sqrt(4)
#> 2.0
noisy_sqrt(-4)
#> That's negative!
# "Short-circuit evaluation" offers another option for conditional statements.
# The opperators `&&` for AND and `||` for OR only evaluate the right-hand
# statement if necessary based on the predicate.
# Logically, if I want to know if `42 == 0 AND x < y`,
# it doesn't matter what `x` and `y` are, since the first statement is false.
# This can be exploited to only evaluate a statement if something is true -
# the second statement doesn't even have to be boolean!
everything = 42
everything < 100 && println("that's true!")
#> "that's true!"
everything == 0 && println("that's true!")
#> false
everything > 0 || println("that's false!")
#> true
everything == everything || println("that's false!")
#> that's false!