mirror of
https://github.com/notepad-plus-plus/notepad-plus-plus.git
synced 2025-08-26 04:08:26 +02:00
Release 5.5.7 (https://www.scintilla.org/scintilla557.zip) Released 8 June 2025 1. Add SCI_SCROLLVERTICAL method to restore view position and maintain it while performing line wrapping. 2. Add SC_UNDO_SELECTION_HISTORY_SCROLL flag to SCI_SETUNDOSELECTIONHISTORY which controls whether undo and redo restore vertical scroll position. 3. Tweak SC_MARK_BAR to be slightly wider by using next higher whole pixel instead of next lower for margin width / 3. 4. Scale images in autocompletion lists with SCI_AUTOCSETIMAGESCALE to match high DPI screens. Initially only on GTK and Qt. 5. Fix wrapping bug for UTF-8 where \r\n could wrap between the characters. Notepad++ Pull Request #16373. 6. Fix crash during painting when scroll bars changed. Bug #2481. 7. On GTK, reset vertical scroll bar synchronously in SCI_SETDOCPOINTER to fix bug where scroll position not restored in non-wrap mode. Bug #2416. 8. On GTK, fix IME problem when tentative composition interfered with delete surrounding. Feature #1476. 9. On GTK, update IME cursor position inside retrieve surrounding to better position candidate window. Feature #1488. Release 5.4.5 (https://www.scintilla.org/lexilla545.zip) Released 8 June 2025 1. Dart: Add error state SCE_DART_STRINGEOL for unterminated string. Pull request #315. 2. Makefile: Add a keyword list to makefile lexer to highlight GNU Make directives like 'ifdef' and 'vpath' as SCE_MAKE_PREPROCESSOR since these are similar to NMAKE directives like '!IFDEF'. 3. Nix: Add error state SCE_NIX_STRINGEOL for unterminated string. Pull request #315. 4. TOML: Add error state SCE_TOML_STRINGEOL for unterminated string. Pull request #315. 5. Zig: Add error state SCE_ZIG_STRINGEOL for unterminated string. Pull request #315. Close #16649
226 lines
4.9 KiB
C++
226 lines
4.9 KiB
C++
// Scintilla source code edit control
|
|
/** @file LexMaxima.cxx
|
|
** Lexer for Maxima (http://maxima.sourceforge.net).
|
|
** Written by Gunter Königsmann based on the lisp lexer by Alexey Yutkin and Neil Hodgson .
|
|
**/
|
|
// Copyright 2018 by Gunter Königsmann <wxMaxima@physikbuch.de>
|
|
// 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 <string>
|
|
#include <string_view>
|
|
|
|
#include "ILexer.h"
|
|
#include "Scintilla.h"
|
|
#include "SciLexer.h"
|
|
|
|
#include "WordList.h"
|
|
#include "LexAccessor.h"
|
|
#include "Accessor.h"
|
|
#include "StyleContext.h"
|
|
#include "CharacterSet.h"
|
|
#include "LexerModule.h"
|
|
using namespace Lexilla;
|
|
|
|
static inline bool isMaximaoperator(char ch) {
|
|
return (ch == '\'' || ch == '`' || ch == '(' ||
|
|
ch == ')' || ch == '[' || ch == ']' ||
|
|
ch == '{' || ch == '}' || ch == '!' ||
|
|
ch == '*' || ch == '/' || ch == '^' ||
|
|
ch == ',' || ch == ':' || ch == '+' ||
|
|
ch == '-');
|
|
}
|
|
|
|
static void ColouriseMaximaDoc(Sci_PositionU startPos, Sci_Position length, int lastStyle,
|
|
WordList *[],
|
|
Accessor &styler) {
|
|
|
|
styler.StartAt(startPos);
|
|
|
|
Sci_Position lengthDoc = startPos + length;
|
|
styler.StartSegment(startPos);
|
|
|
|
Sci_Position i = startPos;
|
|
|
|
// If we are in the middle of a comment we go back to its start before highlighting
|
|
if(lastStyle == SCE_MAXIMA_COMMENT)
|
|
{
|
|
while((i>0) &&
|
|
!((styler.SafeGetCharAt(i+1) == '*') && (styler.SafeGetCharAt(i) == '/')))
|
|
i--;
|
|
}
|
|
|
|
for (; i < lengthDoc; i++) {
|
|
char ch = styler.SafeGetCharAt(i);
|
|
char chNext = styler.SafeGetCharAt(i + 1);
|
|
|
|
if (styler.IsLeadByte(ch))
|
|
continue;
|
|
|
|
// Handle comments.
|
|
// Comments start with /* and end with */
|
|
if((ch == '/') && (chNext == '*'))
|
|
{
|
|
i++;i++;
|
|
|
|
chNext = styler.SafeGetCharAt(i);
|
|
for (; i < lengthDoc; i++)
|
|
{
|
|
ch = chNext;
|
|
chNext = styler.SafeGetCharAt(i + 1);
|
|
if((ch == '*') && (chNext == '/'))
|
|
{
|
|
i++;
|
|
i++;
|
|
break;
|
|
}
|
|
}
|
|
if(i > lengthDoc)
|
|
i = lengthDoc;
|
|
i--;
|
|
styler.ColourTo(i, SCE_MAXIMA_COMMENT);
|
|
continue;
|
|
}
|
|
|
|
// Handle Operators
|
|
if(isMaximaoperator(ch))
|
|
{
|
|
styler.ColourTo(i, SCE_MAXIMA_OPERATOR);
|
|
continue;
|
|
}
|
|
|
|
// Handle command endings.
|
|
if((ch == '$') || (ch == ';'))
|
|
{
|
|
styler.ColourTo(i, SCE_MAXIMA_COMMANDENDING);
|
|
continue;
|
|
}
|
|
|
|
// Handle numbers. Numbers always begin with a digit.
|
|
if(IsASCII(ch) && isdigit(ch))
|
|
{
|
|
i++;
|
|
for (; i < lengthDoc; i++)
|
|
{
|
|
ch = chNext;
|
|
chNext = styler.SafeGetCharAt(i + 1);
|
|
|
|
if(ch == '.')
|
|
continue;
|
|
|
|
// A "e" or similar can be followed by a "+" or a "-"
|
|
if(((ch == 'e') || (ch == 'b') || (ch == 'g') || (ch == 'f')) &&
|
|
((chNext == '+') || (chNext == '-')))
|
|
{
|
|
i++;
|
|
chNext = styler.SafeGetCharAt(i + 1);
|
|
continue;
|
|
}
|
|
|
|
if(!IsASCII(ch) || !(isdigit(ch) || islower(ch) || isupper(ch)))
|
|
{
|
|
i--;
|
|
break;
|
|
}
|
|
}
|
|
styler.ColourTo(i, SCE_MAXIMA_NUMBER);
|
|
continue;
|
|
}
|
|
|
|
// Handle strings
|
|
if(ch == '\"')
|
|
{
|
|
i++;
|
|
for (; i < lengthDoc; i++)
|
|
{
|
|
ch = chNext;
|
|
chNext = styler.SafeGetCharAt(i + 1);
|
|
if(ch == '\\')
|
|
i++;
|
|
else
|
|
{
|
|
if(ch == '\"')
|
|
break;
|
|
}
|
|
}
|
|
styler.ColourTo(i, SCE_MAXIMA_STRING);
|
|
continue;
|
|
}
|
|
|
|
// Handle keywords. Maxima treats Non-ASCII chars as ordinary letters.
|
|
if(((!IsASCII(ch))) || isalpha(ch) || (ch == '_'))
|
|
{
|
|
char cmd[100];
|
|
int cmdidx = 0;
|
|
memset(cmd,0,100);
|
|
cmd[cmdidx++] = ch;
|
|
i++;
|
|
for (; i < lengthDoc; i++)
|
|
{
|
|
ch = chNext;
|
|
chNext = styler.SafeGetCharAt(i + 1);
|
|
if(ch == '\\')
|
|
{
|
|
if(cmdidx < 99)
|
|
cmd[cmdidx++] = ch;
|
|
i++;
|
|
if(cmdidx < 99)
|
|
cmd[cmdidx++] = ch;
|
|
continue;
|
|
}
|
|
if(isMaximaoperator(ch) || ((IsASCII(ch) && !isalpha(ch) && !isdigit(ch) && (ch != '_'))))
|
|
{
|
|
i--;
|
|
break;
|
|
}
|
|
if(cmdidx < 99)
|
|
cmd[cmdidx++] = ch;
|
|
}
|
|
|
|
// A few known keywords
|
|
if(
|
|
(strncmp(cmd,"if",99) == 0) ||
|
|
(strncmp(cmd,"then",99) == 0) ||
|
|
(strncmp(cmd,"else",99) == 0) ||
|
|
(strncmp(cmd,"thru",99) == 0) ||
|
|
(strncmp(cmd,"for",99) == 0) ||
|
|
(strncmp(cmd,"while",99) == 0) ||
|
|
(strncmp(cmd,"do",99) == 0)
|
|
)
|
|
{
|
|
styler.ColourTo(i, SCE_MAXIMA_COMMAND);
|
|
continue;
|
|
}
|
|
|
|
// All other keywords are functions if they are followed
|
|
// by an opening parenthesis
|
|
char nextNonwhitespace = ' ';
|
|
for (Sci_Position o = i + 1; o < lengthDoc; o++)
|
|
{
|
|
nextNonwhitespace = styler.SafeGetCharAt(o);
|
|
if(!IsASCII(nextNonwhitespace) || !isspacechar(nextNonwhitespace))
|
|
break;
|
|
}
|
|
if(nextNonwhitespace == '(')
|
|
{
|
|
styler.ColourTo(i, SCE_MAXIMA_COMMAND);
|
|
}
|
|
else
|
|
{
|
|
styler.ColourTo(i, SCE_MAXIMA_VARIABLE);
|
|
}
|
|
continue;
|
|
}
|
|
|
|
styler.ColourTo(i-1, SCE_MAXIMA_UNKNOWN);
|
|
}
|
|
}
|
|
|
|
extern const LexerModule lmMaxima(SCLEX_MAXIMA, ColouriseMaximaDoc, "maxima", 0, 0);
|