Update scintilla 5.3.4 and lexilla 5.2.4 with:
https://www.scintilla.org/scintilla534.zip Released 8 March 2023. Add multithreaded wrap to significantly improve performance of wrapping large files. More typesafe bindings of *Full APIs in ScintillaCall. Feature #1477. Fix overlapping of text with line end wrap marker. Bug #2378. Fix clipping of line end wrap symbol for SC_WRAPVISUALFLAGLOC_END_BY_TEXT. Where a multi-byte character contains multiple styles, display each byte as a representation. This makes it easier to see and fix lexers that change styles mid-character, commonly because they use fixed size buffers. Fix a potential crash with autocompletion list fill-ups where a SCN_CHARADDED handler retriggered an autocompletion list, but with no items that match the typed character. lexilla523 Released 8 March 2023. Add scripts/PromoteNew.bat script to promote .new files after checking. Makefile: Remove 1024-byte line length limit.. Ruby: Add new lexical classes for % literals SCE_RB_STRING_W (%w non-interpolable string array), SCE_RB_STRING_I (%i non-interpolable symbol array), SCE_RB_STRING_QI (%I interpolable symbol array), and SCE_RB_STRING_QS (%s symbol). Issue #124. Ruby: Disambiguate %= which may be a quote or modulo assignment. Issue #124, Bug #1255, Bug #2182. Ruby: Fix additional fold level for single character in SCE_RB_STRING_QW. Issue #132. Ruby: Set SCE_RB_HERE_QQ for unquoted and double-quoted heredocs and SCE_RB_HERE_QX for backticks-quoted heredocs. Issue #134. Ruby: Recognise #{} inside SCE_RB_HERE_QQ and SCE_RB_HERE_QX. Issue #134. Ruby: Improve regex and heredoc recognition. Issue #136. Ruby: Highlight #@, #@@ and #$ style interpolation. Issue #140. Ruby: Fix folding for multiple heredocs started on one line. Fix folding when there is a space after heredoc opening delimiter. Issue #135. YAML: Remove 1024-byte line length limit. https://www.scintilla.org/lexilla524.zip Released 13 March 2023. C++: Fix failure to recognize keywords containing upper case. Issue #149. GDScript: Support % and $ node paths. Issue #145, Pull request #146. Close #13338
This commit is contained in:
parent
12f649bf54
commit
feb454ad6f
Binary file not shown.
Binary file not shown.
|
@ -29,6 +29,7 @@
|
|||
**.vb text
|
||||
**.cmake text
|
||||
**.d text
|
||||
**.diff text
|
||||
**.erl text
|
||||
**.gd text
|
||||
**.gui text
|
||||
|
|
|
@ -61,7 +61,6 @@ unreadVariable:lexilla/lexers/LexJulia.cxx
|
|||
variableScope:lexilla/lexers/LexJulia.cxx
|
||||
variableScope:lexilla/lexers/LexLaTeX.cxx
|
||||
constParameter:lexilla/lexers/LexLaTeX.cxx
|
||||
constParameter:lexilla/lexers/LexLisp.cxx
|
||||
constParameter:lexilla/lexers/LexMagik.cxx
|
||||
constParameter:lexilla/lexers/LexMatlab.cxx
|
||||
unreadVariable:lexilla/lexers/LexMatlab.cxx
|
||||
|
@ -89,8 +88,8 @@ constParameter:lexilla/lexers/LexRaku.cxx
|
|||
variableScope:lexilla/lexers/LexRaku.cxx
|
||||
redundantInitialization:lexilla/lexers/LexRegistry.cxx
|
||||
constParameter:lexilla/lexers/LexRuby.cxx
|
||||
knownConditionTrueFalse:lexilla/lexers/LexRuby.cxx
|
||||
constParameter:lexilla/lexers/LexRust.cxx
|
||||
constParameter:lexilla/lexers/LexScriptol.cxx
|
||||
knownConditionTrueFalse:lexilla/lexers/LexScriptol.cxx
|
||||
variableScope:lexilla/lexers/LexSpecman.cxx
|
||||
unreadVariable:lexilla/lexers/LexSpice.cxx
|
||||
|
@ -127,30 +126,12 @@ constParameterCallback:lexilla/lexers/LexPython.cxx
|
|||
constParameterCallback:lexilla/lexers/LexScriptol.cxx
|
||||
constParameterCallback:lexilla/lexers/LexVB.cxx
|
||||
|
||||
constVariable:lexilla/lexers/LexA68k.cxx
|
||||
constVariable:lexilla/lexers/LexAsn1.cxx
|
||||
constVariable:lexilla/lexers/LexCLW.cxx
|
||||
constVariable:lexilla/lexers/LexCOBOL.cxx
|
||||
constVariable:lexilla/lexers/LexCSS.cxx
|
||||
constVariable:lexilla/lexers/LexCrontab.cxx
|
||||
constVariable:lexilla/lexers/LexEScript.cxx
|
||||
constVariable:lexilla/lexers/LexEiffel.cxx
|
||||
constVariable:lexilla/lexers/LexForth.cxx
|
||||
constVariable:lexilla/lexers/LexGui4Cli.cxx
|
||||
constVariable:lexilla/lexers/LexKix.cxx
|
||||
constVariable:lexilla/lexers/LexLout.cxx
|
||||
constVariable:lexilla/lexers/LexMetapost.cxx
|
||||
constVariable:lexilla/lexers/LexModula.cxx
|
||||
constVariable:lexilla/lexers/LexOpal.cxx
|
||||
constVariable:lexilla/lexers/LexPS.cxx
|
||||
constVariable:lexilla/lexers/LexPascal.cxx
|
||||
constVariable:lexilla/lexers/LexRebol.cxx
|
||||
constVariable:lexilla/lexers/LexRuby.cxx
|
||||
constVariable:lexilla/lexers/LexSorcus.cxx
|
||||
constVariable:lexilla/lexers/LexStata.cxx
|
||||
constVariable:lexilla/lexers/LexTACL.cxx
|
||||
constVariable:lexilla/lexers/LexTADS3.cxx
|
||||
constVariable:lexilla/lexers/LexTAL.cxx
|
||||
|
||||
// cppcheck appears wrong as atKeyPath must be remembered between loops
|
||||
variableScope:lexilla/lexers/LexRegistry.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="20230208" />
|
||||
<meta name="Date.Modified" content="20230313" />
|
||||
<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.2<br />
|
||||
Site last modified February 8 2023</font>
|
||||
<font color="#FFCC99" size="3">Release version 5.2.4<br />
|
||||
Site last modified March 13 2023</font>
|
||||
</td>
|
||||
<td width="20%">
|
||||
|
||||
|
@ -77,13 +77,13 @@
|
|||
</tr>
|
||||
</table>
|
||||
<ul id="versionlist">
|
||||
<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>
|
||||
<li>Version 5.1.7 improves CMake, HTML, Matlab, Raku, Ruby, and VHDL.</li>
|
||||
<li>Version 5.1.6 improves Markdown and Ruby.</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/lexilla522.zip">
|
||||
<font size="4"> <a href="https://www.scintilla.org/lexilla524.zip">
|
||||
Windows</a>
|
||||
<a href="https://www.scintilla.org/lexilla522.tgz">
|
||||
<a href="https://www.scintilla.org/lexilla524.tgz">
|
||||
GTK/Linux</a>
|
||||
</font>
|
||||
</td>
|
||||
|
@ -42,7 +42,7 @@
|
|||
containing very few restrictions.
|
||||
</p>
|
||||
<h3>
|
||||
Release 5.2.2
|
||||
Release 5.2.4
|
||||
</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/lexilla522.zip">zip format</a> (1.2M) commonly used on Windows</li>
|
||||
<li><a href="https://www.scintilla.org/lexilla522.tgz">tgz format</a> (0.9M) commonly used on Linux and compatible operating systems</li>
|
||||
<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>
|
||||
</ul>
|
||||
Instructions for building on both Windows and Linux are included in the readme file.
|
||||
<h4>
|
||||
|
|
|
@ -585,6 +585,79 @@
|
|||
</tr>
|
||||
</table>
|
||||
<h2>Releases</h2>
|
||||
<h3>
|
||||
<a href="https://www.scintilla.org/lexilla524.zip">Release 5.2.4</a>
|
||||
</h3>
|
||||
<ul>
|
||||
<li>
|
||||
Released 13 March 2023.
|
||||
</li>
|
||||
<li>
|
||||
C++: Fix failure to recognize keywords containing upper case.
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/issues/149">Issue #149</a>.
|
||||
</li>
|
||||
<li>
|
||||
GDScript: Support % and $ node paths.
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/issues/145">Issue #145</a>,
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/pull/146">Pull request #146</a>.
|
||||
</li>
|
||||
</ul>
|
||||
<h3>
|
||||
<a href="https://www.scintilla.org/lexilla523.zip">Release 5.2.3</a>
|
||||
</h3>
|
||||
<ul>
|
||||
<li>
|
||||
Released 8 March 2023.
|
||||
</li>
|
||||
<li>
|
||||
Add scripts/PromoteNew.bat script to promote .new files after checking.
|
||||
</li>
|
||||
<li>
|
||||
Makefile: Remove 1024-byte line length limit..
|
||||
</li>
|
||||
<li>
|
||||
Ruby: Add new lexical classes for % literals SCE_RB_STRING_W (%w non-interpolable string array),
|
||||
SCE_RB_STRING_I (%i non-interpolable symbol array),
|
||||
SCE_RB_STRING_QI (%I interpolable symbol array),
|
||||
and SCE_RB_STRING_QS (%s symbol).
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/issues/124">Issue #124</a>.
|
||||
</li>
|
||||
<li>
|
||||
Ruby: Disambiguate %= which may be a quote or modulo assignment.
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/issues/124">Issue #124</a>,
|
||||
<a href="https://sourceforge.net/p/scintilla/bugs/1255/">Bug #1255</a>,
|
||||
<a href="https://sourceforge.net/p/scintilla/bugs/2182/">Bug #2182</a>.
|
||||
</li>
|
||||
<li>
|
||||
Ruby: Fix additional fold level for single character in SCE_RB_STRING_QW.
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/issues/132">Issue #132</a>.
|
||||
</li>
|
||||
<li>
|
||||
Ruby: Set SCE_RB_HERE_QQ for unquoted and double-quoted heredocs and
|
||||
SCE_RB_HERE_QX for backticks-quoted heredocs.
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/issues/134">Issue #134</a>.
|
||||
</li>
|
||||
<li>
|
||||
Ruby: Recognise #{} inside SCE_RB_HERE_QQ and SCE_RB_HERE_QX.
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/issues/134">Issue #134</a>.
|
||||
</li>
|
||||
<li>
|
||||
Ruby: Improve regex and heredoc recognition.
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/issues/136">Issue #136</a>.
|
||||
</li>
|
||||
<li>
|
||||
Ruby: Highlight #@, #@@ and #$ style interpolation.
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/issues/140">Issue #140</a>.
|
||||
</li>
|
||||
<li>
|
||||
Ruby: Fix folding for multiple heredocs started on one line.
|
||||
Fix folding when there is a space after heredoc opening delimiter.
|
||||
<a href="https://github.com/ScintillaOrg/lexilla/issues/135">Issue #135</a>.
|
||||
</li>
|
||||
<li>
|
||||
YAML: Remove 1024-byte line length limit.
|
||||
</li>
|
||||
</ul>
|
||||
<h3>
|
||||
<a href="https://www.scintilla.org/lexilla522.zip">Release 5.2.2</a>
|
||||
</h3>
|
||||
|
|
|
@ -467,7 +467,11 @@ val SCE_RB_WORD_DEMOTED=29
|
|||
val SCE_RB_STDIN=30
|
||||
val SCE_RB_STDOUT=31
|
||||
val SCE_RB_STDERR=40
|
||||
val SCE_RB_UPPER_BOUND=41
|
||||
val SCE_RB_STRING_W=41
|
||||
val SCE_RB_STRING_I=42
|
||||
val SCE_RB_STRING_QI=43
|
||||
val SCE_RB_STRING_QS=44
|
||||
val SCE_RB_UPPER_BOUND=45
|
||||
# Lexical states for SCLEX_VB, SCLEX_VBSCRIPT, SCLEX_POWERBASIC, SCLEX_BLITZBASIC, SCLEX_PUREBASIC, SCLEX_FREEBASIC
|
||||
lex VB=SCLEX_VB SCE_B_
|
||||
lex VBScript=SCLEX_VBSCRIPT SCE_B_
|
||||
|
@ -2301,3 +2305,4 @@ val SCE_GD_COMMENTBLOCK=12
|
|||
val SCE_GD_STRINGEOL=13
|
||||
val SCE_GD_WORD2=14
|
||||
val SCE_GD_ANNOTATION=15
|
||||
val SCE_GD_NODEPATH=16
|
||||
|
|
|
@ -558,7 +558,11 @@
|
|||
#define SCE_RB_STDIN 30
|
||||
#define SCE_RB_STDOUT 31
|
||||
#define SCE_RB_STDERR 40
|
||||
#define SCE_RB_UPPER_BOUND 41
|
||||
#define SCE_RB_STRING_W 41
|
||||
#define SCE_RB_STRING_I 42
|
||||
#define SCE_RB_STRING_QI 43
|
||||
#define SCE_RB_STRING_QS 44
|
||||
#define SCE_RB_UPPER_BOUND 45
|
||||
#define SCE_B_DEFAULT 0
|
||||
#define SCE_B_COMMENT 1
|
||||
#define SCE_B_NUMBER 2
|
||||
|
@ -2175,6 +2179,7 @@
|
|||
#define SCE_GD_STRINGEOL 13
|
||||
#define SCE_GD_WORD2 14
|
||||
#define SCE_GD_ANNOTATION 15
|
||||
#define SCE_GD_NODEPATH 16
|
||||
/* --Autogenerated -- end of section automatically generated from Scintilla.iface */
|
||||
|
||||
#endif
|
||||
|
|
|
@ -91,6 +91,10 @@ constexpr bool IsSpaceOrTab(int ch) noexcept {
|
|||
return ch == ' ' || ch == '\t';
|
||||
}
|
||||
|
||||
constexpr bool IsOperatorOrSpace(int ch) noexcept {
|
||||
return isoperator(ch) || IsASpace(ch);
|
||||
}
|
||||
|
||||
bool OnlySpaceOrTab(const std::string &s) noexcept {
|
||||
for (const char ch : s) {
|
||||
if (!IsSpaceOrTab(ch))
|
||||
|
@ -138,23 +142,18 @@ BracketPair FindBracketPair(Tokens &tokens) {
|
|||
|
||||
void highlightTaskMarker(StyleContext &sc, LexAccessor &styler,
|
||||
int activity, const WordList &markerList, bool caseSensitive){
|
||||
if ((isoperator(sc.chPrev) || IsASpace(sc.chPrev)) && markerList.Length()) {
|
||||
constexpr Sci_PositionU lengthMarker = 50;
|
||||
char marker[lengthMarker+1] = "";
|
||||
const Sci_PositionU currPos = sc.currentPos;
|
||||
Sci_PositionU i = 0;
|
||||
while (i < lengthMarker) {
|
||||
const char ch = styler.SafeGetCharAt(currPos + i);
|
||||
if (IsASpace(ch) || isoperator(ch)) {
|
||||
if (IsOperatorOrSpace(sc.chPrev) && !IsOperatorOrSpace(sc.ch) && markerList.Length()) {
|
||||
std::string marker;
|
||||
for (Sci_PositionU currPos = sc.currentPos; true; currPos++) {
|
||||
const char ch = styler.SafeGetCharAt(currPos);
|
||||
if (IsOperatorOrSpace(ch)) {
|
||||
break;
|
||||
}
|
||||
if (caseSensitive)
|
||||
marker[i] = ch;
|
||||
marker.push_back(ch);
|
||||
else
|
||||
marker[i] = MakeLowerCase(ch);
|
||||
i++;
|
||||
marker.push_back(MakeLowerCase(ch));
|
||||
}
|
||||
marker[i] = '\0';
|
||||
if (markerList.InList(marker)) {
|
||||
sc.SetState(SCE_C_TASKMARKER|activity);
|
||||
}
|
||||
|
@ -732,10 +731,7 @@ Sci_Position SCI_METHOD LexerCPP::WordListSet(int n, const char *wl) {
|
|||
}
|
||||
Sci_Position firstModification = -1;
|
||||
if (wordListN) {
|
||||
WordList wlNew;
|
||||
wlNew.Set(wl);
|
||||
if (*wordListN != wlNew) {
|
||||
wordListN->Set(wl);
|
||||
if (wordListN->Set(wl)) {
|
||||
firstModification = 0;
|
||||
if (n == 4) {
|
||||
// Rebuild preprocessorDefinitions
|
||||
|
@ -771,6 +767,9 @@ Sci_Position SCI_METHOD LexerCPP::WordListSet(int n, const char *wl) {
|
|||
void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) {
|
||||
LexAccessor styler(pAccess);
|
||||
|
||||
const StyleContext::Transform transform = caseSensitive ?
|
||||
StyleContext::Transform::none : StyleContext::Transform::lower;
|
||||
|
||||
const CharacterSet setOKBeforeRE(CharacterSet::setNone, "([{=,:;!%^&*|?~+-");
|
||||
const CharacterSet setCouldBePostOp(CharacterSet::setNone, "+-");
|
||||
|
||||
|
@ -847,6 +846,8 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i
|
|||
std::string rawStringTerminator = rawStringTerminators.ValueAt(lineCurrent-1);
|
||||
SparseState<std::string> rawSTNew(lineCurrent);
|
||||
|
||||
std::string currentText;
|
||||
|
||||
int activitySet = preproc.ActiveState();
|
||||
|
||||
const WordClassifier &classifierIdentifiers = subStyles.Classifier(SCE_C_IDENTIFIER);
|
||||
|
@ -932,31 +933,29 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i
|
|||
break;
|
||||
case SCE_C_IDENTIFIER:
|
||||
if (sc.atLineStart || sc.atLineEnd || !setWord.Contains(sc.ch) || (sc.ch == '.')) {
|
||||
char s[1000];
|
||||
if (caseSensitive) {
|
||||
sc.GetCurrent(s, sizeof(s));
|
||||
} else {
|
||||
sc.GetCurrentLowered(s, sizeof(s));
|
||||
}
|
||||
if (keywords.InList(s)) {
|
||||
lastWordWasUUID = strcmp(s, "uuid") == 0;
|
||||
sc.GetCurrentString(currentText, transform);
|
||||
if (keywords.InList(currentText)) {
|
||||
lastWordWasUUID = currentText == "uuid";
|
||||
sc.ChangeState(SCE_C_WORD|activitySet);
|
||||
} else if (keywords2.InList(s)) {
|
||||
} else if (keywords2.InList(currentText)) {
|
||||
sc.ChangeState(SCE_C_WORD2|activitySet);
|
||||
} else if (keywords4.InList(s)) {
|
||||
} else if (keywords4.InList(currentText)) {
|
||||
sc.ChangeState(SCE_C_GLOBALCLASS|activitySet);
|
||||
} else {
|
||||
const int subStyle = classifierIdentifiers.ValueFor(s);
|
||||
const int subStyle = classifierIdentifiers.ValueFor(currentText);
|
||||
if (subStyle >= 0) {
|
||||
sc.ChangeState(subStyle|activitySet);
|
||||
}
|
||||
}
|
||||
const bool literalString = sc.ch == '\"';
|
||||
if (literalString || sc.ch == '\'') {
|
||||
size_t lenS = strlen(s);
|
||||
std::string_view s = currentText;
|
||||
size_t lenS = s.length();
|
||||
const bool raw = literalString && sc.chPrev == 'R' && !setInvalidRawFirst.Contains(sc.chNext);
|
||||
if (raw)
|
||||
s[lenS--] = '\0';
|
||||
if (raw) {
|
||||
s.remove_suffix(1);
|
||||
lenS--;
|
||||
}
|
||||
const bool valid =
|
||||
(lenS == 0) ||
|
||||
((lenS == 1) && ((s[0] == 'L') || (s[0] == 'u') || (s[0] == 'U'))) ||
|
||||
|
@ -1070,33 +1069,27 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i
|
|||
seenDocKeyBrace = true;
|
||||
} else if (!setDoxygen.Contains(sc.ch)
|
||||
&& !(seenDocKeyBrace && (sc.ch == ',' || sc.ch == '.'))) {
|
||||
char s[100];
|
||||
if (caseSensitive) {
|
||||
sc.GetCurrent(s, sizeof(s));
|
||||
} else {
|
||||
sc.GetCurrentLowered(s, sizeof(s));
|
||||
}
|
||||
if (!(IsASpace(sc.ch) || (sc.ch == 0))) {
|
||||
sc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR|activitySet);
|
||||
} else if (!keywords3.InList(s + 1) && !keywords3.InList(s)) {
|
||||
const int subStyleCDKW = classifierDocKeyWords.ValueFor(s+1);
|
||||
if (subStyleCDKW >= 0) {
|
||||
sc.ChangeState(subStyleCDKW|activitySet);
|
||||
} else {
|
||||
sc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR|activitySet);
|
||||
} else {
|
||||
sc.GetCurrentString(currentText, transform);
|
||||
assert(!currentText.empty());
|
||||
std::string currentSuffix = currentText.substr(1);
|
||||
if (!keywords3.InList(currentSuffix) && !keywords3.InList(currentText)) {
|
||||
const int subStyleCDKW = classifierDocKeyWords.ValueFor(currentSuffix.c_str());
|
||||
if (subStyleCDKW >= 0) {
|
||||
sc.ChangeState(subStyleCDKW | activitySet);
|
||||
} else {
|
||||
sc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR | activitySet);
|
||||
}
|
||||
}
|
||||
}
|
||||
sc.SetState(styleBeforeDCKeyword|activitySet);
|
||||
seenDocKeyBrace = false;
|
||||
} else if (sc.ch == '>') {
|
||||
char s[100];
|
||||
if (caseSensitive) {
|
||||
sc.GetCurrent(s, sizeof(s));
|
||||
} else {
|
||||
sc.GetCurrentLowered(s, sizeof(s));
|
||||
}
|
||||
if (!keywords3.InList(s)) {
|
||||
const int subStyleCDKW = classifierDocKeyWords.ValueFor(s + 1);
|
||||
sc.GetCurrentString(currentText, transform);
|
||||
if (!keywords3.InList(currentText)) {
|
||||
const int subStyleCDKW = classifierDocKeyWords.ValueFor(currentText.substr(1));
|
||||
if (subStyleCDKW >= 0) {
|
||||
sc.ChangeState(subStyleCDKW | activitySet);
|
||||
} else {
|
||||
|
@ -1226,7 +1219,7 @@ void SCI_METHOD LexerCPP::Lex(Sci_PositionU startPos, Sci_Position length, int i
|
|||
}
|
||||
break;
|
||||
case SCE_C_TASKMARKER:
|
||||
if (isoperator(sc.ch) || IsASpace(sc.ch)) {
|
||||
if (IsOperatorOrSpace(sc.ch)) {
|
||||
sc.SetState(styleBeforeTaskMarker|activitySet);
|
||||
styleBeforeTaskMarker = SCE_C_DEFAULT;
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
@ -28,16 +28,14 @@
|
|||
|
||||
using namespace Lexilla;
|
||||
|
||||
static inline bool AtEOL(Accessor &styler, Sci_PositionU i) {
|
||||
namespace {
|
||||
|
||||
inline bool AtEOL(Accessor &styler, Sci_PositionU i) {
|
||||
return (styler[i] == '\n') ||
|
||||
((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n'));
|
||||
}
|
||||
|
||||
#define DIFF_BUFFER_START_SIZE 16
|
||||
// Note that ColouriseDiffLine analyzes only the first DIFF_BUFFER_START_SIZE
|
||||
// characters of each line to classify the line.
|
||||
|
||||
static void ColouriseDiffLine(char *lineBuffer, Sci_Position endLine, Accessor &styler) {
|
||||
void ColouriseDiffLine(const char *lineBuffer, Sci_Position endLine, Accessor &styler) {
|
||||
// It is needed to remember the current state to recognize starting
|
||||
// comment lines before the first "diff " or "--- ". If a real
|
||||
// difference starts then each line starting with ' ' is a whitespace
|
||||
|
@ -102,39 +100,30 @@ static void ColouriseDiffLine(char *lineBuffer, Sci_Position endLine, Accessor &
|
|||
}
|
||||
}
|
||||
|
||||
static void ColouriseDiffDoc(Sci_PositionU startPos, Sci_Position length, int, WordList *[], Accessor &styler) {
|
||||
char lineBuffer[DIFF_BUFFER_START_SIZE] = "";
|
||||
void ColouriseDiffDoc(Sci_PositionU startPos, Sci_Position length, int, WordList *[], Accessor &styler) {
|
||||
std::string lineBuffer;
|
||||
styler.StartAt(startPos);
|
||||
styler.StartSegment(startPos);
|
||||
Sci_PositionU linePos = 0;
|
||||
for (Sci_PositionU i = startPos; i < startPos + length; i++) {
|
||||
if (AtEOL(styler, i)) {
|
||||
if (linePos < DIFF_BUFFER_START_SIZE) {
|
||||
lineBuffer[linePos] = 0;
|
||||
}
|
||||
ColouriseDiffLine(lineBuffer, i, styler);
|
||||
linePos = 0;
|
||||
} else if (linePos < DIFF_BUFFER_START_SIZE - 1) {
|
||||
lineBuffer[linePos++] = styler[i];
|
||||
} else if (linePos == DIFF_BUFFER_START_SIZE - 1) {
|
||||
lineBuffer[linePos++] = 0;
|
||||
ColouriseDiffLine(lineBuffer.c_str(), i, styler);
|
||||
lineBuffer.clear();
|
||||
} else {
|
||||
lineBuffer.push_back(styler[i]);
|
||||
}
|
||||
}
|
||||
if (linePos > 0) { // Last line does not have ending characters
|
||||
if (linePos < DIFF_BUFFER_START_SIZE) {
|
||||
lineBuffer[linePos] = 0;
|
||||
}
|
||||
ColouriseDiffLine(lineBuffer, startPos + length - 1, styler);
|
||||
if (!lineBuffer.empty()) { // Last line does not have ending characters
|
||||
ColouriseDiffLine(lineBuffer.c_str(), startPos + length - 1, styler);
|
||||
}
|
||||
}
|
||||
|
||||
static void FoldDiffDoc(Sci_PositionU startPos, Sci_Position length, int, WordList *[], Accessor &styler) {
|
||||
void FoldDiffDoc(Sci_PositionU startPos, Sci_Position length, int, WordList *[], Accessor &styler) {
|
||||
Sci_Position curLine = styler.GetLine(startPos);
|
||||
Sci_Position curLineStart = styler.LineStart(curLine);
|
||||
int prevLevel = curLine > 0 ? styler.LevelAt(curLine - 1) : SC_FOLDLEVELBASE;
|
||||
int nextLevel;
|
||||
|
||||
do {
|
||||
int nextLevel = 0;
|
||||
const int lineType = styler.StyleAt(curLineStart);
|
||||
if (lineType == SCE_DIFF_COMMAND)
|
||||
nextLevel = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;
|
||||
|
@ -157,8 +146,10 @@ static void FoldDiffDoc(Sci_PositionU startPos, Sci_Position length, int, WordLi
|
|||
} while (static_cast<Sci_Position>(startPos)+length > curLineStart);
|
||||
}
|
||||
|
||||
static const char *const emptyWordListDesc[] = {
|
||||
0
|
||||
const char *const emptyWordListDesc[] = {
|
||||
nullptr
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
LexerModule lmDiff(SCLEX_DIFF, ColouriseDiffDoc, "diff", FoldDiffDoc, emptyWordListDesc);
|
||||
|
|
|
@ -48,22 +48,13 @@ static constexpr int keywordClasses[] = {
|
|||
namespace {
|
||||
|
||||
struct OptionsFSharp {
|
||||
bool fold;
|
||||
bool foldCompact;
|
||||
bool foldComment;
|
||||
bool foldCommentStream;
|
||||
bool foldCommentMultiLine;
|
||||
bool foldPreprocessor;
|
||||
bool foldImports;
|
||||
OptionsFSharp() {
|
||||
fold = true;
|
||||
foldCompact = true;
|
||||
foldComment = true;
|
||||
foldCommentStream = true;
|
||||
foldCommentMultiLine = true;
|
||||
foldPreprocessor = false;
|
||||
foldImports = true;
|
||||
}
|
||||
bool fold = true;
|
||||
bool foldCompact = true;
|
||||
bool foldComment = true;
|
||||
bool foldCommentStream = true;
|
||||
bool foldCommentMultiLine = true;
|
||||
bool foldPreprocessor = false;
|
||||
bool foldImports = true;
|
||||
};
|
||||
|
||||
struct OptionSetFSharp : public OptionSet<OptionsFSharp> {
|
||||
|
@ -91,25 +82,11 @@ struct OptionSetFSharp : public OptionSet<OptionsFSharp> {
|
|||
}
|
||||
};
|
||||
|
||||
const CharacterSet setOperators = CharacterSet(CharacterSet::setNone, "~^'-+*/%=@|&<>()[]{};,:!?");
|
||||
const CharacterSet setClosingTokens = CharacterSet(CharacterSet::setNone, ")}]");
|
||||
const CharacterSet setFormatSpecs = CharacterSet(CharacterSet::setNone, ".%aAbBcdeEfFgGiMoOstuxX0123456789");
|
||||
const CharacterSet setDotNetFormatSpecs = CharacterSet(CharacterSet::setNone, "cCdDeEfFgGnNpPxX");
|
||||
const CharacterSet setFormatFlags = CharacterSet(CharacterSet::setNone, ".-+0 ");
|
||||
const CharacterSet numericMetaChars1 = CharacterSet(CharacterSet::setNone, "_uU");
|
||||
const CharacterSet numericMetaChars2 = CharacterSet(CharacterSet::setNone, "fFIlLmMnsy");
|
||||
std::map<int, int> numericPrefixes = { { 'b', 2 }, { 'o', 8 }, { 'x', 16 } };
|
||||
constexpr Sci_Position ZERO_LENGTH = -1;
|
||||
|
||||
struct FSharpString {
|
||||
Sci_Position startPos;
|
||||
int startChar;
|
||||
FSharpString() {
|
||||
startPos = ZERO_LENGTH;
|
||||
startChar = '"';
|
||||
}
|
||||
Sci_Position startPos = INVALID_POSITION;
|
||||
int startChar = '"';
|
||||
constexpr bool HasLength() const {
|
||||
return startPos > ZERO_LENGTH;
|
||||
return startPos > INVALID_POSITION;
|
||||
}
|
||||
constexpr bool CanInterpolate() const {
|
||||
return startChar == '$';
|
||||
|
@ -278,20 +255,6 @@ inline bool CanEmbedQuotes(StyleContext &cxt) {
|
|||
cxt.Match('`', '`');
|
||||
}
|
||||
|
||||
inline bool IsNumber(StyleContext &cxt, const int base = 10) {
|
||||
return IsADigit(cxt.ch, base) || (IsADigit(cxt.chPrev, base) && numericMetaChars1.Contains(cxt.ch)) ||
|
||||
(IsADigit(cxt.GetRelative(-2), base) && numericMetaChars2.Contains(cxt.ch));
|
||||
}
|
||||
|
||||
inline bool IsFloat(StyleContext &cxt) {
|
||||
if (cxt.MatchIgnoreCase("e+") || cxt.MatchIgnoreCase("e-")) {
|
||||
cxt.Forward();
|
||||
return true;
|
||||
}
|
||||
return ((cxt.chPrev == '.' && IsADigit(cxt.ch)) ||
|
||||
(IsADigit(cxt.chPrev) && (cxt.ch == '.' || numericMetaChars2.Contains(cxt.ch))));
|
||||
}
|
||||
|
||||
inline bool IsLineEnd(StyleContext &cxt, const Sci_Position offset) {
|
||||
const int ch = cxt.GetRelative(offset, '\n');
|
||||
return (ch == '\r' || ch == '\n');
|
||||
|
@ -301,10 +264,28 @@ class LexerFSharp : public DefaultLexer {
|
|||
WordList keywords[WORDLIST_SIZE];
|
||||
OptionsFSharp options;
|
||||
OptionSetFSharp optionSet;
|
||||
CharacterSet setOperators;
|
||||
CharacterSet setFormatSpecs;
|
||||
CharacterSet setDotNetFormatSpecs;
|
||||
CharacterSet setFormatFlags;
|
||||
CharacterSet numericMetaChars1;
|
||||
CharacterSet numericMetaChars2;
|
||||
std::map<int, int> numericPrefixes = { { 'b', 2 }, { 'o', 8 }, { 'x', 16 } };
|
||||
|
||||
public:
|
||||
explicit LexerFSharp() : DefaultLexer(lexerName, SCLEX_FSHARP) {
|
||||
explicit LexerFSharp()
|
||||
: DefaultLexer(lexerName, SCLEX_FSHARP),
|
||||
setOperators(CharacterSet::setNone, "~^'-+*/%=@|&<>()[]{};,:!?"),
|
||||
setFormatSpecs(CharacterSet::setNone, ".%aAbBcdeEfFgGiMoOstuxX0123456789"),
|
||||
setDotNetFormatSpecs(CharacterSet::setNone, "cCdDeEfFgGnNpPxX"),
|
||||
setFormatFlags(CharacterSet::setNone, ".-+0 "),
|
||||
numericMetaChars1(CharacterSet::setNone, "_uU"),
|
||||
numericMetaChars2(CharacterSet::setNone, "fFIlLmMnsy") {
|
||||
}
|
||||
LexerFSharp(const LexerFSharp &) = delete;
|
||||
LexerFSharp(LexerFSharp &&) = delete;
|
||||
LexerFSharp &operator=(const LexerFSharp &) = delete;
|
||||
LexerFSharp &operator=(LexerFSharp &&) = delete;
|
||||
static ILexer5 *LexerFactoryFSharp() {
|
||||
return new LexerFSharp();
|
||||
}
|
||||
|
@ -347,16 +328,31 @@ public:
|
|||
if (optionSet.PropertySet(&options, key, val)) {
|
||||
return 0;
|
||||
}
|
||||
return ZERO_LENGTH;
|
||||
return INVALID_POSITION;
|
||||
}
|
||||
Sci_Position SCI_METHOD WordListSet(int n, const char *wl) override;
|
||||
void SCI_METHOD Lex(Sci_PositionU start, Sci_Position length, int initStyle, IDocument *pAccess) override;
|
||||
void SCI_METHOD Fold(Sci_PositionU start, Sci_Position length, int initStyle,IDocument *pAccess) override;
|
||||
|
||||
private:
|
||||
inline bool IsNumber(StyleContext &cxt, const int base = 10) {
|
||||
return IsADigit(cxt.ch, base) || (IsADigit(cxt.chPrev, base) && numericMetaChars1.Contains(cxt.ch)) ||
|
||||
(IsADigit(cxt.GetRelative(-2), base) && numericMetaChars2.Contains(cxt.ch));
|
||||
}
|
||||
|
||||
inline bool IsFloat(StyleContext &cxt) {
|
||||
if (cxt.MatchIgnoreCase("e+") || cxt.MatchIgnoreCase("e-")) {
|
||||
cxt.Forward();
|
||||
return true;
|
||||
}
|
||||
return ((cxt.chPrev == '.' && IsADigit(cxt.ch)) ||
|
||||
(IsADigit(cxt.chPrev) && (cxt.ch == '.' || numericMetaChars2.Contains(cxt.ch))));
|
||||
}
|
||||
};
|
||||
|
||||
Sci_Position SCI_METHOD LexerFSharp::WordListSet(int n, const char *wl) {
|
||||
WordList *wordListN = nullptr;
|
||||
Sci_Position firstModification = ZERO_LENGTH;
|
||||
Sci_Position firstModification = INVALID_POSITION;
|
||||
|
||||
if (n < WORDLIST_SIZE) {
|
||||
wordListN = &keywords[n];
|
||||
|
@ -370,7 +366,7 @@ Sci_Position SCI_METHOD LexerFSharp::WordListSet(int n, const char *wl) {
|
|||
void SCI_METHOD LexerFSharp::Lex(Sci_PositionU start, Sci_Position length, int initStyle, IDocument *pAccess) {
|
||||
LexAccessor styler(pAccess);
|
||||
StyleContext sc(start, static_cast<Sci_PositionU>(length), initStyle, styler);
|
||||
Sci_Position lineCurrent = styler.GetLine(start);
|
||||
Sci_Position lineCurrent = styler.GetLine(static_cast<Sci_Position>(start));
|
||||
Sci_PositionU cursor = 0;
|
||||
UnicodeChar uniCh = UnicodeChar();
|
||||
FSharpString fsStr = FSharpString();
|
||||
|
@ -411,7 +407,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.startPos = ZERO_LENGTH;
|
||||
fsStr.startPos = INVALID_POSITION;
|
||||
if (CanEmbedQuotes(sc)) {
|
||||
// double quotes after this position should be non-terminating
|
||||
fsStr.startPos = static_cast<Sci_Position>(sc.currentPos - cursor);
|
||||
|
|
|
@ -94,6 +94,16 @@ int GetGDStringState(Accessor &styler, Sci_Position i, Sci_PositionU *nextIndex)
|
|||
}
|
||||
}
|
||||
|
||||
int GetGDStringState(int ch) {
|
||||
if (ch != '"' && ch != '\'')
|
||||
return SCE_GD_DEFAULT;
|
||||
|
||||
if (ch == '"')
|
||||
return SCE_GD_STRING;
|
||||
else
|
||||
return SCE_GD_CHARACTER;
|
||||
}
|
||||
|
||||
inline bool IsAWordChar(int ch, bool unicodeIdentifiers) {
|
||||
if (IsASCII(ch))
|
||||
return (IsAlphaNumeric(ch) || ch == '.' || ch == '_');
|
||||
|
@ -104,6 +114,16 @@ inline bool IsAWordChar(int ch, bool unicodeIdentifiers) {
|
|||
return IsXidContinue(ch);
|
||||
}
|
||||
|
||||
inline bool IsANodePathChar(int ch, bool unicodeIdentifiers) {
|
||||
if (IsASCII(ch))
|
||||
return (IsAlphaNumeric(ch) || ch == '_' || ch == '/' || ch =='%');
|
||||
|
||||
if (!unicodeIdentifiers)
|
||||
return false;
|
||||
|
||||
return IsXidContinue(ch);
|
||||
}
|
||||
|
||||
inline bool IsAWordStart(int ch, bool unicodeIdentifiers) {
|
||||
if (IsASCII(ch))
|
||||
return (IsUpperOrLowerCase(ch) || ch == '_');
|
||||
|
@ -209,6 +229,7 @@ LexicalClass lexicalClasses[] = {
|
|||
13, "SCE_GD_STRINGEOL", "error literal string", "End of line where string is not closed",
|
||||
14, "SCE_GD_WORD2", "identifier", "Highlighted identifiers",
|
||||
15, "SCE_GD_ANNOTATION", "annotation", "Annotations",
|
||||
16, "SCE_GD_NODEPATH", "path", "Node path",
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -390,7 +411,9 @@ void SCI_METHOD LexerGDScript::Lex(Sci_PositionU startPos, Sci_Position length,
|
|||
bool indentGood = true;
|
||||
Sci_Position startIndicator = sc.currentPos;
|
||||
bool inContinuedString = false;
|
||||
|
||||
bool percentIsNodePath = false;
|
||||
int nodePathStringState = SCE_GD_DEFAULT;
|
||||
|
||||
for (; sc.More(); sc.Forward()) {
|
||||
|
||||
if (sc.atLineStart) {
|
||||
|
@ -412,6 +435,7 @@ void SCI_METHOD LexerGDScript::Lex(Sci_PositionU startPos, Sci_Position length,
|
|||
}
|
||||
|
||||
if (sc.atLineEnd) {
|
||||
percentIsNodePath = false;
|
||||
ProcessLineEnd(sc, inContinuedString);
|
||||
lineCurrent++;
|
||||
if (!sc.More())
|
||||
|
@ -479,6 +503,18 @@ void SCI_METHOD LexerGDScript::Lex(Sci_PositionU startPos, Sci_Position length,
|
|||
if (!IsAWordStart(sc.ch, options.unicodeIdentifiers)) {
|
||||
sc.SetState(SCE_GD_DEFAULT);
|
||||
}
|
||||
} else if (sc.state == SCE_GD_NODEPATH) {
|
||||
if (nodePathStringState != SCE_GD_DEFAULT) {
|
||||
if (sc.ch == GetGDStringQuoteChar(nodePathStringState) ) {
|
||||
nodePathStringState = SCE_GD_DEFAULT;
|
||||
}
|
||||
} else {
|
||||
if (IsGDStringStart(sc.ch)) {
|
||||
nodePathStringState = GetGDStringState(sc.ch);
|
||||
} else if (!IsANodePathChar(sc.ch, options.unicodeIdentifiers)) {
|
||||
sc.SetState(SCE_GD_DEFAULT);
|
||||
}
|
||||
}
|
||||
} else if (IsGDSingleQuoteStringState(sc.state)) {
|
||||
if (sc.ch == '\\') {
|
||||
if ((sc.chNext == '\r') && (sc.GetRelative(2) == '\n')) {
|
||||
|
@ -548,7 +584,11 @@ void SCI_METHOD LexerGDScript::Lex(Sci_PositionU startPos, Sci_Position length,
|
|||
base_n_number = false;
|
||||
sc.SetState(SCE_GD_NUMBER);
|
||||
}
|
||||
} else if ((sc.ch == '$') || (sc.ch == '%' && (percentIsNodePath || IsFirstNonWhitespace(sc.currentPos, styler)))) {
|
||||
percentIsNodePath = false;
|
||||
sc.SetState(SCE_GD_NODEPATH);
|
||||
} else if (isoperator(sc.ch) || sc.ch == '`') {
|
||||
percentIsNodePath = !((sc.ch == ')') || (sc.ch == ']') || (sc.ch == '}'));
|
||||
sc.SetState(SCE_GD_OPERATOR);
|
||||
} else if (sc.ch == '#') {
|
||||
sc.SetState(sc.chNext == '#' ? SCE_GD_COMMENTBLOCK : SCE_GD_COMMENTLINE);
|
||||
|
|
|
@ -1060,10 +1060,7 @@ Sci_Position SCI_METHOD LexerHTML::WordListSet(int n, const char *wl) {
|
|||
}
|
||||
Sci_Position firstModification = -1;
|
||||
if (wordListN) {
|
||||
WordList wlNew;
|
||||
wlNew.Set(wl);
|
||||
if (*wordListN != wlNew) {
|
||||
wordListN->Set(wl);
|
||||
if (wordListN->Set(wl)) {
|
||||
firstModification = 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
@ -34,12 +34,12 @@ static inline bool AtEOL(Accessor &styler, Sci_PositionU i) {
|
|||
}
|
||||
|
||||
static void ColouriseMakeLine(
|
||||
char *lineBuffer,
|
||||
Sci_PositionU lengthLine,
|
||||
const std::string &lineBuffer,
|
||||
Sci_PositionU startLine,
|
||||
Sci_PositionU endPos,
|
||||
Accessor &styler) {
|
||||
|
||||
const Sci_PositionU lengthLine = lineBuffer.length();
|
||||
Sci_PositionU i = 0;
|
||||
Sci_Position lastNonSpace = -1;
|
||||
unsigned int state = SCE_MAKE_DEFAULT;
|
||||
|
@ -118,28 +118,26 @@ static void ColouriseMakeLine(
|
|||
}
|
||||
|
||||
static void ColouriseMakeDoc(Sci_PositionU startPos, Sci_Position length, int, WordList *[], Accessor &styler) {
|
||||
char lineBuffer[1024];
|
||||
std::string lineBuffer;
|
||||
styler.StartAt(startPos);
|
||||
styler.StartSegment(startPos);
|
||||
Sci_PositionU linePos = 0;
|
||||
Sci_PositionU startLine = startPos;
|
||||
for (Sci_PositionU i = startPos; i < startPos + length; i++) {
|
||||
lineBuffer[linePos++] = styler[i];
|
||||
if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
|
||||
lineBuffer.push_back(styler[i]);
|
||||
if (AtEOL(styler, i)) {
|
||||
// End of line (or of line buffer) met, colourise it
|
||||
lineBuffer[linePos] = '\0';
|
||||
ColouriseMakeLine(lineBuffer, linePos, startLine, i, styler);
|
||||
linePos = 0;
|
||||
ColouriseMakeLine(lineBuffer, startLine, i, styler);
|
||||
lineBuffer.clear();
|
||||
startLine = i + 1;
|
||||
}
|
||||
}
|
||||
if (linePos > 0) { // Last line does not have ending characters
|
||||
ColouriseMakeLine(lineBuffer, linePos, startLine, startPos + length - 1, styler);
|
||||
if (!lineBuffer.empty()) { // Last line does not have ending characters
|
||||
ColouriseMakeLine(lineBuffer, startLine, startPos + length - 1, styler);
|
||||
}
|
||||
}
|
||||
|
||||
static const char *const emptyWordListDesc[] = {
|
||||
0
|
||||
nullptr
|
||||
};
|
||||
|
||||
LexerModule lmMake(SCLEX_MAKEFILE, ColouriseMakeDoc, "makefile", 0, emptyWordListDesc);
|
||||
LexerModule lmMake(SCLEX_MAKEFILE, ColouriseMakeDoc, "makefile", nullptr, emptyWordListDesc);
|
||||
|
|
|
@ -500,10 +500,7 @@ Sci_Position SCI_METHOD LexerPython::WordListSet(int n, const char *wl) {
|
|||
}
|
||||
Sci_Position firstModification = -1;
|
||||
if (wordListN) {
|
||||
WordList wlNew;
|
||||
wlNew.Set(wl);
|
||||
if (*wordListN != wlNew) {
|
||||
wordListN->Set(wl);
|
||||
if (wordListN->Set(wl)) {
|
||||
firstModification = 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -339,7 +339,7 @@ bool IsValidRegOrQAdjacent(int ch) noexcept {
|
|||
|
||||
/*
|
||||
* IsValidRegOrQPrecede
|
||||
* - returns true if ch is a valid preceeding character to put directly before Q / q
|
||||
* - returns true if ch is a valid preceding character to put directly before Q / q
|
||||
* * ref: Q Language: https://docs.raku.org/language/quoting
|
||||
*/
|
||||
bool IsValidRegOrQPrecede(int ch) noexcept {
|
||||
|
@ -469,7 +469,7 @@ bool IsRegexStartAtScPos(StyleContext &sc, int &type, CharacterSet &set) {
|
|||
|
||||
/*
|
||||
* IsValidIdentPrecede
|
||||
* - returns if ch is a valid preceeding char to put directly before an identifier
|
||||
* - returns if ch is a valid preceding char to put directly before an identifier
|
||||
*/
|
||||
bool IsValidIdentPrecede(int ch) noexcept {
|
||||
return !(IsAlphaNumeric(ch) || ch == '_' || ch == '@' || ch == '$' || ch == '%');
|
||||
|
@ -486,7 +486,7 @@ bool IsValidDelimiter(int ch) noexcept {
|
|||
|
||||
/*
|
||||
* GetDelimiterCloseChar
|
||||
* - returns the corrisponding close char for a given delimiter (could be the same char)
|
||||
* - returns the corresponding close char for a given delimiter (could be the same char)
|
||||
*/
|
||||
int GetDelimiterCloseChar(int ch) noexcept {
|
||||
int ch_end = GetBracketCloseChar(ch);
|
||||
|
@ -498,7 +498,7 @@ int GetDelimiterCloseChar(int ch) noexcept {
|
|||
|
||||
/*
|
||||
* GetRepeatCharCount
|
||||
* - returns the occurence count of match
|
||||
* - returns the occurrence count of match
|
||||
*/
|
||||
Sci_Position GetRepeatCharCount(StyleContext &sc, int chMatch, Sci_Position length) {
|
||||
Sci_Position cnt = 0;
|
||||
|
@ -612,8 +612,8 @@ Sci_Position LengthToNextChar(StyleContext &sc, const Sci_Position length) {
|
|||
|
||||
/*
|
||||
* GetRelativeString
|
||||
* - gets a relitive string and sets it in &str
|
||||
* - resets string before seting
|
||||
* - gets a relative string and sets it in &str
|
||||
* - resets string before setting
|
||||
*/
|
||||
void GetRelativeString(StyleContext &sc, Sci_Position offset, Sci_Position length,
|
||||
std::string &str) {
|
||||
|
@ -754,7 +754,7 @@ bool LexerRaku::IsOperatorChar(const int ch) {
|
|||
* FIXME: *still* may not contain all valid characters
|
||||
*/
|
||||
bool LexerRaku::IsWordChar(const int ch, bool allowNumber) {
|
||||
// Unicode numbers should not apear in word identifiers
|
||||
// Unicode numbers should not appear in word identifiers
|
||||
if (ch > 0x7F) {
|
||||
const CharacterCategory cc = CategoriseCharacter(ch);
|
||||
switch (cc) {
|
||||
|
@ -1033,20 +1033,20 @@ Sci_Position LexerRaku::LengthToNonWordChar(StyleContext &sc, Sci_Position lengt
|
|||
*/
|
||||
void SCI_METHOD LexerRaku::Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) {
|
||||
LexAccessor styler(pAccess);
|
||||
DelimPair dpEmbeded; // delimiter pair: embeded comments
|
||||
DelimPair dpEmbeded; // delimiter pair: embedded comments
|
||||
DelimPair dpString; // delimiter pair: string
|
||||
DelimPair dpRegQ; // delimiter pair: Regex / Q Lang
|
||||
std::string hereDelim; // heredoc delimiter (if in heredoc)
|
||||
int hereState = 0; // heredoc state to use (Q / QQ)
|
||||
int numState = 0; // number state / type
|
||||
short cntDecimal = 0; // number decinal count
|
||||
short cntDecimal = 0; // number decimal count
|
||||
std::string wordLast; // last word seen
|
||||
std::string identLast; // last identifier seen
|
||||
std::string adverbLast; // last (single) adverb seen
|
||||
WordList lastAdverbs; // last adverbs seen
|
||||
Sci_Position len; // temp length value
|
||||
char s[100]; // temp char string
|
||||
int typeDetect; // temp type detected (for regex and Q lang)
|
||||
int typeDetect = -1; // temp type detected (for regex and Q lang)
|
||||
Sci_Position lengthToEnd; // length until the end of range
|
||||
|
||||
// Backtrack to safe start position before complex quoted elements
|
||||
|
@ -1216,7 +1216,7 @@ void SCI_METHOD LexerRaku::Lex(Sci_PositionU startPos, Sci_Position length, int
|
|||
sc.Forward();
|
||||
} else {
|
||||
sc.SetState(SCE_RAKU_DEFAULT);
|
||||
break; // too many decinal places
|
||||
break; // too many decimal places
|
||||
}
|
||||
}
|
||||
switch (numState) {
|
||||
|
@ -1463,7 +1463,7 @@ void SCI_METHOD LexerRaku::Lex(Sci_PositionU startPos, Sci_Position length, int
|
|||
sc.SetState(hereState);
|
||||
}
|
||||
|
||||
// Reset words: on operator simi-colon OR '}' (end of statement)
|
||||
// Reset words: on operator semi-colon OR '}' (end of statement)
|
||||
if (sc.state == SCE_RAKU_OPERATOR && (sc.ch == ';' || sc.ch == '}')) {
|
||||
wordLast.clear();
|
||||
identLast.clear();
|
||||
|
@ -1480,11 +1480,11 @@ void SCI_METHOD LexerRaku::Lex(Sci_PositionU startPos, Sci_Position length, int
|
|||
sc.Forward(); // Condition met for "embedded comment"
|
||||
dpEmbeded.opener = sc.ch;
|
||||
|
||||
// Find the opposite (termination) closeing bracket (if any)
|
||||
// Find the opposite (termination) closing bracket (if any)
|
||||
dpEmbeded.closer[0] = GetBracketCloseChar(dpEmbeded.opener);
|
||||
if (dpEmbeded.closer[0] > 0) { // Enter "embedded comment"
|
||||
|
||||
// Find multiple opening character occurence
|
||||
// Find multiple opening character occurrence
|
||||
dpEmbeded.count = GetRepeatCharCount(sc, dpEmbeded.opener, lengthToEnd);
|
||||
sc.SetState(SCE_RAKU_COMMENTEMBED);
|
||||
sc.Forward(dpEmbeded.count - 1); // incremented in the next loop
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -5,12 +5,12 @@
|
|||
// Copyright 2003- by Sean O'Dell <sean@celsoft.com>
|
||||
// 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>
|
||||
|
@ -28,12 +28,14 @@
|
|||
|
||||
using namespace Lexilla;
|
||||
|
||||
static const char * const yamlWordListDesc[] = {
|
||||
namespace {
|
||||
|
||||
const char * const yamlWordListDesc[] = {
|
||||
"Keywords",
|
||||
0
|
||||
nullptr
|
||||
};
|
||||
|
||||
static inline bool AtEOL(Accessor &styler, Sci_PositionU i) {
|
||||
inline bool AtEOL(Accessor &styler, Sci_PositionU i) {
|
||||
return (styler[i] == '\n') ||
|
||||
((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n'));
|
||||
}
|
||||
|
@ -42,12 +44,12 @@ static inline bool AtEOL(Accessor &styler, Sci_PositionU i) {
|
|||
* Check for space, tab, line feed, or carriage return.
|
||||
* See YAML 1.2 spec sections 5.4. Line Break Characters and 5.5. White Space Characters.
|
||||
*/
|
||||
static constexpr bool IsWhiteSpaceOrEOL(char ch) noexcept {
|
||||
constexpr bool IsWhiteSpaceOrEOL(char ch) noexcept {
|
||||
return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r';
|
||||
}
|
||||
|
||||
static unsigned int SpaceCount(char* lineBuffer) {
|
||||
if (lineBuffer == NULL)
|
||||
unsigned int SpaceCount(char* lineBuffer) noexcept {
|
||||
if (lineBuffer == nullptr)
|
||||
return 0;
|
||||
|
||||
char* headBuffer = lineBuffer;
|
||||
|
@ -58,8 +60,8 @@ static unsigned int SpaceCount(char* lineBuffer) {
|
|||
return static_cast<unsigned int>(headBuffer - lineBuffer);
|
||||
}
|
||||
|
||||
static bool KeywordAtChar(char* lineBuffer, char* startComment, const WordList &keywords) {
|
||||
if (lineBuffer == NULL || startComment <= lineBuffer)
|
||||
bool KeywordAtChar(const char* lineBuffer, char* startComment, const WordList &keywords) noexcept {
|
||||
if (lineBuffer == nullptr || startComment <= lineBuffer)
|
||||
return false;
|
||||
char* endValue = startComment - 1;
|
||||
while (endValue >= lineBuffer && *endValue == ' ')
|
||||
|
@ -81,24 +83,24 @@ static bool KeywordAtChar(char* lineBuffer, char* startComment, const WordList &
|
|||
#define YAML_STATE_TEXT_PARENT (4 << YAML_STATE_BITSIZE)
|
||||
#define YAML_STATE_TEXT (5 << YAML_STATE_BITSIZE)
|
||||
|
||||
static void ColouriseYAMLLine(
|
||||
void ColouriseYAMLLine(
|
||||
char *lineBuffer,
|
||||
Sci_PositionU currentLine,
|
||||
Sci_PositionU lengthLine,
|
||||
Sci_PositionU startLine,
|
||||
Sci_PositionU endPos,
|
||||
WordList &keywords,
|
||||
const WordList &keywords,
|
||||
Accessor &styler) {
|
||||
|
||||
Sci_PositionU i = 0;
|
||||
bool bInQuotes = false;
|
||||
unsigned int indentAmount = SpaceCount(lineBuffer);
|
||||
const unsigned int indentAmount = SpaceCount(lineBuffer);
|
||||
|
||||
if (currentLine > 0) {
|
||||
int parentLineState = styler.GetLineState(currentLine - 1);
|
||||
const int parentLineState = styler.GetLineState(currentLine - 1);
|
||||
|
||||
if ((parentLineState&YAML_STATE_MASK) == YAML_STATE_TEXT || (parentLineState&YAML_STATE_MASK) == YAML_STATE_TEXT_PARENT) {
|
||||
unsigned int parentIndentAmount = parentLineState&(~YAML_STATE_MASK);
|
||||
const unsigned int parentIndentAmount = parentLineState&(~YAML_STATE_MASK);
|
||||
if (indentAmount > parentIndentAmount) {
|
||||
styler.SetLineState(currentLine, YAML_STATE_TEXT | parentIndentAmount);
|
||||
styler.ColourTo(endPos, SCE_YAML_TEXT);
|
||||
|
@ -189,7 +191,7 @@ static void ColouriseYAMLLine(
|
|||
styler.ColourTo(endPos, SCE_YAML_COMMENT);
|
||||
return;
|
||||
}
|
||||
Sci_PositionU i2 = i;
|
||||
const Sci_PositionU i2 = i;
|
||||
while ((i < startComment) && lineBuffer[i]) {
|
||||
if (!(IsASCII(lineBuffer[i]) && isdigit(lineBuffer[i])) && lineBuffer[i] != '-'
|
||||
&& lineBuffer[i] != '.' && lineBuffer[i] != ',' && lineBuffer[i] != ' ') {
|
||||
|
@ -213,40 +215,38 @@ static void ColouriseYAMLLine(
|
|||
styler.ColourTo(endPos, SCE_YAML_DEFAULT);
|
||||
}
|
||||
|
||||
static void ColouriseYAMLDoc(Sci_PositionU startPos, Sci_Position length, int, WordList *keywordLists[], Accessor &styler) {
|
||||
char lineBuffer[1024] = "";
|
||||
void ColouriseYAMLDoc(Sci_PositionU startPos, Sci_Position length, int, WordList *keywordLists[], Accessor &styler) {
|
||||
std::string lineBuffer;
|
||||
styler.StartAt(startPos);
|
||||
styler.StartSegment(startPos);
|
||||
Sci_PositionU linePos = 0;
|
||||
Sci_PositionU startLine = startPos;
|
||||
Sci_PositionU endPos = startPos + length;
|
||||
Sci_PositionU maxPos = styler.Length();
|
||||
const Sci_PositionU endPos = startPos + length;
|
||||
const Sci_PositionU maxPos = styler.Length();
|
||||
Sci_PositionU lineCurrent = styler.GetLine(startPos);
|
||||
|
||||
for (Sci_PositionU i = startPos; i < maxPos && i < endPos; i++) {
|
||||
lineBuffer[linePos++] = styler[i];
|
||||
if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
|
||||
lineBuffer.push_back(styler[i]);
|
||||
if (AtEOL(styler, i)) {
|
||||
// End of line (or of line buffer) met, colourise it
|
||||
lineBuffer[linePos] = '\0';
|
||||
ColouriseYAMLLine(lineBuffer, lineCurrent, linePos, startLine, i, *keywordLists[0], styler);
|
||||
linePos = 0;
|
||||
ColouriseYAMLLine(lineBuffer.data(), lineCurrent, lineBuffer.length(), startLine, i, *keywordLists[0], styler);
|
||||
lineBuffer.clear();
|
||||
startLine = i + 1;
|
||||
lineCurrent++;
|
||||
}
|
||||
}
|
||||
if (linePos > 0) { // Last line does not have ending characters
|
||||
ColouriseYAMLLine(lineBuffer, lineCurrent, linePos, startLine, startPos + length - 1, *keywordLists[0], styler);
|
||||
if (!lineBuffer.empty()) { // Last line does not have ending characters
|
||||
ColouriseYAMLLine(lineBuffer.data(), lineCurrent, lineBuffer.length(), startLine, startPos + length - 1, *keywordLists[0], styler);
|
||||
}
|
||||
}
|
||||
|
||||
static bool IsCommentLine(Sci_Position line, Accessor &styler) {
|
||||
Sci_Position pos = styler.LineStart(line);
|
||||
bool IsCommentLine(Sci_Position line, Accessor &styler) {
|
||||
const Sci_Position pos = styler.LineStart(line);
|
||||
if (styler[pos] == '#')
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static void FoldYAMLDoc(Sci_PositionU startPos, Sci_Position length, int /*initStyle - unused*/,
|
||||
void FoldYAMLDoc(Sci_PositionU startPos, Sci_Position length, int /*initStyle - unused*/,
|
||||
WordList *[], Accessor &styler) {
|
||||
const Sci_Position maxPos = startPos + length;
|
||||
const Sci_Position maxLines = styler.GetLine(maxPos - 1); // Requested last line
|
||||
|
@ -259,10 +259,10 @@ static void FoldYAMLDoc(Sci_PositionU startPos, Sci_Position length, int /*initS
|
|||
// at least one line in all cases)
|
||||
int spaceFlags = 0;
|
||||
Sci_Position lineCurrent = styler.GetLine(startPos);
|
||||
int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);
|
||||
int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, nullptr);
|
||||
while (lineCurrent > 0) {
|
||||
lineCurrent--;
|
||||
indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL);
|
||||
indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, nullptr);
|
||||
if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG) &&
|
||||
(!IsCommentLine(lineCurrent, styler)))
|
||||
break;
|
||||
|
@ -285,7 +285,7 @@ static void FoldYAMLDoc(Sci_PositionU startPos, Sci_Position length, int /*initS
|
|||
int indentNext = indentCurrent;
|
||||
if (lineNext <= docLines) {
|
||||
// Information about next line is only available if not at end of document
|
||||
indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
|
||||
indentNext = styler.IndentAmount(lineNext, &spaceFlags, nullptr);
|
||||
}
|
||||
const int comment = foldComment && IsCommentLine(lineCurrent, styler);
|
||||
const int comment_start = (comment && !prevComment && (lineNext <= docLines) &&
|
||||
|
@ -314,7 +314,7 @@ static void FoldYAMLDoc(Sci_PositionU startPos, Sci_Position length, int /*initS
|
|||
(lineNext <= docLines && IsCommentLine(lineNext, styler)))) {
|
||||
|
||||
lineNext++;
|
||||
indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL);
|
||||
indentNext = styler.IndentAmount(lineNext, &spaceFlags, nullptr);
|
||||
}
|
||||
|
||||
const int levelAfterComments = indentNext & SC_FOLDLEVELNUMBERMASK;
|
||||
|
@ -329,12 +329,12 @@ static void FoldYAMLDoc(Sci_PositionU startPos, Sci_Position length, int /*initS
|
|||
int skipLevel = levelAfterComments;
|
||||
|
||||
while (--skipLine > lineCurrent) {
|
||||
int skipLineIndent = styler.IndentAmount(skipLine, &spaceFlags, NULL);
|
||||
const int skipLineIndent = styler.IndentAmount(skipLine, &spaceFlags, nullptr);
|
||||
|
||||
if ((skipLineIndent & SC_FOLDLEVELNUMBERMASK) > levelAfterComments)
|
||||
skipLevel = levelBeforeComments;
|
||||
|
||||
int whiteFlag = skipLineIndent & SC_FOLDLEVELWHITEFLAG;
|
||||
const int whiteFlag = skipLineIndent & SC_FOLDLEVELWHITEFLAG;
|
||||
|
||||
styler.SetLevel(skipLine, skipLevel | whiteFlag);
|
||||
}
|
||||
|
@ -359,4 +359,6 @@ static void FoldYAMLDoc(Sci_PositionU startPos, Sci_Position length, int /*initS
|
|||
//styler.SetLevel(lineCurrent, indentCurrent);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
LexerModule lmYAML(SCLEX_YAML, ColouriseYAMLDoc, "yaml", FoldYAMLDoc, yamlWordListDesc);
|
||||
|
|
|
@ -89,3 +89,14 @@ void StyleContext::GetCurrent(char *s, Sci_PositionU len) {
|
|||
void StyleContext::GetCurrentLowered(char *s, Sci_PositionU len) {
|
||||
styler.GetRangeLowered(styler.GetStartSegment(), currentPos, s, len);
|
||||
}
|
||||
|
||||
void StyleContext::GetCurrentString(std::string &string, Transform transform) {
|
||||
const Sci_PositionU startPos = styler.GetStartSegment();
|
||||
const Sci_PositionU len = currentPos - styler.GetStartSegment();
|
||||
string.resize(len);
|
||||
if (transform == Transform::lower) {
|
||||
styler.GetRangeLowered(startPos, currentPos, string.data(), len + 1);
|
||||
} else {
|
||||
styler.GetRange(startPos, currentPos, string.data(), len + 1);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -183,6 +183,8 @@ public:
|
|||
bool MatchIgnoreCase2(const char *s);
|
||||
void GetCurrent(char *s, Sci_PositionU len);
|
||||
void GetCurrentLowered(char *s, Sci_PositionU len);
|
||||
enum class Transform { none, lower };
|
||||
void GetCurrentString(std::string &string, Transform transform);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <cassert>
|
||||
#include <cstring>
|
||||
|
||||
#include <string>
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
#include <memory>
|
||||
|
@ -182,6 +183,12 @@ bool WordList::InList(const char *s) const noexcept {
|
|||
return false;
|
||||
}
|
||||
|
||||
/** convenience overload so can easily call with std::string.
|
||||
*/
|
||||
bool WordList::InList(const std::string &s) const noexcept {
|
||||
return InList(s.c_str());
|
||||
}
|
||||
|
||||
/** similar to InList, but word s can be a substring of keyword.
|
||||
* eg. the keyword define is defined as def~ine. This means the word must start
|
||||
* with def to be a keyword, but also defi, defin and define are valid.
|
||||
|
|
|
@ -33,6 +33,7 @@ public:
|
|||
void Clear() noexcept;
|
||||
bool Set(const char *s);
|
||||
bool InList(const char *s) const noexcept;
|
||||
bool InList(const std::string &s) const noexcept;
|
||||
bool InListAbbreviated(const char *s, const char marker) const noexcept;
|
||||
bool InListAbridged(const char *s, const char marker) const noexcept;
|
||||
const char *WordAt(int n) const noexcept;
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
@echo off
|
||||
rem Promote new result files.
|
||||
rem Find all the *.new files under test\examples and copy them to their expected name without ".new".
|
||||
rem Run after RunTest.bat if ".new" result files are correct.
|
||||
pushd ..\test\examples
|
||||
for /R %%f in (*.new) do (call :moveFile %%f)
|
||||
popd
|
||||
goto :eof
|
||||
|
||||
:moveFile
|
||||
set pathWithNew=%1
|
||||
set directory=%~dp1
|
||||
set fileWithNew=%~nx1
|
||||
set fileNoNew=%~n1
|
||||
set pathNoNew=%pathWithNew:~0,-4%
|
||||
|
||||
if exist %pathNoNew% (
|
||||
echo Move %fileWithNew% to %fileNoNew% in %directory%
|
||||
) else (
|
||||
echo New %fileWithNew% to %fileNoNew% in %directory%
|
||||
)
|
||||
move %pathWithNew% %pathNoNew%
|
||||
goto :eof
|
|
@ -90,7 +90,7 @@
|
|||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<WarningLevel>Level4</WarningLevel>
|
||||
<PreprocessorDefinitions>WIN32;SCI_LEXER;_CRT_SECURE_NO_DEPRECATE;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;_CRT_SECURE_NO_DEPRECATE;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\include;..\..\scintilla\include;..\lexlib;</AdditionalIncludeDirectories>
|
||||
<BrowseInformation>true</BrowseInformation>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>5.2.2</string>
|
||||
<string>5.2.4</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
|
|
|
@ -768,6 +768,7 @@
|
|||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
|
@ -827,6 +828,7 @@
|
|||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
|
@ -851,7 +853,8 @@
|
|||
buildSettings = {
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 5.2.2;
|
||||
CURRENT_PROJECT_VERSION = 5.2.4;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = 4F446KW87E;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
|
@ -877,7 +880,8 @@
|
|||
buildSettings = {
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 5.2.2;
|
||||
CURRENT_PROJECT_VERSION = 5.2.4;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = 4F446KW87E;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
|
||||
#include <windows.h>
|
||||
|
||||
#define VERSION_LEXILLA "5.2.2"
|
||||
#define VERSION_WORDS 5, 2, 2, 0
|
||||
#define VERSION_LEXILLA "5.2.4"
|
||||
#define VERSION_WORDS 5, 2, 4, 0
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION VERSION_WORDS
|
||||
|
|
|
@ -35,7 +35,7 @@ SUBSYSTEM=-SUBSYSTEM:WINDOWS,10.00
|
|||
!ENDIF
|
||||
!ENDIF
|
||||
|
||||
CRTFLAGS=-D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1 -D_CRT_SECURE_NO_DEPRECATE=1 $(ADD_DEFINE)
|
||||
CRTFLAGS=-D_CRT_SECURE_NO_DEPRECATE=1 $(ADD_DEFINE)
|
||||
CXXFLAGS=-Zi -TP -MP -W4 -EHsc -std:c++17 $(CRTFLAGS)
|
||||
CXXDEBUG=-Od -MTd -DDEBUG
|
||||
CXXNDEBUG=-O2 -MT -DNDEBUG -GL
|
||||
|
|
|
@ -77,6 +77,13 @@ picture: gives a rough idea of the fold structure: '|' for level greater than 0x
|
|||
After checking that the .folded.new file is correct, it can be promoted to .folded and
|
||||
committed to the repository.
|
||||
|
||||
An interactive file comparison program like WinMerge (https://winmerge.org/) on
|
||||
Windows or meld (https://meldmerge.org/) on Linux can help examine differences
|
||||
between the .styled and .styled.new files or .folded and .folded.new files.
|
||||
|
||||
On Windows, the scripts/PromoteNew.bat script can be run to promote all .new result
|
||||
files to their base names without .new.
|
||||
|
||||
Styling and folding tests are first performed on the file as a whole, then the file is lexed
|
||||
and folded line-by-line. If there are differences between the whole file and line-by-line
|
||||
then a message with 'per-line is different' for styling or 'per-line has different folds' will be
|
||||
|
@ -94,6 +101,10 @@ Keywords may be defined with keywords settings like:
|
|||
keywords.*.cxx;*.c=int char
|
||||
keywords2.*.cxx=open
|
||||
|
||||
Substyles and substyle identifiers may be defined with settings like:
|
||||
substyles.cpp.11=1
|
||||
substylewords.11.1.*.cxx=map string vector
|
||||
|
||||
Other settings are treated as lexer or folder properties and forwarded to the lexer/folder:
|
||||
lexer.cpp.track.preprocessor=1
|
||||
fold=1
|
||||
|
|
|
@ -120,7 +120,9 @@ void TestDocument::Set(std::string_view sv) {
|
|||
lineStarts.push_back(pos + 1);
|
||||
}
|
||||
}
|
||||
lineStarts.push_back(text.length());
|
||||
if (lineStarts.back() != Length()) {
|
||||
lineStarts.push_back(Length());
|
||||
}
|
||||
lineStates.resize(lineStarts.size());
|
||||
lineLevels.resize(lineStarts.size(), 0x400);
|
||||
}
|
||||
|
@ -130,6 +132,10 @@ void TestDocument::Set(std::string_view sv) {
|
|||
#pragma warning(disable: 26440)
|
||||
#endif
|
||||
|
||||
Sci_Position TestDocument::MaxLine() const noexcept {
|
||||
return lineStarts.size() - 1;
|
||||
}
|
||||
|
||||
int SCI_METHOD TestDocument::Version() const {
|
||||
return Scintilla::dvRelease4;
|
||||
}
|
||||
|
@ -153,8 +159,8 @@ char SCI_METHOD TestDocument::StyleAt(Sci_Position position) const {
|
|||
}
|
||||
|
||||
Sci_Position SCI_METHOD TestDocument::LineFromPosition(Sci_Position position) const {
|
||||
if (position >= static_cast<Sci_Position>(text.length())) {
|
||||
return lineStarts.size() - 1 - 1;
|
||||
if (position >= Length()) {
|
||||
return MaxLine();
|
||||
}
|
||||
|
||||
const std::vector<Sci_Position>::const_iterator it = std::lower_bound(lineStarts.begin(), lineStarts.end(), position);
|
||||
|
@ -169,7 +175,7 @@ Sci_Position SCI_METHOD TestDocument::LineStart(Sci_Position line) const {
|
|||
return 0;
|
||||
}
|
||||
if (line >= static_cast<Sci_Position>(lineStarts.size())) {
|
||||
return text.length();
|
||||
return Length();
|
||||
}
|
||||
return lineStarts.at(line);
|
||||
}
|
||||
|
@ -179,6 +185,9 @@ int SCI_METHOD TestDocument::GetLevel(Sci_Position line) const {
|
|||
}
|
||||
|
||||
int SCI_METHOD TestDocument::SetLevel(Sci_Position line, int level) {
|
||||
if (line == static_cast<Sci_Position>(lineLevels.size())) {
|
||||
return 0x400;
|
||||
}
|
||||
return lineLevels.at(line) = level;
|
||||
}
|
||||
|
||||
|
@ -243,6 +252,11 @@ int SCI_METHOD TestDocument::GetLineIndentation(Sci_Position) {
|
|||
}
|
||||
|
||||
Sci_Position SCI_METHOD TestDocument::LineEnd(Sci_Position line) const {
|
||||
const Sci_Position maxLine = MaxLine();
|
||||
if (line == maxLine || line == maxLine+1) {
|
||||
return text.length();
|
||||
}
|
||||
assert(line < maxLine);
|
||||
Sci_Position position = LineStart(line + 1);
|
||||
position--; // Back over CR or LF
|
||||
// When line terminator is CR+LF, may need to go back one more
|
||||
|
@ -288,7 +302,7 @@ Sci_Position SCI_METHOD TestDocument::GetRelativePosition(Sci_Position positionS
|
|||
|
||||
int SCI_METHOD TestDocument::GetCharacterAndWidth(Sci_Position position, Sci_Position *pWidth) const {
|
||||
// TODO: invalid UTF-8
|
||||
if (position >= static_cast<Sci_Position>(text.length())) {
|
||||
if (position >= Length()) {
|
||||
// Return NULs after document end
|
||||
if (pWidth) {
|
||||
*pWidth = 1;
|
||||
|
|
|
@ -27,6 +27,8 @@ public:
|
|||
TestDocument &operator=(TestDocument&&) = delete;
|
||||
virtual ~TestDocument() = default;
|
||||
|
||||
Sci_Position MaxLine() const noexcept;
|
||||
|
||||
int SCI_METHOD Version() const override;
|
||||
void SCI_METHOD SetErrorStatus(int status) override;
|
||||
Sci_Position SCI_METHOD Length() const override;
|
||||
|
|
|
@ -270,7 +270,9 @@ std::string MarkedDocument(const Scintilla::IDocument *pdoc) {
|
|||
for (Sci_Position pos = 0; pos < pdoc->Length(); pos++) {
|
||||
const char styleNow = pdoc->StyleAt(pos);
|
||||
if (styleNow != prevStyle) {
|
||||
os << "{" << static_cast<unsigned int>(styleNow) << "}";
|
||||
const unsigned char uStyleNow = styleNow;
|
||||
const unsigned int uiStyleNow = uStyleNow;
|
||||
os << "{" << uiStyleNow << "}";
|
||||
prevStyle = styleNow;
|
||||
}
|
||||
char ch = '\0';
|
||||
|
@ -750,10 +752,35 @@ void TestILexer(Scintilla::ILexer5 *plex) {
|
|||
}
|
||||
}
|
||||
|
||||
bool SetProperties(Scintilla::ILexer5 *plex, const PropertyMap &propertyMap, std::filesystem::path path) {
|
||||
bool SetProperties(Scintilla::ILexer5 *plex, const std::string &language, const PropertyMap &propertyMap, std::filesystem::path path) {
|
||||
assert(plex);
|
||||
|
||||
const std::string fileName = path.filename().string();
|
||||
|
||||
if (std::string_view bases = plex->GetSubStyleBases(); !bases.empty()) {
|
||||
// Allocate a substyle for each possible style
|
||||
while (!bases.empty()) {
|
||||
const int baseStyle = bases.front();
|
||||
// substyles.cpp.11=2
|
||||
const std::string base = std::to_string(baseStyle);
|
||||
const std::string substylesForBase = "substyles." + language + "." + base;
|
||||
std::optional<std::string> substylesN = propertyMap.GetProperty(substylesForBase);
|
||||
if (substylesN) {
|
||||
const int substyles = atoi(substylesN->c_str());
|
||||
const int baseStyleNum = plex->AllocateSubStyles(baseStyle, substyles);
|
||||
// substylewords.11.1.$(file.patterns.cpp)=std map string vector
|
||||
for (int kw = 0; kw < substyles; kw++) {
|
||||
const std::string substyleWords = "substylewords." + base + "." + std::to_string(kw + 1) + ".*";
|
||||
const std::optional<std::string> keywordN = propertyMap.GetPropertyForFile(substyleWords, fileName);
|
||||
if (keywordN) {
|
||||
plex->SetIdentifiers(baseStyleNum + kw, keywordN->c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
bases.remove_prefix(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Set keywords, keywords2, ... keywords9, for this file
|
||||
for (int kw = 0; kw < 10; kw++) {
|
||||
std::string kwChoice("keywords");
|
||||
|
@ -790,6 +817,8 @@ bool SetProperties(Scintilla::ILexer5 *plex, const PropertyMap &propertyMap, std
|
|||
// Ignore as processed earlier
|
||||
} else if (key.starts_with("keywords")) {
|
||||
// Ignore as processed earlier
|
||||
} else if (key.starts_with("substyle")) {
|
||||
// Ignore as processed earlier
|
||||
} else {
|
||||
plex->PropertySet(key.c_str(), val.c_str());
|
||||
}
|
||||
|
@ -812,12 +841,12 @@ bool TestFile(const std::filesystem::path &path, const PropertyMap &propertyMap)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!SetProperties(plex, propertyMap, path)) {
|
||||
TestILexer(plex);
|
||||
|
||||
if (!SetProperties(plex, *language, propertyMap, path)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
TestILexer(plex);
|
||||
|
||||
std::string text = ReadFile(path);
|
||||
if (text.starts_with(BOM)) {
|
||||
text.erase(0, BOM.length());
|
||||
|
@ -880,7 +909,7 @@ bool TestFile(const std::filesystem::path &path, const PropertyMap &propertyMap)
|
|||
|
||||
if (success) {
|
||||
Scintilla::ILexer5 *plexCRLF = Lexilla::MakeLexer(*language);
|
||||
SetProperties(plexCRLF, propertyMap, path.filename().string());
|
||||
SetProperties(plexCRLF, *language, propertyMap, path.filename().string());
|
||||
success = TestCRLF(path, text, plexCRLF, disablePerLineTests);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
// SCE_C_WORD2 (16)
|
||||
second
|
||||
|
||||
// SCE_C_IDENTIFIER (11)
|
||||
Second
|
||||
|
||||
// SCE_C_IDENTIFIER (11)
|
||||
upper
|
||||
|
||||
// SCE_C_WORD2 (16)
|
||||
Upper
|
|
@ -0,0 +1,12 @@
|
|||
0 400 400 // SCE_C_WORD2 (16)
|
||||
0 400 400 second
|
||||
1 400 400
|
||||
0 400 400 // SCE_C_IDENTIFIER (11)
|
||||
0 400 400 Second
|
||||
1 400 400
|
||||
0 400 400 // SCE_C_IDENTIFIER (11)
|
||||
0 400 400 upper
|
||||
1 400 400
|
||||
0 400 400 // SCE_C_WORD2 (16)
|
||||
0 400 400 Upper
|
||||
1 400 400
|
|
@ -0,0 +1,11 @@
|
|||
{2}// SCE_C_WORD2 (16)
|
||||
{16}second{0}
|
||||
|
||||
{2}// SCE_C_IDENTIFIER (11)
|
||||
{11}Second{0}
|
||||
|
||||
{2}// SCE_C_IDENTIFIER (11)
|
||||
{11}upper{0}
|
||||
|
||||
{2}// SCE_C_WORD2 (16)
|
||||
{16}Upper{0}
|
|
@ -84,6 +84,15 @@ R"( )"
|
|||
// escapesequence=27
|
||||
"\001 \b"
|
||||
|
||||
// identifier substyles.11.1=128
|
||||
vector
|
||||
|
||||
// identifier substyles.11.2=129
|
||||
std
|
||||
|
||||
// commentdockeyword substyles.17.1=130
|
||||
/** @module */
|
||||
|
||||
// Secondary styles inside preprocessor excluded section
|
||||
|
||||
#if 0
|
||||
|
@ -172,4 +181,13 @@ R"( )"
|
|||
// escapesequence=27
|
||||
"\001 \b"
|
||||
|
||||
// identifier substyles.75.1=192
|
||||
vector
|
||||
|
||||
// identifier substyles.75.2=193
|
||||
std
|
||||
|
||||
// commentdockeyword substyles.81.1=194
|
||||
/** @module */
|
||||
|
||||
#endif
|
||||
|
|
|
@ -84,6 +84,15 @@
|
|||
0 400 400 // escapesequence=27
|
||||
0 400 400 "\001 \b"
|
||||
1 400 400
|
||||
0 400 400 // identifier substyles.11.1=128
|
||||
0 400 400 vector
|
||||
1 400 400
|
||||
0 400 400 // identifier substyles.11.2=129
|
||||
0 400 400 std
|
||||
1 400 400
|
||||
0 400 400 // commentdockeyword substyles.17.1=130
|
||||
0 400 400 /** @module */
|
||||
1 400 400
|
||||
0 400 400 // Secondary styles inside preprocessor excluded section
|
||||
1 400 400
|
||||
2 400 401 + #if 0
|
||||
|
@ -172,5 +181,14 @@
|
|||
0 401 401 | // escapesequence=27
|
||||
0 401 401 | "\001 \b"
|
||||
1 401 401 |
|
||||
0 401 401 | // identifier substyles.75.1=192
|
||||
0 401 401 | vector
|
||||
1 401 401 |
|
||||
0 401 401 | // identifier substyles.75.2=193
|
||||
0 401 401 | std
|
||||
1 401 401 |
|
||||
0 401 401 | // commentdockeyword substyles.81.1=194
|
||||
0 401 401 | /** @module */
|
||||
1 401 401 |
|
||||
0 401 400 | #endif
|
||||
1 400 400
|
|
@ -84,6 +84,15 @@
|
|||
{2}// escapesequence=27
|
||||
{6}"{27}\001{6} {27}\b{6}"{0}
|
||||
|
||||
{2}// identifier substyles.11.1=128
|
||||
{128}vector{0}
|
||||
|
||||
{2}// identifier substyles.11.2=129
|
||||
{129}std{0}
|
||||
|
||||
{2}// commentdockeyword substyles.17.1=130
|
||||
{3}/** {130}@module{3} */{0}
|
||||
|
||||
{2}// Secondary styles inside preprocessor excluded section
|
||||
{0}
|
||||
{9}#if 0
|
||||
|
@ -172,4 +181,13 @@
|
|||
{66}// escapesequence=27
|
||||
{70}"{91}\001{70} {91}\b{70}"{64}
|
||||
|
||||
{66}// identifier substyles.75.1=192
|
||||
{192}vector{64}
|
||||
|
||||
{66}// identifier substyles.75.2=193
|
||||
{193}std{64}
|
||||
|
||||
{66}// commentdockeyword substyles.81.1=194
|
||||
{67}/** {194}@module{67} */{64}
|
||||
|
||||
{9}#endif
|
||||
|
|
|
@ -1,12 +1,19 @@
|
|||
# coding: utf-8
|
||||
lexer.*.cxx=cpp
|
||||
keywords.*.cxx=int let uuid
|
||||
keywords2.*.cxx=second
|
||||
keywords2.*.cxx=second Upper
|
||||
keywords3.*.cxx=file
|
||||
keywords4.*.cxx=global
|
||||
keywords5.*.cxx=
|
||||
keywords6.*.cxx=TODO
|
||||
|
||||
substyles.cpp.11=2
|
||||
substylewords.11.1.*.cxx=map string vector
|
||||
substylewords.11.2.*.cxx=std gsl
|
||||
|
||||
substyles.cpp.17=1
|
||||
substylewords.17.1.*.cxx=module
|
||||
|
||||
lexer.cpp.track.preprocessor=1
|
||||
lexer.cpp.escape.sequence=1
|
||||
# Set options so that AllStyles.cxx can show every style
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
Default=0
|
||||
Default
|
||||
|
||||
Comment=1
|
||||
Another comment
|
||||
|
||||
Command=2 diff
|
||||
diff -u a/cocoa/ScintillaCocoa.mm b/cocoa/ScintillaCocoa.mm
|
||||
|
||||
Header=3 ---
|
||||
--- a/cocoa/ScintillaCocoa.mm 2016-12-30 14:38:22.000000000 -0600
|
||||
|
||||
Header=3 +++
|
||||
+++ b/cocoa/ScintillaCocoa.mm 2017-02-15 08:20:12.000000000 -0600
|
||||
|
||||
Position=4 @@
|
||||
@@ -388,7 +388,8 @@
|
||||
|
||||
- (void) idleTriggered: (NSNotification*) notification
|
||||
{
|
||||
#pragma unused(notification)
|
||||
|
||||
Deleted=5 -
|
||||
- static_cast<ScintillaCocoa*>(mTarget)->IdleTimerFired();
|
||||
|
||||
Added=6 +
|
||||
+ if (mTarget)
|
||||
+ static_cast<ScintillaCocoa*>(mTarget)->IdleTimerFired();
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
Changed=7 !
|
||||
! GdkColor white = { 0, 0xFFFF, 0xFFFF, 0xFFFF};
|
||||
|
||||
PatchAdd=8 ++
|
||||
++ styler.ColourTo(i - 1, StateToPrint);
|
||||
|
||||
PatchDelete=9 +-
|
||||
+- styler.ColourTo(i - 1, StateToPrint);
|
||||
|
||||
RemovedPatchAdd=10 -+
|
||||
-+ styler.ColourTo(i - 1, StateToPrint);
|
||||
|
||||
RemovedPatchDelete=11 --
|
||||
-- styler.ColourTo(i - 1, StateToPrint);
|
||||
|
||||
diff -u a/cocoa/ScintillaCocoa.h b/cocoa/ScintillaCocoa.h
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
0 400 0 Default=0
|
||||
0 400 0 Default
|
||||
0 400 0
|
||||
0 400 0 Comment=1
|
||||
0 400 0 Another comment
|
||||
0 400 0
|
||||
0 400 0 Command=2 diff
|
||||
2 400 0 + diff -u a/cocoa/ScintillaCocoa.mm b/cocoa/ScintillaCocoa.mm
|
||||
0 401 0 |
|
||||
0 401 0 | Header=3 ---
|
||||
2 401 0 + --- a/cocoa/ScintillaCocoa.mm 2016-12-30 14:38:22.000000000 -0600
|
||||
0 402 0 |
|
||||
0 402 0 | Header=3 +++
|
||||
2 401 0 + +++ b/cocoa/ScintillaCocoa.mm 2017-02-15 08:20:12.000000000 -0600
|
||||
0 402 0 |
|
||||
0 402 0 | Position=4 @@
|
||||
2 402 0 + @@ -388,7 +388,8 @@
|
||||
0 403 0 |
|
||||
0 403 0 | - (void) idleTriggered: (NSNotification*) notification
|
||||
0 403 0 | {
|
||||
0 403 0 | #pragma unused(notification)
|
||||
0 403 0 |
|
||||
0 403 0 | Deleted=5 -
|
||||
0 403 0 | - static_cast<ScintillaCocoa*>(mTarget)->IdleTimerFired();
|
||||
0 403 0 |
|
||||
0 403 0 | Added=6 +
|
||||
0 403 0 | + if (mTarget)
|
||||
0 403 0 | + static_cast<ScintillaCocoa*>(mTarget)->IdleTimerFired();
|
||||
0 403 0 | }
|
||||
0 403 0 |
|
||||
0 403 0 | @end
|
||||
0 403 0 |
|
||||
0 403 0 | Changed=7 !
|
||||
0 403 0 | ! GdkColor white = { 0, 0xFFFF, 0xFFFF, 0xFFFF};
|
||||
0 403 0 |
|
||||
0 403 0 | PatchAdd=8 ++
|
||||
0 403 0 | ++ styler.ColourTo(i - 1, StateToPrint);
|
||||
0 403 0 |
|
||||
0 403 0 | PatchDelete=9 +-
|
||||
0 403 0 | +- styler.ColourTo(i - 1, StateToPrint);
|
||||
0 403 0 |
|
||||
0 403 0 | RemovedPatchAdd=10 -+
|
||||
0 403 0 | -+ styler.ColourTo(i - 1, StateToPrint);
|
||||
0 403 0 |
|
||||
0 403 0 | RemovedPatchDelete=11 --
|
||||
0 403 0 | -- styler.ColourTo(i - 1, StateToPrint);
|
||||
0 403 0 |
|
||||
2 400 0 + diff -u a/cocoa/ScintillaCocoa.h b/cocoa/ScintillaCocoa.h
|
||||
0 401 0 |
|
||||
0 400 0
|
|
@ -0,0 +1,49 @@
|
|||
{1}Default=0
|
||||
{0} Default
|
||||
{1}
|
||||
Comment=1
|
||||
Another comment
|
||||
|
||||
Command=2 diff
|
||||
{2}diff -u a/cocoa/ScintillaCocoa.mm b/cocoa/ScintillaCocoa.mm
|
||||
{1}
|
||||
Header=3 ---
|
||||
{3}--- a/cocoa/ScintillaCocoa.mm 2016-12-30 14:38:22.000000000 -0600
|
||||
{1}
|
||||
Header=3 +++
|
||||
{3}+++ b/cocoa/ScintillaCocoa.mm 2017-02-15 08:20:12.000000000 -0600
|
||||
{1}
|
||||
Position=4 @@
|
||||
{4}@@ -388,7 +388,8 @@
|
||||
{1}
|
||||
{0} - (void) idleTriggered: (NSNotification*) notification
|
||||
{
|
||||
#pragma unused(notification)
|
||||
{1}
|
||||
Deleted=5 -
|
||||
{5}- static_cast<ScintillaCocoa*>(mTarget)->IdleTimerFired();
|
||||
{1}
|
||||
Added=6 +
|
||||
{6}+ if (mTarget)
|
||||
+ static_cast<ScintillaCocoa*>(mTarget)->IdleTimerFired();
|
||||
{0} }
|
||||
|
||||
@end
|
||||
{1}
|
||||
Changed=7 !
|
||||
{7}! GdkColor white = { 0, 0xFFFF, 0xFFFF, 0xFFFF};
|
||||
{1}
|
||||
PatchAdd=8 ++
|
||||
{8}++ styler.ColourTo(i - 1, StateToPrint);
|
||||
{1}
|
||||
PatchDelete=9 +-
|
||||
{9}+- styler.ColourTo(i - 1, StateToPrint);
|
||||
{1}
|
||||
RemovedPatchAdd=10 -+
|
||||
{10}-+ styler.ColourTo(i - 1, StateToPrint);
|
||||
{1}
|
||||
RemovedPatchDelete=11 --
|
||||
{11}-- styler.ColourTo(i - 1, StateToPrint);
|
||||
{1}
|
||||
{2}diff -u a/cocoa/ScintillaCocoa.h b/cocoa/ScintillaCocoa.h
|
||||
{1}
|
|
@ -0,0 +1,2 @@
|
|||
+A 1026-byte line is longer than 1024-byte buffer but doesn't cause problems as diff state determine by short line prefix 3456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
0 400 0 +A 1026-byte line is longer than 1024-byte buffer but doesn't cause problems as diff state determine by short line prefix 3456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456
|
||||
0 400 0
|
||||
0 400 0
|
|
@ -0,0 +1,2 @@
|
|||
{6}+A 1026-byte line is longer than 1024-byte buffer but doesn't cause problems as diff state determine by short line prefix 3456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456
|
||||
{1}
|
|
@ -0,0 +1,2 @@
|
|||
lexer.*.diff=diff
|
||||
fold=1
|
|
@ -49,3 +49,7 @@ var hilight = 2
|
|||
@onready
|
||||
var a = 3
|
||||
@onready var b = 3
|
||||
|
||||
# node-identifier=16
|
||||
%node
|
||||
$node
|
||||
|
|
|
@ -49,4 +49,8 @@
|
|||
0 400 0 @onready
|
||||
0 400 0 var a = 3
|
||||
0 400 0 @onready var b = 3
|
||||
1 400 0
|
||||
0 400 0 # node-identifier=16
|
||||
0 400 0 %node
|
||||
0 400 0 $node
|
||||
1 400 0
|
|
@ -49,3 +49,7 @@
|
|||
{15}@onready{0}
|
||||
{5}var{0} {11}a{0} {10}={0} {2}3{0}
|
||||
{15}@onready{0} {5}var{0} {11}b{0} {10}={0} {2}3{0}
|
||||
|
||||
{1}# node-identifier=16{0}
|
||||
{16}%node{0}
|
||||
{16}$node{0}
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
# nodepath
|
||||
|
||||
$Node
|
||||
|
||||
%Node
|
||||
|
||||
%node/"n o d e"/%'n o d e'
|
||||
|
||||
%"No de"
|
||||
|
||||
|
||||
$/root/ThisNode/%Node % %test
|
||||
|
||||
$MainMenuPanel/%Options % %test
|
||||
|
||||
%Options % %test
|
||||
|
||||
$Node % %test
|
||||
|
||||
|
||||
get_node("%Options") % %test
|
||||
|
||||
$"Nod se" % %test
|
||||
|
||||
$/test/"No % de"/test % %test
|
||||
|
||||
%node/"n o d e"/'n o d e' % %"No De"
|
||||
|
||||
"%010d" % 12345
|
||||
|
||||
1 % 1
|
||||
|
||||
a % b
|
|
@ -0,0 +1,34 @@
|
|||
0 400 0 # nodepath
|
||||
1 400 0
|
||||
0 400 0 $Node
|
||||
1 400 0
|
||||
0 400 0 %Node
|
||||
1 400 0
|
||||
0 400 0 %node/"n o d e"/%'n o d e'
|
||||
1 400 0
|
||||
0 400 0 %"No de"
|
||||
1 400 0
|
||||
1 400 0
|
||||
0 400 0 $/root/ThisNode/%Node % %test
|
||||
1 400 0
|
||||
0 400 0 $MainMenuPanel/%Options % %test
|
||||
1 400 0
|
||||
0 400 0 %Options % %test
|
||||
1 400 0
|
||||
0 400 0 $Node % %test
|
||||
1 400 0
|
||||
1 400 0
|
||||
0 400 0 get_node("%Options") % %test
|
||||
1 400 0
|
||||
0 400 0 $"Nod se" % %test
|
||||
1 400 0
|
||||
0 400 0 $/test/"No % de"/test % %test
|
||||
1 400 0
|
||||
0 400 0 %node/"n o d e"/'n o d e' % %"No De"
|
||||
1 400 0
|
||||
0 400 0 "%010d" % 12345
|
||||
1 400 0
|
||||
0 400 0 1 % 1
|
||||
1 400 0
|
||||
0 400 0 a % b
|
||||
1 400 0
|
|
@ -0,0 +1,33 @@
|
|||
{1}# nodepath{0}
|
||||
|
||||
{16}$Node{0}
|
||||
|
||||
{16}%Node{0}
|
||||
|
||||
{16}%node/"n o d e"/%'n o d e'{0}
|
||||
|
||||
{16}%"No de"{0}
|
||||
|
||||
|
||||
{16}$/root/ThisNode/%Node{0} {10}%{0} {16}%test{0}
|
||||
|
||||
{16}$MainMenuPanel/%Options{0} {10}%{0} {16}%test{0}
|
||||
|
||||
{16}%Options{0} {10}%{0} {16}%test{0}
|
||||
|
||||
{16}$Node{0} {10}%{0} {16}%test{0}
|
||||
|
||||
|
||||
{11}get_node{10}({3}"%Options"{10}){0} {10}%{0} {16}%test{0}
|
||||
|
||||
{16}$"Nod se"{0} {10}%{0} {16}%test{0}
|
||||
|
||||
{16}$/test/"No % de"/test{0} {10}%{0} {16}%test{0}
|
||||
|
||||
{16}%node/"n o d e"/'n o d e'{0} {10}%{0} {16}%"No De"{0}
|
||||
|
||||
{3}"%010d"{0} {10}%{0} {2}12345{0}
|
||||
|
||||
{2}1{0} {10}%{0} {2}1{0}
|
||||
|
||||
{11}a{0} {10}%{0} {11}b{0}
|
|
@ -0,0 +1,4 @@
|
|||
# makefile lexer previously used fixed 1024-byte line buffer that would treat text after that as new line
|
||||
|
||||
# Long line with 1025 bytes last 2 bytes colored as default 3456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 12345678912345678
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
0 400 0 # makefile lexer previously used fixed 1024-byte line buffer that would treat text after that as new line
|
||||
0 400 0
|
||||
0 400 0 # Long line with 1025 bytes last 2 bytes colored as default 3456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 12345678912345678
|
||||
0 400 0
|
||||
0 400 0
|
|
@ -0,0 +1,4 @@
|
|||
{1}# makefile lexer previously used fixed 1024-byte line buffer that would treat text after that as new line
|
||||
{0}
|
||||
{1}# Long line with 1025 bytes last 2 bytes colored as default 3456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 12345678912345678
|
||||
{0}
|
|
@ -1,5 +1,5 @@
|
|||
# Enumerate all styles where possible: 0..31,40..41
|
||||
# 22,23,30,31,40,41 are never set and 1 switches rest of file to error state
|
||||
# Enumerate all styles where possible: 0..31,40..45
|
||||
# 30,31,40,45 are never set and 1 switches rest of file to error state
|
||||
|
||||
#0 whitespace
|
||||
#
|
||||
|
@ -66,14 +66,20 @@ module Module15 end
|
|||
<<DELIMITER20
|
||||
DELIMITER20
|
||||
|
||||
#21:here doc
|
||||
<<D
|
||||
21:here doc
|
||||
#21:single quoted heredoc
|
||||
<<'D'
|
||||
21:here doc #{1 + 1}
|
||||
D
|
||||
|
||||
#22:here qq never set
|
||||
#22:double quoted heredoc
|
||||
<<"D"
|
||||
22:here doc #{1 + 1}
|
||||
D
|
||||
|
||||
#23:here qw never set
|
||||
#23:back tick quoted heredoc
|
||||
<<`D`
|
||||
23:here doc #{1 + 1}
|
||||
D
|
||||
|
||||
#24:q quoted string
|
||||
%q!24:quotes's!
|
||||
|
@ -87,13 +93,25 @@ D
|
|||
#27:regex
|
||||
%r(27[a-z]/[A-Z]+)
|
||||
|
||||
#28:string array
|
||||
%w(28 cgi.rb complex.rb date.rb)
|
||||
#28:interpolable string array
|
||||
%W(28 cgi.rb complex.rb date.rb #{1} )
|
||||
|
||||
#29:demoted keyword do
|
||||
while 1 do end
|
||||
|
||||
# 30,31,40,41 never set
|
||||
# 30,31,40,45 never set
|
||||
|
||||
#41:non-interpolable string array
|
||||
%w(#{1 + 1})
|
||||
|
||||
#42:non-interpolable symbol array
|
||||
%i(#{1 + 1})
|
||||
|
||||
#43:interpolable symbol array
|
||||
%I(#{1 + 1})
|
||||
|
||||
#44:symbol
|
||||
%s(#{1 + 1})
|
||||
|
||||
#19:data section
|
||||
__END__
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
0 400 0 # Enumerate all styles where possible: 0..31,40..41
|
||||
0 400 0 # 22,23,30,31,40,41 are never set and 1 switches rest of file to error state
|
||||
0 400 0 # Enumerate all styles where possible: 0..31,40..45
|
||||
0 400 0 # 30,31,40,45 are never set and 1 switches rest of file to error state
|
||||
1 400 0
|
||||
0 400 0 #0 whitespace
|
||||
0 400 0 #
|
||||
|
@ -66,14 +66,20 @@
|
|||
2 400 0 + <<DELIMITER20
|
||||
0 401 0 | DELIMITER20
|
||||
1 400 0
|
||||
0 400 0 #21:here doc
|
||||
2 400 0 + <<D
|
||||
0 401 0 | 21:here doc
|
||||
0 400 0 #21:single quoted heredoc
|
||||
2 400 0 + <<'D'
|
||||
0 401 0 | 21:here doc #{1 + 1}
|
||||
0 401 0 | D
|
||||
1 400 0
|
||||
0 400 0 #22:here qq never set
|
||||
0 400 0 #22:double quoted heredoc
|
||||
2 400 0 + <<"D"
|
||||
0 401 0 | 22:here doc #{1 + 1}
|
||||
0 401 0 | D
|
||||
1 400 0
|
||||
0 400 0 #23:here qw never set
|
||||
0 400 0 #23:back tick quoted heredoc
|
||||
2 400 0 + <<`D`
|
||||
0 401 0 | 23:here doc #{1 + 1}
|
||||
0 401 0 | D
|
||||
1 400 0
|
||||
0 400 0 #24:q quoted string
|
||||
0 400 0 %q!24:quotes's!
|
||||
|
@ -87,13 +93,25 @@
|
|||
0 400 0 #27:regex
|
||||
0 400 0 %r(27[a-z]/[A-Z]+)
|
||||
1 400 0
|
||||
0 400 0 #28:string array
|
||||
0 400 0 %w(28 cgi.rb complex.rb date.rb)
|
||||
0 400 0 #28:interpolable string array
|
||||
0 400 0 %W(28 cgi.rb complex.rb date.rb #{1} )
|
||||
1 400 0
|
||||
0 400 0 #29:demoted keyword do
|
||||
0 400 0 while 1 do end
|
||||
1 400 0
|
||||
0 400 0 # 30,31,40,41 never set
|
||||
0 400 0 # 30,31,40,45 never set
|
||||
1 400 0
|
||||
0 400 0 #41:non-interpolable string array
|
||||
0 400 0 %w(#{1 + 1})
|
||||
1 400 0
|
||||
0 400 0 #42:non-interpolable symbol array
|
||||
0 400 0 %i(#{1 + 1})
|
||||
1 400 0
|
||||
0 400 0 #43:interpolable symbol array
|
||||
0 400 0 %I(#{1 + 1})
|
||||
1 400 0
|
||||
0 400 0 #44:symbol
|
||||
0 400 0 %s(#{1 + 1})
|
||||
1 400 0
|
||||
0 400 0 #19:data section
|
||||
0 400 0 __END__
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{2}# Enumerate all styles where possible: 0..31,40..41{0}
|
||||
{2}# 22,23,30,31,40,41 are never set and 1 switches rest of file to error state{0}
|
||||
{2}# Enumerate all styles where possible: 0..31,40..45{0}
|
||||
{2}# 30,31,40,45 are never set and 1 switches rest of file to error state{0}
|
||||
|
||||
{2}#0 whitespace{0}
|
||||
{2}#{0}
|
||||
|
@ -63,17 +63,23 @@
|
|||
{2}#19:data section at end of file{0}
|
||||
|
||||
{2}#20:here delimiter{0}
|
||||
{10}<<{20}DELIMITER20{21}
|
||||
{10}<<{20}DELIMITER20{22}
|
||||
{20}DELIMITER20{0}
|
||||
|
||||
{2}#21:here doc{0}
|
||||
{10}<<{20}D{21}
|
||||
21:here doc
|
||||
{2}#21:single quoted heredoc{0}
|
||||
{10}<<{20}'D'{21}
|
||||
21:here doc #{1 + 1}
|
||||
{20}D{0}
|
||||
|
||||
{2}#22:here qq never set{0}
|
||||
{2}#22:double quoted heredoc{0}
|
||||
{10}<<{20}"D"{22}
|
||||
22:here doc {10}#{{4}1{0} {10}+{0} {4}1{10}}{22}
|
||||
{20}D{0}
|
||||
|
||||
{2}#23:here qw never set{0}
|
||||
{2}#23:back tick quoted heredoc{0}
|
||||
{10}<<{20}`D`{23}
|
||||
23:here doc {10}#{{4}1{0} {10}+{0} {4}1{10}}{23}
|
||||
{20}D{0}
|
||||
|
||||
{2}#24:q quoted string{0}
|
||||
{24}%q!24:quotes's!{0}
|
||||
|
@ -87,13 +93,25 @@
|
|||
{2}#27:regex{0}
|
||||
{27}%r(27[a-z]/[A-Z]+){0}
|
||||
|
||||
{2}#28:string array{0}
|
||||
{28}%w(28 cgi.rb complex.rb date.rb){0}
|
||||
{2}#28:interpolable string array{0}
|
||||
{28}%W(28 cgi.rb complex.rb date.rb {10}#{{4}1{10}}{28} ){0}
|
||||
|
||||
{2}#29:demoted keyword do{0}
|
||||
{5}while{0} {4}1{0} {29}do{0} {5}end{0}
|
||||
|
||||
{2}# 30,31,40,41 never set{0}
|
||||
{2}# 30,31,40,45 never set{0}
|
||||
|
||||
{2}#41:non-interpolable string array{0}
|
||||
{41}%w(#{1 + 1}){0}
|
||||
|
||||
{2}#42:non-interpolable symbol array{0}
|
||||
{42}%i(#{1 + 1}){0}
|
||||
|
||||
{2}#43:interpolable symbol array{0}
|
||||
{43}%I({10}#{{4}1{0} {10}+{0} {4}1{10}}{43}){0}
|
||||
|
||||
{2}#44:symbol{0}
|
||||
{44}%s(#{1 + 1}){0}
|
||||
|
||||
{2}#19:data section{0}
|
||||
{19}__END__
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
# Bad folding when single character ')' in SCE_RB_STRING_QW #132
|
||||
%W(#{1 + 1})
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
0 400 0 # Bad folding when single character ')' in SCE_RB_STRING_QW #132
|
||||
0 400 0 %W(#{1 + 1})
|
||||
1 400 0
|
||||
0 400 0
|
|
@ -0,0 +1,3 @@
|
|||
{2}# Bad folding when single character ')' in SCE_RB_STRING_QW #132{0}
|
||||
{28}%W({10}#{{4}1{0} {10}+{0} {4}1{10}}{28}){0}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
a = <<XXX # :nodoc:
|
||||
heredoc
|
||||
XXX
|
||||
|
||||
puts(<<-ONE, <<-TWO)
|
||||
content for heredoc one
|
||||
ONE
|
||||
content for heredoc two
|
||||
TWO
|
|
@ -0,0 +1,10 @@
|
|||
2 400 0 + a = <<XXX # :nodoc:
|
||||
0 401 0 | heredoc
|
||||
0 401 0 | XXX
|
||||
1 400 0
|
||||
2 400 0 + puts(<<-ONE, <<-TWO)
|
||||
0 401 0 | content for heredoc one
|
||||
0 401 0 | ONE
|
||||
0 401 0 | content for heredoc two
|
||||
0 401 0 | TWO
|
||||
0 400 0
|
|
@ -0,0 +1,9 @@
|
|||
{11}a{0} {10}={0} {10}<<{20}XXX{0} {2}# :nodoc:{22}
|
||||
heredoc
|
||||
{20}XXX{0}
|
||||
|
||||
{11}puts{10}(<<{20}-ONE{10},{0} {10}<<{20}-TWO{10}){22}
|
||||
content for heredoc one
|
||||
ONE
|
||||
content for heredoc two
|
||||
{20}TWO{0}
|
|
@ -0,0 +1,23 @@
|
|||
a = {r: /\w+/, h: <<EOF
|
||||
heredoc
|
||||
EOF
|
||||
}
|
||||
|
||||
puts a
|
||||
|
||||
def b # :nodoc:
|
||||
<<EOF
|
||||
heredoc
|
||||
EOF
|
||||
end
|
||||
|
||||
def c # :nodoc:
|
||||
/\w+/
|
||||
end
|
||||
|
||||
puts b
|
||||
puts c
|
||||
|
||||
$stdout . puts <<EOF
|
||||
heredoc
|
||||
EOF
|
|
@ -0,0 +1,24 @@
|
|||
2 400 0 + a = {r: /\w+/, h: <<EOF
|
||||
0 402 0 | heredoc
|
||||
0 402 0 | EOF
|
||||
0 401 0 | }
|
||||
1 400 0
|
||||
0 400 0 puts a
|
||||
1 400 0
|
||||
2 400 0 + def b # :nodoc:
|
||||
2 401 0 + <<EOF
|
||||
0 402 0 | heredoc
|
||||
0 402 0 | EOF
|
||||
0 401 0 | end
|
||||
1 400 0
|
||||
2 400 0 + def c # :nodoc:
|
||||
0 401 0 | /\w+/
|
||||
0 401 0 | end
|
||||
1 400 0
|
||||
0 400 0 puts b
|
||||
0 400 0 puts c
|
||||
1 400 0
|
||||
2 400 0 + $stdout . puts <<EOF
|
||||
0 401 0 | heredoc
|
||||
0 401 0 | EOF
|
||||
0 400 0
|
|
@ -0,0 +1,23 @@
|
|||
{11}a{0} {10}={0} {10}{{14}r:{0} {12}/\w+/{10},{0} {14}h:{0} {10}<<{20}EOF{22}
|
||||
heredoc
|
||||
{20}EOF{0}
|
||||
{10}}{0}
|
||||
|
||||
{11}puts{0} {11}a{0}
|
||||
|
||||
{5}def{0} {9}b{0} {2}# :nodoc:{0}
|
||||
{10}<<{20}EOF{22}
|
||||
heredoc
|
||||
{20}EOF{0}
|
||||
{5}end{0}
|
||||
|
||||
{5}def{0} {9}c{0} {2}# :nodoc:{0}
|
||||
{12}/\w+/{0}
|
||||
{5}end{0}
|
||||
|
||||
{11}puts{0} {11}b{0}
|
||||
{11}puts{0} {11}c{0}
|
||||
|
||||
{13}$stdout{0} {10}.{0} {11}puts{0} {10}<<{20}EOF{22}
|
||||
heredoc
|
||||
{20}EOF{0}
|
|
@ -0,0 +1,11 @@
|
|||
"#{1}"#
|
||||
"#@a"#
|
||||
"#@@a"#
|
||||
"#$a"#
|
||||
"#$?"#
|
||||
"#$-a1"#
|
||||
"#$_a1"#
|
||||
"#$123"#
|
||||
"#$\"#
|
||||
"#$""#
|
||||
a = /#$//#
|
|
@ -0,0 +1,12 @@
|
|||
0 400 0 "#{1}"#
|
||||
0 400 0 "#@a"#
|
||||
0 400 0 "#@@a"#
|
||||
0 400 0 "#$a"#
|
||||
0 400 0 "#$?"#
|
||||
0 400 0 "#$-a1"#
|
||||
0 400 0 "#$_a1"#
|
||||
0 400 0 "#$123"#
|
||||
0 400 0 "#$\"#
|
||||
0 400 0 "#$""#
|
||||
0 400 0 a = /#$//#
|
||||
0 400 0
|
|
@ -0,0 +1,11 @@
|
|||
{6}"{10}#{{4}1{10}}{6}"{2}#{0}
|
||||
{6}"{10}#{16}@a{6}"{2}#{0}
|
||||
{6}"{10}#{17}@@a{6}"{2}#{0}
|
||||
{6}"{10}#{13}$a{6}"{2}#{0}
|
||||
{6}"{10}#{13}$?{6}"{2}#{0}
|
||||
{6}"{10}#{13}$-a{6}1"{2}#{0}
|
||||
{6}"{10}#{13}$_a1{6}"{2}#{0}
|
||||
{6}"{10}#{13}$123{6}"{2}#{0}
|
||||
{6}"{10}#{13}$\{6}"{2}#{0}
|
||||
{6}"{10}#{13}$"{6}"{2}#{0}
|
||||
{11}a{0} {10}={0} {12}/{10}#{13}$/{12}/{2}#{0}
|
|
@ -1,8 +1,8 @@
|
|||
{2}# Test that final \n in indented heredoc (2nd example) is styled as SCE_RB_HERE_Q not SCE_RB_HERE_DELIM{0}
|
||||
{10}<<{20}T{21}
|
||||
{10}<<{20}T{22}
|
||||
X
|
||||
{20}T{0}
|
||||
|
||||
{10}<<{20}-T{21}
|
||||
{10}<<{20}-T{22}
|
||||
X
|
||||
{20}T{0}
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
{2}# heredoc method call, other argument{0}
|
||||
{11}puts{0} {10}<<{20}~EOT{10}.{11}chomp{21}
|
||||
{11}puts{0} {10}<<{20}~EOT{10}.{11}chomp{22}
|
||||
squiggly heredoc
|
||||
{20}EOT{0}
|
||||
|
||||
{11}puts{0} {10}<<{20}ONE{10},{0} {5}__FILE__{10},{0} {5}__LINE__{21}
|
||||
{11}puts{0} {10}<<{20}ONE{10},{0} {5}__FILE__{10},{0} {5}__LINE__{22}
|
||||
content for heredoc one
|
||||
{20}ONE{0}
|
||||
|
||||
{2}# heredoc prevStyle == SCE_RB_GLOBAL{0}
|
||||
{13}$stdout{10}.{11}puts{0} {10}<<{20}~EOT{10}.{11}chomp{21}
|
||||
{13}$stdout{10}.{11}puts{0} {10}<<{20}~EOT{10}.{11}chomp{22}
|
||||
squiggly heredoc
|
||||
{20}EOT{0}
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
# Issue 124, disambiguating %= which may be a quote or modulo assignment
|
||||
# %-quoting with '=' as the quote
|
||||
s = %=3=
|
||||
puts s
|
||||
x = 7
|
||||
# Modulo assignment, equivalent to x = x % 2
|
||||
x %=2
|
||||
puts x
|
|
@ -0,0 +1,9 @@
|
|||
0 400 0 # Issue 124, disambiguating %= which may be a quote or modulo assignment
|
||||
0 400 0 # %-quoting with '=' as the quote
|
||||
0 400 0 s = %=3=
|
||||
0 400 0 puts s
|
||||
0 400 0 x = 7
|
||||
0 400 0 # Modulo assignment, equivalent to x = x % 2
|
||||
0 400 0 x %=2
|
||||
0 400 0 puts x
|
||||
0 400 0
|
|
@ -0,0 +1,8 @@
|
|||
{2}# Issue 124, disambiguating %= which may be a quote or modulo assignment{0}
|
||||
{2}# %-quoting with '=' as the quote{0}
|
||||
{11}s{0} {10}={0} {25}%=3={0}
|
||||
{11}puts{0} {11}s{0}
|
||||
{11}x{0} {10}={0} {4}7{0}
|
||||
{2}# Modulo assignment, equivalent to x = x % 2{0}
|
||||
{11}x{0} {10}%={4}2{0}
|
||||
{11}puts{0} {11}x{0}
|
|
@ -0,0 +1,4 @@
|
|||
# makefile lexer previously used fixed 1024-byte line buffer that would treat text after that as new line
|
||||
|
||||
# Long line with 1025 bytes last 2 bytes colored as default 3456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 12345678912345678
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
0 400 0 # makefile lexer previously used fixed 1024-byte line buffer that would treat text after that as new line
|
||||
1 400 0
|
||||
0 400 0 # Long line with 1025 bytes last 2 bytes colored as default 3456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 12345678912345678
|
||||
1 400 0
|
||||
0 400 0
|
|
@ -0,0 +1,4 @@
|
|||
{1}# makefile lexer previously used fixed 1024-byte line buffer that would treat text after that as new line
|
||||
{0}
|
||||
{1}# Long line with 1025 bytes last 2 bytes colored as default 3456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 12345678912345678
|
||||
{0}
|
|
@ -1,10 +1,17 @@
|
|||
/** @file testWordList.cxx
|
||||
** Unit Tests for Lexilla internal data structures
|
||||
** Tests WordList, WordClassifier, and SubStyles
|
||||
**/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
|
||||
#include "WordList.h"
|
||||
#include "SubStyles.h"
|
||||
|
||||
#include "catch.hpp"
|
||||
|
||||
|
@ -28,6 +35,14 @@ TEST_CASE("WordList") {
|
|||
REQUIRE(!wl.InList("class"));
|
||||
}
|
||||
|
||||
SECTION("StringInList") {
|
||||
wl.Set("else struct");
|
||||
std::string sStruct = "struct";
|
||||
REQUIRE(wl.InList(sStruct));
|
||||
std::string sClass = "class";
|
||||
REQUIRE(!wl.InList(sClass));
|
||||
}
|
||||
|
||||
SECTION("InListUnicode") {
|
||||
// "cheese" in English
|
||||
// "kase" ('k', 'a with diaeresis', 's', 'e') in German
|
||||
|
@ -104,3 +119,93 @@ TEST_CASE("WordList") {
|
|||
REQUIRE(wl.InListAbridged("\xd1\x81\xd1\x8b\xd1\x80", '~'));
|
||||
}
|
||||
}
|
||||
|
||||
// Test WordClassifier.
|
||||
|
||||
TEST_CASE("WordClassifier") {
|
||||
|
||||
constexpr int base = 1;
|
||||
constexpr int key = 10;
|
||||
constexpr int type = 11;
|
||||
constexpr int other = 40;
|
||||
|
||||
WordClassifier wc(1);
|
||||
|
||||
SECTION("Base") {
|
||||
REQUIRE(wc.Base() == base);
|
||||
wc.Allocate(key, 2);
|
||||
REQUIRE(wc.Start() == key);
|
||||
REQUIRE(wc.Last() == type);
|
||||
REQUIRE(wc.Length() == 2);
|
||||
REQUIRE(wc.IncludesStyle(key));
|
||||
REQUIRE(wc.IncludesStyle(type));
|
||||
REQUIRE(!wc.IncludesStyle(other));
|
||||
|
||||
wc.Clear();
|
||||
REQUIRE(wc.Base() == base);
|
||||
REQUIRE(wc.Start() == 0);
|
||||
REQUIRE(wc.Last() == -1);
|
||||
REQUIRE(wc.Length() == 0);
|
||||
}
|
||||
|
||||
SECTION("ValueFor") {
|
||||
wc.Allocate(key, 2);
|
||||
wc.SetIdentifiers(key, "else if then");
|
||||
wc.SetIdentifiers(type, "double float int long");
|
||||
REQUIRE(wc.ValueFor("if") == key);
|
||||
REQUIRE(wc.ValueFor("double") == type);
|
||||
REQUIRE(wc.ValueFor("fish") < 0);
|
||||
wc.RemoveStyle(type);
|
||||
REQUIRE(wc.ValueFor("double") < 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Test SubStyles.
|
||||
|
||||
TEST_CASE("SubStyles") {
|
||||
|
||||
constexpr char bases[] = "\002\005";
|
||||
constexpr int base = 2;
|
||||
constexpr int base2 = 5;
|
||||
constexpr int styleFirst = 0x80;
|
||||
constexpr int stylesAvailable = 0x40;
|
||||
constexpr int distanceToSecondary = 0x40;
|
||||
|
||||
SubStyles subStyles(bases, styleFirst, stylesAvailable, distanceToSecondary);
|
||||
|
||||
SECTION("All") {
|
||||
REQUIRE(subStyles.DistanceToSecondaryStyles() == distanceToSecondary);
|
||||
// Before allocation
|
||||
REQUIRE(subStyles.Start(base) == 0);
|
||||
|
||||
const int startSubStyles = subStyles.Allocate(base, 3);
|
||||
REQUIRE(startSubStyles == styleFirst);
|
||||
REQUIRE(subStyles.Start(base) == styleFirst);
|
||||
REQUIRE(subStyles.Length(base) == 3);
|
||||
REQUIRE(subStyles.BaseStyle(128) == 2);
|
||||
|
||||
// Not a substyle so returns argument.
|
||||
REQUIRE(subStyles.BaseStyle(96) == 96);
|
||||
|
||||
REQUIRE(subStyles.FirstAllocated() == styleFirst);
|
||||
REQUIRE(subStyles.LastAllocated() == styleFirst + 3 - 1);
|
||||
subStyles.SetIdentifiers(styleFirst, "int long size_t");
|
||||
const WordClassifier &wc = subStyles.Classifier(base);
|
||||
REQUIRE(wc.ValueFor("int") == styleFirst);
|
||||
REQUIRE(wc.ValueFor("double") < 0);
|
||||
|
||||
// Add second set of substyles which shouldn't affect first
|
||||
const int startSecondSet = subStyles.Allocate(base2, 2);
|
||||
constexpr int expectedStylesSecond = styleFirst + 3;
|
||||
REQUIRE(startSecondSet == expectedStylesSecond);
|
||||
REQUIRE(subStyles.Start(base) == styleFirst);
|
||||
REQUIRE(subStyles.Start(base2) == expectedStylesSecond);
|
||||
REQUIRE(subStyles.LastAllocated() == styleFirst + 5 - 1);
|
||||
|
||||
// Clear and check that earlier call no longer works
|
||||
subStyles.Free();
|
||||
REQUIRE(subStyles.Start(base) == 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1 +1 @@
|
|||
522
|
||||
524
|
|
@ -1,18 +1,6 @@
|
|||
cd ..
|
||||
del/q lexilla.zip
|
||||
zip lexilla.zip lexilla\*.* lexilla\*\*.* lexilla\*\*\*.* lexilla\*\*\*\*.* lexilla\*\*\*\*\*.* -x *.bak -x *.o -x *.obj -x *.iobj -x *.dll -x *.exe -x *.a -x *.lib -x *.res -x *.exp -x *.sarif -x *.pdb -x *.ipdb -x *.idb -x *.sbr -x *.ilk
|
||||
zip lexilla.zip -d lexilla/src/ARM64/*
|
||||
zip lexilla.zip -d lexilla/src/x64/*
|
||||
zip lexilla.zip -d lexilla/src/Release/*
|
||||
zip lexilla.zip -d lexilla/src/Debug/*
|
||||
zip lexilla.zip -d lexilla/src/__pycache__/*
|
||||
zip lexilla.zip -d lexilla/test/ARM64/*
|
||||
zip lexilla.zip -d lexilla/test/x64/*
|
||||
zip lexilla.zip -d lexilla/test/Release/*
|
||||
zip lexilla.zip -d lexilla/test/Debug/*
|
||||
zip lexilla.zip -d lexilla/test/unit/ARM64/*
|
||||
zip lexilla.zip -d lexilla/test/unit/x64/*
|
||||
zip lexilla.zip -d lexilla/test/unit/Release/*
|
||||
zip lexilla.zip -d lexilla/test/unit/Debug/*
|
||||
zip lexilla.zip -d lexilla/scripts/__pycache__/*
|
||||
zip lexilla.zip lexilla\*.* lexilla\*\*.* lexilla\*\*\*.* lexilla\*\*\*\*.* lexilla\*\*\*\*\*.* ^
|
||||
-x *.bak *.o *.obj *.iobj *.dll *.exe *.a *.lib *.res *.exp *.sarif *.pdb *.ipdb *.idb *.sbr *.ilk *.tgz ^
|
||||
**/__pycache__/* **/Debug/* **/Release/* **/x64/* **/ARM64/* **/cov-int/* **/.vs/* **/.vscode/* @
|
||||
cd lexilla
|
||||
|
|
|
@ -231,7 +231,7 @@ Position ScintillaCall::GetStyledText(void *tr) {
|
|||
return CallPointer(Message::GetStyledText, 0, tr);
|
||||
}
|
||||
|
||||
Position ScintillaCall::GetStyledTextFull(void *tr) {
|
||||
Position ScintillaCall::GetStyledTextFull(TextRangeFull *tr) {
|
||||
return CallPointer(Message::GetStyledTextFull, 0, tr);
|
||||
}
|
||||
|
||||
|
@ -1159,7 +1159,7 @@ Position ScintillaCall::FindText(Scintilla::FindOption searchFlags, void *ft) {
|
|||
return CallPointer(Message::FindText, static_cast<uintptr_t>(searchFlags), ft);
|
||||
}
|
||||
|
||||
Position ScintillaCall::FindTextFull(Scintilla::FindOption searchFlags, void *ft) {
|
||||
Position ScintillaCall::FindTextFull(Scintilla::FindOption searchFlags, TextToFindFull *ft) {
|
||||
return CallPointer(Message::FindTextFull, static_cast<uintptr_t>(searchFlags), ft);
|
||||
}
|
||||
|
||||
|
@ -1167,7 +1167,7 @@ Position ScintillaCall::FormatRange(bool draw, void *fr) {
|
|||
return CallPointer(Message::FormatRange, draw, fr);
|
||||
}
|
||||
|
||||
Position ScintillaCall::FormatRangeFull(bool draw, void *fr) {
|
||||
Position ScintillaCall::FormatRangeFull(bool draw, RangeToFormatFull *fr) {
|
||||
return CallPointer(Message::FormatRangeFull, draw, fr);
|
||||
}
|
||||
|
||||
|
@ -1235,7 +1235,7 @@ Position ScintillaCall::GetTextRange(void *tr) {
|
|||
return CallPointer(Message::GetTextRange, 0, tr);
|
||||
}
|
||||
|
||||
Position ScintillaCall::GetTextRangeFull(void *tr) {
|
||||
Position ScintillaCall::GetTextRangeFull(TextRangeFull *tr) {
|
||||
return CallPointer(Message::GetTextRangeFull, 0, tr);
|
||||
}
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#include "QuartzTextLayout.h"
|
||||
|
||||
NSRect PRectangleToNSRect(const Scintilla::Internal::PRectangle &rc);
|
||||
Scintilla::Internal::PRectangle NSRectToPRectangle(NSRect &rc);
|
||||
Scintilla::Internal::PRectangle NSRectToPRectangle(const NSRect &rc);
|
||||
CFStringEncoding EncodingFromCharacterSet(bool unicode, Scintilla::CharacterSet characterSet);
|
||||
|
||||
@interface ScintillaContextMenu : NSMenu {
|
||||
|
|
|
@ -73,10 +73,8 @@ NSRect PRectangleToNSRect(const PRectangle &rc) {
|
|||
/**
|
||||
* Converts an NSRect as used by the system to a native Scintilla rectangle.
|
||||
*/
|
||||
PRectangle NSRectToPRectangle(NSRect &rc) {
|
||||
return PRectangle(static_cast<XYPOSITION>(rc.origin.x), static_cast<XYPOSITION>(rc.origin.y),
|
||||
static_cast<XYPOSITION>(NSMaxX(rc)),
|
||||
static_cast<XYPOSITION>(NSMaxY(rc)));
|
||||
PRectangle NSRectToPRectangle(const NSRect &rc) {
|
||||
return PRectangle(rc.origin.x, rc.origin.y, NSMaxX(rc), NSMaxY(rc));
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -1288,7 +1286,7 @@ void SurfaceImpl::MeasureWidths(const Font *font_, std::string_view text, XYPOSI
|
|||
// Switched to MacRoman to make work so treat as single byte encoding.
|
||||
for (int i=0; i<text.length(); i++) {
|
||||
CGFloat xPosition = CTLineGetOffsetForStringIndex(mLine, i+1, nullptr);
|
||||
positions[i] = static_cast<XYPOSITION>(xPosition);
|
||||
positions[i] = xPosition;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -1306,7 +1304,7 @@ void SurfaceImpl::MeasureWidths(const Font *font_, std::string_view text, XYPOSI
|
|||
const int codeUnits = UTF16LengthFromUTF8ByteCount(byteCount);
|
||||
const CGFloat xPosition = linePositions[ui];
|
||||
for (unsigned int bytePos=0; (bytePos<byteCount) && (i<text.length()); bytePos++) {
|
||||
positions[i++] = static_cast<XYPOSITION>(xPosition);
|
||||
positions[i++] = xPosition;
|
||||
}
|
||||
ui += codeUnits;
|
||||
}
|
||||
|
@ -1322,14 +1320,14 @@ void SurfaceImpl::MeasureWidths(const Font *font_, std::string_view text, XYPOSI
|
|||
size_t lenChar = DBCSIsLeadByte(mode.codePage, text[i]) ? 2 : 1;
|
||||
CGFloat xPosition = CTLineGetOffsetForStringIndex(mLine, ui+1, NULL);
|
||||
for (unsigned int bytePos=0; (bytePos<lenChar) && (i<text.length()); bytePos++) {
|
||||
positions[i++] = static_cast<XYPOSITION>(xPosition);
|
||||
positions[i++] = xPosition;
|
||||
}
|
||||
ui++;
|
||||
}
|
||||
} else { // Single byte encoding
|
||||
for (int i=0; i<text.length(); i++) {
|
||||
CGFloat xPosition = CTLineGetOffsetForStringIndex(mLine, i+1, NULL);
|
||||
positions[i] = static_cast<XYPOSITION>(xPosition);
|
||||
positions[i] = xPosition;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1405,7 +1403,7 @@ void SurfaceImpl::MeasureWidthsUTF8(const Font *font_, std::string_view text, XY
|
|||
// Switched to MacRoman to make work so treat as single byte encoding.
|
||||
for (int i=0; i<text.length(); i++) {
|
||||
CGFloat xPosition = CTLineGetOffsetForStringIndex(mLine, i+1, nullptr);
|
||||
positions[i] = static_cast<XYPOSITION>(xPosition);
|
||||
positions[i] = xPosition;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -1422,7 +1420,7 @@ void SurfaceImpl::MeasureWidthsUTF8(const Font *font_, std::string_view text, XY
|
|||
const int codeUnits = UTF16LengthFromUTF8ByteCount(byteCount);
|
||||
const CGFloat xPosition = linePositions[ui];
|
||||
for (unsigned int bytePos=0; (bytePos<byteCount) && (i<text.length()); bytePos++) {
|
||||
positions[i++] = static_cast<XYPOSITION>(xPosition);
|
||||
positions[i++] = xPosition;
|
||||
}
|
||||
ui += codeUnits;
|
||||
}
|
||||
|
@ -1546,8 +1544,8 @@ PRectangle Window::GetPosition() const {
|
|||
CGFloat screenHeight = ScreenMax();
|
||||
// Invert screen positions to match Scintilla
|
||||
return PRectangle(
|
||||
static_cast<XYPOSITION>(NSMinX(rect)), static_cast<XYPOSITION>(screenHeight - NSMaxY(rect)),
|
||||
static_cast<XYPOSITION>(NSMaxX(rect)), static_cast<XYPOSITION>(screenHeight - NSMinY(rect)));
|
||||
NSMinX(rect), screenHeight - NSMaxY(rect),
|
||||
NSMaxX(rect), screenHeight - NSMinY(rect));
|
||||
} else {
|
||||
return PRectangle(0, 0, 1, 1);
|
||||
}
|
||||
|
@ -1686,8 +1684,8 @@ PRectangle Window::GetMonitorRect(Point) {
|
|||
CGFloat screenHeight = rect.origin.y + rect.size.height;
|
||||
// Invert screen positions to match Scintilla
|
||||
PRectangle rcWork(
|
||||
static_cast<XYPOSITION>(NSMinX(rect)), static_cast<XYPOSITION>(screenHeight - NSMaxY(rect)),
|
||||
static_cast<XYPOSITION>(NSMaxX(rect)), static_cast<XYPOSITION>(screenHeight - NSMinY(rect)));
|
||||
NSMinX(rect), screenHeight - NSMaxY(rect),
|
||||
NSMaxX(rect), screenHeight - NSMinY(rect));
|
||||
PRectangle rcMonitor(rcWork.left - rcPosition.left,
|
||||
rcWork.top - rcPosition.top,
|
||||
rcWork.right - rcPosition.left,
|
||||
|
@ -2082,7 +2080,7 @@ void ListBoxImpl::Append(char *s, int type) {
|
|||
}
|
||||
NSImage *img = images[@(type)];
|
||||
if (img) {
|
||||
XYPOSITION widthIcon = static_cast<XYPOSITION>(img.size.width);
|
||||
XYPOSITION widthIcon = img.size.width;
|
||||
if (widthIcon > maxIconWidth) {
|
||||
[colIcon setHidden: NO];
|
||||
maxIconWidth = widthIcon;
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>5.3.3</string>
|
||||
<string>5.3.4</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
|
|
|
@ -573,7 +573,7 @@
|
|||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 5.3.3;
|
||||
CURRENT_PROJECT_VERSION = 5.3.4;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
|
@ -635,7 +635,7 @@
|
|||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 5.3.3;
|
||||
CURRENT_PROJECT_VERSION = 5.3.4;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
|
@ -665,7 +665,7 @@
|
|||
CODE_SIGN_IDENTITY = "-";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 5.3.3;
|
||||
CURRENT_PROJECT_VERSION = 5.3.4;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
|
@ -699,7 +699,7 @@
|
|||
CODE_SIGN_IDENTITY = "-";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 5.3.3;
|
||||
CURRENT_PROJECT_VERSION = 5.3.4;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
|
|
|
@ -83,6 +83,8 @@ extern "C" NSString *ScintillaRecPboardType;
|
|||
|
||||
namespace Scintilla::Internal {
|
||||
|
||||
CGContextRef CGContextCurrent();
|
||||
|
||||
/**
|
||||
* Main scintilla class, implemented for macOS (Cocoa).
|
||||
*/
|
||||
|
@ -101,6 +103,8 @@ private:
|
|||
bool isFirstResponder;
|
||||
bool isActive;
|
||||
|
||||
Point sizeClient;
|
||||
|
||||
bool enteredSetScrollingSize;
|
||||
|
||||
bool GetPasteboardData(NSPasteboard *board, SelectionText *selectedText);
|
||||
|
@ -116,6 +120,7 @@ private:
|
|||
|
||||
protected:
|
||||
Point GetVisibleOriginInMain() const override;
|
||||
Point ClientSize() const override;
|
||||
PRectangle GetClientRectangle() const override;
|
||||
PRectangle GetClientDrawingRectangle() override;
|
||||
Point ConvertPoint(NSPoint point);
|
||||
|
|
|
@ -399,6 +399,20 @@ const CGFloat paddingHighlightY = 2;
|
|||
|
||||
@end
|
||||
|
||||
//----------------- CGContextCurrent ---------------------------------------------------------------
|
||||
|
||||
CGContextRef Scintilla::Internal::CGContextCurrent() {
|
||||
if (@available(macOS 10.10, *)) {
|
||||
return [NSGraphicsContext currentContext].CGContext;
|
||||
} else {
|
||||
// Use old deprecated API
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||||
return static_cast<CGContextRef>([NSGraphicsContext currentContext].graphicsPort);
|
||||
#pragma clang diagnostic pop
|
||||
}
|
||||
}
|
||||
|
||||
//----------------- ScintillaCocoa -----------------------------------------------------------------
|
||||
|
||||
ScintillaCocoa::ScintillaCocoa(ScintillaView *sciView_, SCIContentView *viewContent, SCIMarginView *viewMargin) {
|
||||
|
@ -712,7 +726,16 @@ SCIContentView *ScintillaCocoa::ContentView() {
|
|||
Scintilla::Internal::Point ScintillaCocoa::GetVisibleOriginInMain() const {
|
||||
NSScrollView *scrollView = ScrollContainer();
|
||||
NSRect contentRect = scrollView.contentView.bounds;
|
||||
return Point(static_cast<XYPOSITION>(contentRect.origin.x), static_cast<XYPOSITION>(contentRect.origin.y));
|
||||
return Point(contentRect.origin.x, contentRect.origin.y);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Return the size of the client area which has been cached.
|
||||
*/
|
||||
Scintilla::Internal::Point ScintillaCocoa::ClientSize() const {
|
||||
return sizeClient;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -724,10 +747,7 @@ Scintilla::Internal::Point ScintillaCocoa::GetVisibleOriginInMain() const {
|
|||
*/
|
||||
PRectangle ScintillaCocoa::GetClientRectangle() const {
|
||||
NSScrollView *scrollView = ScrollContainer();
|
||||
NSSize size = scrollView.contentView.bounds.size;
|
||||
Point origin = GetVisibleOriginInMain();
|
||||
return PRectangle(origin.x, origin.y, static_cast<XYPOSITION>(origin.x+size.width),
|
||||
static_cast<XYPOSITION>(origin.y + size.height));
|
||||
return NSRectToPRectangle(scrollView.contentView.bounds);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -758,7 +778,7 @@ Scintilla::Internal::Point ScintillaCocoa::ConvertPoint(NSPoint point) {
|
|||
NSView *container = ContentView();
|
||||
NSPoint result = [container convertPoint: point fromView: nil];
|
||||
Scintilla::Internal::Point ptOrigin = GetVisibleOriginInMain();
|
||||
return Point(static_cast<XYPOSITION>(result.x - ptOrigin.x), static_cast<XYPOSITION>(result.y - ptOrigin.y));
|
||||
return Point(result.x - ptOrigin.x, result.y - ptOrigin.y);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -1132,7 +1152,7 @@ void ScintillaCocoa::CTPaint(void *gc, NSRect rc) {
|
|||
|
||||
- (void) drawRect: (NSRect) needsDisplayInRect {
|
||||
if (sci) {
|
||||
CGContextRef context = (CGContextRef) [NSGraphicsContext currentContext].graphicsPort;
|
||||
CGContextRef context = CGContextCurrent();
|
||||
sci->CTPaint(context, needsDisplayInRect);
|
||||
}
|
||||
}
|
||||
|
@ -1154,8 +1174,7 @@ void ScintillaCocoa::CTPaint(void *gc, NSRect rc) {
|
|||
|
||||
void ScintillaCocoa::CallTipMouseDown(NSPoint pt) {
|
||||
NSRect rectBounds = ((__bridge NSView *)(ct.wDraw.GetID())).bounds;
|
||||
Point location(static_cast<XYPOSITION>(pt.x),
|
||||
static_cast<XYPOSITION>(rectBounds.size.height - pt.y));
|
||||
Point location(pt.x, rectBounds.size.height - pt.y);
|
||||
ct.MouseClick(location);
|
||||
CallTipClick();
|
||||
}
|
||||
|
@ -1341,7 +1360,7 @@ void ScintillaCocoa::DragScroll() {
|
|||
return;
|
||||
|
||||
if ([type compare: NSPasteboardTypeString] == NSOrderedSame) {
|
||||
[pasteboard setString: (__bridge NSString *)cfsVal forType: NSStringPboardType];
|
||||
[pasteboard setString: (__bridge NSString *)cfsVal forType: NSPasteboardTypeString];
|
||||
} else if ([type compare: ScintillaRecPboardType] == NSOrderedSame) {
|
||||
// This is specific to scintilla, allows us to drag rectangular selections around the document.
|
||||
if (selectedText.rectangular)
|
||||
|
@ -1369,7 +1388,16 @@ void ScintillaCocoa::StartDrag() {
|
|||
|
||||
// Put the data to be dragged on the drag pasteboard.
|
||||
SelectionText selectedText;
|
||||
NSPasteboard *pasteboard = [NSPasteboard pasteboardWithName: NSDragPboard];
|
||||
NSPasteboard *pasteboard = nil;
|
||||
if (@available(macOS 10.13, *)) {
|
||||
pasteboard = [NSPasteboard pasteboardWithName: NSPasteboardNameDrag];
|
||||
} else {
|
||||
// Use old deprecated name
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||||
pasteboard = [NSPasteboard pasteboardWithName: NSDragPboard];
|
||||
#pragma clang diagnostic pop
|
||||
}
|
||||
CopySelectionRange(&selectedText);
|
||||
SetPasteboardData(pasteboard, selectedText);
|
||||
|
||||
|
@ -1550,12 +1578,20 @@ NSDragOperation ScintillaCocoa::DraggingUpdated(id <NSDraggingInfo> info) {
|
|||
NSPasteboard *pasteboard = [info draggingPasteboard];
|
||||
|
||||
// Return what type of operation we will perform. Prefer move over copy.
|
||||
if ([pasteboard.types containsObject: NSStringPboardType] ||
|
||||
if ([pasteboard.types containsObject: NSPasteboardTypeString] ||
|
||||
[pasteboard.types containsObject: ScintillaRecPboardType])
|
||||
return (sourceDragMask & NSDragOperationMove) ? NSDragOperationMove : NSDragOperationCopy;
|
||||
|
||||
if ([pasteboard.types containsObject: NSFilenamesPboardType])
|
||||
return (sourceDragMask & NSDragOperationGeneric);
|
||||
if (@available(macOS 10.13, *)) {
|
||||
if ([pasteboard.types containsObject: NSPasteboardTypeFileURL])
|
||||
return (sourceDragMask & NSDragOperationGeneric);
|
||||
} else {
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||||
if ([pasteboard.types containsObject: NSFilenamesPboardType])
|
||||
return (sourceDragMask & NSDragOperationGeneric);
|
||||
#pragma clang diagnostic pop
|
||||
}
|
||||
return NSDragOperationNone;
|
||||
}
|
||||
|
||||
|
@ -1579,22 +1615,38 @@ void ScintillaCocoa::DraggingExited(id <NSDraggingInfo> info) {
|
|||
bool ScintillaCocoa::PerformDragOperation(id <NSDraggingInfo> info) {
|
||||
NSPasteboard *pasteboard = [info draggingPasteboard];
|
||||
|
||||
if ([pasteboard.types containsObject: NSFilenamesPboardType]) {
|
||||
NSArray *files = [pasteboard propertyListForType: NSFilenamesPboardType];
|
||||
for (NSString* uri in files)
|
||||
NotifyURIDropped(uri.UTF8String);
|
||||
if (@available(macOS 10.13, *)) {
|
||||
// NSPasteboardTypeFileURL is available for macOS 10.13+, provides NSURLs
|
||||
if ([pasteboard.types containsObject: NSPasteboardTypeFileURL]) {
|
||||
NSArray *files = [pasteboard readObjectsForClasses:@[NSURL.class] options:nil];
|
||||
for (NSURL *uri in files) {
|
||||
NotifyURIDropped([uri path].UTF8String);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
SelectionText text;
|
||||
GetPasteboardData(pasteboard, &text);
|
||||
|
||||
if (text.Length() > 0) {
|
||||
NSDragOperation operation = [info draggingSourceOperationMask];
|
||||
bool moving = (operation & NSDragOperationMove) != 0;
|
||||
|
||||
DropAt(posDrag, text.Data(), text.Length(), moving, text.rectangular);
|
||||
};
|
||||
// Use deprecated NSFilenamesPboardType, provides NSStrings
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||||
if ([pasteboard.types containsObject: NSFilenamesPboardType]) {
|
||||
NSArray *files = [pasteboard propertyListForType: NSFilenamesPboardType];
|
||||
for (NSString *uri in files) {
|
||||
NotifyURIDropped(uri.UTF8String);
|
||||
}
|
||||
}
|
||||
#pragma clang diagnostic pop
|
||||
}
|
||||
|
||||
SelectionText text;
|
||||
GetPasteboardData(pasteboard, &text);
|
||||
|
||||
if (text.Length() > 0) {
|
||||
NSDragOperation operation = [info draggingSourceOperationMask];
|
||||
bool moving = (operation & NSDragOperationMove) != 0;
|
||||
|
||||
DropAt(posDrag, text.Data(), text.Length(), moving, text.rectangular);
|
||||
};
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1612,8 +1664,8 @@ void ScintillaCocoa::SetPasteboardData(NSPasteboard *board, const SelectionText
|
|||
return;
|
||||
|
||||
NSArray *pbTypes = selectedText.rectangular ?
|
||||
@[NSStringPboardType, ScintillaRecPboardType] :
|
||||
@[NSStringPboardType];
|
||||
@[NSPasteboardTypeString, ScintillaRecPboardType] :
|
||||
@[NSPasteboardTypeString];
|
||||
[board declareTypes: pbTypes owner: nil];
|
||||
|
||||
if (selectedText.rectangular) {
|
||||
|
@ -1621,7 +1673,7 @@ void ScintillaCocoa::SetPasteboardData(NSPasteboard *board, const SelectionText
|
|||
[board setString: (__bridge NSString *)cfsVal forType: ScintillaRecPboardType];
|
||||
}
|
||||
|
||||
[board setString: (__bridge NSString *)cfsVal forType: NSStringPboardType];
|
||||
[board setString: (__bridge NSString *)cfsVal forType: NSPasteboardTypeString];
|
||||
|
||||
if (cfsVal)
|
||||
CFRelease(cfsVal);
|
||||
|
@ -1634,7 +1686,7 @@ void ScintillaCocoa::SetPasteboardData(NSPasteboard *board, const SelectionText
|
|||
*/
|
||||
bool ScintillaCocoa::GetPasteboardData(NSPasteboard *board, SelectionText *selectedText) {
|
||||
NSArray *supportedTypes = @[ScintillaRecPboardType,
|
||||
NSStringPboardType];
|
||||
NSPasteboardTypeString];
|
||||
NSString *bestType = [board availableTypeFromArray: supportedTypes];
|
||||
NSString *data = [board stringForType: bestType];
|
||||
|
||||
|
@ -1840,7 +1892,7 @@ bool ScintillaCocoa::SyncPaint(void *gc, PRectangle rc) {
|
|||
* Paint the margin into the SCIMarginView space.
|
||||
*/
|
||||
void ScintillaCocoa::PaintMargin(NSRect aRect) {
|
||||
CGContextRef gc = (CGContextRef) [NSGraphicsContext currentContext].graphicsPort;
|
||||
CGContextRef gc = CGContextCurrent();
|
||||
|
||||
PRectangle rc = NSRectToPRectangle(aRect);
|
||||
rcPaint = rc;
|
||||
|
@ -1988,6 +2040,10 @@ bool ScintillaCocoa::SetScrollingSize() {
|
|||
|
||||
void ScintillaCocoa::Resize() {
|
||||
SetScrollingSize();
|
||||
|
||||
const PRectangle rcClient = GetClientRectangle();
|
||||
sizeClient = Point(rcClient.Width(), rcClient.Height());
|
||||
|
||||
ChangeSize();
|
||||
}
|
||||
|
||||
|
@ -2597,10 +2653,11 @@ void ScintillaCocoa::UpdateBaseElements() {
|
|||
|
||||
bool changed = false;
|
||||
if (@available(macOS 10.14, *)) {
|
||||
NSColor *textBack = [NSColor.textBackgroundColor colorUsingColorSpaceName: NSCalibratedRGBColorSpace];
|
||||
NSColor *noFocusBack = [NSColor.unemphasizedSelectedTextBackgroundColor colorUsingColorSpaceName: NSCalibratedRGBColorSpace];
|
||||
NSColorSpace *colorSpace = [NSColorSpace genericRGBColorSpace];
|
||||
NSColor *textBack = [NSColor.textBackgroundColor colorUsingColorSpace: colorSpace];
|
||||
NSColor *noFocusBack = [NSColor.unemphasizedSelectedTextBackgroundColor colorUsingColorSpace: colorSpace];
|
||||
if (vs.selection.layer == Layer::Base) {
|
||||
NSColor *selBack = [NSColor.selectedTextBackgroundColor colorUsingColorSpaceName: NSCalibratedRGBColorSpace];
|
||||
NSColor *selBack = [NSColor.selectedTextBackgroundColor colorUsingColorSpace: colorSpace];
|
||||
// Additional selection: blend with text background to make weaker version.
|
||||
NSColor *modified = [selBack blendedColorWithFraction:0.5 ofColor:textBack];
|
||||
changed = vs.SetElementBase(Element::SelectionBack, ColourFromNSColor(selBack));
|
||||
|
@ -2610,7 +2667,7 @@ void ScintillaCocoa::UpdateBaseElements() {
|
|||
// Less translucent colour used in dark mode as otherwise less visible
|
||||
const int alpha = textBack.brightnessComponent > 0.5 ? 0x40 : 0x60;
|
||||
// Make a translucent colour that approximates selectedTextBackgroundColor
|
||||
NSColor *accent = [NSColor.controlAccentColor colorUsingColorSpaceName: NSCalibratedRGBColorSpace];
|
||||
NSColor *accent = [NSColor.controlAccentColor colorUsingColorSpace: colorSpace];
|
||||
const ColourRGBA colourAccent = ColourFromNSColor(accent);
|
||||
changed = vs.SetElementBase(Element::SelectionBack, ColourRGBA(colourAccent, alpha));
|
||||
changed = vs.SetElementBase(Element::SelectionAdditionalBack, ColourRGBA(colourAccent, alpha/2)) || changed;
|
||||
|
|
|
@ -314,6 +314,7 @@
|
|||
HEADER_SEARCH_PATHS = "";
|
||||
INFOPLIST_FILE = Info.plist;
|
||||
INSTALL_PATH = "$(HOME)/Applications";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST)) @executable_path/../Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.9;
|
||||
OTHER_LDFLAGS = "";
|
||||
|
@ -341,6 +342,7 @@
|
|||
HEADER_SEARCH_PATHS = "";
|
||||
INFOPLIST_FILE = Info.plist;
|
||||
INSTALL_PATH = "$(HOME)/Applications";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST)) @executable_path/../Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.9;
|
||||
OTHER_LDFLAGS = "";
|
||||
|
|
|
@ -197,7 +197,6 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor) {
|
|||
marginRect.origin.x = x;
|
||||
marginRect.size.width = width;
|
||||
[self addCursorRect: marginRect cursor: cc];
|
||||
[cc setOnMouseEntered: YES];
|
||||
x += width;
|
||||
}
|
||||
}
|
||||
|
@ -235,7 +234,15 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor) {
|
|||
trackingArea = nil;
|
||||
mMarkedTextRange = NSMakeRange(NSNotFound, 0);
|
||||
|
||||
[self registerForDraggedTypes: @[NSStringPboardType, ScintillaRecPboardType, NSFilenamesPboardType]];
|
||||
if (@available(macOS 10.13, *)) {
|
||||
[self registerForDraggedTypes: @[NSPasteboardTypeString, ScintillaRecPboardType, NSPasteboardTypeFileURL]];
|
||||
} else {
|
||||
// Use old deprecated type
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||||
[self registerForDraggedTypes: @[NSPasteboardTypeString, ScintillaRecPboardType, NSFilenamesPboardType]];
|
||||
#pragma clang diagnostic pop
|
||||
}
|
||||
|
||||
// Set up accessibility in the text role
|
||||
if ([self respondsToSelector: @selector(setAccessibilityElement:)]) {
|
||||
|
@ -308,7 +315,6 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor) {
|
|||
// We only have one cursor rect: our bounds.
|
||||
const NSRect visibleBounds = mOwner.backend->GetBounds();
|
||||
[self addCursorRect: visibleBounds cursor: mCurrentCursor];
|
||||
[mCurrentCursor setOnMouseEntered: YES];
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -365,7 +371,7 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor) {
|
|||
* Gets called by the runtime when the view needs repainting.
|
||||
*/
|
||||
- (void) drawRect: (NSRect) rect {
|
||||
CGContextRef context = (CGContextRef) [NSGraphicsContext currentContext].graphicsPort;
|
||||
CGContextRef context = CGContextCurrent();
|
||||
|
||||
if (!mOwner.backend->Draw(rect, context)) {
|
||||
dispatch_async(dispatch_get_main_queue(), ^ {
|
||||
|
@ -778,14 +784,14 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor) {
|
|||
// Only snap for positions inside the document - allow outside
|
||||
// for overshoot.
|
||||
long lineHeight = mOwner.backend->WndProc(Message::TextHeight, 0, 0);
|
||||
rc.origin.y = std::round(static_cast<XYPOSITION>(rc.origin.y) / lineHeight) * lineHeight;
|
||||
rc.origin.y = std::round(rc.origin.y / lineHeight) * lineHeight;
|
||||
}
|
||||
// Snap to whole points - on retina displays this avoids visual debris
|
||||
// when scrolling horizontally.
|
||||
if ((rc.origin.x > 0) && (NSMaxX(rc) < contentRect.size.width)) {
|
||||
// Only snap for positions inside the document - allow outside
|
||||
// for overshoot.
|
||||
rc.origin.x = std::round(static_cast<XYPOSITION>(rc.origin.x));
|
||||
rc.origin.x = std::round(rc.origin.x);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
@ -1828,11 +1834,10 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor) {
|
|||
* Specialized property setter for colors.
|
||||
*/
|
||||
- (void) setColorProperty: (int) property parameter: (long) parameter value: (NSColor *) value {
|
||||
if (value.colorSpaceName != NSDeviceRGBColorSpace)
|
||||
value = [value colorUsingColorSpaceName: NSDeviceRGBColorSpace];
|
||||
long red = static_cast<long>(value.redComponent * 255);
|
||||
long green = static_cast<long>(value.greenComponent * 255);
|
||||
long blue = static_cast<long>(value.blueComponent * 255);
|
||||
NSColor *deviceColor = [value colorUsingColorSpace: [NSColorSpace deviceRGBColorSpace]];
|
||||
long red = static_cast<long>(deviceColor.redComponent * 255);
|
||||
long green = static_cast<long>(deviceColor.greenComponent * 255);
|
||||
long blue = static_cast<long>(deviceColor.blueComponent * 255);
|
||||
|
||||
long color = (blue << 16) + (green << 8) + red;
|
||||
mBackend->WndProc(static_cast<Message>(property), parameter, color);
|
||||
|
|
|
@ -7982,7 +7982,7 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){
|
|||
|
||||
<p><b id="SCI_SETLAYOUTTHREADS">SCI_SETLAYOUTTHREADS(int threads)</b><br />
|
||||
<b id="SCI_GETLAYOUTTHREADS">SCI_GETLAYOUTTHREADS → int</b><br />
|
||||
The time taken to measure text runs on wide lines can be improved by performing the task
|
||||
The time taken to measure text runs on wide lines or when wrapping can be improved by performing the task
|
||||
concurrently on multiple threads when
|
||||
<a class="seealso" href="#SCI_SUPPORTSFEATURE">SCI_SUPPORTSFEATURE(SC_SUPPORTS_THREAD_SAFE_MEASURE_WIDTHS)</a>
|
||||
is available.
|
||||
|
|
|
@ -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/scintilla533.zip">
|
||||
<font size="4"> <a href="https://www.scintilla.org/scintilla534.zip">
|
||||
Windows</a>
|
||||
<a href="https://www.scintilla.org/scintilla533.tgz">
|
||||
<a href="https://www.scintilla.org/scintilla534.tgz">
|
||||
GTK/Linux</a>
|
||||
</font>
|
||||
</td>
|
||||
|
@ -42,7 +42,7 @@
|
|||
containing very few restrictions.
|
||||
</p>
|
||||
<h3>
|
||||
Release 5.3.3
|
||||
Release 5.3.4
|
||||
</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/scintilla533.zip">zip format</a> (1.4M) commonly used on Windows</li>
|
||||
<li><a href="https://www.scintilla.org/scintilla533.tgz">tgz format</a> (1.3M) commonly used on Linux and compatible operating systems</li>
|
||||
<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>
|
||||
</ul>
|
||||
Instructions for building on both Windows and Linux are included in the readme file.
|
||||
<h4>
|
||||
|
|
|
@ -579,6 +579,37 @@
|
|||
</tr>
|
||||
</table>
|
||||
<h2>Releases</h2>
|
||||
<h3>
|
||||
<a href="https://www.scintilla.org/scintilla534.zip">Release 5.3.4</a>
|
||||
</h3>
|
||||
<ul>
|
||||
<li>
|
||||
Released 8 March 2023.
|
||||
</li>
|
||||
<li>
|
||||
Add multithreaded wrap to significantly improve performance of wrapping large files.
|
||||
</li>
|
||||
<li>
|
||||
More typesafe bindings of *Full APIs in ScintillaCall.
|
||||
<a href="https://sourceforge.net/p/scintilla/feature-requests/1477/">Feature #1477</a>.
|
||||
</li>
|
||||
<li>
|
||||
Fix overlapping of text with line end wrap marker.
|
||||
<a href="https://sourceforge.net/p/scintilla/bugs/2378/">Bug #2378</a>.
|
||||
</li>
|
||||
<li>
|
||||
Fix clipping of line end wrap symbol for SC_WRAPVISUALFLAGLOC_END_BY_TEXT.
|
||||
</li>
|
||||
<li>
|
||||
Where a multi-byte character contains multiple styles, display each byte as a representation.
|
||||
This makes it easier to see and fix lexers that change styles mid-character, commonly because
|
||||
they use fixed size buffers.
|
||||
</li>
|
||||
<li>
|
||||
Fix a potential crash with autocompletion list fill-ups where a SCN_CHARADDED
|
||||
handler retriggered an autocompletion list, but with no items that match the typed character.
|
||||
</li>
|
||||
</ul>
|
||||
<h3>
|
||||
<a href="https://www.scintilla.org/scintilla533.zip">Release 5.3.3</a>
|
||||
</h3>
|
||||
|
|
|
@ -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="20230208" />
|
||||
<meta name="Date.Modified" content="20230308" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<style type="text/css">
|
||||
#versionlist {
|
||||
|
@ -56,8 +56,8 @@
|
|||
GTK, and macOS</font>
|
||||
</td>
|
||||
<td width="40%" align="right">
|
||||
<font color="#FFCC99" size="3"> Release version 5.3.3<br />
|
||||
Site last modified February 8 2023</font>
|
||||
<font color="#FFCC99" size="3"> Release version 5.3.4<br />
|
||||
Site last modified March 8 2023</font>
|
||||
</td>
|
||||
<td width="20%">
|
||||
|
||||
|
@ -72,12 +72,12 @@
|
|||
</tr>
|
||||
</table>
|
||||
<ul id="versionlist">
|
||||
<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>
|
||||
<li>Version 5.2.3 adds 64-bit safe APIs and fixes scrollbar on GTK with Xorg.</li>
|
||||
</ul>
|
||||
<ul id="menu">
|
||||
<li id="remote1"><a href="https://www.scintilla.org/SciTEImage.html">Screenshot</a></li>
|
||||
|
|
|
@ -2180,7 +2180,7 @@ void Platform::DebugPrintf(const char *format, ...) noexcept {
|
|||
char buffer[2000];
|
||||
va_list pArguments;
|
||||
va_start(pArguments, format);
|
||||
vsprintf(buffer, format, pArguments);
|
||||
vsnprintf(buffer, std::size(buffer), format, pArguments);
|
||||
va_end(pArguments);
|
||||
Platform::DebugDisplay(buffer);
|
||||
}
|
||||
|
|
|
@ -402,6 +402,7 @@ void ScintillaGTK::MapThis() {
|
|||
wMain.SetCursor(Window::Cursor::arrow);
|
||||
scrollbarv.SetCursor(Window::Cursor::arrow);
|
||||
scrollbarh.SetCursor(Window::Cursor::arrow);
|
||||
SetClientRectangle();
|
||||
ChangeSize();
|
||||
gdk_window_show(PWindow(wMain));
|
||||
} catch (...) {
|
||||
|
@ -1061,8 +1062,12 @@ void ScintillaGTK::FullPaint() {
|
|||
wText.InvalidateAll();
|
||||
}
|
||||
|
||||
void ScintillaGTK::SetClientRectangle() {
|
||||
rectangleClient = wMain.GetClientPosition();
|
||||
}
|
||||
|
||||
PRectangle ScintillaGTK::GetClientRectangle() const {
|
||||
PRectangle rc = wMain.GetClientPosition();
|
||||
PRectangle rc = rectangleClient;
|
||||
if (verticalScrollBarVisible)
|
||||
rc.right -= verticalScrollBarWidth;
|
||||
if (horizontalScrollBarVisible && !Wrapping())
|
||||
|
@ -1788,6 +1793,7 @@ void ScintillaGTK::Resize(int width, int height) {
|
|||
gtk_widget_hide(GTK_WIDGET(PWidget(scrollbarv)));
|
||||
verticalScrollBarWidth = 0;
|
||||
}
|
||||
SetClientRectangle();
|
||||
if (IS_WIDGET_MAPPED(PWidget(wMain))) {
|
||||
ChangeSize();
|
||||
} else {
|
||||
|
|
|
@ -33,6 +33,8 @@ class ScintillaGTK : public ScintillaBase {
|
|||
int verticalScrollBarWidth;
|
||||
int horizontalScrollBarHeight;
|
||||
|
||||
PRectangle rectangleClient;
|
||||
|
||||
SelectionText primary;
|
||||
SelectionPosition posPrimary;
|
||||
|
||||
|
@ -128,6 +130,7 @@ private:
|
|||
bool HaveMouseCapture() override;
|
||||
bool PaintContains(PRectangle rc) override;
|
||||
void FullPaint();
|
||||
void SetClientRectangle();
|
||||
PRectangle GetClientRectangle() const override;
|
||||
void ScrollText(Sci::Line linesToMove) override;
|
||||
void SetVerticalScrollPos() override;
|
||||
|
|
|
@ -414,6 +414,7 @@ PositionCache.o: \
|
|||
../src/CaseFolder.h \
|
||||
../src/Document.h \
|
||||
../src/UniConversion.h \
|
||||
../src/DBCS.h \
|
||||
../src/Selection.h \
|
||||
../src/PositionCache.h
|
||||
RESearch.o: \
|
||||
|
|
|
@ -29,7 +29,6 @@ WARNINGS += -Wno-language-extension-token
|
|||
# register may be used in glib
|
||||
# This produces a warning since -Wno-register is not valid for C files but it still works
|
||||
WARNINGS += -Wno-register
|
||||
DEFINES += -D_CRT_SECURE_NO_DEPRECATE
|
||||
endif
|
||||
# Can choose aspect to sanitize: address and undefined can simply change SANITIZE but for
|
||||
# thread also need to create Position Independent Executable -> search online documentation
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue