+upd: Lexilla (v5.2.4+) current dev

This commit is contained in:
rkotten 2023-05-03 14:11:54 +02:00
parent d149a397f9
commit 4e46cf666e
20 changed files with 288 additions and 245 deletions

View File

@ -1250,7 +1250,7 @@
#define IDS_LEX_STR_63345 63345
#define IDS_LEX_STR_63346 63346
#define IDS_LEX_STR_Obj 63347
#define IDS_LEX_STR_Key 63348
#define IDS_LEX_STR_Key 63348
#define IDS_LEX_STR_HotKey 63349
#define IDS_LEX_STR_HotStrg 63350
#define IDS_LEX_STR_HotStrgOp 63351
@ -1290,7 +1290,7 @@
#define IDS_LEX_STR_63385 63385
#define IDS_LEX_STR_63386 63386
#define IDS_LEX_STR_63387 63387
#define IDS_LEX_STR_StrgEOL 63388
#define IDS_LEX_STR_StrgEOL 63388
#define IDS_LEX_STD_CH_SAVED 63389
#define IDS_LEX_STD_CH_MODIFIED 63390
#define IDS_LEX_STD_CH_REV_TO_ORG 63391
@ -1307,6 +1307,7 @@
#define IDS_LEX_STR_InOut 63402
#define IDS_LEX_STR_PortConn 63403
#define IDS_LEX_STR_SysTasks 63404
#define IDS_LEX_STR_AfterLabel 63405
#define IDS_LEX_CSV_COL_0 63490

View File

@ -513,6 +513,7 @@ BEGIN
IDS_LEX_STR_InOut "InOut"
IDS_LEX_STR_PortConn "Port Connection"
IDS_LEX_STR_SysTasks "System Tasks"
IDS_LEX_STR_AfterLabel "After Label"
END
STRINGTABLE

View File

@ -513,6 +513,7 @@ BEGIN
IDS_LEX_STR_InOut "InOut"
IDS_LEX_STR_PortConn "Port Connection"
IDS_LEX_STR_SysTasks "System Tasks"
IDS_LEX_STR_AfterLabel "After Label"
END
STRINGTABLE

View File

@ -585,6 +585,31 @@
</tr>
</table>
<h2>Releases</h2>
<h3>
<a href="https://www.scintilla.org/lexilla525.zip">Release 5.2.5</a>
</h3>
<ul>
<li>
Released 13 March 2023.
</li>
<li>
Add CharacterSetArray constructor without setBase initial argument for common case
where this is setNone and the initialSet argument completely defines the characters.
This shortens and clarifies use of CharacterSetArray.
</li>
<li>
Bash: fix nesting of parameters (SCE_SH_PARAM) like ${var/$sub/"${rep}}"}.
<a href="https://github.com/ScintillaOrg/lexilla/issues/154">Issue #154</a>.
</li>
<li>
Batch: style SCE_BAT_AFTER_LABEL used for rest of line after label which is not executed.
<a href="https://github.com/ScintillaOrg/lexilla/issues/148">Issue #148</a>.
</li>
<li>
VB: allow multiline strings when lexer.vb.strings.multiline set.
<a href="https://github.com/ScintillaOrg/lexilla/issues/151">Issue #151</a>.
</li>
</ul>
<h3>
<a href="https://www.scintilla.org/lexilla524.zip">Release 5.2.4</a>
</h3>

View File

@ -602,6 +602,7 @@ val SCE_BAT_HIDE=4
val SCE_BAT_COMMAND=5
val SCE_BAT_IDENTIFIER=6
val SCE_BAT_OPERATOR=7
val SCE_BAT_AFTER_LABEL=8
# Lexical states for SCLEX_TCMD
lex TCMD=SCLEX_TCMD SCE_TCMD_
val SCE_TCMD_DEFAULT=0

View File

@ -550,6 +550,7 @@
#define SCE_BAT_COMMAND 5
#define SCE_BAT_IDENTIFIER 6
#define SCE_BAT_OPERATOR 7
#define SCE_BAT_AFTER_LABEL 8
#define SCE_TCMD_DEFAULT 0
#define SCE_TCMD_COMMENT 1
#define SCE_TCMD_WORD 2

View File

