Update: Scintilla 5.3.5 Lexilla 5.2.5
update to Scinitlla Release 5.3.5 (https://www.scintilla.org/scintilla535.zip) Released 31 May 2023. On Win32, implement IME context sensitivity with IMR_DOCUMENTFEED. Feature #1310. On Win32 remove dependence on MSIMG32.DLL by replacing AlphaBlend by GdiAlphaBlend. Bug #1923. On Qt, stop movement of IME candidate box. On Qt, report correct caret position within paragraph for IME retrieve surrounding text. On Qt for Cocoa, fix crash in entry of multi-character strings with IME. and Lexilla Release 5.2.5 (https://www.scintilla.org/lexilla525.zip) Released 31 May 2023. 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. Bash: implement highlighting inside quoted elements and here-docs. Controlled with properties lexer.bash.styling.inside.string, lexer.bash.styling.inside.backticks, lexer.bash.styling.inside.parameter, and lexer.bash.styling.inside.heredoc. Issue #154, Issue #153, Feature #1033. Bash: add property lexer.bash.command.substitution to choose how to style command substitutions. 0 → SCE_SH_BACKTICKS; 1 → surrounding "$(" and ")" as operators and contents styled as bash code; 2 → use distinct styles (base style + 64) for contents. Choice (2) is a provisional feature and details may change before it is finalized. Issue #153. Bash: fix nesting of parameters (SCE_SH_PARAM) like ${var/$sub/"${rep}}"}. Issue #154. Bash: fix single character special parameters like $? by limiting style. Issue #154. Bash: treat "$$" as special parameter and end scalars before "$". Issue #154. Bash: treat "<<" in arithmetic contexts as left bitwise shift operator instead of here-doc. Issue #137. Batch: style SCE_BAT_AFTER_LABEL used for rest of line after label which is not executed. Issue #148. F#: Lex interpolated verbatim strings as verbatim. Issue #156. VB: allow multiline strings when lexer.vb.strings.multiline set. Issue #151. Close #13729
This commit is contained in:
parent
043bd4f385
commit
b39ca37c3a
Binary file not shown.
Binary file not shown.
|
@ -29,7 +29,6 @@ shadowVariable:lexilla/lexers/LexAU3.cxx
|
|||
constParameter:lexilla/lexers/LexBaan.cxx
|
||||
unreadVariable:lexilla/lexers/LexBaan.cxx
|
||||
constParameter:lexilla/lexers/LexBash.cxx
|
||||
uninitMemberVar:lexilla/lexers/LexBash.cxx
|
||||
variableScope:lexilla/lexers/LexBash.cxx
|
||||
variableScope:lexilla/lexers/LexCmake.cxx
|
||||
knownConditionTrueFalse:lexilla/lexers/LexCmake.cxx
|
||||
|
@ -46,7 +45,6 @@ variableScope:lexilla/lexers/LexErlang.cxx
|
|||
knownConditionTrueFalse:lexilla/lexers/LexEScript.cxx
|
||||
constParameter:lexilla/lexers/LexFortran.cxx
|
||||
redundantContinue:lexilla/lexers/LexFortran.cxx
|
||||
redundantCondition:lexilla/lexers/LexFSharp.cxx
|
||||
knownConditionTrueFalse:lexilla/lexers/LexFSharp.cxx
|
||||
constParameter:lexilla/lexers/LexGDScript.cxx
|
||||
variableScope:lexilla/lexers/LexGui4Cli.cxx
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<meta name="keywords" content="Scintilla, SciTE, Editing Component, Text Editor" />
|
||||
<meta name="Description"
|
||||
content="www.scintilla.org is the home of the Scintilla editing component and SciTE text editor application." />
|
||||
<meta name="Date.Modified" content="20230313" />
|
||||
<meta name="Date.Modified" content="20230531" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<style type="text/css">
|
||||
.logo {
|
||||
|
@ -61,8 +61,8 @@
|
|||
<font color="#FFCC99" size="4"> A library of language lexers for use with Scintilla</font>
|
||||
</td>
|
||||
<td width="40%" align="right">
|
||||
<font color="#FFCC99" size="3">Release version 5.2.4<br />
|
||||
Site last modified March 13 2023</font>
|
||||
<font color="#FFCC99" size="3">Release version 5.2.5<br />
|
||||
Site last modified May 31 2023</font>
|
||||
</td>
|
||||
<td width="20%">
|
||||
|
||||
|
@ -77,13 +77,12 @@
|
|||
</tr>
|
||||
</table>
|
||||
<ul id="versionlist">
|
||||
<li>Version 5.2.5 improves Bash, Batch, F#, and VB.</li>
|
||||
<li>Version 5.2.4 improves C++ and GDScript.</li>
|
||||
<li>Version 5.2.3 improves Makefile, Ruby, and YAML.</li>
|
||||
<li>Version 5.2.2 improves C++, Matlab, Modula-3, Python, and X12.</li>
|
||||
<li>Version 5.2.1 improves Batch, F#, Markdown, and PowerShell.</li>
|
||||
<li>Version 5.2.0 improves PowerShell and R.</li>
|
||||
<li>Version 5.1.9 improves Julia and Properties.</li>
|
||||
<li>Version 5.1.8 improves F#, MS SQL, PowerShell, and Visual Prolog.</li>
|
||||
</ul>
|
||||
<ul id="menu">
|
||||
<li id="remote1"><a href="https://www.scintilla.org/SciTEImage.html">Screenshot</a></li>
|
||||
|
|
|
@ -26,9 +26,9 @@
|
|||
<table bgcolor="#CCCCCC" width="100%" cellspacing="0" cellpadding="8" border="0">
|
||||
<tr>
|
||||
<td>
|
||||
<font size="4"> <a href="https://www.scintilla.org/lexilla524.zip">
|
||||
<font size="4"> <a href="https://www.scintilla.org/lexilla525.zip">
|
||||
Windows</a>
|
||||
<a href="https://www.scintilla.org/lexilla524.tgz">
|
||||
<a href="https://www.scintilla.org/lexilla525.tgz">
|
||||
GTK/Linux</a>
|
||||
</font>
|
||||
</td>
|
||||
|
@ -42,7 +42,7 @@
|
|||
containing very few restrictions.
|
||||
</p>
|
||||
<h3>
|
||||
Release 5.2.4
|
||||
Release 5.2.5
|
||||
</h3>
|
||||
<h4>
|
||||
Source Code
|
||||
|
@ -50,8 +50,8 @@
|
|||
The source code package contains all of the source code for Lexilla but no binary
|
||||
executable code and is available in
|
||||
<ul>
|
||||
<li><a href="https://www.scintilla.org/lexilla524.zip">zip format</a> (1.2M) commonly used on Windows</li>
|
||||
<li><a href="https://www.scintilla.org/lexilla524.tgz">tgz format</a> (0.9M) commonly used on Linux and compatible operating systems</li>
|
||||
<li><a href="https://www.scintilla.org/lexilla525.zip">zip format</a> (1.2M) commonly used on Windows</li>
|
||||
<li><a href="https://www.scintilla.org/lexilla525.tgz">tgz format</a> (0.9M) commonly used on Linux and compatible operating systems</li>
|
||||
</ul>
|
||||
Instructions for building on both Windows and Linux are included in the readme file.
|
||||
<h4>
|
||||
|
|
|
@ -585,6 +585,63 @@
|
|||
</tr>
|
||||
</table>
|
||||
<h2>Releases</h2>
|
||||
<h3>
|
||||
<a href="https://www.scintilla.org/lexilla525.zip">Release 5.2.5</a>
|
||||
</h3>
|
||||
<ul>
|
||||
<li>
|
||||
Released 31 May 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: implement highlighting inside quoted elements and here-docs.
|
||||
Controlled with properties lexer.bash.styling.inside.string, lexer.bash.styling.inside.backticks,
|
||||
lexer.bash.styling.inside.parameter, and lexer.bash.styling.inside.heredoc.
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/issues/154">Issue #154</a>,
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/issues/153">Issue #153</a>,
|
||||
<a href="https://sourceforge.net/p/scintilla/feature-requests/1033/">Feature #1033</a>.
|
||||
</li>
|
||||
<li>
|
||||
Bash: add property lexer.bash.command.substitution to choose how to style command substitutions.
|
||||
0 → SCE_SH_BACKTICKS;
|
||||
1 → surrounding "$(" and ")" as operators and contents styled as bash code;
|
||||
2 → use distinct styles (base style + 64) for contents.
|
||||
Choice (2) is a provisional feature and details may change before it is finalized.
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/issues/153">Issue #153</a>.
|
||||
</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>
|
||||
Bash: fix single character special parameters like $? by limiting style.
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/issues/154">Issue #154</a>.
|
||||
</li>
|
||||
<li>
|
||||
Bash: treat "$$" as special parameter and end scalars before "$".
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/issues/154">Issue #154</a>.
|
||||
</li>
|
||||
<li>
|
||||
Bash: treat "<<" in arithmetic contexts as left bitwise shift operator instead of here-doc.
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/issues/137">Issue #137</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>
|
||||
F#: Lex interpolated verbatim strings as verbatim.
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/issues/156">Issue #156</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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -676,6 +676,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
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
@ -770,14 +770,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('$');
|
||||
|
|
|
@ -84,12 +84,15 @@ struct OptionSetFSharp : public OptionSet<OptionsFSharp> {
|
|||
|
||||
struct FSharpString {
|
||||
Sci_Position startPos = INVALID_POSITION;
|
||||
int startChar = '"';
|
||||
int startChar = '"', nextChar = '\0';
|
||||
constexpr bool HasLength() const {
|
||||
return startPos > INVALID_POSITION;
|
||||
}
|
||||
constexpr bool CanInterpolate() const {
|
||||
return startChar == '$';
|
||||
return startChar == '$' || (startChar == '@' && nextChar == '$');
|
||||
}
|
||||
constexpr bool IsVerbatim() const {
|
||||
return startChar == '@' || (startChar == '$' && nextChar == '@');
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -207,8 +210,9 @@ inline bool MatchQuotedExpressionEnd(const StyleContext &cxt) {
|
|||
return (cxt.ch == '>' && cxt.chPrev == '@');
|
||||
}
|
||||
|
||||
inline bool MatchStringStart(const StyleContext &cxt) {
|
||||
return (cxt.ch == '"' || cxt.Match('@', '"') || cxt.Match('$', '"') || cxt.Match('`', '`'));
|
||||
inline bool MatchStringStart(StyleContext &cxt) {
|
||||
return (cxt.ch == '"' || cxt.Match("@\"") || cxt.Match("$\"") || cxt.Match("@$\"") || cxt.Match("$@\"") ||
|
||||
cxt.Match("``"));
|
||||
}
|
||||
|
||||
inline bool FollowsEscapedBackslash(StyleContext &cxt) {
|
||||
|
@ -223,21 +227,21 @@ inline bool MatchStringEnd(StyleContext &cxt, const FSharpString &fsStr) {
|
|||
// end of quoted identifier?
|
||||
((cxt.ch == '`' && cxt.chPrev == '`') ||
|
||||
// end of literal or interpolated triple-quoted string?
|
||||
((fsStr.startChar == '"' || (fsStr.CanInterpolate() && cxt.chPrev != '$')) &&
|
||||
((fsStr.startChar == '"' || (fsStr.CanInterpolate() && !(fsStr.IsVerbatim() || cxt.chPrev == '$'))) &&
|
||||
cxt.MatchIgnoreCase("\"\"\"")) ||
|
||||
// end of verbatim string?
|
||||
(fsStr.startChar == '@' &&
|
||||
(fsStr.IsVerbatim() &&
|
||||
// embedded quotes must be in pairs
|
||||
cxt.ch == '"' && cxt.chNext != '"' &&
|
||||
(cxt.chPrev != '"' || (cxt.chPrev == '"' &&
|
||||
(cxt.chPrev != '"' ||
|
||||
// empty verbatim string?
|
||||
(cxt.GetRelative(-2) == '@' ||
|
||||
((cxt.GetRelative(-2) == '@' || cxt.GetRelative(-2) == '$') ||
|
||||
// pair of quotes at end of string?
|
||||
(cxt.GetRelative(-2) == '"' && cxt.GetRelative(-3) != '@'))))))) ||
|
||||
(cxt.GetRelative(-2) == '"' && !(cxt.GetRelative(-3) == '@' || cxt.GetRelative(-3) == '$'))))))) ||
|
||||
(!fsStr.HasLength() && cxt.ch == '"' &&
|
||||
((cxt.chPrev != '\\' || (cxt.GetRelative(-2) == '\\' && !FollowsEscapedBackslash(cxt))) ||
|
||||
// treat backslashes as char literals in verbatim strings
|
||||
(fsStr.startChar == '@' && cxt.chPrev == '\\')));
|
||||
(fsStr.IsVerbatim() && cxt.chPrev == '\\')));
|
||||
}
|
||||
|
||||
inline bool MatchCharacterStart(StyleContext &cxt) {
|
||||
|
@ -251,8 +255,8 @@ inline bool CanEmbedQuotes(StyleContext &cxt) {
|
|||
// - https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/strings
|
||||
// - https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/interpolated-strings#syntax
|
||||
// - https://fsharp.org/specs/language-spec/4.1/FSharpSpec-4.1-latest.pdf#page=25&zoom=auto,-98,600
|
||||
return cxt.MatchIgnoreCase("$\"\"\"") || cxt.MatchIgnoreCase("\"\"\"") || cxt.Match('@', '"') ||
|
||||
cxt.Match('`', '`');
|
||||
return cxt.Match("$\"\"\"") || cxt.Match("\"\"\"") || cxt.Match("@$\"\"\"") || cxt.Match("$@\"\"\"") ||
|
||||
cxt.Match('@', '"') || cxt.Match('`', '`');
|
||||
}
|
||||
|
||||
inline bool IsLineEnd(StyleContext &cxt, const Sci_Position offset) {
|
||||
|
@ -407,6 +411,7 @@ void SCI_METHOD LexerFSharp::Lex(Sci_PositionU start, Sci_Position length, int i
|
|||
state = SCE_FSHARP_CHARACTER;
|
||||
} else if (MatchStringStart(sc)) {
|
||||
fsStr.startChar = sc.ch;
|
||||
fsStr.nextChar = sc.chNext;
|
||||
fsStr.startPos = INVALID_POSITION;
|
||||
if (CanEmbedQuotes(sc)) {
|
||||
// double quotes after this position should be non-terminating
|
||||
|
@ -414,7 +419,7 @@ void SCI_METHOD LexerFSharp::Lex(Sci_PositionU start, Sci_Position length, int i
|
|||
}
|
||||
if (sc.ch == '`') {
|
||||
state = SCE_FSHARP_QUOT_IDENTIFIER;
|
||||
} else if (sc.ch == '@') {
|
||||
} else if (fsStr.IsVerbatim()) {
|
||||
state = SCE_FSHARP_VERBATIM;
|
||||
} else {
|
||||
state = SCE_FSHARP_STRING;
|
||||
|
@ -542,7 +547,7 @@ void SCI_METHOD LexerFSharp::Lex(Sci_PositionU start, Sci_Position length, int i
|
|||
} else if (sc.chNext == '}') {
|
||||
isInterpolated = false;
|
||||
sc.Forward();
|
||||
state = SCE_FSHARP_STRING;
|
||||
state = fsStr.IsVerbatim() ? SCE_FSHARP_VERBATIM : SCE_FSHARP_STRING;
|
||||
}
|
||||
} else if (fsStr.CanInterpolate() && sc.ch == '{') {
|
||||
isInterpolated = true;
|
||||
|
@ -607,7 +612,7 @@ void SCI_METHOD LexerFSharp::Lex(Sci_PositionU start, Sci_Position length, int i
|
|||
!(setFormatFlags.Contains(sc.ch) || IsADigit(sc.ch)) ||
|
||||
(setFormatFlags.Contains(sc.ch) && sc.ch == sc.chNext))) {
|
||||
colorSpan++;
|
||||
state = (fsStr.startChar == '@') ? SCE_FSHARP_VERBATIM : SCE_FSHARP_STRING;
|
||||
state = fsStr.IsVerbatim() ? SCE_FSHARP_VERBATIM : SCE_FSHARP_STRING;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -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 --[[ ... ]],
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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_) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -41,24 +41,24 @@ sys.path.append(str(thisPath.parent.parent.parent / "scintilla" / "scripts"))
|
|||
|
||||
import FileGenerator
|
||||
|
||||
neutralEncoding = "cp437" # Each byte value is valid in cp437
|
||||
neutralEncoding = "iso-8859-1" # Each byte value is valid in iso-8859-1
|
||||
|
||||
def FindModules(lexFile):
|
||||
modules = []
|
||||
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}")
|
||||
|
@ -67,7 +67,7 @@ def FindModules(lexFile):
|
|||
modules.append([parts[1], parts[2], lexerName])
|
||||
partLine = ""
|
||||
else:
|
||||
partLine = partLine + l
|
||||
partLine = partLine + line
|
||||
return modules
|
||||
|
||||
def FindLexersInXcode(xCodeProject):
|
||||
|
@ -113,11 +113,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 \
|
||||
|
@ -130,36 +130,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()):
|
||||
|
@ -171,15 +171,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]
|
||||
|
@ -194,19 +194,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
|
||||
|
|
|
@ -105,7 +105,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"
|
||||
|
@ -116,7 +116,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)
|
||||
|
||||
|
|
|
@ -101,7 +101,7 @@
|
|||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>gdi32.lib;imm32.lib;ole32.lib;oleaut32.lib;msimg32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalDependencies>gdi32.lib;imm32.lib;ole32.lib;oleaut32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<CETCompat>true</CETCompat>
|
||||
<ModuleDefinitionFile>Lexilla.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>5.2.4</string>
|
||||
<string>5.2.5</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
|
|
|
@ -853,7 +853,7 @@
|
|||
buildSettings = {
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 5.2.4;
|
||||
CURRENT_PROJECT_VERSION = 5.2.5;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = 4F446KW87E;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
|
@ -880,7 +880,7 @@
|
|||
buildSettings = {
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 5.2.4;
|
||||
CURRENT_PROJECT_VERSION = 5.2.5;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = 4F446KW87E;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
|
||||
#include <windows.h>
|
||||
|
||||
#define VERSION_LEXILLA "5.2.4"
|
||||
#define VERSION_WORDS 5, 2, 4, 0
|
||||
#define VERSION_LEXILLA "5.2.5"
|
||||
#define VERSION_WORDS 5, 2, 5, 0
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION VERSION_WORDS
|
||||
|
|
|
@ -131,8 +131,12 @@ $(LEXILLA): $(LEXILLA_OBJS) $(VERSION_RESOURCE)
|
|||
$(CXX) $(CXXFLAGS) $(LDFLAGS) $^ -o $@
|
||||
|
||||
$(LIBLEXILLA): $(LEXILLA_OBJS)
|
||||
ifeq ($(SHAREDEXTENSION),dylib)
|
||||
libtool -static -o $@ $^
|
||||
else
|
||||
$(AR) rc $@ $^
|
||||
$(RANLIB) $@
|
||||
endif
|
||||
|
||||
# Automatically generate dependencies for most files with "make deps"
|
||||
include deps.mak
|
||||
|
|
|
@ -885,9 +885,10 @@ bool TestFile(const std::filesystem::path &path, const PropertyMap &propertyMap)
|
|||
}
|
||||
|
||||
if (propertyMap.GetPropertyValue("testlexers.list.styles").value_or(0)) {
|
||||
std::vector<bool> used(0x80);
|
||||
std::vector<bool> used(0x100);
|
||||
for (Sci_Position pos = 0; pos < pdoc->Length(); pos++) {
|
||||
const unsigned style = pdoc->StyleAt(pos);
|
||||
const unsigned char uchStyle = pdoc->StyleAt(pos);
|
||||
const unsigned style = uchStyle;
|
||||
used.at(style) = true;
|
||||
}
|
||||
PrintRanges(used);
|
||||
|
|
|
@ -0,0 +1,60 @@
|
|||
# Enumerate all styles: 0 to 13
|
||||
|
||||
# comment=2
|
||||
|
||||
# whitespace=0
|
||||
# w
|
||||
|
||||
# error=1
|
||||
0#0000
|
||||
|
||||
# number=3
|
||||
123
|
||||
|
||||
# keyword=4
|
||||
set
|
||||
|
||||
# double-quoted-string=5
|
||||
"string"
|
||||
|
||||
# single-quoted-string=6
|
||||
'str'
|
||||
|
||||
# operator=7
|
||||
+
|
||||
|
||||
# identifier=8
|
||||
identifier
|
||||
|
||||
# scalar=9
|
||||
$scalar
|
||||
$?Status
|
||||
|
||||
# parameter-expansion=10
|
||||
${parameter}
|
||||
|
||||
# back-ticks=11
|
||||
`ls`
|
||||
|
||||
# here-doc-delimiter=12, here-doc=13
|
||||
<<EOF
|
||||
Here-doc.
|
||||
EOF
|
||||
|
||||
# other quoted types are mapped to current classes
|
||||
|
||||
# double-quoted-string=5
|
||||
$"string"
|
||||
$'str'
|
||||
|
||||
# back-ticks=11
|
||||
$`ls`
|
||||
$(ls)
|
||||
|
||||
# Use substyles
|
||||
|
||||
# Substyled identifier=128
|
||||
map
|
||||
|
||||
# Substyled scalar=129
|
||||
$CWD
|
|
@ -0,0 +1,61 @@
|
|||
0 400 0 # Enumerate all styles: 0 to 13
|
||||
1 400 0
|
||||
0 400 0 # comment=2
|
||||
1 400 0
|
||||
2 400 0 + # whitespace=0
|
||||
0 401 0 | # w
|
||||
1 400 0
|
||||
0 400 0 # error=1
|
||||
0 400 0 0#0000
|
||||
1 400 0
|
||||
0 400 0 # number=3
|
||||
0 400 0 123
|
||||
1 400 0
|
||||
0 400 0 # keyword=4
|
||||
0 400 0 set
|
||||
1 400 0
|
||||
0 400 0 # double-quoted-string=5
|
||||
0 400 0 "string"
|
||||
1 400 0
|
||||
0 400 0 # single-quoted-string=6
|
||||
0 400 0 'str'
|
||||
1 400 0
|
||||
0 400 0 # operator=7
|
||||
0 400 0 +
|
||||
1 400 0
|
||||
0 400 0 # identifier=8
|
||||
0 400 0 identifier
|
||||
1 400 0
|
||||
0 400 0 # scalar=9
|
||||
0 400 0 $scalar
|
||||
0 400 0 $?Status
|
||||
1 400 0
|
||||
0 400 0 # parameter-expansion=10
|
||||
0 400 0 ${parameter}
|
||||
1 400 0
|
||||
0 400 0 # back-ticks=11
|
||||
0 400 0 `ls`
|
||||
1 400 0
|
||||
0 400 0 # here-doc-delimiter=12, here-doc=13
|
||||
2 400 0 + <<EOF
|
||||
0 401 0 | Here-doc.
|
||||
0 401 0 | EOF
|
||||
1 400 0
|
||||
0 400 0 # other quoted types are mapped to current classes
|
||||
1 400 0
|
||||
0 400 0 # double-quoted-string=5
|
||||
0 400 0 $"string"
|
||||
0 400 0 $'str'
|
||||
1 400 0
|
||||
0 400 0 # back-ticks=11
|
||||
0 400 0 $`ls`
|
||||
0 400 0 $(ls)
|
||||
1 400 0
|
||||
0 400 0 # Use substyles
|
||||
1 400 0
|
||||
0 400 0 # Substyled identifier=128
|
||||
0 400 0 map
|
||||
1 400 0
|
||||
0 400 0 # Substyled scalar=129
|
||||
0 400 0 $CWD
|
||||
0 400 0
|
|
@ -0,0 +1,60 @@
|
|||
{2}# Enumerate all styles: 0 to 13{0}
|
||||
|
||||
{2}# comment=2{0}
|
||||
|
||||
{2}# whitespace=0{0}
|
||||
{2}# w{0}
|
||||
|
||||
{2}# error=1{0}
|
||||
{1}0#0000{0}
|
||||
|
||||
{2}# number=3{0}
|
||||
{3}123{0}
|
||||
|
||||
{2}# keyword=4{0}
|
||||
{4}set{0}
|
||||
|
||||
{2}# double-quoted-string=5{0}
|
||||
{5}"string"{0}
|
||||
|
||||
{2}# single-quoted-string=6{0}
|
||||
{6}'str'{0}
|
||||
|
||||
{2}# operator=7{0}
|
||||
{7}+{0}
|
||||
|
||||
{2}# identifier=8{0}
|
||||
{8}identifier{0}
|
||||
|
||||
{2}# scalar=9{0}
|
||||
{9}$scalar{0}
|
||||
{9}$?{8}Status{0}
|
||||
|
||||
{2}# parameter-expansion=10{0}
|
||||
{10}${parameter}{0}
|
||||
|
||||
{2}# back-ticks=11{0}
|
||||
{11}`ls`{0}
|
||||
|
||||
{2}# here-doc-delimiter=12, here-doc=13{0}
|
||||
{12}<<EOF{13}
|
||||
Here-doc.
|
||||
EOF{0}
|
||||
|
||||
{2}# other quoted types are mapped to current classes{0}
|
||||
|
||||
{2}# double-quoted-string=5{0}
|
||||
{5}$"string"{0}
|
||||
{5}$'str'{0}
|
||||
|
||||
{2}# back-ticks=11{0}
|
||||
{11}$`ls`{0}
|
||||
{11}$(ls){0}
|
||||
|
||||
{2}# Use substyles{0}
|
||||
|
||||
{2}# Substyled identifier=128{0}
|
||||
{128}map{0}
|
||||
|
||||
{2}# Substyled scalar=129{0}
|
||||
{129}$CWD{0}
|
|
@ -0,0 +1,77 @@
|
|||
# Nested elements and other complex cases
|
||||
|
||||
# String with backtick inclusion
|
||||
"x`ls`"
|
||||
# Nested string
|
||||
"x`ls "*.c"`"
|
||||
# Not terminated at first "
|
||||
"x`ls" # "`" #
|
||||
|
||||
# String with command inclusion
|
||||
"x$(ls)"
|
||||
|
||||
# Nested command
|
||||
$(ls -la$(ls *.c))
|
||||
|
||||
# Check strings and backticks in command
|
||||
echo $('ls' "." `ls` $'.' $".")
|
||||
|
||||
# $( not terminated by ) if contains unterminated string
|
||||
$('x) # ') #
|
||||
$("x) # ") #
|
||||
$(`x) # `) # Bash doesn't like this
|
||||
$($'x) # ') #
|
||||
$($"x) # ") #
|
||||
|
||||
# Parameter expansion
|
||||
var=abcdef
|
||||
sub=abc
|
||||
rep='& '
|
||||
echo ${var/$sub/"${rep}}"} #
|
||||
|
||||
# '$' in variable
|
||||
echo $$PID
|
||||
echo $var${var}
|
||||
|
||||
# Here-doc with internal elements
|
||||
cat <<EOF
|
||||
$scalar
|
||||
${var}
|
||||
$((1+2))
|
||||
$(pwd)
|
||||
`pwd`
|
||||
EOF
|
||||
|
||||
# Quoted delimiter treats here-doc as simple string
|
||||
cat <<"EOF"
|
||||
$scalar
|
||||
${var}
|
||||
$((1+2))
|
||||
$(pwd)
|
||||
`pwd`
|
||||
EOF
|
||||
|
||||
# Escaped same as quoted
|
||||
cat <<\EOF
|
||||
$scalar
|
||||
EOF
|
||||
|
||||
# Nesting
|
||||
echo "$((1 + 2))" #
|
||||
echo "$[1 + 2]" #
|
||||
|
||||
# Multiple nesting levels
|
||||
$(ls -la$(ls $(c) $'*.c' ` $(${s})`))
|
||||
|
||||
# Multi-line
|
||||
$(ls |
|
||||
more)
|
||||
|
||||
$(
|
||||
`x`
|
||||
"x"
|
||||
`ls`
|
||||
$'x'
|
||||
$"x"
|
||||
)
|
||||
#end -- checks termination of previous
|
|
@ -0,0 +1,78 @@
|
|||
0 400 0 # Nested elements and other complex cases
|
||||
1 400 0
|
||||
0 400 0 # String with backtick inclusion
|
||||
0 400 0 "x`ls`"
|
||||
0 400 0 # Nested string
|
||||
0 400 0 "x`ls "*.c"`"
|
||||
0 400 0 # Not terminated at first "
|
||||
0 400 0 "x`ls" # "`" #
|
||||
1 400 0
|
||||
0 400 0 # String with command inclusion
|
||||
0 400 0 "x$(ls)"
|
||||
1 400 0
|
||||
0 400 0 # Nested command
|
||||
0 400 0 $(ls -la$(ls *.c))
|
||||
1 400 0
|
||||
0 400 0 # Check strings and backticks in command
|
||||
0 400 0 echo $('ls' "." `ls` $'.' $".")
|
||||
1 400 0
|
||||
0 400 0 # $( not terminated by ) if contains unterminated string
|
||||
0 400 0 $('x) # ') #
|
||||
0 400 0 $("x) # ") #
|
||||
0 400 0 $(`x) # `) # Bash doesn't like this
|
||||
0 400 0 $($'x) # ') #
|
||||
0 400 0 $($"x) # ") #
|
||||
1 400 0
|
||||
0 400 0 # Parameter expansion
|
||||
0 400 0 var=abcdef
|
||||
0 400 0 sub=abc
|
||||
0 400 0 rep='& '
|
||||
0 400 0 echo ${var/$sub/"${rep}}"} #
|
||||
1 400 0
|
||||
0 400 0 # '$' in variable
|
||||
0 400 0 echo $$PID
|
||||
0 400 0 echo $var${var}
|
||||
1 400 0
|
||||
0 400 0 # Here-doc with internal elements
|
||||
2 400 0 + cat <<EOF
|
||||
0 401 0 | $scalar
|
||||
0 401 0 | ${var}
|
||||
0 401 0 | $((1+2))
|
||||
0 401 0 | $(pwd)
|
||||
0 401 0 | `pwd`
|
||||
0 401 0 | EOF
|
||||
1 400 0
|
||||
0 400 0 # Quoted delimiter treats here-doc as simple string
|
||||
2 400 0 + cat <<"EOF"
|
||||
0 401 0 | $scalar
|
||||
0 401 0 | ${var}
|
||||
0 401 0 | $((1+2))
|
||||
0 401 0 | $(pwd)
|
||||
0 401 0 | `pwd`
|
||||
0 401 0 | EOF
|
||||
1 400 0
|
||||
0 400 0 # Escaped same as quoted
|
||||
2 400 0 + cat <<\EOF
|
||||
0 401 0 | $scalar
|
||||
0 401 0 | EOF
|
||||
1 400 0
|
||||
0 400 0 # Nesting
|
||||
0 400 0 echo "$((1 + 2))" #
|
||||
0 400 0 echo "$[1 + 2]" #
|
||||
1 400 0
|
||||
0 400 0 # Multiple nesting levels
|
||||
0 400 0 $(ls -la$(ls $(c) $'*.c' ` $(${s})`))
|
||||
1 400 0
|
||||
0 400 0 # Multi-line
|
||||
0 400 0 $(ls |
|
||||
0 400 0 more)
|
||||
1 400 0
|
||||
0 400 0 $(
|
||||
0 400 0 `x`
|
||||
0 400 0 "x"
|
||||
0 400 0 `ls`
|
||||
0 400 0 $'x'
|
||||
0 400 0 $"x"
|
||||
0 400 0 )
|
||||
0 400 0 #end -- checks termination of previous
|
||||
0 400 0
|
|
@ -0,0 +1,77 @@
|
|||
{2}# Nested elements and other complex cases{0}
|
||||
|
||||
{2}# String with backtick inclusion{0}
|
||||
{5}"x`ls`"{0}
|
||||
{2}# Nested string{0}
|
||||
{5}"x`ls "*.c"`"{0}
|
||||
{2}# Not terminated at first "{0}
|
||||
{5}"x`ls" # "`"{0} {2}#{0}
|
||||
|
||||
{2}# String with command inclusion{0}
|
||||
{5}"x$(ls)"{0}
|
||||
|
||||
{2}# Nested command{0}
|
||||
{11}$(ls -la$(ls *.c)){0}
|
||||
|
||||
{2}# Check strings and backticks in command{0}
|
||||
{4}echo{0} {11}$('ls' "." `ls` $'.' $"."){0}
|
||||
|
||||
{2}# $( not terminated by ) if contains unterminated string{0}
|
||||
{11}$('x) # '){0} {2}#{0}
|
||||
{11}$("x) # "){0} {2}#{0}
|
||||
{11}$(`x) # `){0} {2}# Bash doesn't like this{0}
|
||||
{11}$($'x) # '){0} {2}#{0}
|
||||
{11}$($"x) # "){0} {2}#{0}
|
||||
|
||||
{2}# Parameter expansion{0}
|
||||
{8}var{7}={8}abcdef{0}
|
||||
{8}sub{7}={8}abc{0}
|
||||
{8}rep{7}={6}'& '{0}
|
||||
{4}echo{0} {10}${var/$sub/"${rep}}"}{0} {2}#{0}
|
||||
|
||||
{2}# '$' in variable{0}
|
||||
{4}echo{0} {9}$${8}PID{0}
|
||||
{4}echo{0} {9}$var{10}${var}{0}
|
||||
|
||||
{2}# Here-doc with internal elements{0}
|
||||
{4}cat{0} {12}<<EOF{13}
|
||||
$scalar
|
||||
${var}
|
||||
$((1+2))
|
||||
$(pwd)
|
||||
`pwd`
|
||||
EOF{0}
|
||||
|
||||
{2}# Quoted delimiter treats here-doc as simple string{0}
|
||||
{4}cat{0} {12}<<"EOF"{13}
|
||||
$scalar
|
||||
${var}
|
||||
$((1+2))
|
||||
$(pwd)
|
||||
`pwd`
|
||||
EOF{0}
|
||||
|
||||
{2}# Escaped same as quoted{0}
|
||||
{4}cat{0} {12}<<\EOF{13}
|
||||
$scalar
|
||||
EOF{0}
|
||||
|
||||
{2}# Nesting{0}
|
||||
{4}echo{0} {5}"$((1 + 2))"{0} {2}#{0}
|
||||
{4}echo{0} {5}"$[1 + 2]"{0} {2}#{0}
|
||||
|
||||
{2}# Multiple nesting levels{0}
|
||||
{11}$(ls -la$(ls $(c) $'*.c' ` $(${s})`)){0}
|
||||
|
||||
{2}# Multi-line{0}
|
||||
{11}$(ls |
|
||||
more){0}
|
||||
|
||||
{11}$(
|
||||
`x`
|
||||
"x"
|
||||
`ls`
|
||||
$'x'
|
||||
$"x"
|
||||
){0}
|
||||
{2}#end -- checks termination of previous{0}
|
|
@ -0,0 +1,26 @@
|
|||
# Use lexer.bash.command.substitution=2 to style command substitution
|
||||
# so that both the scope of the command and the internal structure are visible.
|
||||
|
||||
# Nested command
|
||||
$(ls -la$(ls *.c))
|
||||
|
||||
# Check strings and backticks in command
|
||||
echo $('ls' "." `ls` $'.' $".")
|
||||
|
||||
PROJECT_DIR=$(rlwrap -S "Enter source path: " -e '' -i -o cat)
|
||||
|
||||
# Multiple nesting levels
|
||||
$(ls -la$(ls $(c) $'*.c' ` $(${s})`))
|
||||
|
||||
# Multi-line
|
||||
$(ls |
|
||||
more)
|
||||
|
||||
$(
|
||||
`x`
|
||||
"x"
|
||||
`ls`
|
||||
$'x'
|
||||
$"x"
|
||||
)
|
||||
#end -- checks termination of previous
|
|
@ -0,0 +1,27 @@
|
|||
2 400 0 + # Use lexer.bash.command.substitution=2 to style command substitution
|
||||
0 401 0 | # so that both the scope of the command and the internal structure are visible.
|
||||
1 400 0
|
||||
0 400 0 # Nested command
|
||||
0 400 0 $(ls -la$(ls *.c))
|
||||
1 400 0
|
||||
0 400 0 # Check strings and backticks in command
|
||||
0 400 0 echo $('ls' "." `ls` $'.' $".")
|
||||
1 400 0
|
||||
0 400 0 PROJECT_DIR=$(rlwrap -S "Enter source path: " -e '' -i -o cat)
|
||||
1 400 0
|
||||
0 400 0 # Multiple nesting levels
|
||||
0 400 0 $(ls -la$(ls $(c) $'*.c' ` $(${s})`))
|
||||
1 400 0
|
||||
0 400 0 # Multi-line
|
||||
0 400 0 $(ls |
|
||||
0 400 0 more)
|
||||
1 400 0
|
||||
0 400 0 $(
|
||||
0 400 0 `x`
|
||||
0 400 0 "x"
|
||||
0 400 0 `ls`
|
||||
0 400 0 $'x'
|
||||
0 400 0 $"x"
|
||||
0 400 0 )
|
||||
0 400 0 #end -- checks termination of previous
|
||||
0 400 0
|
|
@ -0,0 +1,26 @@
|
|||
{2}# Use lexer.bash.command.substitution=2 to style command substitution{0}
|
||||
{2}# so that both the scope of the command and the internal structure are visible.{0}
|
||||
|
||||
{2}# Nested command{0}
|
||||
{71}$({72}ls{64} {71}-{72}la{71}$({72}ls{64} {71}*.{72}c{71})){0}
|
||||
|
||||
{2}# Check strings and backticks in command{0}
|
||||
{4}echo{0} {71}$({70}'ls'{64} {69}"."{64} {75}`ls`{64} {69}$'.'{64} {69}$"."{71}){0}
|
||||
|
||||
{8}PROJECT_DIR{7}={71}$({72}rlwrap{64} {72}-S{64} {69}"Enter source path: "{64} {72}-e{64} {70}''{64} {71}-{72}i{64} {72}-o{64} {72}cat{71}){0}
|
||||
|
||||
{2}# Multiple nesting levels{0}
|
||||
{71}$({72}ls{64} {71}-{72}la{71}$({72}ls{64} {71}$({72}c{71}){64} {69}$'*.c'{64} {75}` $(${s})`{71})){0}
|
||||
|
||||
{2}# Multi-line{0}
|
||||
{71}$({72}ls{64} {71}|{64}
|
||||
{72}more{71}){0}
|
||||
|
||||
{71}$({64}
|
||||
{75}`x`{64}
|
||||
{69}"x"{64}
|
||||
{75}`ls`{64}
|
||||
{69}$'x'{64}
|
||||
{69}$"x"{64}
|
||||
{71}){0}
|
||||
{2}#end -- checks termination of previous{0}
|
|
@ -0,0 +1,77 @@
|
|||
# Nested elements and other complex cases
|
||||
|
||||
# String with backtick inclusion
|
||||
"x`ls`"
|
||||
# Nested string
|
||||
"x`ls "*.c"`"
|
||||
# Not terminated at first "
|
||||
"x`ls" # "`" #
|
||||
|
||||
# String with command inclusion
|
||||
"x$(ls)"
|
||||
|
||||
# Nested command
|
||||
$(ls -la$(ls *.c))
|
||||
|
||||
# Check strings and backticks in command
|
||||
echo $('ls' "." `ls` $'.' $".")
|
||||
|
||||
# $( not terminated by ) if contains unterminated string
|
||||
$('x) # ') #
|
||||
$("x) # ") #
|
||||
$(`x) # `) # Bash doesn't like this
|
||||
$($'x) # ') #
|
||||
$($"x) # ") #
|
||||
|
||||
# Parameter expansion
|
||||
var=abcdef
|
||||
sub=abc
|
||||
rep='& '
|
||||
echo ${var/$sub/"${rep}}"} #
|
||||
|
||||
# '$' in variable
|
||||
echo $$PID
|
||||
echo $var${var}
|
||||
|
||||
# Here-doc with internal elements
|
||||
cat <<EOF
|
||||
$scalar
|
||||
${var}
|
||||
$((1+2))
|
||||
$(pwd)
|
||||
`pwd`
|
||||
EOF
|
||||
|
||||
# Quoted delimiter treats here-doc as simple string
|
||||
cat <<"EOF"
|
||||
$scalar
|
||||
${var}
|
||||
$((1+2))
|
||||
$(pwd)
|
||||
`pwd`
|
||||
EOF
|
||||
|
||||
# Escaped same as quoted
|
||||
cat <<\EOF
|
||||
$scalar
|
||||
EOF
|
||||
|
||||
# Nesting
|
||||
echo "$((1 + 2))" #
|
||||
echo "$[1 + 2]" #
|
||||
|
||||
# Multiple nesting levels
|
||||
$(ls -la$(ls $(c) $'*.c' ` $(${s})`))
|
||||
|
||||
# Multi-line
|
||||
$(ls |
|
||||
more)
|
||||
|
||||
$(
|
||||
`x`
|
||||
"x"
|
||||
`ls`
|
||||
$'x'
|
||||
$"x"
|
||||
)
|
||||
#end -- checks termination of previous
|
|
@ -0,0 +1,78 @@
|
|||
0 400 0 # Nested elements and other complex cases
|
||||
1 400 0
|
||||
0 400 0 # String with backtick inclusion
|
||||
0 400 0 "x`ls`"
|
||||
0 400 0 # Nested string
|
||||
0 400 0 "x`ls "*.c"`"
|
||||
0 400 0 # Not terminated at first "
|
||||
0 400 0 "x`ls" # "`" #
|
||||
1 400 0
|
||||
0 400 0 # String with command inclusion
|
||||
0 400 0 "x$(ls)"
|
||||
1 400 0
|
||||
0 400 0 # Nested command
|
||||
0 400 0 $(ls -la$(ls *.c))
|
||||
1 400 0
|
||||
0 400 0 # Check strings and backticks in command
|
||||
0 400 0 echo $('ls' "." `ls` $'.' $".")
|
||||
1 400 0
|
||||
0 400 0 # $( not terminated by ) if contains unterminated string
|
||||
0 400 0 $('x) # ') #
|
||||
0 400 0 $("x) # ") #
|
||||
0 400 0 $(`x) # `) # Bash doesn't like this
|
||||
0 400 0 $($'x) # ') #
|
||||
0 400 0 $($"x) # ") #
|
||||
1 400 0
|
||||
0 400 0 # Parameter expansion
|
||||
0 400 0 var=abcdef
|
||||
0 400 0 sub=abc
|
||||
0 400 0 rep='& '
|
||||
0 400 0 echo ${var/$sub/"${rep}}"} #
|
||||
1 400 0
|
||||
0 400 0 # '$' in variable
|
||||
0 400 0 echo $$PID
|
||||
0 400 0 echo $var${var}
|
||||
1 400 0
|
||||
0 400 0 # Here-doc with internal elements
|
||||
2 400 0 + cat <<EOF
|
||||
0 401 0 | $scalar
|
||||
0 401 0 | ${var}
|
||||
0 401 0 | $((1+2))
|
||||
0 401 0 | $(pwd)
|
||||
0 401 0 | `pwd`
|
||||
0 401 0 | EOF
|
||||
1 400 0
|
||||
0 400 0 # Quoted delimiter treats here-doc as simple string
|
||||
2 400 0 + cat <<"EOF"
|
||||
0 401 0 | $scalar
|
||||
0 401 0 | ${var}
|
||||
0 401 0 | $((1+2))
|
||||
0 401 0 | $(pwd)
|
||||
0 401 0 | `pwd`
|
||||
0 401 0 | EOF
|
||||
1 400 0
|
||||
0 400 0 # Escaped same as quoted
|
||||
2 400 0 + cat <<\EOF
|
||||
0 401 0 | $scalar
|
||||
0 401 0 | EOF
|
||||
1 400 0
|
||||
0 400 0 # Nesting
|
||||
0 400 0 echo "$((1 + 2))" #
|
||||
0 400 0 echo "$[1 + 2]" #
|
||||
1 400 0
|
||||
0 400 0 # Multiple nesting levels
|
||||
0 400 0 $(ls -la$(ls $(c) $'*.c' ` $(${s})`))
|
||||
1 400 0
|
||||
0 400 0 # Multi-line
|
||||
0 400 0 $(ls |
|
||||
0 400 0 more)
|
||||
1 400 0
|
||||
0 400 0 $(
|
||||
0 400 0 `x`
|
||||
0 400 0 "x"
|
||||
0 400 0 `ls`
|
||||
0 400 0 $'x'
|
||||
0 400 0 $"x"
|
||||
0 400 0 )
|
||||
0 400 0 #end -- checks termination of previous
|
||||
0 400 0
|
|
@ -0,0 +1,77 @@
|
|||
{2}# Nested elements and other complex cases{0}
|
||||
|
||||
{2}# String with backtick inclusion{0}
|
||||
{5}"x{11}`ls`{5}"{0}
|
||||
{2}# Nested string{0}
|
||||
{5}"x{11}`ls {5}"*.c"{11}`{5}"{0}
|
||||
{2}# Not terminated at first "{0}
|
||||
{5}"x{11}`ls{5}" # "{11}`{5}"{0} {2}#{0}
|
||||
|
||||
{2}# String with command inclusion{0}
|
||||
{5}"x{7}$({8}ls{7}){5}"{0}
|
||||
|
||||
{2}# Nested command{0}
|
||||
{7}$({8}ls{0} {7}-{8}la{7}$({8}ls{0} {7}*.{8}c{7})){0}
|
||||
|
||||
{2}# Check strings and backticks in command{0}
|
||||
{4}echo{0} {7}$({6}'ls'{0} {5}"."{0} {11}`ls`{0} {5}$'.'{0} {5}$"."{7}){0}
|
||||
|
||||
{2}# $( not terminated by ) if contains unterminated string{0}
|
||||
{7}$({6}'x) # '{7}){0} {2}#{0}
|
||||
{7}$({5}"x) # "{7}){0} {2}#{0}
|
||||
{7}$({11}`x) # `{7}){0} {2}# Bash doesn't like this{0}
|
||||
{7}$({5}$'x) # '{7}){0} {2}#{0}
|
||||
{7}$({5}$"x) # "{7}){0} {2}#{0}
|
||||
|
||||
{2}# Parameter expansion{0}
|
||||
{8}var{7}={8}abcdef{0}
|
||||
{8}sub{7}={8}abc{0}
|
||||
{8}rep{7}={6}'& '{0}
|
||||
{4}echo{0} {10}${var/{9}$sub{10}/{5}"{10}${rep}{5}}"{10}}{0} {2}#{0}
|
||||
|
||||
{2}# '$' in variable{0}
|
||||
{4}echo{0} {9}$${8}PID{0}
|
||||
{4}echo{0} {9}$var{10}${var}{0}
|
||||
|
||||
{2}# Here-doc with internal elements{0}
|
||||
{4}cat{0} {12}<<EOF{13}
|
||||
{9}$scalar{13}
|
||||
{10}${var}{13}
|
||||
{7}$(({3}1{7}+{3}2{7})){13}
|
||||
{7}$({8}pwd{7}){13}
|
||||
{11}`pwd`{13}
|
||||
EOF{0}
|
||||
|
||||
{2}# Quoted delimiter treats here-doc as simple string{0}
|
||||
{4}cat{0} {12}<<"EOF"{13}
|
||||
$scalar
|
||||
${var}
|
||||
$((1+2))
|
||||
$(pwd)
|
||||
`pwd`
|
||||
EOF{0}
|
||||
|
||||
{2}# Escaped same as quoted{0}
|
||||
{4}cat{0} {12}<<\EOF{13}
|
||||
$scalar
|
||||
EOF{0}
|
||||
|
||||
{2}# Nesting{0}
|
||||
{4}echo{0} {5}"{7}$(({3}1{0} {7}+{0} {3}2{7})){5}"{0} {2}#{0}
|
||||
{4}echo{0} {5}"{7}$[{3}1{0} {7}+{0} {3}2{7}]{5}"{0} {2}#{0}
|
||||
|
||||
{2}# Multiple nesting levels{0}
|
||||
{7}$({8}ls{0} {7}-{8}la{7}$({8}ls{0} {7}$({8}c{7}){0} {5}$'*.c'{0} {11}` {7}$({10}${s}{7}){11}`{7})){0}
|
||||
|
||||
{2}# Multi-line{0}
|
||||
{7}$({8}ls{0} {7}|{0}
|
||||
{8}more{7}){0}
|
||||
|
||||
{7}$({0}
|
||||
{11}`x`{0}
|
||||
{5}"x"{0}
|
||||
{11}`ls`{0}
|
||||
{5}$'x'{0}
|
||||
{5}$"x"{0}
|
||||
{7}){0}
|
||||
{2}#end -- checks termination of previous{0}
|
|
@ -2,3 +2,25 @@ lexer.*.bsh=bash
|
|||
fold=1
|
||||
fold.comment=1
|
||||
keywords.*.bsh=case cat do done echo else esac exit export fi find for if in set then while
|
||||
|
||||
# Can use substyles for identifiers and scalars
|
||||
substyles.bash.8=1
|
||||
substylewords.8.1.*.bsh=map
|
||||
substyles.bash.9=1
|
||||
substylewords.9.1.*.bsh=CWD
|
||||
|
||||
lexer.bash.styling.inside.string=0
|
||||
lexer.bash.styling.inside.backticks=0
|
||||
lexer.bash.styling.inside.parameter=0
|
||||
lexer.bash.styling.inside.heredoc=0
|
||||
lexer.bash.command.substitution=0
|
||||
|
||||
match NestedStyledInside.bsh
|
||||
lexer.bash.styling.inside.string=1
|
||||
lexer.bash.styling.inside.backticks=1
|
||||
lexer.bash.styling.inside.parameter=1
|
||||
lexer.bash.styling.inside.heredoc=1
|
||||
lexer.bash.command.substitution=1
|
||||
|
||||
match NestedRich.bsh
|
||||
lexer.bash.command.substitution=2
|
||||
|
|
|
@ -31,4 +31,9 @@ while read -r f; do
|
|||
} >> $OUT_FILE
|
||||
done
|
||||
|
||||
# Issue 137, should be shift but here-doc was detected
|
||||
echo $(( x << END ))
|
||||
pwd
|
||||
END
|
||||
|
||||
INVALID_NUMBER=0#0000
|
||||
|
|
|
@ -31,5 +31,10 @@
|
|||
0 402 0 | } >> $OUT_FILE
|
||||
0 401 0 | done
|
||||
1 400 0
|
||||
0 400 0 # Issue 137, should be shift but here-doc was detected
|
||||
0 400 0 echo $(( x << END ))
|
||||
0 400 0 pwd
|
||||
0 400 0 END
|
||||
1 400 0
|
||||
0 400 0 INVALID_NUMBER=0#0000
|
||||
0 400 0
|
|
@ -31,4 +31,9 @@ EOF{0}
|
|||
{7}}{0} {7}>>{0} {9}$OUT_FILE{0}
|
||||
{4}done{0}
|
||||
|
||||
{2}# Issue 137, should be shift but here-doc was detected{0}
|
||||
{4}echo{0} {7}$(({0} {8}x{0} {7}<<{0} {8}END{0} {7})){0}
|
||||
{8}pwd{0}
|
||||
{8}END{0}
|
||||
|
||||
{8}INVALID_NUMBER{7}={1}0#0000{0}
|
||||
|
|
|
@ -54,6 +54,7 @@ echo %%0
|
|||
echo %%%0
|
||||
echo %%%%~-abcd
|
||||
|
||||
:TEST that after label style works
|
||||
:: Bug 2304: "::" comments not recognised when second command on line
|
||||
Set /A xxx=%xxx%+1 & :: Increment
|
||||
Set /A xxx=%xxx%+1 & ::Increment
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
0 400 0 echo %%%0
|
||||
0 400 0 echo %%%%~-abcd
|
||||
0 400 0
|
||||
0 400 0 :TEST that after label style works
|
||||
0 400 0 :: Bug 2304: "::" comments not recognised when second command on line
|
||||
0 400 0 Set /A xxx=%xxx%+1 & :: Increment
|
||||
0 400 0 Set /A xxx=%xxx%+1 & ::Increment
|
||||
|
|
|
@ -54,6 +54,7 @@ rem 'echo' is word=2, 'a' is default=0
|
|||
{2}echo{0} %%{6}%0{0}
|
||||
{2}echo{0} %%{6}%%~-abcd{0}
|
||||
|
||||
{3}:TEST{8} that after label style works
|
||||
{1}:: Bug 2304: "::" comments not recognised when second command on line
|
||||
{2}Set{0} /A xxx{7}={6}%xxx%{7}+{0}1 {7}&{0} {1}:: Increment
|
||||
{2}Set{0} /A xxx{7}={6}%xxx%{7}+{0}1 {7}&{0} {1}::Increment
|
||||
|
|
|
@ -6,30 +6,46 @@ let x = List.fold (*) 24.5 [ 1.; 2.; 3. ]
|
|||
printfn "Speed: %.2f m/s" x
|
||||
printfn $"Speed: %.2f{x} m/s"
|
||||
printfn $"Speed: {x:f2} m/s"
|
||||
printfn $@"Speed: %.2f{x} m/s"
|
||||
printfn @$"Speed: {x:f2} m/s"
|
||||
|
||||
// expect " 147%"
|
||||
printfn """%% increase:% .0F%% over last year""" x
|
||||
printfn $"""%% increase:% .0F{x}%% over last year"""
|
||||
printfn $"""%% increase:{x / 100.,5:P0} over last year"""
|
||||
printfn $@"""%% increase:% .0F{x}%% over last year"""
|
||||
printfn @$"""%% increase:{x / 100.,5:P0} over last year"""
|
||||
|
||||
// expect "1.5E+002"
|
||||
// NB: units should look like text even without a space
|
||||
printfn @"Time: %-0.1Esecs" x
|
||||
printfn $"Time: %-0.1E{x}secs"
|
||||
printfn $"Time: {x:E1}secs"
|
||||
printfn $@"Time: %-0.1E{x}secs"
|
||||
printfn @$"Time: {x:E1}secs"
|
||||
|
||||
// expect "\" +147\""
|
||||
printfn @"""Temp: %+12.3g K""" x
|
||||
printfn $"""{'"'}Temp: %+12.3g{x} K{'"'}"""
|
||||
printfn $"""{'"'}Temp: {'+',9}{x:g3} K{'"'}"""
|
||||
printfn $@"""Temp: %+12.3g{x} K"""
|
||||
printfn @$"""Temp: {'+',9}{x:g3} K"""
|
||||
|
||||
// Since F# 6.0
|
||||
printfn @"%B" 0b1_000_000
|
||||
printfn "%B" "\x40"B.[0]
|
||||
printfn $"""%B{'\064'B}"""
|
||||
printfn $@"""%B{0b1_000_000}"""
|
||||
printfn @$"""%B{'\064'B}"""
|
||||
|
||||
// These don't work
|
||||
printfn ``%.2f`` x
|
||||
printfn $"%.2f" x
|
||||
printfn $@"%.2f" x
|
||||
printfn @$"%.2f" x
|
||||
printfn $"%.2f {x}"
|
||||
printfn $@"%.2f {x}"
|
||||
printfn @$"%.2f {x}"
|
||||
printfn $"""%.2f {x}"""
|
||||
printfn $@"""%.2f {x}"""
|
||||
printfn @$"""%.2f {x}"""
|
||||
|
|
|
@ -6,31 +6,47 @@
|
|||
0 400 400 printfn "Speed: %.2f m/s" x
|
||||
0 400 400 printfn $"Speed: %.2f{x} m/s"
|
||||
0 400 400 printfn $"Speed: {x:f2} m/s"
|
||||
0 400 400 printfn $@"Speed: %.2f{x} m/s"
|
||||
0 400 400 printfn @$"Speed: {x:f2} m/s"
|
||||
1 400 400
|
||||
0 400 400 // expect " 147%"
|
||||
0 400 400 printfn """%% increase:% .0F%% over last year""" x
|
||||
0 400 400 printfn $"""%% increase:% .0F{x}%% over last year"""
|
||||
0 400 400 printfn $"""%% increase:{x / 100.,5:P0} over last year"""
|
||||
0 400 400 printfn $@"""%% increase:% .0F{x}%% over last year"""
|
||||
0 400 400 printfn @$"""%% increase:{x / 100.,5:P0} over last year"""
|
||||
1 400 400
|
||||
2 400 401 + // expect "1.5E+002"
|
||||
0 401 400 | // NB: units should look like text even without a space
|
||||
0 400 400 printfn @"Time: %-0.1Esecs" x
|
||||
0 400 400 printfn $"Time: %-0.1E{x}secs"
|
||||
0 400 400 printfn $"Time: {x:E1}secs"
|
||||
0 400 400 printfn $@"Time: %-0.1E{x}secs"
|
||||
0 400 400 printfn @$"Time: {x:E1}secs"
|
||||
1 400 400
|
||||
0 400 400 // expect "\" +147\""
|
||||
0 400 400 printfn @"""Temp: %+12.3g K""" x
|
||||
0 400 400 printfn $"""{'"'}Temp: %+12.3g{x} K{'"'}"""
|
||||
0 400 400 printfn $"""{'"'}Temp: {'+',9}{x:g3} K{'"'}"""
|
||||
0 400 400 printfn $@"""Temp: %+12.3g{x} K"""
|
||||
0 400 400 printfn @$"""Temp: {'+',9}{x:g3} K"""
|
||||
1 400 400
|
||||
0 400 400 // Since F# 6.0
|
||||
0 400 400 printfn @"%B" 0b1_000_000
|
||||
0 400 400 printfn "%B" "\x40"B.[0]
|
||||
0 400 400 printfn $"""%B{'\064'B}"""
|
||||
0 400 400 printfn $@"""%B{0b1_000_000}"""
|
||||
0 400 400 printfn @$"""%B{'\064'B}"""
|
||||
1 400 400
|
||||
0 400 400 // These don't work
|
||||
0 400 400 printfn ``%.2f`` x
|
||||
0 400 400 printfn $"%.2f" x
|
||||
0 400 400 printfn $@"%.2f" x
|
||||
0 400 400 printfn @$"%.2f" x
|
||||
0 400 400 printfn $"%.2f {x}"
|
||||
0 400 400 printfn $@"%.2f {x}"
|
||||
0 400 400 printfn @$"%.2f {x}"
|
||||
0 400 400 printfn $"""%.2f {x}"""
|
||||
0 400 400 printfn $@"""%.2f {x}"""
|
||||
0 400 400 printfn @$"""%.2f {x}"""
|
||||
1 400 400
|
|
@ -6,30 +6,46 @@
|
|||
{2}printfn{0} {15}"Speed: {19}%.2f{15} m/s"{0} {6}x{0}
|
||||
{2}printfn{0} {15}$"Speed: {19}%.2f{15}{x} m/s"{0}
|
||||
{2}printfn{0} {15}$"Speed: {x{19}:f2{15}} m/s"{0}
|
||||
{2}printfn{0} {16}$@"Speed: {19}%.2f{16}{x} m/s"{0}
|
||||
{2}printfn{0} {16}@$"Speed: {x{19}:f2{16}} m/s"{0}
|
||||
|
||||
{9}// expect " 147%"{0}
|
||||
{2}printfn{0} {15}"""{19}%%{15} increase:{19}% .0F%%{15} over last year"""{0} {6}x{0}
|
||||
{2}printfn{0} {15}$"""{19}%%{15} increase:{19}% .0F{15}{x}{19}%%{15} over last year"""{0}
|
||||
{2}printfn{0} {15}$"""{19}%%{15} increase:{x / 100.{19},5:P0{15}} over last year"""{0}
|
||||
{2}printfn{0} {16}$@"""{19}%%{16} increase:{19}% .0F{16}{x}{19}%%{16} over last year"""{0}
|
||||
{2}printfn{0} {16}@$"""{19}%%{16} increase:{x / 100.{19},5:P0{16}} over last year"""{0}
|
||||
|
||||
{9}// expect "1.5E+002"{0}
|
||||
{9}// NB: units should look like text even without a space{0}
|
||||
{2}printfn{0} {16}@"Time: {19}%-0.1E{16}secs"{0} {6}x{0}
|
||||
{2}printfn{0} {15}$"Time: {19}%-0.1E{15}{x}secs"{0}
|
||||
{2}printfn{0} {15}$"Time: {x{19}:E1{15}}secs"{0}
|
||||
{2}printfn{0} {16}$@"Time: {19}%-0.1E{16}{x}secs"{0}
|
||||
{2}printfn{0} {16}@$"Time: {x{19}:E1{16}}secs"{0}
|
||||
|
||||
{9}// expect "\" +147\""{0}
|
||||
{2}printfn{0} {16}@"""Temp: {19}%+12.3g{16} K"""{0} {6}x{0}
|
||||
{2}printfn{0} {15}$"""{'"'}Temp: {19}%+12.3g{15}{x} K{'"'}"""{0}
|
||||
{2}printfn{0} {15}$"""{'"'}Temp: {'+'{19},9{15}}{x{19}:g3{15}} K{'"'}"""{0}
|
||||
{2}printfn{0} {16}$@"""Temp: {19}%+12.3g{16}{x} K"""{0}
|
||||
{2}printfn{0} {16}@$"""Temp: {'+'{19},9{16}}{x{19}:g3{16}} K"""{0}
|
||||
|
||||
{9}// Since F# 6.0{0}
|
||||
{2}printfn{0} {16}@"{19}%B{16}"{0} {13}0b1_000_000{0}
|
||||
{2}printfn{0} {15}"{19}%B{15}"{0} {15}"\x40"B{0}.{12}[{13}0{12}]{0}
|
||||
{2}printfn{0} {15}$"""{19}%B{15}{'\064'B}"""{0}
|
||||
{2}printfn{0} {16}$@"""{19}%B{16}{0b1_000_000}"""{0}
|
||||
{2}printfn{0} {16}@$"""{19}%B{16}{'\064'B}"""{0}
|
||||
|
||||
{9}// These don't work{0}
|
||||
{2}printfn{0} {7}``%.2f``{0} {6}x{0}
|
||||
{2}printfn{0} {15}$"%.2f"{0} {6}x{0}
|
||||
{2}printfn{0} {16}$@"%.2f"{0} {6}x{0}
|
||||
{2}printfn{0} {16}@$"%.2f"{0} {6}x{0}
|
||||
{2}printfn{0} {15}$"%.2f {x}"{0}
|
||||
{2}printfn{0} {16}$@"%.2f {x}"{0}
|
||||
{2}printfn{0} {16}@$"%.2f {x}"{0}
|
||||
{2}printfn{0} {15}$"""%.2f {x}"""{0}
|
||||
{2}printfn{0} {16}$@"""%.2f {x}"""{0}
|
||||
{2}printfn{0} {16}@$"""%.2f {x}"""{0}
|
||||
|
|
|
@ -1,2 +1,3 @@
|
|||
lexer.*.vb=vb
|
||||
lexer.vb.strings.multiline=1
|
||||
keywords.*.vb=as dim or string
|
||||
|
|
|
@ -3,6 +3,9 @@ Dim a As String = "hello, world"
|
|||
Dim b As String = "hello world"
|
||||
Dim c As String = "Joe said ""Hello"" to me"
|
||||
Dim d As String = "\\\\server\\share\\file.txt"
|
||||
Dim e As String = "The brown fox
|
||||
jumps over
|
||||
the lazy dog"
|
||||
' Character
|
||||
""C "c"C "cc"C
|
||||
' Date
|
||||
|
|
|
@ -3,6 +3,9 @@
|
|||
0 400 0 Dim b As String = "hello world"
|
||||
0 400 0 Dim c As String = "Joe said ""Hello"" to me"
|
||||
0 400 0 Dim d As String = "\\\\server\\share\\file.txt"
|
||||
0 400 0 Dim e As String = "The brown fox
|
||||
0 400 0 jumps over
|
||||
0 400 0 the lazy dog"
|
||||
0 400 0 ' Character
|
||||
0 400 0 ""C "c"C "cc"C
|
||||
0 400 0 ' Date
|
||||
|
|
|
@ -3,6 +3,9 @@
|
|||
{3}Dim{0} {7}b{0} {3}As{0} {3}String{0} {6}={0} {4}"hello world"{0}
|
||||
{3}Dim{0} {7}c{0} {3}As{0} {3}String{0} {6}={0} {4}"Joe said ""Hello"" to me"{0}
|
||||
{3}Dim{0} {7}d{0} {3}As{0} {3}String{0} {6}={0} {4}"\\\\server\\share\\file.txt"{0}
|
||||
{3}Dim{0} {7}e{0} {3}As{0} {3}String{0} {6}={0} {4}"The brown fox
|
||||
jumps over
|
||||
the lazy dog"{0}
|
||||
{1}' Character
|
||||
{4}""C{0} {4}"c"C{0} {4}"cc"C{0}
|
||||
{1}' Date
|
||||
|
|
|
@ -1 +1 @@
|
|||
524
|
||||
525
|
|
@ -15,7 +15,7 @@
|
|||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>5.3.4</string>
|
||||
<string>5.3.5</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
|
|
|
@ -573,7 +573,8 @@
|
|||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 5.3.4;
|
||||
CURRENT_PROJECT_VERSION = 5.3.5;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
|
@ -635,7 +636,8 @@
|
|||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 5.3.4;
|
||||
CURRENT_PROJECT_VERSION = 5.3.5;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
|
@ -665,7 +667,8 @@
|
|||
CODE_SIGN_IDENTITY = "-";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 5.3.4;
|
||||
CURRENT_PROJECT_VERSION = 5.3.5;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
|
@ -699,7 +702,8 @@
|
|||
CODE_SIGN_IDENTITY = "-";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 5.3.4;
|
||||
CURRENT_PROJECT_VERSION = 5.3.5;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
|
|
|
@ -0,0 +1,71 @@
|
|||
// File to suppress cppcheck warnings for files that will not be fixed.
|
||||
// Does not suppress warnings where an additional occurrence of the warning may be of interest.
|
||||
|
||||
// Coding style is to use assignments in constructor when there are many
|
||||
// members to initialize or the initialization is complex or has comments.
|
||||
useInitializationList
|
||||
|
||||
// These may be interesting but its not clear without examining each instance closely
|
||||
// Would have to ensure that any_of/all_of has same early/late exits as current code and
|
||||
// produces same result on empty collections
|
||||
useStlAlgorithm
|
||||
|
||||
// Written with variable for consistency
|
||||
knownArgument:scintilla/src/SparseVector.h
|
||||
|
||||
// The cast converts from 'unsigned char ' to 'char' so isn't unused.
|
||||
// Redundant code: Found unused cast of expression 'leadByte'
|
||||
constStatement:scintilla/src/Document.cxx
|
||||
|
||||
// Some non-explicit constructors are used for conversions or are private to lexers
|
||||
noExplicitConstructor
|
||||
|
||||
// MarginView access to all bits is safe and is better defined in later versions of C++
|
||||
shiftTooManyBitsSigned:scintilla/src/MarginView.cxx
|
||||
|
||||
// DLL entry points are unused inside Scintilla
|
||||
unusedFunction:scintilla/win32/ScintillaDLL.cxx
|
||||
|
||||
// ScintillaDocument is providing an API and there are no consumers of the API inside Scintilla
|
||||
unusedFunction:scintilla/qt/ScintillaEdit/ScintillaDocument.cpp
|
||||
|
||||
// Doesn't understand changing dropWentOutside in Editor
|
||||
knownConditionTrueFalse:scintilla/qt/ScintillaEditBase/ScintillaQt.cpp
|
||||
knownConditionTrueFalse:scintilla/win32/ScintillaWin.cxx
|
||||
|
||||
// G_DEFINE_TYPE is too complex to pass to cppcheck
|
||||
unknownMacro:scintilla/gtk/PlatGTK.cxx
|
||||
|
||||
// maskSmooth set depending on preprocessor allowing Wayland definition
|
||||
badBitmaskCheck:scintilla/gtk/ScintillaGTK.cxx
|
||||
|
||||
// Difficult to test accessibility so don't change
|
||||
constVariable:scintilla/gtk/ScintillaGTKAccessible.cxx
|
||||
|
||||
// Have no way of testing ScintillaEdit so don't fix even simple warnings
|
||||
cstyleCast:scintilla/qt/ScintillaEdit/ScintillaEdit.cpp
|
||||
shadowFunction:scintilla/qt/ScintillaEdit/ScintillaEdit.cpp
|
||||
|
||||
// cppcheck fails emit from Qt
|
||||
shadowFunction:scintilla/qt/ScintillaEditBase/ScintillaQt.cpp
|
||||
shadowFunction:scintilla/qt/ScintillaEditBase/ScintillaEditBase.cpp
|
||||
|
||||
// moc_ files show #error as they are not built with standard context
|
||||
preprocessorErrorDirective:scintilla/qt/*.cpp
|
||||
|
||||
// moc_ files are not understood by cppcheck
|
||||
noValidConfiguration
|
||||
|
||||
// The performance cost of by-value passing is often small and using a reference decreases
|
||||
// code legibility.
|
||||
passedByValue
|
||||
|
||||
// Suppress everything in catch.hpp as won't be changing
|
||||
*:scintilla/test/unit/catch.hpp
|
||||
|
||||
// Checks for moves move to variables that are not read but the moved from is checked
|
||||
unreadVariable:scintilla/test/unit/*.cxx
|
||||
accessMoved:scintilla/test/unit/*.cxx
|
||||
|
||||
// cppcheck fails REQUIRE from Catch
|
||||
comparisonOfFuncReturningBoolError:scintilla/test/unit/*.cxx
|
|
@ -148,10 +148,6 @@
|
|||
GTK sample which can be used to find bugs or prototype new features.</a><br />
|
||||
<a class="jump" href="Lexer.txt">A detailed description of how to write a lexer, including a
|
||||
discussion of folding</a>.<br />
|
||||
<a class="jump" href="http://sphere.sourceforge.net/flik/docs/scintilla-container_lexer.html">
|
||||
How to implement a lexer in the container</a>.<br />
|
||||
<a class="jump" href="http://sphere.sourceforge.net/flik/docs/scintilla-folding.html">
|
||||
How to implement folding</a>.<br />
|
||||
<a class="jump" href="https://github.com/geany/geany/files/5204338/Scintilla-var.aq-Tutorial.pdf">
|
||||
Beginner's Guide to lexing and folding</a>.<br />
|
||||
The <a class="jump" href="SciCoding.html">coding style</a> used in Scintilla and SciTE is
|
||||
|
@ -4883,7 +4879,74 @@ struct Sci_TextToFindFull {
|
|||
A windowed IME <code>SC_IME_WINDOWED</code> (0) may be more similar in appearance and
|
||||
behaviour to the IME in other applications.
|
||||
An inline IME <code>SC_IME_INLINE</code> (1) may work better with some Scintilla features such as
|
||||
rectangular and multiple selection.</p>
|
||||
rectangular and multiple selection, with IME interactions such as retrieve-surrounding or reconversion feature.</p>
|
||||
|
||||
<table class="standard" summary="IME input method">
|
||||
<caption>IME input method support (O=present, X=absent)</caption>
|
||||
<thead align="left">
|
||||
<tr>
|
||||
<th>IME input method</th>
|
||||
<th>Windows</th>
|
||||
<th>Gtk</th>
|
||||
<th>Qt</th>
|
||||
<th>macOS</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<tr>
|
||||
<th align="left"><code>SC_IME_WINDOWED</code></th>
|
||||
<td>O</td>
|
||||
<td>O</td>
|
||||
<td>X</td>
|
||||
<td>X</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th align="left"><code>SC_IME_INLINE</code></th>
|
||||
<td>O</td>
|
||||
<td>O</td>
|
||||
<td>O</td>
|
||||
<td>O</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p></p>
|
||||
|
||||
<table class="standard" summary="IME interaction">
|
||||
<caption>IME interaction support</caption>
|
||||
<thead align="left">
|
||||
<tr>
|
||||
<th>IME interaction</th>
|
||||
<th>Windows</th>
|
||||
<th>Gtk</th>
|
||||
<th>Qt</th>
|
||||
<th>macOS</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<tr>
|
||||
<th align="left">Retrieve Surrounding</th>
|
||||
<td>O</td>
|
||||
<td>O</td>
|
||||
<td>O</td>
|
||||
<td>O</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th align="left">Reconversion</th>
|
||||
<td>O</td>
|
||||
<td>O</td>
|
||||
<td>O</td>
|
||||
<td>O</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th align="left">Delete Surrounding</th>
|
||||
<td>O</td>
|
||||
<td>O</td>
|
||||
<td>X</td>
|
||||
<td>O</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<p>The windowed behaviour can be chosen with <code>SCI_SETIMEINTERACTION(SC_IME_WINDOWED)</code>
|
||||
and the inline behaviour with <code>SCI_SETIMEINTERACTION(SC_IME_INLINE)</code>.
|
||||
Scintilla may ignore this call in some cases. For example, the inline behaviour might only be supported for some languages.</p>
|
||||
|
|
|
@ -26,9 +26,9 @@
|
|||
<table bgcolor="#CCCCCC" width="100%" cellspacing="0" cellpadding="8" border="0">
|
||||
<tr>
|
||||
<td>
|
||||
<font size="4"> <a href="https://www.scintilla.org/scintilla534.zip">
|
||||
<font size="4"> <a href="https://www.scintilla.org/scintilla535.zip">
|
||||
Windows</a>
|
||||
<a href="https://www.scintilla.org/scintilla534.tgz">
|
||||
<a href="https://www.scintilla.org/scintilla535.tgz">
|
||||
GTK/Linux</a>
|
||||
</font>
|
||||
</td>
|
||||
|
@ -42,7 +42,7 @@
|
|||
containing very few restrictions.
|
||||
</p>
|
||||
<h3>
|
||||
Release 5.3.4
|
||||
Release 5.3.5
|
||||
</h3>
|
||||
<h4>
|
||||
Source Code
|
||||
|
@ -50,8 +50,8 @@
|
|||
The source code package contains all of the source code for Scintilla but no binary
|
||||
executable code and is available in
|
||||
<ul>
|
||||
<li><a href="https://www.scintilla.org/scintilla534.zip">zip format</a> (1.4M) commonly used on Windows</li>
|
||||
<li><a href="https://www.scintilla.org/scintilla534.tgz">tgz format</a> (1.3M) commonly used on Linux and compatible operating systems</li>
|
||||
<li><a href="https://www.scintilla.org/scintilla535.zip">zip format</a> (1.4M) commonly used on Windows</li>
|
||||
<li><a href="https://www.scintilla.org/scintilla535.tgz">tgz format</a> (1.3M) commonly used on Linux and compatible operating systems</li>
|
||||
</ul>
|
||||
Instructions for building on both Windows and Linux are included in the readme file.
|
||||
<h4>
|
||||
|
|
|
@ -576,9 +576,37 @@
|
|||
<td>Ferdinand Oeinck</td>
|
||||
<td>Michael Heath</td>
|
||||
<td>Enrico Tröger</td>
|
||||
</tr><tr>
|
||||
<td>Chengzhi Li</td>
|
||||
</tr>
|
||||
</table>
|
||||
<h2>Releases</h2>
|
||||
<h3>
|
||||
<a href="https://www.scintilla.org/scintilla535.zip">Release 5.3.5</a>
|
||||
</h3>
|
||||
<ul>
|
||||
<li>
|
||||
Released 31 May 2023.
|
||||
</li>
|
||||
<li>
|
||||
On Win32, implement IME context sensitivity with IMR_DOCUMENTFEED.
|
||||
<a href="https://sourceforge.net/p/scintilla/feature-requests/1310/">Feature #1310</a>.
|
||||
</li>
|
||||
<li>
|
||||
On Win32 remove dependence on MSIMG32.DLL by replacing AlphaBlend
|
||||
by GdiAlphaBlend.
|
||||
<a href="https://sourceforge.net/p/scintilla/bugs/1923/">Bug #1923</a>.
|
||||
</li>
|
||||
<li>
|
||||
On Qt, stop movement of IME candidate box.
|
||||
</li>
|
||||
<li>
|
||||
On Qt, report correct caret position within paragraph for IME retrieve surrounding text.
|
||||
</li>
|
||||
<li>
|
||||
On Qt for Cocoa, fix crash in entry of multi-character strings with IME.
|
||||
</li>
|
||||
</ul>
|
||||
<h3>
|
||||
<a href="https://www.scintilla.org/scintilla534.zip">Release 5.3.4</a>
|
||||
</h3>
|
||||
|
|
|
@ -29,6 +29,10 @@
|
|||
<h3>
|
||||
Ports and Bindings of Scintilla
|
||||
</h3>
|
||||
<p>
|
||||
<a href="https://github.com/mneuroth/SciTEQt">SciTEQt</a>
|
||||
is a port of the SciTE editor to the Qt QML/Quick platform.
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://orbitalquark.github.io/scinterm">Scinterm</a>
|
||||
is an implementation of Scintilla for the ncurses platform.
|
||||
|
@ -127,6 +131,14 @@
|
|||
<h3>
|
||||
Projects using Scintilla
|
||||
</h3>
|
||||
<p>
|
||||
<a href="https://github.com/dail8859/NotepadNext">Notepad Next</a>
|
||||
is a cross-platform reimplementation of Notepad++.
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://github.com/dolphinsmalltalk/Dolphin">Dolphin Smalltalk</a>
|
||||
is an implementation of the Smalltalk language for Windows.
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://github.com/simdsoft/x-studio/blob/master/README_EN.md">x-studio</a>
|
||||
is a powerful and very lightweight developer IDE that supports Lua debugging.
|
||||
|
|
|
@ -9,9 +9,16 @@
|
|||
<meta name="keywords" content="Scintilla, SciTE, Editing Component, Text Editor" />
|
||||
<meta name="Description"
|
||||
content="www.scintilla.org is the home of the Scintilla editing component and SciTE text editor application." />
|
||||
<meta name="Date.Modified" content="20230308" />
|
||||
<meta name="Date.Modified" content="20230531" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<style type="text/css">
|
||||
.logo {
|
||||
background: url(https://www.scintilla.org/ScintillaLogo.png) no-repeat;
|
||||
background-image: image-set(
|
||||
url(https://www.scintilla.org/ScintillaLogo.png) 1x,
|
||||
url(https://www.scintilla.org/ScintillaLogo2x.png) 2x );
|
||||
height:150px;
|
||||
}
|
||||
#versionlist {
|
||||
margin: 0;
|
||||
padding: .5em;
|
||||
|
@ -48,16 +55,13 @@
|
|||
<body bgcolor="#FFFFFF" text="#000000">
|
||||
<table bgcolor="#000000" width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td width="256">
|
||||
<img src="SciWord.jpg" height="78" width="256" alt="Scintilla" />
|
||||
</td>
|
||||
<td width="40%" align="left">
|
||||
<font color="#FFCC99" size="4"> A free source code editing component for Win32,
|
||||
GTK, and macOS</font>
|
||||
</td>
|
||||
<td width="40%" align="right">
|
||||
<font color="#FFCC99" size="3"> Release version 5.3.4<br />
|
||||
Site last modified March 8 2023</font>
|
||||
<font color="#FFCC99" size="3"> Release version 5.3.5<br />
|
||||
Site last modified May 31 2023</font>
|
||||
</td>
|
||||
<td width="20%">
|
||||
|
||||
|
@ -66,18 +70,18 @@
|
|||
</table>
|
||||
<table bgcolor="#000000" width="100%" cellspacing="0" cellpadding="0" border="0">
|
||||
<tr>
|
||||
<td width="100%" style="background: url(SciBreak.jpg) no-repeat;height:150px;">
|
||||
<td width="100%" class="logo">
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<ul id="versionlist">
|
||||
<li>Version 5.3.5 improves IME support on Win32 and Qt.</li>
|
||||
<li>Version 5.3.4 adds multithreaded wrapping.</li>
|
||||
<li>Version 5.3.3 fixes minor bugs in APIs and platform layers.</li>
|
||||
<li>Version 5.3.2 adds SCI_REPLACETARGETMINIMAL to modify text without marking unchanged start and end text in change history.</li>
|
||||
<li>Version 5.3.1 can represent invisible text with a character to simplify editing and provide summarized views.</li>
|
||||
<li>Version 5.3.0 adds change history.</li>
|
||||
<li>Version 5.2.4 fixes failures on GTK with multi-threaded layout.</li>
|
||||
</ul>
|
||||
<ul id="menu">
|
||||
<li id="remote1"><a href="https://www.scintilla.org/SciTEImage.html">Screenshot</a></li>
|
||||
|
|
|
@ -13,7 +13,7 @@ TEMPLATE = lib
|
|||
CONFIG += lib_bundle
|
||||
CONFIG += c++1z
|
||||
|
||||
VERSION = 5.3.4
|
||||
VERSION = 5.3.5
|
||||
|
||||
SOURCES += \
|
||||
ScintillaEdit.cpp \
|
||||
|
|
|
@ -268,8 +268,15 @@ void ScintillaEditBase::keyPressEvent(QKeyEvent *event)
|
|||
|
||||
QString text = event->text();
|
||||
if (input && !text.isEmpty() && text[0].isPrint()) {
|
||||
QByteArray utext = sqt->BytesForDocument(text);
|
||||
sqt->InsertCharacter(std::string_view(utext.data(), utext.size()), CharacterSource::DirectInput);
|
||||
const int strLen = text.length();
|
||||
for (int i = 0; i < strLen;) {
|
||||
const int ucWidth = text.at(i).isHighSurrogate() ? 2 : 1;
|
||||
const QString oneCharUTF16 = text.mid(i, ucWidth);
|
||||
const QByteArray oneChar = sqt->BytesForDocument(oneCharUTF16);
|
||||
|
||||
sqt->InsertCharacter(std::string_view(oneChar.data(), oneChar.length()), CharacterSource::DirectInput);
|
||||
i += ucWidth;
|
||||
}
|
||||
} else {
|
||||
event->ignore();
|
||||
}
|
||||
|
@ -478,8 +485,6 @@ static std::vector<int> MapImeIndicators(QInputMethodEvent *event)
|
|||
int indicator = IndicatorUnknown;
|
||||
switch (charFormat.underlineStyle()) {
|
||||
case QTextCharFormat::NoUnderline: // win32, linux
|
||||
indicator = IndicatorTarget;
|
||||
break;
|
||||
case QTextCharFormat::SingleUnderline: // osx
|
||||
case QTextCharFormat::DashUnderline: // win32, linux
|
||||
indicator = IndicatorInput;
|
||||
|
@ -535,6 +540,7 @@ void ScintillaEditBase::inputMethodEvent(QInputMethodEvent *event)
|
|||
}
|
||||
|
||||
sqt->view.imeCaretBlockOverride = false;
|
||||
preeditPos = -1; // reset not to interrupt Qt::ImCursorRectangle.
|
||||
|
||||
if (!event->commitString().isEmpty()) {
|
||||
const QString &commitStr = event->commitString();
|
||||
|
@ -561,6 +567,9 @@ void ScintillaEditBase::inputMethodEvent(QInputMethodEvent *event)
|
|||
sqt->ClearBeforeTentativeStart();
|
||||
sqt->pdoc->TentativeStart(); // TentativeActive() from now on.
|
||||
|
||||
// Fix candidate window position at the start of preeditString.
|
||||
preeditPos = sqt->CurrentPosition();
|
||||
|
||||
std::vector<int> imeIndicator = MapImeIndicators(event);
|
||||
|
||||
for (int i = 0; i < preeditStrLen;) {
|
||||
|
@ -592,10 +601,14 @@ void ScintillaEditBase::inputMethodEvent(QInputMethodEvent *event)
|
|||
sqt->view.imeCaretBlockOverride = true;
|
||||
}
|
||||
|
||||
// Set candidate box position for Qt::ImMicroFocus.
|
||||
preeditPos = sqt->CurrentPosition();
|
||||
// Set Candidate window position again at imeCaret when target input.
|
||||
const bool targetAny = std::any_of(imeIndicator.begin(), imeIndicator.end(), [](int i) noexcept {
|
||||
return i == IndicatorTarget;
|
||||
});
|
||||
if (targetAny)
|
||||
preeditPos = sqt->CurrentPosition();
|
||||
|
||||
sqt->EnsureCaretVisible();
|
||||
updateMicroFocus();
|
||||
}
|
||||
sqt->ShowCaretAtCurrentPosition();
|
||||
}
|
||||
|
@ -642,7 +655,7 @@ QVariant ScintillaEditBase::inputMethodQuery(Qt::InputMethodQuery query) const
|
|||
case Qt::ImCursorPosition:
|
||||
{
|
||||
const Scintilla::Position paraStart = sqt->pdoc->ParaUp(pos);
|
||||
return QVariant(static_cast<int>(pos - paraStart));
|
||||
return static_cast<int>(sqt->pdoc->CountUTF16(paraStart, pos));
|
||||
}
|
||||
|
||||
case Qt::ImSurroundingText:
|
||||
|
|
|
@ -12,7 +12,7 @@ TEMPLATE = lib
|
|||
CONFIG += lib_bundle
|
||||
CONFIG += c++1z
|
||||
|
||||
VERSION = 5.3.4
|
||||
VERSION = 5.3.5
|
||||
|
||||
SOURCES += \
|
||||
PlatQt.cpp \
|
||||
|
|
|
@ -5,7 +5,8 @@
|
|||
# Requires Python 2.7 or later
|
||||
|
||||
def sanitiseLine(line):
|
||||
if line[-1:] == '\n': line = line[:-1]
|
||||
if line[-1:] == '\n':
|
||||
line = line[:-1]
|
||||
if line.find("##") != -1:
|
||||
line = line[:line.find("##")]
|
||||
line = line.strip()
|
||||
|
|
|
@ -143,16 +143,16 @@ def UpdateLineInPlistFile(path, key, value):
|
|||
lines = []
|
||||
keyCurrent = ""
|
||||
with codecs.open(path, "rb", "utf-8") as f:
|
||||
for l in f.readlines():
|
||||
ls = l.strip()
|
||||
for line in f.readlines():
|
||||
ls = line.strip()
|
||||
if ls.startswith("<key>"):
|
||||
keyCurrent = ls.replace("<key>", "").replace("</key>", "")
|
||||
elif ls.startswith("<string>"):
|
||||
if keyCurrent == key:
|
||||
start, tag, rest = l.partition("<string>")
|
||||
start, tag, rest = line.partition("<string>")
|
||||
_val, etag, end = rest.partition("</string>")
|
||||
l = start + tag + value + etag + end
|
||||
lines.append(l)
|
||||
line = start + tag + value + etag + end
|
||||
lines.append(line)
|
||||
contents = "".join(lines)
|
||||
UpdateFile(path, contents)
|
||||
|
||||
|
@ -160,13 +160,13 @@ def UpdateLineInFile(path, linePrefix, lineReplace):
|
|||
lines = []
|
||||
updated = False
|
||||
with codecs.open(path, "r", "utf-8") as f:
|
||||
for l in f.readlines():
|
||||
l = l.rstrip()
|
||||
if not updated and l.startswith(linePrefix):
|
||||
for line in f.readlines():
|
||||
line = line.rstrip()
|
||||
if not updated and line.startswith(linePrefix):
|
||||
lines.append(lineReplace)
|
||||
updated = True
|
||||
else:
|
||||
lines.append(l)
|
||||
lines.append(line)
|
||||
if not updated:
|
||||
print(f"{path}:0: Can't find '{linePrefix}'")
|
||||
contents = lineEnd.join(lines) + lineEnd
|
||||
|
@ -176,7 +176,7 @@ def ReadFileAsList(path):
|
|||
"""Read all the lnes in the file and return as a list of strings without line ends.
|
||||
"""
|
||||
with codecs.open(path, "r", "utf-8") as f:
|
||||
return [l.rstrip('\n') for l in f]
|
||||
return [line.rstrip('\n') for line in f]
|
||||
|
||||
def UpdateFileFromLines(path, lines, lineEndToUse):
|
||||
"""Join the lines with the lineEndToUse then update file if the result is different.
|
||||
|
@ -194,19 +194,19 @@ def FindSectionInList(lines, markers):
|
|||
start = -1
|
||||
end = -1
|
||||
state = 0
|
||||
for i, l in enumerate(lines):
|
||||
if markers[0] in l:
|
||||
for i, line in enumerate(lines):
|
||||
if markers[0] in line:
|
||||
if markers[1]:
|
||||
state = 1
|
||||
else:
|
||||
start = i+1
|
||||
state = 2
|
||||
elif state == 1:
|
||||
if markers[1] in l:
|
||||
if markers[1] in line:
|
||||
start = i+1
|
||||
state = 2
|
||||
elif state == 2:
|
||||
if markers[2] in l:
|
||||
if markers[2] in line:
|
||||
end = i
|
||||
state = 3
|
||||
# Check that section was found
|
||||
|
|
|
@ -21,11 +21,11 @@ import itertools, string, sys
|
|||
|
||||
from FileGenerator import Regenerate
|
||||
|
||||
def contiguousRanges(l, diff):
|
||||
# l is s list of lists
|
||||
def contiguousRanges(ll, diff):
|
||||
# ll is a list of lists
|
||||
# group into lists where first element of each element differs by diff
|
||||
out = [[l[0]]]
|
||||
for s in l[1:]:
|
||||
out = [[ll[0]]]
|
||||
for s in ll[1:]:
|
||||
if s[0] != out[-1][-1][0] + diff:
|
||||
out.append([])
|
||||
out[-1].append(s)
|
||||
|
@ -99,7 +99,7 @@ def groupRanges(symmetrics):
|
|||
|
||||
rangeCoverage = list(flatten([range(r[0], r[0]+r[2]*r[3], r[3]) for r in rangeGroups]))
|
||||
|
||||
nonRanges = [(l, u) for l, u, _d in symmetrics if l not in rangeCoverage]
|
||||
nonRanges = [(x, u) for x, u, _d in symmetrics if x not in rangeCoverage]
|
||||
|
||||
return rangeGroups, nonRanges
|
||||
|
||||
|
|
|
@ -15,12 +15,12 @@ def HeaderFromIncludeLine(s):
|
|||
return s.strip()[1:].strip()[7:].strip()
|
||||
|
||||
def ExtractHeaders(file):
|
||||
with file.open(encoding="cp437") as infile:
|
||||
return [HeaderFromIncludeLine(l) for l in infile if IsHeader(l)]
|
||||
with file.open(encoding="iso-8859-1") as infile:
|
||||
return [HeaderFromIncludeLine(h) for h in infile if IsHeader(h)]
|
||||
|
||||
def ExtractWithPrefix(file, prefix):
|
||||
with file.open(encoding="cp437") as infile:
|
||||
return [l.strip()[len(prefix):] for l in infile if l.startswith(prefix)]
|
||||
with file.open(encoding="iso-8859-1") as infile:
|
||||
return [s.strip()[len(prefix):] for s in infile if s.startswith(prefix)]
|
||||
|
||||
def ExcludeName(name, excludes):
|
||||
return any(exclude in name for exclude in excludes)
|
||||
|
|
|
@ -34,7 +34,7 @@ def UpdateVersionNumbers(sci, root):
|
|||
UpdateLineInFile(root / "doc/ScintillaDownload.html", " Release",
|
||||
" Release " + sci.versionDotted)
|
||||
ReplaceREInFile(root / "doc/ScintillaDownload.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>" + sci.version,
|
||||
0)
|
||||
UpdateLineInFile(root / "doc/index.html",
|
||||
|
|
|
@ -25,15 +25,15 @@ def FindCredits(historyFile, removeLinks=True):
|
|||
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 removeLinks and "<a" in l:
|
||||
if stage == 1 and line.startswith("<td>"):
|
||||
credit = line[4:-5]
|
||||
if removeLinks and "<a" in line:
|
||||
title, _a, rest = credit.partition("<a href=")
|
||||
urlplus, _bracket, end = rest.partition(">")
|
||||
name = end.split("<")[0]
|
||||
|
@ -49,12 +49,12 @@ class ScintillaData:
|
|||
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" / "index.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
|
||||
# index.html, SciTE.html
|
||||
|
|
|
@ -108,14 +108,14 @@ void DrawArrow(Surface *surface, const PRectangle &rc, bool upArrow, ColourRGBA
|
|||
|
||||
constexpr XYPOSITION pixelMove = 0.0f;
|
||||
if (upArrow) { // Up arrow
|
||||
Point pts[] = {
|
||||
const Point pts[] = {
|
||||
Point(centreX - halfWidth + pixelMove, centreY + quarterWidth + 0.5f),
|
||||
Point(centreX + halfWidth + pixelMove, centreY + quarterWidth + 0.5f),
|
||||
Point(centreX + pixelMove, centreY - halfWidth + quarterWidth + 0.5f),
|
||||
};
|
||||
surface->Polygon(pts, std::size(pts), FillStroke(colourBG));
|
||||
} else { // Down arrow
|
||||
Point pts[] = {
|
||||
const Point pts[] = {
|
||||
Point(centreX - halfWidth + pixelMove, centreY - quarterWidth + 0.5f),
|
||||
Point(centreX + halfWidth + pixelMove, centreY - quarterWidth + 0.5f),
|
||||
Point(centreX + pixelMove, centreY + halfWidth - quarterWidth + 0.5f),
|
||||
|
|
|
@ -580,7 +580,7 @@ constexpr std::string_view complexCaseConversions =
|
|||
// Maximum length of a case conversion result is 6 bytes in UTF-8
|
||||
constexpr size_t maxConversionLength = 6;
|
||||
|
||||
class CaseConverter : public ICaseConverter {
|
||||
class CaseConverter final : public ICaseConverter {
|
||||
struct ConversionString {
|
||||
char conversion[maxConversionLength+1]{};
|
||||
};
|
||||
|
@ -605,7 +605,6 @@ class CaseConverter : public ICaseConverter {
|
|||
return character < other.character;
|
||||
}
|
||||
};
|
||||
CaseConversion conversion;
|
||||
typedef std::vector<CharacterConversion> CharacterToConversion;
|
||||
CharacterToConversion characterToConversion;
|
||||
// The parallel arrays
|
||||
|
@ -613,14 +612,7 @@ class CaseConverter : public ICaseConverter {
|
|||
std::vector<ConversionString> conversions;
|
||||
|
||||
public:
|
||||
explicit CaseConverter(CaseConversion conversion_) : conversion(conversion_) {
|
||||
};
|
||||
// Deleted so CaseConverter objects can not be copied.
|
||||
CaseConverter(const CaseConverter &) = delete;
|
||||
CaseConverter(CaseConverter &&) = delete;
|
||||
CaseConverter &operator=(const CaseConverter &) = delete;
|
||||
CaseConverter &operator=(CaseConverter &&) = delete;
|
||||
virtual ~CaseConverter() noexcept = default;
|
||||
CaseConverter() noexcept = default;
|
||||
bool Initialised() const noexcept {
|
||||
return !characters.empty();
|
||||
}
|
||||
|
@ -690,15 +682,13 @@ public:
|
|||
// Empty the original calculated data completely
|
||||
CharacterToConversion().swap(characterToConversion);
|
||||
}
|
||||
void AddSymmetric(int lower, int upper);
|
||||
void SetupConversions();
|
||||
void AddSymmetric(CaseConversion conversion, int lower, int upper);
|
||||
void SetupConversions(CaseConversion conversion);
|
||||
};
|
||||
|
||||
CaseConverter caseConvFold(CaseConversion::fold);
|
||||
CaseConverter caseConvUp(CaseConversion::upper);
|
||||
CaseConverter caseConvLow(CaseConversion::lower);
|
||||
CaseConverter caseConvList[3];
|
||||
|
||||
void CaseConverter::AddSymmetric(int lower, int upper) {
|
||||
void CaseConverter::AddSymmetric(CaseConversion conversion, int lower, int upper) {
|
||||
const int character = (conversion == CaseConversion::upper) ? lower : upper;
|
||||
const int source = (conversion == CaseConversion::upper) ? upper : lower;
|
||||
char converted[maxConversionLength+1]{};
|
||||
|
@ -720,7 +710,7 @@ std::string_view NextField(std::string_view &view) {
|
|||
return field;
|
||||
}
|
||||
|
||||
void CaseConverter::SetupConversions() {
|
||||
void CaseConverter::SetupConversions(CaseConversion conversion) {
|
||||
// First initialize for the symmetric ranges
|
||||
for (size_t i=0; i<std::size(symmetricCaseConversionRanges);) {
|
||||
const int lower = symmetricCaseConversionRanges[i++];
|
||||
|
@ -728,14 +718,14 @@ void CaseConverter::SetupConversions() {
|
|||
const int length = symmetricCaseConversionRanges[i++];
|
||||
const int pitch = symmetricCaseConversionRanges[i++];
|
||||
for (int j=0; j<length*pitch; j+=pitch) {
|
||||
AddSymmetric(lower+j, upper+j);
|
||||
AddSymmetric(conversion, lower+j, upper+j);
|
||||
}
|
||||
}
|
||||
// Add the symmetric singletons
|
||||
for (size_t i=0; i<std::size(symmetricCaseConversions);) {
|
||||
const int lower = symmetricCaseConversions[i++];
|
||||
const int upper = symmetricCaseConversions[i++];
|
||||
AddSymmetric(lower, upper);
|
||||
AddSymmetric(conversion, lower, upper);
|
||||
}
|
||||
// Add the complex cases
|
||||
std::string_view sComplex = complexCaseConversions;
|
||||
|
@ -768,21 +758,11 @@ void CaseConverter::SetupConversions() {
|
|||
}
|
||||
|
||||
CaseConverter *ConverterForConversion(CaseConversion conversion) {
|
||||
CaseConverter *pCaseConv = &caseConvFold;
|
||||
switch (conversion) {
|
||||
case CaseConversion::fold:
|
||||
pCaseConv = &caseConvFold;
|
||||
break;
|
||||
case CaseConversion::upper:
|
||||
pCaseConv = &caseConvUp;
|
||||
break;
|
||||
case CaseConversion::lower:
|
||||
default:
|
||||
pCaseConv = &caseConvLow;
|
||||
break;
|
||||
}
|
||||
const unsigned index = static_cast<unsigned>(conversion);
|
||||
assert(index < std::size(caseConvList));
|
||||
CaseConverter *pCaseConv = &caseConvList[index];
|
||||
if (!pCaseConv->Initialised()) {
|
||||
pCaseConv->SetupConversions();
|
||||
pCaseConv->SetupConversions(conversion);
|
||||
}
|
||||
return pCaseConv;
|
||||
}
|
||||
|
|
|
@ -2880,7 +2880,7 @@ public:
|
|||
};
|
||||
|
||||
// Define a way for the Regular Expression code to access the document
|
||||
class DocumentIndexer : public CharacterIndexer {
|
||||
class DocumentIndexer final : public CharacterIndexer {
|
||||
Document *pdoc;
|
||||
Sci::Position end;
|
||||
public:
|
||||
|
@ -2888,13 +2888,6 @@ public:
|
|||
pdoc(pdoc_), end(end_) {
|
||||
}
|
||||
|
||||
DocumentIndexer(const DocumentIndexer &) = delete;
|
||||
DocumentIndexer(DocumentIndexer &&) = delete;
|
||||
DocumentIndexer &operator=(const DocumentIndexer &) = delete;
|
||||
DocumentIndexer &operator=(DocumentIndexer &&) = delete;
|
||||
|
||||
~DocumentIndexer() override = default;
|
||||
|
||||
char CharAt(Sci::Position index) const noexcept override {
|
||||
if (index < 0 || index >= end)
|
||||
return 0;
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <memory>
|
||||
#include <chrono>
|
||||
#include <atomic>
|
||||
#include <mutex>
|
||||
#include <thread>
|
||||
#include <future>
|
||||
|
||||
|
@ -1510,7 +1511,7 @@ bool Editor::WrapBlock(Surface *surface, Sci::Line lineToWrap, Sci::Line lineToW
|
|||
// Lines that are less likely to be re-examined should not be read from or written to the cache.
|
||||
const SignificantLines significantLines {
|
||||
pdoc->SciLineFromPosition(sel.MainCaret()),
|
||||
topLine,
|
||||
pcs->DocFromDisplay(topLine),
|
||||
LinesOnScreen() + 1,
|
||||
view.llc.GetLevel(),
|
||||
};
|
||||
|
@ -1914,7 +1915,7 @@ Sci::Position Editor::FormatRange(Scintilla::Message iMessage, Scintilla::uptr_t
|
|||
void *ptr = PtrFromSPtr(lParam);
|
||||
if (iMessage == Message::FormatRange) {
|
||||
RangeToFormat *pfr = static_cast<RangeToFormat *>(ptr);
|
||||
CharacterRangeFull chrg{ pfr->chrg.cpMin,pfr->chrg.cpMax };
|
||||
const CharacterRangeFull chrg{ pfr->chrg.cpMin,pfr->chrg.cpMax };
|
||||
AutoSurface surface(pfr->hdc, this, Technology::Default);
|
||||
AutoSurface surfaceMeasure(pfr->hdcTarget, this, Technology::Default);
|
||||
if (!surface || !surfaceMeasure) {
|
||||
|
|
|
@ -172,6 +172,7 @@ PRectangle PixelAlignOutside(const PRectangle &rc, int pixelDivisions) noexcept;
|
|||
*/
|
||||
constexpr const float componentMaximum = 255.0f;
|
||||
class ColourRGBA {
|
||||
static constexpr int rgbMask = 0xffffff;
|
||||
int co;
|
||||
public:
|
||||
constexpr explicit ColourRGBA(int co_ = 0) noexcept : co(co_) {
|
||||
|
@ -190,11 +191,11 @@ public:
|
|||
}
|
||||
|
||||
static constexpr ColourRGBA FromIpRGB(intptr_t co_) noexcept {
|
||||
return ColourRGBA(static_cast<int>(co_) | (0xffu << 24));
|
||||
return ColourRGBA((co_ & rgbMask) | (0xffu << 24));
|
||||
}
|
||||
|
||||
constexpr ColourRGBA WithoutAlpha() const noexcept {
|
||||
return ColourRGBA(co & 0xffffff);
|
||||
return ColourRGBA(co & rgbMask);
|
||||
}
|
||||
|
||||
constexpr ColourRGBA Opaque() const noexcept {
|
||||
|
@ -206,7 +207,7 @@ public:
|
|||
}
|
||||
|
||||
constexpr int OpaqueRGB() const noexcept {
|
||||
return co & 0xffffff;
|
||||
return co & rgbMask;
|
||||
}
|
||||
|
||||
// Red, green and blue values as bytes 0..255
|
||||
|
|
|
@ -144,7 +144,7 @@ void DrawTail(Surface *surface, XYPOSITION leftLine, XYPOSITION rightTail, XYPOS
|
|||
const XYPOSITION strokeTop = centreY + slopeLength;
|
||||
const XYPOSITION halfWidth = widthSymbolStroke / 2.0f;
|
||||
const XYPOSITION strokeMiddle = strokeTop + halfWidth;
|
||||
Point lines[] = {
|
||||
const Point lines[] = {
|
||||
// Stick
|
||||
Point(rightTail, strokeMiddle),
|
||||
Point(leftLine + halfWidth + slopeLength, strokeMiddle),
|
||||
|
@ -396,7 +396,7 @@ void LineMarker::Draw(Surface *surface, const PRectangle &rcWhole, const Font *f
|
|||
break;
|
||||
|
||||
case MarkerSymbol::Arrow: {
|
||||
Point pts[] = {
|
||||
const Point pts[] = {
|
||||
Point(centreX - dimOn4, centreY - dimOn2),
|
||||
Point(centreX - dimOn4, centreY + dimOn2),
|
||||
Point(centreX + dimOn2 - dimOn4, centreY),
|
||||
|
@ -406,7 +406,7 @@ void LineMarker::Draw(Surface *surface, const PRectangle &rcWhole, const Font *f
|
|||
break;
|
||||
|
||||
case MarkerSymbol::ArrowDown: {
|
||||
Point pts[] = {
|
||||
const Point pts[] = {
|
||||
Point(centreX - dimOn2, centreY - dimOn4),
|
||||
Point(centreX + dimOn2, centreY - dimOn4),
|
||||
Point(centreX, centreY + dimOn2 - dimOn4),
|
||||
|
@ -416,7 +416,7 @@ void LineMarker::Draw(Surface *surface, const PRectangle &rcWhole, const Font *f
|
|||
break;
|
||||
|
||||
case MarkerSymbol::Plus: {
|
||||
Point pts[] = {
|
||||
const Point pts[] = {
|
||||
Point(centreX - armSize, centreY - 1),
|
||||
Point(centreX - 1, centreY - 1),
|
||||
Point(centreX - 1, centreY - armSize),
|
||||
|
@ -435,7 +435,7 @@ void LineMarker::Draw(Surface *surface, const PRectangle &rcWhole, const Font *f
|
|||
break;
|
||||
|
||||
case MarkerSymbol::Minus: {
|
||||
Point pts[] = {
|
||||
const Point pts[] = {
|
||||
Point(centreX - armSize, centreY - 1),
|
||||
Point(centreX + armSize, centreY - 1),
|
||||
Point(centreX + armSize, centreY + 1),
|
||||
|
@ -489,7 +489,7 @@ void LineMarker::Draw(Surface *surface, const PRectangle &rcWhole, const Font *f
|
|||
break;
|
||||
|
||||
case MarkerSymbol::ShortArrow: {
|
||||
Point pts[] = {
|
||||
const Point pts[] = {
|
||||
Point(centreX, centreY + dimOn2),
|
||||
Point(centreX + dimOn2, centreY),
|
||||
Point(centreX, centreY - dimOn2),
|
||||
|
@ -547,7 +547,7 @@ void LineMarker::Draw(Surface *surface, const PRectangle &rcWhole, const Font *f
|
|||
|
||||
case MarkerSymbol::Bookmark: {
|
||||
const XYPOSITION halfHeight = std::floor(minDim / 3);
|
||||
Point pts[] = {
|
||||
const Point pts[] = {
|
||||
Point(rcWhole.left, centreY - halfHeight),
|
||||
Point(rcWhole.right - strokeWidth - 2, centreY - halfHeight),
|
||||
Point(rcWhole.right - strokeWidth - 2 - halfHeight, centreY),
|
||||
|
@ -560,7 +560,7 @@ void LineMarker::Draw(Surface *surface, const PRectangle &rcWhole, const Font *f
|
|||
|
||||
case MarkerSymbol::VerticalBookmark: {
|
||||
const XYPOSITION halfWidth = std::floor(minDim / 3);
|
||||
Point pts[] = {
|
||||
const Point pts[] = {
|
||||
Point(centreX - halfWidth, centreY - dimOn2),
|
||||
Point(centreX + halfWidth, centreY - dimOn2),
|
||||
Point(centreX + halfWidth, centreY + dimOn2),
|
||||
|
|
|
@ -92,7 +92,7 @@ void DrawWrapMarker(Surface *surface, PRectangle rcPlace,
|
|||
}
|
||||
};
|
||||
|
||||
Relative rel = { x0, isEndMarker ? 1 : -1, y0, 1, widthStroke / 2.0f };
|
||||
const Relative rel = { x0, isEndMarker ? 1 : -1, y0, 1, widthStroke / 2.0f };
|
||||
|
||||
// arrow head
|
||||
const Point head[] = {
|
||||
|
|
|
@ -461,7 +461,7 @@ bool SignificantLines::LineMayCache(Sci::Line line) const noexcept {
|
|||
case LineCache::Caret:
|
||||
return line == lineCaret;
|
||||
case LineCache::Page:
|
||||
return (abs(line - lineCaret) < linesOnScreen) ||
|
||||
return (std::abs(line - lineCaret) < linesOnScreen) ||
|
||||
((line >= lineTop) && (line <= (lineTop + linesOnScreen)));
|
||||
case LineCache::Document:
|
||||
default:
|
||||
|
|
|
@ -14,8 +14,6 @@ namespace Scintilla::Internal {
|
|||
class CharacterIndexer {
|
||||
public:
|
||||
virtual char CharAt(Sci::Position index) const=0;
|
||||
virtual ~CharacterIndexer() {
|
||||
}
|
||||
};
|
||||
|
||||
class RESearch {
|
||||
|
|
|
@ -265,7 +265,7 @@ void ScintillaBase::AutoCompleteStart(Sci::Position lenEntered, const char *list
|
|||
}
|
||||
}
|
||||
|
||||
ListOptions options{
|
||||
const ListOptions options{
|
||||
vs.ElementColour(Element::List),
|
||||
vs.ElementColour(Element::ListBack),
|
||||
vs.ElementColour(Element::ListSelected),
|
||||
|
|
|
@ -266,7 +266,7 @@ void RGBAImage::SetPixel(int x, int y, ColourRGBA colour) noexcept {
|
|||
|
||||
namespace {
|
||||
|
||||
unsigned char AlphaMultiplied(unsigned char value, unsigned char alpha) {
|
||||
constexpr unsigned char AlphaMultiplied(unsigned char value, unsigned char alpha) noexcept {
|
||||
return (value * alpha / UCHAR_MAX) & 0xffU;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,9 +2,9 @@
|
|||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import ctypes, os, sys
|
||||
import ctypes
|
||||
|
||||
from ctypes import c_int, c_ulong, c_char_p, c_wchar_p, c_ushort, c_uint, c_long, c_ssize_t
|
||||
from ctypes import c_int, c_char_p, c_long, c_ssize_t
|
||||
|
||||
def IsEnumeration(t):
|
||||
return t[:1].isupper()
|
||||
|
@ -52,7 +52,7 @@ class SciCall:
|
|||
self._ptr = ptr
|
||||
self._msg = msg
|
||||
self._stringResult = stringResult
|
||||
def __call__(self, w=0, l=0):
|
||||
def __call__(self, w=0, lp=0):
|
||||
ww = ctypes.cast(w, c_char_p)
|
||||
if self._stringResult:
|
||||
lengthBytes = self._fn(self._ptr, self._msg, ww, None)
|
||||
|
@ -63,7 +63,7 @@ class SciCall:
|
|||
assert lengthBytes == lengthBytes2
|
||||
return bytearray(result)[:lengthBytes]
|
||||
else:
|
||||
ll = ctypes.cast(l, c_char_p)
|
||||
ll = ctypes.cast(lp, c_char_p)
|
||||
return self._fn(self._ptr, self._msg, ww, ll)
|
||||
|
||||
sciFX = ctypes.CFUNCTYPE(c_ssize_t, c_char_p, c_int, c_char_p, c_char_p)
|
||||
|
|
|
@ -8,8 +8,7 @@ from __future__ import unicode_literals
|
|||
import os, platform, sys, unittest
|
||||
|
||||
import ctypes
|
||||
from ctypes import wintypes
|
||||
from ctypes import c_int, c_ulong, c_char_p, c_wchar_p, c_ushort, c_uint, c_long
|
||||
from ctypes import c_int, c_char_p, c_wchar_p, c_ushort, c_uint
|
||||
from ctypes.wintypes import HWND, WPARAM, LPARAM, HANDLE, HBRUSH, LPCWSTR
|
||||
user32=ctypes.windll.user32
|
||||
gdi32=ctypes.windll.gdi32
|
||||
|
@ -248,11 +247,11 @@ class XiteWin():
|
|||
def Invalidate(self):
|
||||
user32.InvalidateRect(self.win, 0, 0)
|
||||
|
||||
def WndProc(self, h, m, w, l):
|
||||
def WndProc(self, h, m, wp, lp):
|
||||
user32.DefWindowProcW.argtypes = [HWND, c_uint, WPARAM, LPARAM]
|
||||
ms = sgsm.get(m, "XXX")
|
||||
if trace:
|
||||
print("%s %s %s %s" % (hex(h)[2:],ms,w,l))
|
||||
print("%s %s %s %s" % (hex(h)[2:],ms,wp,lp))
|
||||
if ms == "WM_CLOSE":
|
||||
user32.PostQuitMessage(0)
|
||||
elif ms == "WM_CREATE":
|
||||
|
@ -260,20 +259,20 @@ class XiteWin():
|
|||
return 0
|
||||
elif ms == "WM_SIZE":
|
||||
# Work out size
|
||||
if w != 1:
|
||||
if wp != 1:
|
||||
self.OnSize()
|
||||
return 0
|
||||
elif ms == "WM_COMMAND":
|
||||
cmdCode = w & 0xffff
|
||||
cmdCode = wp & 0xffff
|
||||
if cmdCode in self.cmds:
|
||||
self.Command(self.cmds[cmdCode])
|
||||
return 0
|
||||
elif ms == "WM_ACTIVATE":
|
||||
if w != WA_INACTIVE:
|
||||
if wp != WA_INACTIVE:
|
||||
self.FocusOnEditor()
|
||||
return 0
|
||||
else:
|
||||
return user32.DefWindowProcW(h, m, w, l)
|
||||
return user32.DefWindowProcW(h, m, wp, lp)
|
||||
return 0
|
||||
|
||||
def Command(self, name):
|
||||
|
@ -506,7 +505,7 @@ class XiteWin():
|
|||
self.Open()
|
||||
|
||||
def CmdSave(self):
|
||||
if (self.fullPath == None) or (len(self.fullPath) == 0):
|
||||
if (self.fullPath is None) or (len(self.fullPath) == 0):
|
||||
self.SaveAs()
|
||||
else:
|
||||
self.Save()
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
from __future__ import with_statement
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import os, string, sys, time, unittest
|
||||
import string, time, unittest
|
||||
|
||||
try:
|
||||
start = time.perf_counter()
|
||||
|
|
|
@ -414,7 +414,7 @@ class TestSimple(unittest.TestCase):
|
|||
self.xite.ChooseLexer(b"cpp")
|
||||
self.ed.SetCodePage(65001)
|
||||
self.ed.SetLineEndTypesAllowed(1)
|
||||
text = b"x\xe2\x80\xa9y";
|
||||
text = b"x\xe2\x80\xa9y"
|
||||
self.ed.AddText(5, text)
|
||||
self.assertEquals(self.ed.LineCount, 2)
|
||||
|
||||
|
@ -501,7 +501,7 @@ class TestSimple(unittest.TestCase):
|
|||
self.xite.ChooseLexer(b"cpp")
|
||||
self.ed.SetCodePage(65001)
|
||||
self.ed.SetLineEndTypesAllowed(1)
|
||||
text = b"x\xc2\x85y";
|
||||
text = b"x\xc2\x85y"
|
||||
self.ed.AddText(4, text)
|
||||
self.assertEquals(self.ed.LineCount, 2)
|
||||
|
||||
|
@ -1165,8 +1165,10 @@ class TestMarkers(unittest.TestCase):
|
|||
|
||||
def testTwiceAddedDelete(self):
|
||||
handle = self.ed.MarkerAdd(1,1)
|
||||
self.assertNotEqual(handle, -1)
|
||||
self.assertEquals(self.ed.MarkerGet(1), 2)
|
||||
handle2 = self.ed.MarkerAdd(1,1)
|
||||
self.assertNotEqual(handle2, -1)
|
||||
self.assertEquals(self.ed.MarkerGet(1), 2)
|
||||
self.ed.MarkerDelete(1,1)
|
||||
self.assertEquals(self.ed.MarkerGet(1), 2)
|
||||
|
@ -1207,7 +1209,9 @@ class TestMarkers(unittest.TestCase):
|
|||
def testMarkerNext(self):
|
||||
self.assertEquals(self.ed.MarkerNext(0, 2), -1)
|
||||
h1 = self.ed.MarkerAdd(0,1)
|
||||
self.assertNotEqual(h1, -1)
|
||||
h2 = self.ed.MarkerAdd(2,1)
|
||||
self.assertNotEqual(h2, -1)
|
||||
self.assertEquals(self.ed.MarkerNext(0, 2), 0)
|
||||
self.assertEquals(self.ed.MarkerNext(1, 2), 2)
|
||||
self.assertEquals(self.ed.MarkerNext(2, 2), 2)
|
||||
|
@ -2448,8 +2452,6 @@ class TestIndices(unittest.TestCase):
|
|||
|
||||
def testUTF16(self):
|
||||
self.assertEquals(self.ed.GetLineCharacterIndex(), self.ed.SC_LINECHARACTERINDEX_NONE)
|
||||
t = "aå\U00010348flﬔ-"
|
||||
tv = t.encode("UTF-8")
|
||||
self.ed.SetContents(self.tv)
|
||||
self.ed.AllocateLineCharacterIndex(self.ed.SC_LINECHARACTERINDEX_UTF16)
|
||||
self.assertEquals(self.ed.IndexPositionFromLine(0, self.ed.SC_LINECHARACTERINDEX_UTF16), 0)
|
||||
|
@ -2821,7 +2823,8 @@ class TestSubStyles(unittest.TestCase):
|
|||
|
||||
def testSecondary(self):
|
||||
inactiveDistance = self.ed.DistanceToSecondaryStyles()
|
||||
self.assertEquals(self.ed.GetPrimaryStyleFromStyle(self.ed.SCE_C_IDENTIFIER+inactiveDistance), self.ed.SCE_C_IDENTIFIER)
|
||||
inactiveIdentifier = self.ed.SCE_C_IDENTIFIER+inactiveDistance
|
||||
self.assertEquals(self.ed.GetPrimaryStyleFromStyle(inactiveIdentifier), self.ed.SCE_C_IDENTIFIER)
|
||||
|
||||
class TestCallTip(unittest.TestCase):
|
||||
|
||||
|
|
|
@ -10,11 +10,10 @@
|
|||
from __future__ import with_statement
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import codecs, ctypes, os, sys, unittest
|
||||
import ctypes, unittest
|
||||
|
||||
from MessageNumbers import msgs, sgsm
|
||||
from MessageNumbers import msgs
|
||||
|
||||
import ctypes
|
||||
user32 = ctypes.windll.user32
|
||||
|
||||
import XiteWin as Xite
|
||||
|
@ -32,8 +31,8 @@ class TestWins(unittest.TestCase):
|
|||
|
||||
# Helper methods
|
||||
|
||||
def Send(self, msg, w, l):
|
||||
return user32.SendMessageW(self.sciHwnd, msgs[msg], w, l)
|
||||
def Send(self, msg, wp, lp):
|
||||
return user32.SendMessageW(self.sciHwnd, msgs[msg], wp, lp)
|
||||
|
||||
def GetTextLength(self):
|
||||
return self.Send("WM_GETTEXTLENGTH", 0, 0)
|
||||
|
|
|
@ -1 +1 @@
|
|||
534
|
||||
535
|
||||
|
|
|
@ -963,7 +963,7 @@ void SurfaceGDI::AlphaRectangle(PRectangle rc, XYPOSITION cornerSize, FillStroke
|
|||
section.SetSymmetric(x, corner - x, valOutline);
|
||||
}
|
||||
|
||||
AlphaBlend(hdc, rcw.left, rcw.top, size.cx, size.cy, section.DC(), 0, 0, size.cx, size.cy, mergeAlpha);
|
||||
GdiAlphaBlend(hdc, rcw.left, rcw.top, size.cx, size.cy, section.DC(), 0, 0, size.cx, size.cy, mergeAlpha);
|
||||
}
|
||||
} else {
|
||||
BrushColour(fillStroke.stroke.colour);
|
||||
|
@ -1002,7 +1002,7 @@ void SurfaceGDI::GradientRectangle(PRectangle rc, const std::vector<ColourStop>
|
|||
}
|
||||
}
|
||||
|
||||
AlphaBlend(hdc, rcw.left, rcw.top, size.cx, size.cy, section.DC(), 0, 0, size.cx, size.cy, mergeAlpha);
|
||||
GdiAlphaBlend(hdc, rcw.left, rcw.top, size.cx, size.cy, section.DC(), 0, 0, size.cx, size.cy, mergeAlpha);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1019,7 +1019,7 @@ void SurfaceGDI::DrawRGBAImage(PRectangle rc, int width, int height, const unsig
|
|||
DIBSection section(hdc, size);
|
||||
if (section) {
|
||||
RGBAImage::BGRAFromRGBA(section.Bytes(), pixelsImage, static_cast<size_t>(width) * height);
|
||||
AlphaBlend(hdc, static_cast<int>(rc.left), static_cast<int>(rc.top),
|
||||
GdiAlphaBlend(hdc, static_cast<int>(rc.left), static_cast<int>(rc.top),
|
||||
static_cast<int>(rc.Width()), static_cast<int>(rc.Height()), section.DC(),
|
||||
0, 0, width, height, mergeAlpha);
|
||||
}
|
||||
|
@ -1713,19 +1713,19 @@ void SurfaceD2D::RoundedRectangle(PRectangle rc, FillStroke fillStroke) {
|
|||
const FLOAT minDimension = static_cast<FLOAT>(std::min(rc.Width(), rc.Height())) / 2.0f;
|
||||
const FLOAT radius = std::min(4.0f, minDimension);
|
||||
if (fillStroke.fill.colour == fillStroke.stroke.colour) {
|
||||
D2D1_ROUNDED_RECT roundedRectFill = {
|
||||
const D2D1_ROUNDED_RECT roundedRectFill = {
|
||||
RectangleFromPRectangle(rc),
|
||||
radius, radius };
|
||||
D2DPenColourAlpha(fillStroke.fill.colour);
|
||||
pRenderTarget->FillRoundedRectangle(roundedRectFill, pBrush);
|
||||
} else {
|
||||
D2D1_ROUNDED_RECT roundedRectFill = {
|
||||
const D2D1_ROUNDED_RECT roundedRectFill = {
|
||||
RectangleFromPRectangle(rc.Inset(1.0)),
|
||||
radius-1, radius-1 };
|
||||
D2DPenColourAlpha(fillStroke.fill.colour);
|
||||
pRenderTarget->FillRoundedRectangle(roundedRectFill, pBrush);
|
||||
|
||||
D2D1_ROUNDED_RECT roundedRect = {
|
||||
const D2D1_ROUNDED_RECT roundedRect = {
|
||||
RectangleFromPRectangle(rc.Inset(0.5)),
|
||||
radius, radius };
|
||||
D2DPenColourAlpha(fillStroke.stroke.colour);
|
||||
|
@ -1749,12 +1749,12 @@ void SurfaceD2D::AlphaRectangle(PRectangle rc, XYPOSITION cornerSize, FillStroke
|
|||
pRenderTarget->DrawRectangle(rectOutline, pBrush, fillStroke.stroke.WidthF());
|
||||
} else {
|
||||
const float cornerSizeF = static_cast<float>(cornerSize);
|
||||
D2D1_ROUNDED_RECT roundedRectFill = {
|
||||
const D2D1_ROUNDED_RECT roundedRectFill = {
|
||||
rectFill, cornerSizeF - 1.0f, cornerSizeF - 1.0f };
|
||||
D2DPenColourAlpha(fillStroke.fill.colour);
|
||||
pRenderTarget->FillRoundedRectangle(roundedRectFill, pBrush);
|
||||
|
||||
D2D1_ROUNDED_RECT roundedRect = {
|
||||
const D2D1_ROUNDED_RECT roundedRect = {
|
||||
rectOutline, cornerSizeF, cornerSizeF};
|
||||
D2DPenColourAlpha(fillStroke.stroke.colour);
|
||||
pRenderTarget->DrawRoundedRectangle(roundedRect, pBrush, fillStroke.stroke.WidthF());
|
||||
|
@ -1814,7 +1814,7 @@ void SurfaceD2D::DrawRGBAImage(PRectangle rc, int width, int height, const unsig
|
|||
|
||||
ID2D1Bitmap *bitmap = nullptr;
|
||||
const D2D1_SIZE_U size = D2D1::SizeU(width, height);
|
||||
D2D1_BITMAP_PROPERTIES props = {{DXGI_FORMAT_B8G8R8A8_UNORM,
|
||||
const D2D1_BITMAP_PROPERTIES props = {{DXGI_FORMAT_B8G8R8A8_UNORM,
|
||||
D2D1_ALPHA_MODE_PREMULTIPLIED}, 72.0, 72.0};
|
||||
const HRESULT hr = pRenderTarget->CreateBitmap(size, image.data(),
|
||||
width * 4, &props, &bitmap);
|
||||
|
@ -1857,12 +1857,12 @@ void SurfaceD2D::Stadium(PRectangle rc, FillStroke fillStroke, Ends ends) {
|
|||
const FLOAT halfStroke = fillStroke.stroke.WidthF() / 2.0f;
|
||||
if (ends == Surface::Ends::semiCircles) {
|
||||
const D2D1_RECT_F rect = RectangleFromPRectangle(rc);
|
||||
D2D1_ROUNDED_RECT roundedRectFill = { RectangleInset(rect, fillStroke.stroke.WidthF()),
|
||||
const D2D1_ROUNDED_RECT roundedRectFill = { RectangleInset(rect, fillStroke.stroke.WidthF()),
|
||||
radiusFill, radiusFill };
|
||||
D2DPenColourAlpha(fillStroke.fill.colour);
|
||||
pRenderTarget->FillRoundedRectangle(roundedRectFill, pBrush);
|
||||
|
||||
D2D1_ROUNDED_RECT roundedRect = { RectangleInset(rect, halfStroke),
|
||||
const D2D1_ROUNDED_RECT roundedRect = { RectangleInset(rect, halfStroke),
|
||||
radius, radius };
|
||||
D2DPenColourAlpha(fillStroke.stroke.colour);
|
||||
pRenderTarget->DrawRoundedRectangle(roundedRect, pBrush, fillStroke.stroke.WidthF());
|
||||
|
@ -1954,7 +1954,7 @@ void SurfaceD2D::Copy(PRectangle rc, Point from, Surface &surfaceSource) {
|
|||
}
|
||||
}
|
||||
|
||||
class BlobInline : public IDWriteInlineObject {
|
||||
class BlobInline final : public IDWriteInlineObject {
|
||||
XYPOSITION width;
|
||||
|
||||
// IUnknown
|
||||
|
@ -1980,12 +1980,6 @@ class BlobInline : public IDWriteInlineObject {
|
|||
public:
|
||||
BlobInline(XYPOSITION width_=0.0f) noexcept : width(width_) {
|
||||
}
|
||||
// Defaulted so BlobInline objects can be copied.
|
||||
BlobInline(const BlobInline &) = default;
|
||||
BlobInline(BlobInline &&) = default;
|
||||
BlobInline &operator=(const BlobInline &) = default;
|
||||
BlobInline &operator=(BlobInline &&) = default;
|
||||
virtual ~BlobInline() noexcept = default;
|
||||
};
|
||||
|
||||
/// Implement IUnknown
|
||||
|
@ -1995,9 +1989,9 @@ STDMETHODIMP BlobInline::QueryInterface(REFIID riid, PVOID *ppv) {
|
|||
// Never called so not checked.
|
||||
*ppv = nullptr;
|
||||
if (riid == IID_IUnknown)
|
||||
*ppv = static_cast<IUnknown *>(this);
|
||||
*ppv = this;
|
||||
if (riid == __uuidof(IDWriteInlineObject))
|
||||
*ppv = static_cast<IDWriteInlineObject *>(this);
|
||||
*ppv = this;
|
||||
if (!*ppv)
|
||||
return E_NOINTERFACE;
|
||||
return S_OK;
|
||||
|
@ -2869,7 +2863,7 @@ void Window::SetCursor(Cursor curs) {
|
|||
coordinates */
|
||||
PRectangle Window::GetMonitorRect(Point pt) {
|
||||
const PRectangle rcPosition = GetPosition();
|
||||
POINT ptDesktop = {static_cast<LONG>(pt.x + rcPosition.left),
|
||||
const POINT ptDesktop = {static_cast<LONG>(pt.x + rcPosition.left),
|
||||
static_cast<LONG>(pt.y + rcPosition.top)};
|
||||
HMONITOR hMonitor = MonitorFromPoint(ptDesktop, MONITOR_DEFAULTTONEAREST);
|
||||
|
||||
|
@ -2915,7 +2909,7 @@ public:
|
|||
}
|
||||
|
||||
void AllocItem(const char *text, int pixId) {
|
||||
ListItemData lid = { text, pixId };
|
||||
const ListItemData lid = { text, pixId };
|
||||
data.push_back(lid);
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ extern void Platform_Initialise(void *hInstance) noexcept;
|
|||
extern void Platform_Finalise(bool fromDllMain) noexcept;
|
||||
|
||||
constexpr RECT RectFromPRectangle(PRectangle prc) noexcept {
|
||||
RECT rc = { static_cast<LONG>(prc.left), static_cast<LONG>(prc.top),
|
||||
const RECT rc = { static_cast<LONG>(prc.left), static_cast<LONG>(prc.top),
|
||||
static_cast<LONG>(prc.right), static_cast<LONG>(prc.bottom) };
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
|
||||
#include <windows.h>
|
||||
|
||||
#define VERSION_SCINTILLA "5.3.4"
|
||||
#define VERSION_WORDS 5, 3, 4, 0
|
||||
#define VERSION_SCINTILLA "5.3.5"
|
||||
#define VERSION_WORDS 5, 3, 5, 0
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION VERSION_WORDS
|
||||
|
|
|
@ -101,7 +101,7 @@
|
|||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>gdi32.lib;imm32.lib;ole32.lib;oleaut32.lib;msimg32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalDependencies>gdi32.lib;imm32.lib;ole32.lib;oleaut32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
|
|
|
@ -200,44 +200,82 @@ constexpr bool KeyboardIsNumericKeypadFunction(uptr_t wParam, sptr_t lParam) {
|
|||
}
|
||||
}
|
||||
|
||||
typedef void VFunction(void);
|
||||
|
||||
/**
|
||||
*/
|
||||
class FormatEnumerator {
|
||||
class FormatEnumerator final : public IEnumFORMATETC {
|
||||
public:
|
||||
VFunction **vtbl;
|
||||
ULONG ref;
|
||||
ULONG pos;
|
||||
std::vector<CLIPFORMAT> formats;
|
||||
FormatEnumerator(ULONG pos_, const CLIPFORMAT formats_[], size_t formatsLen_);
|
||||
|
||||
// IUnknown
|
||||
STDMETHODIMP QueryInterface(REFIID riid, PVOID *ppv) override;
|
||||
STDMETHODIMP_(ULONG)AddRef() override;
|
||||
STDMETHODIMP_(ULONG)Release() override;
|
||||
|
||||
// IEnumFORMATETC
|
||||
STDMETHODIMP Next(ULONG celt, FORMATETC *rgelt, ULONG *pceltFetched) override;
|
||||
STDMETHODIMP Skip(ULONG celt) override;
|
||||
STDMETHODIMP Reset() override;
|
||||
STDMETHODIMP Clone(IEnumFORMATETC **ppenum) override;
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
class DropSource {
|
||||
class DropSource final : public IDropSource {
|
||||
public:
|
||||
VFunction **vtbl;
|
||||
ScintillaWin *sci;
|
||||
DropSource() noexcept;
|
||||
ScintillaWin *sci = nullptr;
|
||||
|
||||
// IUnknown
|
||||
STDMETHODIMP QueryInterface(REFIID riid, PVOID *ppv) override;
|
||||
STDMETHODIMP_(ULONG)AddRef() override;
|
||||
STDMETHODIMP_(ULONG)Release() override;
|
||||
|
||||
// IDropSource
|
||||
STDMETHODIMP QueryContinueDrag(BOOL fEsc, DWORD grfKeyState) override;
|
||||
STDMETHODIMP GiveFeedback(DWORD) override;
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
class DataObject {
|
||||
class DataObject final : public IDataObject {
|
||||
public:
|
||||
VFunction **vtbl;
|
||||
ScintillaWin *sci;
|
||||
DataObject() noexcept;
|
||||
ScintillaWin *sci = nullptr;
|
||||
|
||||
// IUnknown
|
||||
STDMETHODIMP QueryInterface(REFIID riid, PVOID *ppv) override;
|
||||
STDMETHODIMP_(ULONG)AddRef() override;
|
||||
STDMETHODIMP_(ULONG)Release() override;
|
||||
|
||||
// IDataObject
|
||||
STDMETHODIMP GetData(FORMATETC *pFEIn, STGMEDIUM *pSTM) override;
|
||||
STDMETHODIMP GetDataHere(FORMATETC *, STGMEDIUM *) override;
|
||||
STDMETHODIMP QueryGetData(FORMATETC *pFE) override;
|
||||
STDMETHODIMP GetCanonicalFormatEtc(FORMATETC *, FORMATETC *pFEOut) override;
|
||||
STDMETHODIMP SetData(FORMATETC *, STGMEDIUM *, BOOL) override;
|
||||
STDMETHODIMP EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC **ppEnum) override;
|
||||
STDMETHODIMP DAdvise(FORMATETC *, DWORD, IAdviseSink *, PDWORD) override;
|
||||
STDMETHODIMP DUnadvise(DWORD) override;
|
||||
STDMETHODIMP EnumDAdvise(IEnumSTATDATA **) override;
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
class DropTarget {
|
||||
class DropTarget final : public IDropTarget {
|
||||
public:
|
||||
VFunction **vtbl;
|
||||
ScintillaWin *sci;
|
||||
DropTarget() noexcept;
|
||||
ScintillaWin *sci = nullptr;
|
||||
|
||||
// IUnknown
|
||||
STDMETHODIMP QueryInterface(REFIID riid, PVOID *ppv) override;
|
||||
STDMETHODIMP_(ULONG)AddRef() override;
|
||||
STDMETHODIMP_(ULONG)Release() override;
|
||||
|
||||
// IDropTarget
|
||||
STDMETHODIMP DragEnter(LPDATAOBJECT pIDataSource, DWORD grfKeyState, POINTL pt, PDWORD pdwEffect) override;
|
||||
STDMETHODIMP DragOver(DWORD grfKeyState, POINTL pt, PDWORD pdwEffect) override;
|
||||
STDMETHODIMP DragLeave() override;
|
||||
STDMETHODIMP Drop(LPDATAOBJECT pIDataSource, DWORD grfKeyState, POINTL pt, PDWORD pdwEffect) override;
|
||||
};
|
||||
|
||||
class IMContext {
|
||||
|
@ -411,6 +449,7 @@ class ScintillaWin :
|
|||
void ImeStartComposition();
|
||||
void ImeEndComposition();
|
||||
LRESULT ImeOnReconvert(LPARAM lParam);
|
||||
LRESULT ImeOnDocumentFeed(LPARAM lParam) const;
|
||||
sptr_t HandleCompositionWindowed(uptr_t wParam, sptr_t lParam);
|
||||
sptr_t HandleCompositionInline(uptr_t wParam, sptr_t lParam);
|
||||
static bool KoreanIME() noexcept;
|
||||
|
@ -782,8 +821,8 @@ void ScintillaWin::StartDrag() {
|
|||
inDragDrop = DragDrop::dragging;
|
||||
DWORD dwEffect = 0;
|
||||
dropWentOutside = true;
|
||||
IDataObject *pDataObject = reinterpret_cast<IDataObject *>(&dob);
|
||||
IDropSource *pDropSource = reinterpret_cast<IDropSource *>(&ds);
|
||||
IDataObject *pDataObject = &dob;
|
||||
IDropSource *pDropSource = &ds;
|
||||
//Platform::DebugPrintf("About to DoDragDrop %x %x\n", pDataObject, pDropSource);
|
||||
const HRESULT hr = ::DoDragDrop(
|
||||
pDataObject,
|
||||
|
@ -1777,6 +1816,9 @@ sptr_t ScintillaWin::IMEMessage(unsigned int iMessage, uptr_t wParam, sptr_t lPa
|
|||
if (wParam == IMR_RECONVERTSTRING) {
|
||||
return ImeOnReconvert(lParam);
|
||||
}
|
||||
if (wParam == IMR_DOCUMENTFEED) {
|
||||
return ImeOnDocumentFeed(lParam);
|
||||
}
|
||||
return ::DefWindowProc(MainHWND(), iMessage, wParam, lParam);
|
||||
}
|
||||
|
||||
|
@ -2022,7 +2064,7 @@ sptr_t ScintillaWin::WndProc(Message iMessage, uptr_t wParam, sptr_t lParam) {
|
|||
UpdateBaseElements();
|
||||
// Get Intellimouse scroll line parameters
|
||||
GetIntelliMouseParameters();
|
||||
::RegisterDragDrop(MainHWND(), reinterpret_cast<IDropTarget *>(&dt));
|
||||
::RegisterDragDrop(MainHWND(), &dt);
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
|
@ -2802,97 +2844,82 @@ void ScintillaWin::ClaimSelection() {
|
|||
}
|
||||
|
||||
/// Implement IUnknown
|
||||
|
||||
STDMETHODIMP_(ULONG)FormatEnumerator_AddRef(FormatEnumerator *fe);
|
||||
STDMETHODIMP FormatEnumerator_QueryInterface(FormatEnumerator *fe, REFIID riid, PVOID *ppv) {
|
||||
STDMETHODIMP FormatEnumerator::QueryInterface(REFIID riid, PVOID *ppv) {
|
||||
//Platform::DebugPrintf("EFE QI");
|
||||
*ppv = nullptr;
|
||||
if (riid == IID_IUnknown)
|
||||
*ppv = reinterpret_cast<IEnumFORMATETC *>(fe);
|
||||
if (riid == IID_IEnumFORMATETC)
|
||||
*ppv = reinterpret_cast<IEnumFORMATETC *>(fe);
|
||||
if (!*ppv)
|
||||
if (riid == IID_IUnknown || riid == IID_IEnumFORMATETC) {
|
||||
*ppv = this;
|
||||
} else {
|
||||
return E_NOINTERFACE;
|
||||
FormatEnumerator_AddRef(fe);
|
||||
}
|
||||
AddRef();
|
||||
return S_OK;
|
||||
}
|
||||
STDMETHODIMP_(ULONG)FormatEnumerator_AddRef(FormatEnumerator *fe) {
|
||||
return ++fe->ref;
|
||||
STDMETHODIMP_(ULONG)FormatEnumerator::AddRef() {
|
||||
return ++ref;
|
||||
}
|
||||
STDMETHODIMP_(ULONG)FormatEnumerator_Release(FormatEnumerator *fe) {
|
||||
fe->ref--;
|
||||
if (fe->ref > 0)
|
||||
return fe->ref;
|
||||
delete fe;
|
||||
return 0;
|
||||
STDMETHODIMP_(ULONG)FormatEnumerator::Release() {
|
||||
const ULONG refs = --ref;
|
||||
if (refs == 0) {
|
||||
delete this;
|
||||
}
|
||||
return refs;
|
||||
}
|
||||
/// Implement IEnumFORMATETC
|
||||
STDMETHODIMP FormatEnumerator_Next(FormatEnumerator *fe, ULONG celt, FORMATETC *rgelt, ULONG *pceltFetched) {
|
||||
STDMETHODIMP FormatEnumerator::Next(ULONG celt, FORMATETC *rgelt, ULONG *pceltFetched) {
|
||||
if (!rgelt) return E_POINTER;
|
||||
ULONG putPos = 0;
|
||||
while ((fe->pos < fe->formats.size()) && (putPos < celt)) {
|
||||
rgelt->cfFormat = fe->formats[fe->pos];
|
||||
while ((pos < formats.size()) && (putPos < celt)) {
|
||||
rgelt->cfFormat = formats[pos];
|
||||
rgelt->ptd = nullptr;
|
||||
rgelt->dwAspect = DVASPECT_CONTENT;
|
||||
rgelt->lindex = -1;
|
||||
rgelt->tymed = TYMED_HGLOBAL;
|
||||
rgelt++;
|
||||
fe->pos++;
|
||||
pos++;
|
||||
putPos++;
|
||||
}
|
||||
if (pceltFetched)
|
||||
*pceltFetched = putPos;
|
||||
return putPos ? S_OK : S_FALSE;
|
||||
}
|
||||
STDMETHODIMP FormatEnumerator_Skip(FormatEnumerator *fe, ULONG celt) {
|
||||
fe->pos += celt;
|
||||
STDMETHODIMP FormatEnumerator::Skip(ULONG celt) {
|
||||
pos += celt;
|
||||
return S_OK;
|
||||
}
|
||||
STDMETHODIMP FormatEnumerator_Reset(FormatEnumerator *fe) {
|
||||
fe->pos = 0;
|
||||
STDMETHODIMP FormatEnumerator::Reset() {
|
||||
pos = 0;
|
||||
return S_OK;
|
||||
}
|
||||
STDMETHODIMP FormatEnumerator_Clone(FormatEnumerator *fe, IEnumFORMATETC **ppenum) {
|
||||
STDMETHODIMP FormatEnumerator::Clone(IEnumFORMATETC **ppenum) {
|
||||
FormatEnumerator *pfe;
|
||||
try {
|
||||
pfe = new FormatEnumerator(fe->pos, &fe->formats[0], fe->formats.size());
|
||||
pfe = new FormatEnumerator(pos, &formats[0], formats.size());
|
||||
} catch (...) {
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
return FormatEnumerator_QueryInterface(pfe, IID_IEnumFORMATETC,
|
||||
reinterpret_cast<void **>(ppenum));
|
||||
return pfe->QueryInterface(IID_IEnumFORMATETC, reinterpret_cast<void **>(ppenum));
|
||||
}
|
||||
|
||||
static VFunction *vtFormatEnumerator[] = {
|
||||
(VFunction *)(FormatEnumerator_QueryInterface),
|
||||
(VFunction *)(FormatEnumerator_AddRef),
|
||||
(VFunction *)(FormatEnumerator_Release),
|
||||
(VFunction *)(FormatEnumerator_Next),
|
||||
(VFunction *)(FormatEnumerator_Skip),
|
||||
(VFunction *)(FormatEnumerator_Reset),
|
||||
(VFunction *)(FormatEnumerator_Clone)
|
||||
};
|
||||
|
||||
FormatEnumerator::FormatEnumerator(ULONG pos_, const CLIPFORMAT formats_[], size_t formatsLen_) {
|
||||
vtbl = vtFormatEnumerator;
|
||||
ref = 0; // First QI adds first reference...
|
||||
pos = pos_;
|
||||
formats.insert(formats.begin(), formats_, formats_+formatsLen_);
|
||||
}
|
||||
|
||||
/// Implement IUnknown
|
||||
STDMETHODIMP DropSource_QueryInterface(DropSource *ds, REFIID riid, PVOID *ppv) {
|
||||
return ds->sci->QueryInterface(riid, ppv);
|
||||
STDMETHODIMP DropSource::QueryInterface(REFIID riid, PVOID *ppv) {
|
||||
return sci->QueryInterface(riid, ppv);
|
||||
}
|
||||
STDMETHODIMP_(ULONG)DropSource_AddRef(DropSource *ds) {
|
||||
return ds->sci->AddRef();
|
||||
STDMETHODIMP_(ULONG)DropSource::AddRef() {
|
||||
return sci->AddRef();
|
||||
}
|
||||
STDMETHODIMP_(ULONG)DropSource_Release(DropSource *ds) {
|
||||
return ds->sci->Release();
|
||||
STDMETHODIMP_(ULONG)DropSource::Release() {
|
||||
return sci->Release();
|
||||
}
|
||||
|
||||
/// Implement IDropSource
|
||||
STDMETHODIMP DropSource_QueryContinueDrag(DropSource *, BOOL fEsc, DWORD grfKeyState) {
|
||||
STDMETHODIMP DropSource::QueryContinueDrag(BOOL fEsc, DWORD grfKeyState) {
|
||||
if (fEsc)
|
||||
return DRAGDROP_S_CANCEL;
|
||||
if (!(grfKeyState & MK_LBUTTON))
|
||||
|
@ -2900,46 +2927,33 @@ STDMETHODIMP DropSource_QueryContinueDrag(DropSource *, BOOL fEsc, DWORD grfKeyS
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP DropSource_GiveFeedback(DropSource *, DWORD) {
|
||||
STDMETHODIMP DropSource::GiveFeedback(DWORD) {
|
||||
return DRAGDROP_S_USEDEFAULTCURSORS;
|
||||
}
|
||||
|
||||
static VFunction *vtDropSource[] = {
|
||||
(VFunction *)(DropSource_QueryInterface),
|
||||
(VFunction *)(DropSource_AddRef),
|
||||
(VFunction *)(DropSource_Release),
|
||||
(VFunction *)(DropSource_QueryContinueDrag),
|
||||
(VFunction *)(DropSource_GiveFeedback)
|
||||
};
|
||||
|
||||
DropSource::DropSource() noexcept {
|
||||
vtbl = vtDropSource;
|
||||
sci = nullptr;
|
||||
}
|
||||
|
||||
/// Implement IUnkown
|
||||
STDMETHODIMP DataObject_QueryInterface(DataObject *pd, REFIID riid, PVOID *ppv) {
|
||||
//Platform::DebugPrintf("DO QI %x\n", pd);
|
||||
return pd->sci->QueryInterface(riid, ppv);
|
||||
STDMETHODIMP DataObject::QueryInterface(REFIID riid, PVOID *ppv) {
|
||||
//Platform::DebugPrintf("DO QI %p\n", this);
|
||||
return sci->QueryInterface(riid, ppv);
|
||||
}
|
||||
STDMETHODIMP_(ULONG)DataObject_AddRef(DataObject *pd) {
|
||||
return pd->sci->AddRef();
|
||||
STDMETHODIMP_(ULONG)DataObject::AddRef() {
|
||||
return sci->AddRef();
|
||||
}
|
||||
STDMETHODIMP_(ULONG)DataObject_Release(DataObject *pd) {
|
||||
return pd->sci->Release();
|
||||
STDMETHODIMP_(ULONG)DataObject::Release() {
|
||||
return sci->Release();
|
||||
}
|
||||
/// Implement IDataObject
|
||||
STDMETHODIMP DataObject_GetData(DataObject *pd, FORMATETC *pFEIn, STGMEDIUM *pSTM) {
|
||||
return pd->sci->GetData(pFEIn, pSTM);
|
||||
STDMETHODIMP DataObject::GetData(FORMATETC *pFEIn, STGMEDIUM *pSTM) {
|
||||
return sci->GetData(pFEIn, pSTM);
|
||||
}
|
||||
|
||||
STDMETHODIMP DataObject_GetDataHere(DataObject *, FORMATETC *, STGMEDIUM *) {
|
||||
STDMETHODIMP DataObject::GetDataHere(FORMATETC *, STGMEDIUM *) {
|
||||
//Platform::DebugPrintf("DOB GetDataHere\n");
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP DataObject_QueryGetData(DataObject *pd, FORMATETC *pFE) {
|
||||
if (pd->sci->DragIsRectangularOK(pFE->cfFormat) && IsValidFormatEtc(pFE)) {
|
||||
STDMETHODIMP DataObject::QueryGetData(FORMATETC *pFE) {
|
||||
if (sci->DragIsRectangularOK(pFE->cfFormat) && IsValidFormatEtc(pFE)) {
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
@ -2950,7 +2964,7 @@ STDMETHODIMP DataObject_QueryGetData(DataObject *pd, FORMATETC *pFE) {
|
|||
}
|
||||
}
|
||||
|
||||
STDMETHODIMP DataObject_GetCanonicalFormatEtc(DataObject *, FORMATETC *, FORMATETC *pFEOut) {
|
||||
STDMETHODIMP DataObject::GetCanonicalFormatEtc(FORMATETC *, FORMATETC *pFEOut) {
|
||||
//Platform::DebugPrintf("DOB GetCanon\n");
|
||||
pFEOut->cfFormat = CF_UNICODETEXT;
|
||||
pFEOut->ptd = nullptr;
|
||||
|
@ -2960,12 +2974,12 @@ STDMETHODIMP DataObject_GetCanonicalFormatEtc(DataObject *, FORMATETC *, FORMATE
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP DataObject_SetData(DataObject *, FORMATETC *, STGMEDIUM *, BOOL) {
|
||||
STDMETHODIMP DataObject::SetData(FORMATETC *, STGMEDIUM *, BOOL) {
|
||||
//Platform::DebugPrintf("DOB SetData\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
STDMETHODIMP DataObject_EnumFormatEtc(DataObject *pd, DWORD dwDirection, IEnumFORMATETC **ppEnum) {
|
||||
STDMETHODIMP DataObject::EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC **ppEnum) {
|
||||
try {
|
||||
//Platform::DebugPrintf("DOB EnumFormatEtc %d\n", dwDirection);
|
||||
if (dwDirection != DATADIR_GET) {
|
||||
|
@ -2975,115 +2989,77 @@ STDMETHODIMP DataObject_EnumFormatEtc(DataObject *pd, DWORD dwDirection, IEnumFO
|
|||
|
||||
const CLIPFORMAT formats[] = {CF_UNICODETEXT};
|
||||
FormatEnumerator *pfe = new FormatEnumerator(0, formats, std::size(formats));
|
||||
return FormatEnumerator_QueryInterface(pfe, IID_IEnumFORMATETC,
|
||||
reinterpret_cast<void **>(ppEnum));
|
||||
return pfe->QueryInterface(IID_IEnumFORMATETC, reinterpret_cast<void **>(ppEnum));
|
||||
} catch (std::bad_alloc &) {
|
||||
pd->sci->errorStatus = Status::BadAlloc;
|
||||
sci->errorStatus = Status::BadAlloc;
|
||||
return E_OUTOFMEMORY;
|
||||
} catch (...) {
|
||||
pd->sci->errorStatus = Status::Failure;
|
||||
sci->errorStatus = Status::Failure;
|
||||
return E_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
STDMETHODIMP DataObject_DAdvise(DataObject *, FORMATETC *, DWORD, IAdviseSink *, PDWORD) {
|
||||
STDMETHODIMP DataObject::DAdvise(FORMATETC *, DWORD, IAdviseSink *, PDWORD) {
|
||||
//Platform::DebugPrintf("DOB DAdvise\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
STDMETHODIMP DataObject_DUnadvise(DataObject *, DWORD) {
|
||||
STDMETHODIMP DataObject::DUnadvise(DWORD) {
|
||||
//Platform::DebugPrintf("DOB DUnadvise\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
STDMETHODIMP DataObject_EnumDAdvise(DataObject *, IEnumSTATDATA **) {
|
||||
STDMETHODIMP DataObject::EnumDAdvise(IEnumSTATDATA **) {
|
||||
//Platform::DebugPrintf("DOB EnumDAdvise\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
static VFunction *vtDataObject[] = {
|
||||
(VFunction *)(DataObject_QueryInterface),
|
||||
(VFunction *)(DataObject_AddRef),
|
||||
(VFunction *)(DataObject_Release),
|
||||
(VFunction *)(DataObject_GetData),
|
||||
(VFunction *)(DataObject_GetDataHere),
|
||||
(VFunction *)(DataObject_QueryGetData),
|
||||
(VFunction *)(DataObject_GetCanonicalFormatEtc),
|
||||
(VFunction *)(DataObject_SetData),
|
||||
(VFunction *)(DataObject_EnumFormatEtc),
|
||||
(VFunction *)(DataObject_DAdvise),
|
||||
(VFunction *)(DataObject_DUnadvise),
|
||||
(VFunction *)(DataObject_EnumDAdvise)
|
||||
};
|
||||
|
||||
DataObject::DataObject() noexcept {
|
||||
vtbl = vtDataObject;
|
||||
sci = nullptr;
|
||||
}
|
||||
|
||||
/// Implement IUnknown
|
||||
STDMETHODIMP DropTarget_QueryInterface(DropTarget *dt, REFIID riid, PVOID *ppv) {
|
||||
//Platform::DebugPrintf("DT QI %x\n", dt);
|
||||
return dt->sci->QueryInterface(riid, ppv);
|
||||
STDMETHODIMP DropTarget::QueryInterface(REFIID riid, PVOID *ppv) {
|
||||
//Platform::DebugPrintf("DT QI %p\n", this);
|
||||
return sci->QueryInterface(riid, ppv);
|
||||
}
|
||||
STDMETHODIMP_(ULONG)DropTarget_AddRef(DropTarget *dt) {
|
||||
return dt->sci->AddRef();
|
||||
STDMETHODIMP_(ULONG)DropTarget::AddRef() {
|
||||
return sci->AddRef();
|
||||
}
|
||||
STDMETHODIMP_(ULONG)DropTarget_Release(DropTarget *dt) {
|
||||
return dt->sci->Release();
|
||||
STDMETHODIMP_(ULONG)DropTarget::Release() {
|
||||
return sci->Release();
|
||||
}
|
||||
|
||||
/// Implement IDropTarget by forwarding to Scintilla
|
||||
STDMETHODIMP DropTarget_DragEnter(DropTarget *dt, LPDATAOBJECT pIDataSource, DWORD grfKeyState,
|
||||
POINTL pt, PDWORD pdwEffect) {
|
||||
STDMETHODIMP DropTarget::DragEnter(LPDATAOBJECT pIDataSource, DWORD grfKeyState, POINTL pt, PDWORD pdwEffect) {
|
||||
try {
|
||||
return dt->sci->DragEnter(pIDataSource, grfKeyState, pt, pdwEffect);
|
||||
return sci->DragEnter(pIDataSource, grfKeyState, pt, pdwEffect);
|
||||
} catch (...) {
|
||||
dt->sci->errorStatus = Status::Failure;
|
||||
sci->errorStatus = Status::Failure;
|
||||
}
|
||||
return E_FAIL;
|
||||
}
|
||||
STDMETHODIMP DropTarget_DragOver(DropTarget *dt, DWORD grfKeyState, POINTL pt, PDWORD pdwEffect) {
|
||||
STDMETHODIMP DropTarget::DragOver(DWORD grfKeyState, POINTL pt, PDWORD pdwEffect) {
|
||||
try {
|
||||
return dt->sci->DragOver(grfKeyState, pt, pdwEffect);
|
||||
return sci->DragOver(grfKeyState, pt, pdwEffect);
|
||||
} catch (...) {
|
||||
dt->sci->errorStatus = Status::Failure;
|
||||
sci->errorStatus = Status::Failure;
|
||||
}
|
||||
return E_FAIL;
|
||||
}
|
||||
STDMETHODIMP DropTarget_DragLeave(DropTarget *dt) {
|
||||
STDMETHODIMP DropTarget::DragLeave() {
|
||||
try {
|
||||
return dt->sci->DragLeave();
|
||||
return sci->DragLeave();
|
||||
} catch (...) {
|
||||
dt->sci->errorStatus = Status::Failure;
|
||||
sci->errorStatus = Status::Failure;
|
||||
}
|
||||
return E_FAIL;
|
||||
}
|
||||
STDMETHODIMP DropTarget_Drop(DropTarget *dt, LPDATAOBJECT pIDataSource, DWORD grfKeyState,
|
||||
POINTL pt, PDWORD pdwEffect) {
|
||||
STDMETHODIMP DropTarget::Drop(LPDATAOBJECT pIDataSource, DWORD grfKeyState, POINTL pt, PDWORD pdwEffect) {
|
||||
try {
|
||||
return dt->sci->Drop(pIDataSource, grfKeyState, pt, pdwEffect);
|
||||
return sci->Drop(pIDataSource, grfKeyState, pt, pdwEffect);
|
||||
} catch (...) {
|
||||
dt->sci->errorStatus = Status::Failure;
|
||||
sci->errorStatus = Status::Failure;
|
||||
}
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
static VFunction *vtDropTarget[] = {
|
||||
(VFunction *)(DropTarget_QueryInterface),
|
||||
(VFunction *)(DropTarget_AddRef),
|
||||
(VFunction *)(DropTarget_Release),
|
||||
(VFunction *)(DropTarget_DragEnter),
|
||||
(VFunction *)(DropTarget_DragOver),
|
||||
(VFunction *)(DropTarget_DragLeave),
|
||||
(VFunction *)(DropTarget_Drop)
|
||||
};
|
||||
|
||||
DropTarget::DropTarget() noexcept {
|
||||
vtbl = vtDropTarget;
|
||||
sci = nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* DBCS: support Input Method Editor (IME).
|
||||
* Called when IME Window opened.
|
||||
|
@ -3216,6 +3192,50 @@ LRESULT ScintillaWin::ImeOnReconvert(LPARAM lParam) {
|
|||
return rcSize;
|
||||
}
|
||||
|
||||
LRESULT ScintillaWin::ImeOnDocumentFeed(LPARAM lParam) const {
|
||||
// This is called while typing preedit string in.
|
||||
// So there is no selection.
|
||||
// Limit feed within one line without EOL.
|
||||
// Look around: lineStart |<-- |compStart| - caret - compEnd| -->| lineEnd.
|
||||
|
||||
const Sci::Position curPos = CurrentPosition();
|
||||
const Sci::Line curLine = pdoc->SciLineFromPosition(curPos);
|
||||
const Sci::Position lineStart = pdoc->LineStart(curLine);
|
||||
const Sci::Position lineEnd = pdoc->LineEnd(curLine);
|
||||
|
||||
const std::wstring rcFeed = StringDecode(RangeText(lineStart, lineEnd), CodePageOfDocument());
|
||||
const int rcFeedLen = static_cast<int>(rcFeed.length()) * sizeof(wchar_t);
|
||||
const int rcSize = sizeof(RECONVERTSTRING) + rcFeedLen + sizeof(wchar_t);
|
||||
|
||||
RECONVERTSTRING *rc = static_cast<RECONVERTSTRING *>(PtrFromSPtr(lParam));
|
||||
if (!rc)
|
||||
return rcSize;
|
||||
|
||||
wchar_t *rcFeedStart = reinterpret_cast<wchar_t*>(rc + 1);
|
||||
memcpy(rcFeedStart, &rcFeed[0], rcFeedLen);
|
||||
|
||||
IMContext imc(MainHWND());
|
||||
if (!imc.hIMC)
|
||||
return 0;
|
||||
|
||||
const size_t compStrLen = imc.GetCompositionString(GCS_COMPSTR).size();
|
||||
const int imeCaretPos = imc.GetImeCaretPos();
|
||||
const Sci::Position compStart = pdoc->GetRelativePositionUTF16(curPos, -imeCaretPos);
|
||||
const Sci::Position compStrOffset = pdoc->CountUTF16(lineStart, compStart);
|
||||
|
||||
// Fill in reconvert structure.
|
||||
// Let IME to decide what the target is.
|
||||
rc->dwVersion = 0; //constant
|
||||
rc->dwStrLen = static_cast<DWORD>(rcFeed.length());
|
||||
rc->dwStrOffset = sizeof(RECONVERTSTRING); //constant
|
||||
rc->dwCompStrLen = static_cast<DWORD>(compStrLen);
|
||||
rc->dwCompStrOffset = static_cast<DWORD>(compStrOffset) * sizeof(wchar_t);
|
||||
rc->dwTargetStrLen = rc->dwCompStrLen;
|
||||
rc->dwTargetStrOffset = rc->dwCompStrOffset;
|
||||
|
||||
return rcSize; // MS API says reconv structure to be returned.
|
||||
}
|
||||
|
||||
void ScintillaWin::GetIntelliMouseParameters() noexcept {
|
||||
// This retrieves the number of lines per scroll as configured in the Mouse Properties sheet in Control Panel
|
||||
::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &linesPerScroll, 0);
|
||||
|
@ -3411,14 +3431,15 @@ DWORD ScintillaWin::EffectFromState(DWORD grfKeyState) const noexcept {
|
|||
/// Implement IUnknown
|
||||
STDMETHODIMP ScintillaWin::QueryInterface(REFIID riid, PVOID *ppv) {
|
||||
*ppv = nullptr;
|
||||
if (riid == IID_IUnknown)
|
||||
*ppv = reinterpret_cast<IDropTarget *>(&dt);
|
||||
if (riid == IID_IDropSource)
|
||||
*ppv = reinterpret_cast<IDropSource *>(&ds);
|
||||
if (riid == IID_IDropTarget)
|
||||
*ppv = reinterpret_cast<IDropTarget *>(&dt);
|
||||
if (riid == IID_IDataObject)
|
||||
*ppv = reinterpret_cast<IDataObject *>(&dob);
|
||||
if (riid == IID_IUnknown) {
|
||||
*ppv = &dt;
|
||||
} else if (riid == IID_IDropSource) {
|
||||
*ppv = &ds;
|
||||
} else if (riid == IID_IDropTarget) {
|
||||
*ppv = &dt;
|
||||
} else if (riid == IID_IDataObject) {
|
||||
*ppv = &dob;
|
||||
}
|
||||
if (!*ppv)
|
||||
return E_NOINTERFACE;
|
||||
return S_OK;
|
||||
|
|
|
@ -45,7 +45,7 @@ vpath %.h ../src ../include
|
|||
vpath %.cxx ../src
|
||||
|
||||
LDFLAGS=-shared -static -mwindows
|
||||
LIBS=-lgdi32 -luser32 -limm32 -lole32 -luuid -loleaut32 -lmsimg32 $(LIBSMINGW)
|
||||
LIBS=-lgdi32 -luser32 -limm32 -lole32 -luuid -loleaut32 $(LIBSMINGW)
|
||||
|
||||
INCLUDES=-I ../include -I ../src
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ CXXNDEBUG=-O2 -MT -DNDEBUG -GL
|
|||
NAME=-Fo
|
||||
LDFLAGS=-OPT:REF -LTCG -IGNORE:4197 -DEBUG $(SUBSYSTEM) $(CETCOMPAT)
|
||||
LDDEBUG=
|
||||
LIBS=KERNEL32.lib USER32.lib GDI32.lib IMM32.lib OLE32.lib OLEAUT32.lib MSIMG32.lib
|
||||
LIBS=KERNEL32.lib USER32.lib GDI32.lib IMM32.lib OLE32.lib OLEAUT32.lib
|
||||
NOLOGO=-nologo
|
||||
|
||||
!IFDEF QUIET
|
||||
|
|
Loading…
Reference in New Issue