@ -6,11 +6,11 @@
// Adapted from LexPerl by Kein-Hong Man 2004
// The License.txt file describes the conditions under which this software may be distributed.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>
#include <cstdlib>
#include <cassert>
#include <cstring>
#include <cstdio>
#include <cstdarg>
#include <string>
#include <string_view>
@ -35,6 +35,8 @@
using namespace Scintilla;
using namespace Lexilla;
namespace {
#define HERE_DELIM_MAX 256
// define this if you want 'invalid octals' to be marked as errors
@ -50,27 +52,36 @@ using namespace Lexilla;
#endif
// state constants for parts of a bash command segment
#define BASH_CMD_BODY 0
#define BASH_CMD_START 1
#define BASH_CMD_WORD 2
#define BASH_CMD_TEST 3
#define BASH_CMD_ARITH 4
#define BASH_CMD_DELIM 5
enum class CmdState {
Body,
Start,
Word,
Test,
Arithmetic,
Delimiter,
};
enum class TestExprType {
Test, // test
DoubleBracket, // [[]]
SingleBracket, // []
};
// state constants for nested delimiter pairs, used by
// SCE_SH_STRING and SCE_SH_BACKTICKS processing
#define BASH_DELIM_LITERAL 0
#define BASH_DELIM_STRING 1
#define BASH_DELIM_CSTRING 2
#define BASH_DELIM_LSTRING 3
#define BASH_DELIM_COMMAND 4
#define BASH_DELIM_BACKTICK 5
// SCE_SH_STRING, SCE_SH_PARAM and SCE_SH_BACKTICKS processing
enum class QuoteStyle {
Literal, // ''
CString, // $''
String, // ""
LString, // $""
Backtick, // ``, $``
Parameter, // ${}
Command, // $()
};
#define BASH_DELIM_STACK_MAX 7
#define BASH_QUOTE_STACK_MAX 7
namespace {
inline int translateBashDigit(int ch) {
constexpr int translateBashDigit(int ch) noexcept {
if (ch >= '0' && ch <= '9') {
return ch - '0';
} else if (ch >= 'a' && ch <= 'z') {
@ -85,7 +96,7 @@ inline int translateBashDigit(int ch) {
return BASH_BASE_ERROR;
}
inline int getBashNumberBase(char *s) {
int getBashNumberBase(char *s) noexcept {
int i = 0;
int base = 0;
while (*s) {
@ -98,7 +109,7 @@ inline int getBashNumberBase(char *s) {
return base;
}
int opposite(int ch) {
constexpr int opposite(int ch) noexcept {
if (ch == '(') return ')';
if (ch == '[') return ']';
if (ch == '{') return '}';
@ -109,7 +120,8 @@ int opposite(int ch) {
int GlobScan(StyleContext &sc) {
// forward scan for zsh globs, disambiguate versus bash arrays
// complex expressions may still fail, e.g. unbalanced () '' "" etc
int c, sLen = 0;
int c;
int sLen = 0;
int pCount = 0;
int hash = 0;
while ((c = sc.GetRelativeCharacter(++sLen)) != 0) {
@ -133,10 +145,10 @@ int GlobScan(StyleContext &sc) {
}
bool IsCommentLine(Sci_Position line, LexAccessor &styler) {
Sci_Position pos = styler.LineStart(line);
Sci_Position eol_pos = styler.LineStart(line + 1) - 1;
const Sci_Position pos = styler.LineStart(line);
const Sci_Position eol_pos = styler.LineStart(line + 1) - 1;
for (Sci_Position i = pos; i < eol_pos; i++) {
char ch = styler[i];
const char ch = styler[i];
if (ch == '#')
return true;
else if (ch != ' ' && ch != '\t')
@ -159,7 +171,7 @@ struct OptionsBash {
const char * const bashWordListDesc[] = {
"Keywords",
0
nullptr
};
struct OptionSetBash : public OptionSet<OptionsBash> {
@ -176,7 +188,7 @@ struct OptionSetBash : public OptionSet<OptionsBash> {
const char styleSubable[] = { SCE_SH_IDENTIFIER, SCE_SH_SCALAR, 0 };
LexicalClass lexicalClasses[] = {
const LexicalClass lexicalClasses[] = {
// Lexer Bash SCLEX_BASH SCE_SH_:
0, "SCE_SH_DEFAULT", "default", "White space",
1, "SCE_SH_ERROR", "error", "Error",
@ -196,7 +208,7 @@ LexicalClass lexicalClasses[] = {
}
class LexerBash : public DefaultLexer {
class LexerBash final : public DefaultLexer {
WordList keywords;
OptionsBash options;
OptionSetBash osBash;
@ -207,8 +219,6 @@ public:
DefaultLexer("bash", SCLEX_BASH, lexicalClasses, ELEMENTS(lexicalClasses)),
subStyles(styleSubable, 0x80, 0x40, 0) {
}
virtual ~LexerBash() {
}
void SCI_METHOD Release() override {
delete this;
}
@ -236,7 +246,7 @@ public:
void SCI_METHOD Fold(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override;
void * SCI_METHOD PrivateCall(int, void *) override {
return 0;
return nullptr;
}
int SCI_METHOD AllocateSubStyles(int styleBase, int numberStyles) override {
@ -281,7 +291,7 @@ Sci_Position SCI_METHOD LexerBash::PropertySet(const char *key, const char *val)
}
Sci_Position SCI_METHOD LexerBash::WordListSet(int n, const char *wl) {
WordList *wordListN = 0;
WordList *wordListN = nullptr;
switch (n) {
case 0:
wordListN = &keywords;
@ -297,22 +307,24 @@ Sci_Position SCI_METHOD LexerBash::WordListSet(int n, const char *wl) {
}
void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) {
WordList cmdDelimiter, bashStruct, bashStruct_in;
WordList cmdDelimiter;
WordList bashStruct;
WordList bashStruct_in;
cmdDelimiter.Set("| || |& & && ; ;; ( ) { }");
bashStruct.Set("if elif fi while until else then do done esac eval");
bashStruct_in.Set("for case select");
CharacterSet setWordStart(CharacterSet::setAlpha, "_");
const CharacterSet setWordStart(CharacterSet::setAlpha, "_");
// note that [+-] are often parts of identifiers in shell scripts
CharacterSet setWord(CharacterSet::setAlphaNum, "._+-");
const CharacterSet setWord(CharacterSet::setAlphaNum, "._+-");
CharacterSet setMetaCharacter(CharacterSet::setNone, "|&;()<> \t\r\n");
setMetaCharacter.Add(0);
CharacterSet setBashOperator(CharacterSet::setNone, "^&%()-+=|{}[]:;>,*/<?!.~@");
CharacterSet setSingleCharOp(CharacterSet::setNone, "rwxoRWXOezsfdlpSbctugkTBMACahGLNn");
CharacterSet setParam(CharacterSet::setAlphaNum, "$_");
CharacterSet setHereDoc(CharacterSet::setAlpha, "_\\-+!%*,./:?@[]^`{}~");
CharacterSet setHereDoc2(CharacterSet::setAlphaNum, "_-+!%*,./:=?@[]^`{}~");
CharacterSet setLeftShift(CharacterSet::setDigits, "$");
const CharacterSet setBashOperator(CharacterSet::setNone, "^&%()-+=|{}[]:;>,*/<?!.~@");
const CharacterSet setSingleCharOp(CharacterSet::setNone, "rwxoRWXOezsfdlpSbctugkTBMACahGLNn");
const CharacterSet setParam(CharacterSet::setAlphaNum, "$_");
const CharacterSet setHereDoc(CharacterSet::setAlpha, "_\\-+!%*,./:?@[]^`{}~");
const CharacterSet setHereDoc2(CharacterSet::setAlphaNum, "_-+!%*,./:=?@[]^`{}~");
const CharacterSet setLeftShift(CharacterSet::setDigits, "$");
class HereDocCls { // Class to manage HERE document elements
public:
@ -326,9 +338,9 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
char Delimiter[HERE_DELIM_MAX]; // the Delimiter
HereDocCls() {
State = 0;
Quote = 0;
Quote = '\0';
Quoted = false;
Indent = 0;
Indent = false;
DelimiterLength = 0;
Delimiter[0] = '\0';
}
@ -336,8 +348,6 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
Delimiter[DelimiterLength++] = static_cast<char>(ch);
Delimiter[DelimiterLength] = '\0';
}
~HereDocCls() {
}
};
HereDocCls HereDoc;
@ -360,32 +370,31 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
Open(u);
}
};
QuoteCls Quote;
class QuoteStackCls { // Class to manage quote pairs that nest
public:
int Count;
int Up, Down;
int Style;
QuoteStyle Style;
int Depth; // levels pushed
int CountStack[BASH_DELIM_STACK_MAX];
int UpStack [BASH_DELIM_STACK_MAX];
int StyleStack[BASH_DELIM_STACK_MAX];
int CountStack[BASH_QUOTE_STACK_MAX];
int UpStack [BASH_QUOTE_STACK_MAX];
QuoteStyle StyleStack[BASH_QUOTE_STACK_MAX];
QuoteStackCls() {
Count = 0;
Up = '\0';
Down = '\0';
Style = 0;
Style = QuoteStyle::Literal;
Depth = 0;
}
void Start(int u, int s) {
void Start(int u, QuoteStyle s) {
Count = 1;
Up = u;
Down = opposite(Up);
Style = s;
}
void Push(int u, int s) {
if (Depth >= BASH_DELIM_STACK_MAX)
void Push(int u, QuoteStyle s) {
if (Depth >= BASH_QUOTE_STACK_MAX)
return;
CountStack[Depth] = Count;
UpStack [Depth] = Up;
@ -405,8 +414,6 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
Style = StyleStack[Depth];
Down = opposite(Up);
}
~QuoteStackCls() {
}
};
QuoteStackCls QuoteStack;
@ -415,9 +422,9 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
int numBase = 0;
int digit;
Sci_PositionU endPos = startPos + length;
int cmdState = BASH_CMD_START;
int testExprType = 0;
const Sci_PositionU endPos = startPos + length;
CmdState cmdState = CmdState::Start;
TestExprType testExprType = TestExprType::Test;
LexAccessor styler(pAccess);
// Always backtracks to the start of a line that is not a continuation
@ -427,7 +434,7 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
ln--;
for (;;) {
startPos = styler.LineStart(ln);
if (ln == 0 || styler.GetLineState(ln) == BASH_CMD_START)
if (ln == 0 || styler.GetLineState(ln) == static_cast<int>(CmdState::Start))
break;
ln--;
}
@ -447,33 +454,33 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
|| sc.state == SCE_SH_COMMENTLINE
|| sc.state == SCE_SH_PARAM) {
// force backtrack while retaining cmdState
styler.SetLineState(ln, BASH_CMD_BODY);
styler.SetLineState(ln, static_cast<int>(CmdState::Body));
} else {
if (ln > 0) {
if ((sc.GetRelative(-3) == '\\' && sc.GetRelative(-2) == '\r' && sc.chPrev == '\n')
|| sc.GetRelative(-2) == '\\') { // handle '\' line continuation
// retain last line's state
} else
cmdState = BASH_CMD_START;
cmdState = CmdState::Start;
}
styler.SetLineState(ln, cmdState);
styler.SetLineState(ln, static_cast<int>(cmdState));
}
}
// controls change of cmdState at the end of a non-whitespace element
// states BODY|TEST|ARITH persist until the end of a command segment
// state WORD persist, but ends with 'in' or 'do' construct keywords
int cmdStateNew = BASH_CMD_BODY;
if (cmdState == BASH_CMD_TEST || cmdState == BASH_CMD_ARITH || cmdState == BASH_CMD_WORD)
// states Body|Test|Arithmetic persist until the end of a command segment
// state Word persist, but ends with 'in' or 'do' construct keywords
CmdState cmdStateNew = CmdState::Body;
if (cmdState == CmdState::Test || cmdState == CmdState::Arithmetic || cmdState == CmdState::Word)
cmdStateNew = cmdState;
int stylePrev = sc.state;
const int stylePrev = sc.state;
// Determine if the current state should terminate.
switch (sc.state) {
case SCE_SH_OPERATOR:
sc.SetState(SCE_SH_DEFAULT);
if (cmdState == BASH_CMD_DELIM) // if command delimiter, start new command
cmdStateNew = BASH_CMD_START;
if (cmdState == CmdState::Delimiter) // if command delimiter, start new command
cmdStateNew = CmdState::Start;
else if (sc.chPrev == '\\') // propagate command state if line continued
cmdStateNew = cmdState;
break;
@ -484,20 +491,20 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
char s2[10];
sc.GetCurrent(s, sizeof(s));
int identifierStyle = SCE_SH_IDENTIFIER;
int subStyle = classifierIdentifiers.ValueFor(s);
const int subStyle = classifierIdentifiers.ValueFor(s);
if (subStyle >= 0) {
identifierStyle = subStyle;
}
// allow keywords ending in a whitespace or command delimiter
s2[0] = static_cast<char>(sc.ch);
s2[1] = '\0';
bool keywordEnds = IsASpace(sc.ch) || cmdDelimiter.InList(s2);
const bool keywordEnds = IsASpace(sc.ch) || cmdDelimiter.InList(s2);
// 'in' or 'do' may be construct keywords
if (cmdState == BASH_CMD_WORD) {
if (cmdState == CmdState::Word) {
if (strcmp(s, "in") == 0 && keywordEnds)
cmdStateNew = BASH_CMD_BODY;
cmdStateNew = CmdState::Body;
else if (strcmp(s, "do") == 0 && keywordEnds)
cmdStateNew = BASH_CMD_START;
cmdStateNew = CmdState::Start;
else
sc.ChangeState(identifierStyle);
sc.SetState(SCE_SH_DEFAULT);
@ -505,33 +512,33 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
}
// a 'test' keyword starts a test expression
if (strcmp(s, "test") == 0) {
if (cmdState == BASH_CMD_START && keywordEnds) {
cmdStateNew = BASH_CMD_TEST;
testExprType = 0;
if (cmdState == CmdState::Start && keywordEnds) {
cmdStateNew = CmdState::Test;
testExprType = TestExprType::Test;
} else
sc.ChangeState(identifierStyle);
}
// detect bash construct keywords
else if (bashStruct.InList(s)) {
if (cmdState == BASH_CMD_START && keywordEnds)
cmdStateNew = BASH_CMD_START;
if (cmdState == CmdState::Start && keywordEnds)
cmdStateNew = CmdState::Start;
else
sc.ChangeState(identifierStyle);
}
// 'for'|'case'|'select' needs 'in'|'do' to be highlighted later
else if (bashStruct_in.InList(s)) {
if (cmdState == BASH_CMD_START && keywordEnds)
cmdStateNew = BASH_CMD_WORD;
if (cmdState == CmdState::Start && keywordEnds)
cmdStateNew = CmdState::Word;
else
sc.ChangeState(identifierStyle);
}
// disambiguate option items and file test operators
else if (s[0] == '-') {
if (cmdState != BASH_CMD_TEST)
if (cmdState != CmdState::Test)
sc.ChangeState(identifierStyle);
}
// disambiguate keywords and identifiers
else if (cmdState != BASH_CMD_START
else if (cmdState != CmdState::Start
|| !(keywords.InList(s) && keywordEnds)) {
sc.ChangeState(identifierStyle);
}
@ -540,10 +547,10 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
break;
case SCE_SH_IDENTIFIER:
if (sc.chPrev == '\\' || !setWord.Contains(sc.ch) ||
(cmdState == BASH_CMD_ARITH && !setWordStart.Contains(sc.ch))) {
(cmdState == CmdState::Arithmetic && !setWordStart.Contains(sc.ch))) {
char s[500];
sc.GetCurrent(s, sizeof(s));
int subStyle = classifierIdentifiers.ValueFor(s);
const int subStyle = classifierIdentifiers.ValueFor(s);
if (subStyle >= 0) {
sc.ChangeState(subStyle);
}
@ -627,7 +634,7 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
HereDoc.Quoted = true;
HereDoc.State = 1;
} else if (setHereDoc.Contains(sc.chNext) ||
(sc.chNext == '=' && cmdState != BASH_CMD_ARITH)) {
(sc.chNext == '=' && cmdState != CmdState::Arithmetic)) {
// an unquoted here-doc delimiter, no special handling
HereDoc.State = 1;
} else if (sc.chNext == '<') { // HERE string <<<
@ -636,7 +643,7 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
} else if (IsASpace(sc.chNext)) {
// eat whitespace
} else if (setLeftShift.Contains(sc.chNext) ||
(sc.chNext == '=' && cmdState == BASH_CMD_ARITH)) {
(sc.chNext == '=' && cmdState == CmdState::Arithmetic)) {
// left shift <<$var or <<= cases
sc.ChangeState(SCE_SH_OPERATOR);
sc.ForwardSetState(SCE_SH_DEFAULT);
@ -707,7 +714,7 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
if (!setParam.Contains(sc.ch)) {
char s[500];
sc.GetCurrent(s, sizeof(s));
int subStyle = classifierScalars.ValueFor(&s[1]); // skip the $
const int subStyle = classifierScalars.ValueFor(&s[1]); // skip the $
if (subStyle >= 0) {
sc.ChangeState(subStyle);
}
@ -720,9 +727,10 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
}
break;
case SCE_SH_STRING: // delimited styles, can nest
case SCE_SH_PARAM: // ${parameter}
case SCE_SH_BACKTICKS:
if (sc.ch == '\\' && QuoteStack.Up != '\\') {
if (QuoteStack.Style != BASH_DELIM_LITERAL)
if (QuoteStack.Style != QuoteStyle::Literal)
sc.Forward();
} else if (sc.ch == QuoteStack.Down) {
QuoteStack.Count--;
@ -735,57 +743,46 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
} else if (sc.ch == QuoteStack.Up) {
QuoteStack.Count++;
} else {
if (QuoteStack.Style == BASH_DELIM_STRING ||
QuoteStack.Style == BASH_DELIM_LSTRING
if (QuoteStack.Style == QuoteStyle::String ||
QuoteStack.Style == QuoteStyle::LString
) { // do nesting for "string", $"locale-string"
if (sc.ch == '`') {
QuoteStack.Push(sc.ch, BASH_DELIM_BACKTICK);
QuoteStack.Push(sc.ch, QuoteStyle::Backtick);
} else if (sc.ch == '$' && sc.chNext == '(') {
sc.Forward();
QuoteStack.Push(sc.ch, BASH_DELIM_COMMAND);
QuoteStack.Push(sc.ch, QuoteStyle::Command);
}
} else if (QuoteStack.Style == BASH_DELIM_COMMAND ||
QuoteStack.Style == BASH_DELIM_BACKTICK
) { // do nesting for $(command), `command`
} else if (QuoteStack.Style == QuoteStyle::Command ||
QuoteStack.Style == QuoteStyle::Parameter ||
QuoteStack.Style == QuoteStyle::Backtick
) { // do nesting for $(command), `command`, ${parameter}
if (sc.ch == '\'') {
QuoteStack.Push(sc.ch, BASH_DELIM_LITERAL);
QuoteStack.Push(sc.ch, QuoteStyle::Literal);
} else if (sc.ch == '\"') {
QuoteStack.Push(sc.ch, BASH_DELIM_STRING);
QuoteStack.Push(sc.ch, QuoteStyle::String);
} else if (sc.ch == '`') {
QuoteStack.Push(sc.ch, BASH_DELIM_BACKTICK);
QuoteStack.Push(sc.ch, QuoteStyle::Backtick);
} else if (sc.ch == '$') {
if (sc.chNext == '\'') {
sc.Forward();
QuoteStack.Push(sc.ch, BASH_DELIM_CSTRING);
QuoteStack.Push(sc.ch, QuoteStyle::CString);
} else if (sc.chNext == '\"') {
sc.Forward();
QuoteStack.Push(sc.ch, BASH_DELIM_LSTRING);
QuoteStack.Push(sc.ch, QuoteStyle::LString);
} else if (sc.chNext == '{') {
sc.Forward();
QuoteStack.Push(sc.ch, QuoteStyle::Parameter);
} else if (sc.chNext == '(') {
sc.Forward();
QuoteStack.Push(sc.ch, BASH_DELIM_COMMAND);
QuoteStack.Push(sc.ch, QuoteStyle::Command);
}
}
}
}
break;
case SCE_SH_PARAM: // ${parameter}
if (sc.ch == '\\' && Quote.Up != '\\') {
sc.Forward();
} else if (sc.ch == Quote.Down) {
Quote.Count--;
if (Quote.Count == 0) {
sc.ForwardSetState(SCE_SH_DEFAULT);
}
} else if (sc.ch == Quote.Up) {
Quote.Count++;
}
break;
case SCE_SH_CHARACTER: // singly-quoted strings
if (sc.ch == Quote.Down) {
Quote.Count--;
if (Quote.Count == 0) {
sc.ForwardSetState(SCE_SH_DEFAULT);
}
if (sc.ch == '\'') {
sc.ForwardSetState(SCE_SH_DEFAULT);
}
break;
}
@ -851,7 +848,7 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
sc.SetState(SCE_SH_WORD);
}
// handle some zsh features within arithmetic expressions only
if (cmdState == BASH_CMD_ARITH) {
if (cmdState == CmdState::Arithmetic) {
if (sc.chPrev == '[') { // [#8] [##8] output digit setting
sc.SetState(SCE_SH_WORD);
if (sc.chNext == '#') {
@ -869,13 +866,12 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
}
} else if (sc.ch == '\"') {
sc.SetState(SCE_SH_STRING);
QuoteStack.Start(sc.ch, BASH_DELIM_STRING);
QuoteStack.Start(sc.ch, QuoteStyle::String);
} else if (sc.ch == '\'') {
sc.SetState(SCE_SH_CHARACTER);
Quote.Start(sc.ch);
} else if (sc.ch == '`') {
sc.SetState(SCE_SH_BACKTICKS);
QuoteStack.Start(sc.ch, BASH_DELIM_BACKTICK);
QuoteStack.Start(sc.ch, QuoteStyle::Backtick);
} else if (sc.ch == '$') {
if (sc.Match("$((")) {
sc.SetState(SCE_SH_OPERATOR); // handle '((' later
@ -885,19 +881,19 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
sc.Forward();
if (sc.ch == '{') {
sc.ChangeState(SCE_SH_PARAM);
Quote.Start(sc.ch);
QuoteStack.Start(sc.ch, QuoteStyle::Parameter);
} else if (sc.ch == '\'') {
sc.ChangeState(SCE_SH_STRING);
QuoteStack.Start(sc.ch, BASH_DELIM_CSTRING);
QuoteStack.Start(sc.ch, QuoteStyle::CString);
} else if (sc.ch == '"') {
sc.ChangeState(SCE_SH_STRING);
QuoteStack.Start(sc.ch, BASH_DELIM_LSTRING);
QuoteStack.Start(sc.ch, QuoteStyle::LString);
} else if (sc.ch == '(') {
sc.ChangeState(SCE_SH_BACKTICKS);
QuoteStack.Start(sc.ch, BASH_DELIM_COMMAND);
QuoteStack.Start(sc.ch, QuoteStyle::Command);
} else if (sc.ch == '`') { // $` seen in a configure script, valid?
sc.ChangeState(SCE_SH_BACKTICKS);
QuoteStack.Start(sc.ch, BASH_DELIM_BACKTICK);
QuoteStack.Start(sc.ch, QuoteStyle::Backtick);
} else {
continue; // scalar has no delimiter pair
}
@ -921,8 +917,8 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
bool isCmdDelim = false;
sc.SetState(SCE_SH_OPERATOR);
// globs have no whitespace, do not appear in arithmetic expressions
if (cmdState != BASH_CMD_ARITH && sc.ch == '(' && sc.chNext != '(') {
int i = GlobScan(sc);
if (cmdState != CmdState::Arithmetic && sc.ch == '(' && sc.chNext != '(') {
const int i = GlobScan(sc);
if (i > 1) {
sc.SetState(SCE_SH_IDENTIFIER);
sc.Forward(i);
@ -930,31 +926,31 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
}
}
// handle opening delimiters for test/arithmetic expressions - ((,[[,[
if (cmdState == BASH_CMD_START
|| cmdState == BASH_CMD_BODY) {
if (cmdState == CmdState::Start
|| cmdState == CmdState::Body) {
if (sc.Match('(', '(')) {
cmdState = BASH_CMD_ARITH;
cmdState = CmdState::Arithmetic;
sc.Forward();
} else if (sc.Match('[', '[') && IsASpace(sc.GetRelative(2))) {
cmdState = BASH_CMD_TEST;
testExprType = 1;
cmdState = CmdState::Test;
testExprType = TestExprType::DoubleBracket;
sc.Forward();
} else if (sc.ch == '[' && IsASpace(sc.chNext)) {
cmdState = BASH_CMD_TEST;
testExprType = 2;
cmdState = CmdState::Test;
testExprType = TestExprType::SingleBracket;
}
}
// special state -- for ((x;y;z)) in ... looping
if (cmdState == BASH_CMD_WORD && sc.Match('(', '(')) {
cmdState = BASH_CMD_ARITH;
if (cmdState == CmdState::Word && sc.Match('(', '(')) {
cmdState = CmdState::Arithmetic;
sc.Forward();
continue;
}
// handle command delimiters in command START|BODY|WORD state, also TEST if 'test'
if (cmdState == BASH_CMD_START
|| cmdState == BASH_CMD_BODY
|| cmdState == BASH_CMD_WORD
|| (cmdState == BASH_CMD_TEST && testExprType == 0)) {
// handle command delimiters in command Start|Body|Word state, also Test if 'test'
if (cmdState == CmdState::Start
|| cmdState == CmdState::Body
|| cmdState == CmdState::Word
|| (cmdState == CmdState::Test && testExprType == TestExprType::Test)) {
s[0] = static_cast<char>(sc.ch);
if (setBashOperator.Contains(sc.chNext)) {
s[1] = static_cast<char>(sc.chNext);
@ -968,20 +964,20 @@ void SCI_METHOD LexerBash::Lex(Sci_PositionU startPos, Sci_Position length, int
isCmdDelim = cmdDelimiter.InList(s);
}
if (isCmdDelim) {
cmdState = BASH_CMD_DELIM;
cmdState = CmdState::Delimiter;
continue;
}
}
// handle closing delimiters for test/arithmetic expressions - )),]],]
if (cmdState == BASH_CMD_ARITH && sc.Match(')', ')')) {
cmdState = BASH_CMD_BODY;
if (cmdState == CmdState::Arithmetic && sc.Match(')', ')')) {
cmdState = CmdState::Body;
sc.Forward();
} else if (cmdState == BASH_CMD_TEST && IsASpace(sc.chPrev)) {
if (sc.Match(']', ']') && testExprType == 1) {
} else if (cmdState == CmdState::Test && IsASpace(sc.chPrev)) {
if (sc.Match(']', ']') && testExprType == TestExprType::DoubleBracket) {
sc.Forward();
cmdState = BASH_CMD_BODY;
} else if (sc.ch == ']' && testExprType == 2) {
cmdState = BASH_CMD_BODY;
cmdState = CmdState::Body;
} else if (sc.ch == ']' && testExprType == TestExprType::SingleBracket) {
cmdState = CmdState::Body;
}
}
}
@ -1000,22 +996,22 @@ void SCI_METHOD LexerBash::Fold(Sci_PositionU startPos, Sci_Position length, int
LexAccessor styler(pAccess);
Sci_PositionU endPos = startPos + length;
const Sci_PositionU endPos = startPos + length;
int visibleChars = 0;
int skipHereCh = 0;
Sci_Position lineCurrent = styler.GetLine(startPos);
int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
int levelCurrent = levelPrev;
char chNext = styler[startPos];
int styleNext = styler.StyleAt(startPos);
int styleNext = styler.StyleIndexAt(startPos);
char word[8] = { '\0' }; // we're not interested in long words anyway
unsigned int wordlen = 0;
for (Sci_PositionU i = startPos; i < endPos; i++) {
char ch = chNext;
const char ch = chNext;
chNext = styler.SafeGetCharAt(i + 1);
int style = styleNext;
styleNext = styler.StyleAt(i + 1);
bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
const int style = styleNext;
styleNext = styler.StyleIndexAt(i + 1);
const bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
// Comment folding
if (options.foldComment && atEOL && IsCommentLine(lineCurrent, styler))
{
@ -1079,7 +1075,7 @@ void SCI_METHOD LexerBash::Fold(Sci_PositionU startPos, Sci_Position length, int
visibleChars++;
}
// Fill in the real level of the next line, keeping the current flags as they will be filled in later
int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
const int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
styler.SetLevel(lineCurrent, levelPrev | flagsNext);
}

View File

@ -5,12 +5,12 @@
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>
#include <ctype.h>
#include <cstdlib>
#include <cassert>
#include <cstring>
#include <cctype>
#include <cstdio>
#include <cstdarg>
#include <string>
#include <string_view>
@ -79,7 +79,7 @@ bool textQuoted(const char *lineBuffer, Sci_PositionU endPos) {
const size_t strLength = strlen(strQuotes);
for (size_t i = 0; i < strLength; i++) {
const char *pQuote = strchr(strBuffer, strQuotes[i]);
while (pQuote != NULL)
while (pQuote)
{
if (!IsEscaped(strBuffer, pQuote - strBuffer)) {
CurrentStatus = !CurrentStatus;
@ -159,7 +159,17 @@ void ColouriseBatchDoc(
styler.ColourTo(endPos, SCE_BAT_COMMENT);
} else {
// Colorize Real Label
styler.ColourTo(endPos, SCE_BAT_LABEL);
// :[\t ]*[^\t &+:<>|]+
const char *startLabelName = lineBuffer + offset + 1;
const size_t whitespaceLength = strspn(startLabelName, "\t ");
// Set of label-terminating characters determined experimentally
const char *endLabel = strpbrk(startLabelName + whitespaceLength, "\t &+:<>|");
if (endLabel) {
styler.ColourTo(startLine + offset + endLabel - startLabelName, SCE_BAT_LABEL);
styler.ColourTo(endPos, SCE_BAT_AFTER_LABEL); // New style
} else {
styler.ColourTo(endPos, SCE_BAT_LABEL);
}
}
stopLineProcessing=true;
// Check for Drive Change (Drive Change is internal command) - return if found
@ -630,9 +640,9 @@ void ColouriseBatchDoc(
const char *const batchWordListDesc[] = {
"Internal Commands",
"External Commands",
0
nullptr
};
}
LexerModule lmBatch(SCLEX_BATCH, ColouriseBatchDoc, "batch", 0, batchWordListDesc);
LexerModule lmBatch(SCLEX_BATCH, ColouriseBatchDoc, "batch", nullptr, batchWordListDesc);

View File

@ -162,7 +162,7 @@ void highlightTaskMarker(StyleContext &sc, LexAccessor &styler,
class EscapeSequence {
const CharacterSet setHexDigits = CharacterSet(CharacterSet::setDigits, "ABCDEFabcdef");
const CharacterSet setOctDigits = CharacterSet(CharacterSet::setNone, "01234567");
const CharacterSet setOctDigits = CharacterSet("01234567");
const CharacterSet setNoneNumeric;
const CharacterSet *escapeSetValid = nullptr;
int digitsLeft = 0;
@ -537,11 +537,11 @@ public:
explicit LexerCPP(bool caseSensitive_) :
caseSensitive(caseSensitive_),
setWord(CharacterSet::setAlphaNum, "._", true),
setNegationOp(CharacterSet::setNone, "!"),
setAddOp(CharacterSet::setNone, "+-"),
setMultOp(CharacterSet::setNone, "*/%"),
setRelOp(CharacterSet::setNone, "=!<>"),
setLogicalOp(CharacterSet::setNone, "|&"),
setNegationOp("!"),
setAddOp("+-"),
setMultOp("*/%"),
setRelOp("=!<>"),
setLogicalOp("|&"),
subStyles(styleSubable, 0x80, 0x40, inactiveFlag) {
}
// Deleted so LexerCPP objects can not be copied.
@ -769,14 +769,14 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i
const StyleContext::Transform transform = caseSensitive ?
StyleContext::Transform::none : StyleContext::Transform::lower;
const CharacterSet setOKBeforeRE(CharacterSet::setNone, "([{=,:;!%^&*|?~+-");
const CharacterSet setCouldBePostOp(CharacterSet::setNone, "+-");
const CharacterSet setOKBeforeRE("([{=,:;!%^&*|?~+-");
const CharacterSet setCouldBePostOp("+-");
const CharacterSet setDoxygen(CharacterSet::setAlpha, "$@\\&<>#{}[]");
setWordStart = CharacterSet(CharacterSet::setAlpha, "_", true);
const CharacterSet setInvalidRawFirst(CharacterSet::setNone, " )\\\t\v\f\n");
const CharacterSet setInvalidRawFirst(" )\\\t\v\f\n");
if (options.identifiersAllowDollars) {
setWordStart.Add('$');

View File

@ -65,9 +65,9 @@ static void ColouriseLuaDoc(
// Not exactly following number definition (several dots are seen as OK, etc.)
// but probably enough in most cases. [pP] is for hex floats.
CharacterSet setNumber(CharacterSet::setDigits, ".-+abcdefpABCDEFP");
CharacterSet setExponent(CharacterSet::setNone, "eEpP");
CharacterSet setLuaOperator(CharacterSet::setNone, "*/-+()={}~[];<>,.^%:#&|");
CharacterSet setEscapeSkip(CharacterSet::setNone, "\"'\\");
CharacterSet setExponent("eEpP");
CharacterSet setLuaOperator("*/-+()={}~[];<>,.^%:#&|");
CharacterSet setEscapeSkip("\"'\\");
Sci_Position currentLine = styler.GetLine(startPos);
// Initialize long string [[ ... ]] or block comment --[[ ... ]],

View File

@ -72,6 +72,10 @@ static void ColouriseVBDoc(Sci_PositionU startPos, Sci_Position length, int init
int visibleChars = 0;
int fileNbDigits = 0;
// property lexer.vb.strings.multiline
// Set to 1 to allow strings to continue over line ends.
bool allowMultilineStr = styler.GetPropertyInt("lexer.vb.strings.multiline", 0) != 0;
// Do not leak onto next line
if (initStyle == SCE_B_STRINGEOL || initStyle == SCE_B_COMMENT || initStyle == SCE_B_PREPROCESSOR) {
initStyle = SCE_B_DEFAULT;
@ -134,7 +138,7 @@ static void ColouriseVBDoc(Sci_PositionU startPos, Sci_Position length, int init
}
sc.ForwardSetState(SCE_B_DEFAULT);
}
} else if (sc.atLineEnd) {
} else if (sc.atLineEnd && !allowMultilineStr) {
visibleChars = 0;
sc.ChangeState(SCE_B_STRINGEOL);
sc.ForwardSetState(SCE_B_DEFAULT);

View File

@ -33,6 +33,9 @@ public:
if (base & setDigits)
AddString("0123456789");
}
CharacterSetArray(const char *initialSet, bool valueAfter_=false) noexcept :
CharacterSetArray(setNone, initialSet, valueAfter_) {
}
// For compatibility with previous version but should not be used in new code.
CharacterSetArray(setBase base, const char *initialSet, [[maybe_unused]]int size_, bool valueAfter_=false) noexcept :
CharacterSetArray(base, initialSet, valueAfter_) {

View File

@ -35,8 +35,7 @@ DefaultLexer::DefaultLexer(const char *languageName_, int language_,
nClasses(nClasses_) {
}
DefaultLexer::~DefaultLexer() {
}
DefaultLexer::~DefaultLexer() = default;
void SCI_METHOD DefaultLexer::Release() {
delete this;

View File

@ -116,7 +116,7 @@ void LexerModule::Fold(Sci_PositionU startPos, Sci_Position lengthDoc, int initS
startPos = newStartPos;
initStyle = 0;
if (startPos > 0) {
initStyle = styler.StyleAt(startPos - 1);
initStyle = styler.StyleIndexAt(startPos - 1);
}
}
fnFolder(startPos, lengthDoc, initStyle, keywordlists, styler);

View File

@ -22,7 +22,7 @@ using namespace Lexilla;
namespace {
typedef std::map<std::string, std::string, std::less<>> mapss;
using mapss = std::map<std::string, std::string, std::less<>>;
mapss *PropsFromPointer(void *impl) noexcept {
return static_cast<mapss *>(impl);
@ -45,7 +45,7 @@ bool PropSetSimple::Set(std::string_view key, std::string_view val) {
mapss *props = PropsFromPointer(impl);
if (!props)
return false;
mapss::iterator it = props->find(key);
mapss::iterator const it = props->find(key);
if (it != props->end()) {
if (val == it->second)
return false;
@ -59,7 +59,7 @@ bool PropSetSimple::Set(std::string_view key, std::string_view val) {
const char *PropSetSimple::Get(std::string_view key) const {
mapss *props = PropsFromPointer(impl);
if (props) {
mapss::const_iterator keyPos = props->find(key);
mapss::const_iterator const keyPos = props->find(key);
if (keyPos != props->end()) {
return keyPos->second.c_str();
}

View File

@ -134,7 +134,7 @@ bool WordList::Set(const char *s) {
len = lenTemp;
std::fill(starts, std::end(starts), -1);
for (int l = static_cast<int>(len - 1); l >= 0; l--) {
unsigned char indexChar = words[l][0];
unsigned char const indexChar = words[l][0];
starts[indexChar] = l;
}
return true;

View File

@ -49,17 +49,17 @@ def FindModules(lexFile):
partLine = ""
with lexFile.open(encoding=neutralEncoding) as f:
lineNum = 0
for l in f.readlines():
for line in f.readlines():
lineNum += 1
l = l.rstrip()
if partLine or l.startswith("LexerModule"):
if ")" in l:
l = partLine + l
original = l
l = l.replace("(", " ")
l = l.replace(")", " ")
l = l.replace(",", " ")
parts = l.split()
line = line.rstrip()
if partLine or line.startswith("LexerModule"):
if ")" in line:
line = partLine + line
original = line
line = line.replace("(", " ")
line = line.replace(")", " ")
line = line.replace(",", " ")
parts = line.split()
lexerName = parts[4]
if not (lexerName.startswith('"') and lexerName.endswith('"')):
print(f"{lexFile}:{lineNum}: Bad LexerModule statement:\n{original}")
@ -68,7 +68,7 @@ def FindModules(lexFile):
modules.append([parts[1], parts[2], lexerName])
partLine = ""
else:
partLine = partLine + l
partLine = partLine + line
return modules
def FindLexersInXcode(xCodeProject):
@ -114,11 +114,11 @@ knownIrregularProperties = [
def FindProperties(lexFile):
properties = {}
with open(lexFile, encoding=neutralEncoding) as f:
for l in f.readlines():
if ("GetProperty" in l or "DefineProperty" in l) and "\"" in l:
l = l.strip()
if not l.startswith("//"): # Drop comments
propertyName = l.split("\"")[1]
for s in f.readlines():
if ("GetProperty" in s or "DefineProperty" in s) and "\"" in s:
s = s.strip()
if not s.startswith("//"): # Drop comments
propertyName = s.split("\"")[1]
if propertyName.lower() == propertyName:
# Only allow lower case property names
if propertyName in knownIrregularProperties or \
@ -131,36 +131,36 @@ def FindPropertyDocumentation(lexFile):
documents = {}
with lexFile.open(encoding=neutralEncoding) as f:
name = ""
for l in f.readlines():
l = l.strip()
if "// property " in l:
propertyName = l.split()[2]
for line in f.readlines():
line = line.strip()
if "// property " in line:
propertyName = line.split()[2]
if propertyName.lower() == propertyName:
# Only allow lower case property names
name = propertyName
documents[name] = ""
elif "DefineProperty" in l and "\"" in l:
propertyName = l.split("\"")[1]
elif "DefineProperty" in line and "\"" in line:
propertyName = line.split("\"")[1]
if propertyName.lower() == propertyName:
# Only allow lower case property names
name = propertyName
documents[name] = ""
elif name:
if l.startswith("//"):
if line.startswith("//"):
if documents[name]:
documents[name] += " "
documents[name] += l[2:].strip()
elif l.startswith("\""):
l = l[1:].strip()
if l.endswith(";"):
l = l[:-1].strip()
if l.endswith(")"):
l = l[:-1].strip()
if l.endswith("\""):
l = l[:-1]
documents[name] += line[2:].strip()
elif line.startswith("\""):
line = line[1:].strip()
if line.endswith(";"):
line = line[:-1].strip()
if line.endswith(")"):
line = line[:-1].strip()
if line.endswith("\""):
line = line[:-1]
# Fix escaped double quotes
l = l.replace("\\\"", "\"")
documents[name] += l
line = line.replace("\\\"", "\"")
documents[name] += line
else:
name = ""
for name in list(documents.keys()):
@ -172,15 +172,15 @@ def FindCredits(historyFile):
credits = []
stage = 0
with historyFile.open(encoding="utf-8") as f:
for l in f.readlines():
l = l.strip()
if stage == 0 and l == "<table>":
for line in f.readlines():
line = line.strip()
if stage == 0 and line == "<table>":
stage = 1
elif stage == 1 and l == "</table>":
elif stage == 1 and line == "</table>":
stage = 2
if stage == 1 and l.startswith("<td>"):
credit = l[4:-5]
if "<a" in l:
if stage == 1 and line.startswith("<td>"):
credit = line[4:-5]
if "<a" in line:
title, a, rest = credit.partition("<a href=")
urlplus, _bracket, end = rest.partition(">")
name = end.split("<")[0]
@ -195,19 +195,19 @@ def FindCredits(historyFile):
def ciKey(a):
return str(a).lower()
def SortListInsensitive(l):
l.sort(key=ciKey)
def SortListInsensitive(list):
list.sort(key=ciKey)
class LexillaData:
def __init__(self, scintillaRoot):
# Discover version information
self.version = (scintillaRoot / "version.txt").read_text().strip()
self.versionDotted = self.version[0] + '.' + self.version[1] + '.' + \
self.version[2]
self.versionDotted = self.version[0:-2] + '.' + self.version[-2] + '.' + \
self.version[-1]
self.versionCommad = self.versionDotted.replace(".", ", ") + ', 0'
with (scintillaRoot / "doc" / "Lexilla.html").open() as f:
self.dateModified = [l for l in f.readlines() if "Date.Modified" in l]\
self.dateModified = [d for d in f.readlines() if "Date.Modified" in d]\
[0].split('\"')[3]
# 20130602
# Lexilla.html

View File

@ -10,9 +10,9 @@ pushd %_THISDIR_%
set _EXITCODE_=0
set _PYTHON_EXE=d:\DEV\Python_Embed_311_x64\python.exe
::set _PYTHON_EXE=d:\DEV\Python_Embed_311_x64\python.exe
rem call :RESOLVE_PATH _PYTHON_EXE "%_THISDIR_%..\..\..\..\_python_emb\python.exe"
rem set _PYTHON_EXE=python.exe
set _PYTHON_EXE=python.exe
set _CMD_="%_PYTHON_EXE%" "%~dpn0.py"
echo.Calling: %_CMD_%

View File

@ -106,7 +106,7 @@ def RegenerateAll(rootDirectory):
# Discover version information
version = (lexillaDir / "version.txt").read_text().strip()
versionDotted = version[0] + '.' + version[1] + '.' + version[2]
versionDotted = version[0:-2] + '.' + version[-2] + '.' + version[-1]
versionCommad = versionDotted.replace(".", ", ") + ', 0'
rcPath = srcDir / "LexillaVersion.rc"
@ -117,7 +117,7 @@ def RegenerateAll(rootDirectory):
UpdateLineInFile(docDir / "LexillaDownload.html", " Release",
" Release " + versionDotted)
ReplaceREInFile(docDir / "LexillaDownload.html",
r"/www.scintilla.org/([a-zA-Z]+)\d\d\d",
r"/www.scintilla.org/([a-zA-Z]+)\d{3,5}",
r"/www.scintilla.org/\g<1>" + version,
0)

View File

@ -30,6 +30,7 @@ EDITLEXER lexBAT =
{ {SCE_BAT_OPERATOR}, IDS_LEX_STR_Operator, L"Operator", L"fore:#B000B0", L"" },
{ {MULTI_STYLE(SCE_BAT_COMMAND,SCE_BAT_HIDE,0,0)}, IDS_LEX_STR_Cmd, L"Command", L"bold", L"" },
{ {SCE_BAT_LABEL}, IDS_LEX_STR_Label, L"Label", L"fore:#C80000; back:#F4F4F4; eolfilled", L"" },
{ {SCE_BAT_AFTER_LABEL}, IDS_LEX_STR_AfterLabel, L"After Label", L"fore:#00ACAC;", L"" },
EDITLEXER_SENTINEL
}
};