From cc580c1b2c3e65a3200d8056c42a06f4886835c6 Mon Sep 17 00:00:00 2001 From: mpheath <58158242+mpheath@users.noreply.github.com> Date: Thu, 27 Nov 2025 15:15:39 +1000 Subject: [PATCH 1/2] Add new lexer EscSeq --- include/LexicalStyles.iface | 167 +++++++ include/SciLexer.h | 165 +++++++ lexers/LexEscSeq.cxx | 441 ++++++++++++++++++ src/Lexilla.cxx | 2 + src/Lexilla/Lexilla.xcodeproj/project.pbxproj | 4 + src/deps.mak | 15 + src/lexilla.mak | 1 + src/nmdeps.mak | 15 + test/examples/escseq/SciTE.properties | 13 + test/examples/escseq/colourText0.ans | 37 ++ test/examples/escseq/colourText0.ans.folded | 38 ++ test/examples/escseq/colourText0.ans.styled | 37 ++ test/examples/escseq/colourText1.ans | 37 ++ test/examples/escseq/colourText1.ans.folded | 38 ++ test/examples/escseq/colourText1.ans.styled | 37 ++ 15 files changed, 1047 insertions(+) create mode 100644 lexers/LexEscSeq.cxx create mode 100644 test/examples/escseq/SciTE.properties create mode 100644 test/examples/escseq/colourText0.ans create mode 100644 test/examples/escseq/colourText0.ans.folded create mode 100644 test/examples/escseq/colourText0.ans.styled create mode 100644 test/examples/escseq/colourText1.ans create mode 100644 test/examples/escseq/colourText1.ans.folded create mode 100644 test/examples/escseq/colourText1.ans.styled diff --git a/include/LexicalStyles.iface b/include/LexicalStyles.iface index 4771e5f8..b79a7bfd 100644 --- a/include/LexicalStyles.iface +++ b/include/LexicalStyles.iface @@ -150,6 +150,7 @@ val SCLEX_DART=138 val SCLEX_ZIG=139 val SCLEX_NIX=140 val SCLEX_SINEX=141 +val SCLEX_ESCSEQ=142 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a # value assigned in sequence from SCLEX_AUTOMATIC+1. @@ -2459,3 +2460,169 @@ val SCE_SINEX_BLOCK_START=2 val SCE_SINEX_BLOCK_END=3 val SCE_SINEX_DATE=4 val SCE_SINEX_NUMBER=5 +# Lexical states for SCLEX_ESCSEQ +lex ESCSEQ=SCLEX_ESCSEQ SCE_ESCSEQ_ +val SCE_ESCSEQ_DEFAULT=0 +val SCE_ESCSEQ_BLACK_DEFAULT=1 +val SCE_ESCSEQ_RED_DEFAULT=2 +val SCE_ESCSEQ_GREEN_DEFAULT=3 +val SCE_ESCSEQ_YELLOW_DEFAULT=4 +val SCE_ESCSEQ_BLUE_DEFAULT=5 +val SCE_ESCSEQ_MAGENTA_DEFAULT=6 +val SCE_ESCSEQ_CYAN_DEFAULT=7 +val SCE_ESCSEQ_WHITE_DEFAULT=8 +val SCE_ESCSEQ_DEFAULT_BLACK=9 +val SCE_ESCSEQ_BLACK_BLACK=10 +val SCE_ESCSEQ_RED_BLACK=11 +val SCE_ESCSEQ_GREEN_BLACK=12 +val SCE_ESCSEQ_YELLOW_BLACK=13 +val SCE_ESCSEQ_BLUE_BLACK=14 +val SCE_ESCSEQ_MAGENTA_BLACK=15 +val SCE_ESCSEQ_CYAN_BLACK=16 +val SCE_ESCSEQ_WHITE_BLACK=17 +val SCE_ESCSEQ_DEFAULT_RED=18 +val SCE_ESCSEQ_BLACK_RED=19 +val SCE_ESCSEQ_RED_RED=20 +val SCE_ESCSEQ_GREEN_RED=21 +val SCE_ESCSEQ_YELLOW_RED=22 +val SCE_ESCSEQ_BLUE_RED=23 +val SCE_ESCSEQ_MAGENTA_RED=24 +val SCE_ESCSEQ_CYAN_RED=25 +val SCE_ESCSEQ_WHITE_RED=26 +val SCE_ESCSEQ_DEFAULT_GREEN=27 +val SCE_ESCSEQ_BLACK_GREEN=28 +val SCE_ESCSEQ_RED_GREEN=29 +val SCE_ESCSEQ_GREEN_GREEN=30 +val SCE_ESCSEQ_YELLOW_GREEN=40 +val SCE_ESCSEQ_BLUE_GREEN=41 +val SCE_ESCSEQ_MAGENTA_GREEN=42 +val SCE_ESCSEQ_CYAN_GREEN=43 +val SCE_ESCSEQ_WHITE_GREEN=44 +val SCE_ESCSEQ_DEFAULT_YELLOW=45 +val SCE_ESCSEQ_BLACK_YELLOW=46 +val SCE_ESCSEQ_RED_YELLOW=47 +val SCE_ESCSEQ_GREEN_YELLOW=48 +val SCE_ESCSEQ_YELLOW_YELLOW=49 +val SCE_ESCSEQ_BLUE_YELLOW=50 +val SCE_ESCSEQ_MAGENTA_YELLOW=51 +val SCE_ESCSEQ_CYAN_YELLOW=52 +val SCE_ESCSEQ_WHITE_YELLOW=53 +val SCE_ESCSEQ_DEFAULT_BLUE=54 +val SCE_ESCSEQ_BLACK_BLUE=55 +val SCE_ESCSEQ_RED_BLUE=56 +val SCE_ESCSEQ_GREEN_BLUE=57 +val SCE_ESCSEQ_YELLOW_BLUE=58 +val SCE_ESCSEQ_BLUE_BLUE=59 +val SCE_ESCSEQ_MAGENTA_BLUE=60 +val SCE_ESCSEQ_CYAN_BLUE=61 +val SCE_ESCSEQ_WHITE_BLUE=62 +val SCE_ESCSEQ_DEFAULT_MAGENTA=63 +val SCE_ESCSEQ_BLACK_MAGENTA=64 +val SCE_ESCSEQ_RED_MAGENTA=65 +val SCE_ESCSEQ_GREEN_MAGENTA=66 +val SCE_ESCSEQ_YELLOW_MAGENTA=67 +val SCE_ESCSEQ_BLUE_MAGENTA=68 +val SCE_ESCSEQ_MAGENTA_MAGENTA=69 +val SCE_ESCSEQ_CYAN_MAGENTA=70 +val SCE_ESCSEQ_WHITE_MAGENTA=71 +val SCE_ESCSEQ_DEFAULT_CYAN=72 +val SCE_ESCSEQ_BLACK_CYAN=73 +val SCE_ESCSEQ_RED_CYAN=74 +val SCE_ESCSEQ_GREEN_CYAN=75 +val SCE_ESCSEQ_YELLOW_CYAN=76 +val SCE_ESCSEQ_BLUE_CYAN=77 +val SCE_ESCSEQ_MAGENTA_CYAN=78 +val SCE_ESCSEQ_CYAN_CYAN=79 +val SCE_ESCSEQ_WHITE_CYAN=80 +val SCE_ESCSEQ_DEFAULT_WHITE=81 +val SCE_ESCSEQ_BLACK_WHITE=82 +val SCE_ESCSEQ_RED_WHITE=83 +val SCE_ESCSEQ_GREEN_WHITE=84 +val SCE_ESCSEQ_YELLOW_WHITE=85 +val SCE_ESCSEQ_BLUE_WHITE=86 +val SCE_ESCSEQ_MAGENTA_WHITE=87 +val SCE_ESCSEQ_CYAN_WHITE=88 +val SCE_ESCSEQ_WHITE_WHITE=89 +val SCE_ESCSEQ_BOLD_DEFAULT=90 +val SCE_ESCSEQ_BOLD_BLACK_DEFAULT=91 +val SCE_ESCSEQ_BOLD_RED_DEFAULT=92 +val SCE_ESCSEQ_BOLD_GREEN_DEFAULT=93 +val SCE_ESCSEQ_BOLD_YELLOW_DEFAULT=94 +val SCE_ESCSEQ_BOLD_BLUE_DEFAULT=95 +val SCE_ESCSEQ_BOLD_MAGENTA_DEFAULT=96 +val SCE_ESCSEQ_BOLD_CYAN_DEFAULT=97 +val SCE_ESCSEQ_BOLD_WHITE_DEFAULT=98 +val SCE_ESCSEQ_BOLD_DEFAULT_BLACK=99 +val SCE_ESCSEQ_BOLD_BLACK_BLACK=100 +val SCE_ESCSEQ_BOLD_RED_BLACK=101 +val SCE_ESCSEQ_BOLD_GREEN_BLACK=102 +val SCE_ESCSEQ_BOLD_YELLOW_BLACK=103 +val SCE_ESCSEQ_BOLD_BLUE_BLACK=104 +val SCE_ESCSEQ_BOLD_MAGENTA_BLACK=105 +val SCE_ESCSEQ_BOLD_CYAN_BLACK=106 +val SCE_ESCSEQ_BOLD_WHITE_BLACK=107 +val SCE_ESCSEQ_BOLD_DEFAULT_RED=108 +val SCE_ESCSEQ_BOLD_BLACK_RED=109 +val SCE_ESCSEQ_BOLD_RED_RED=110 +val SCE_ESCSEQ_BOLD_GREEN_RED=111 +val SCE_ESCSEQ_BOLD_YELLOW_RED=112 +val SCE_ESCSEQ_BOLD_BLUE_RED=113 +val SCE_ESCSEQ_BOLD_MAGENTA_RED=114 +val SCE_ESCSEQ_BOLD_CYAN_RED=115 +val SCE_ESCSEQ_BOLD_WHITE_RED=116 +val SCE_ESCSEQ_BOLD_DEFAULT_GREEN=117 +val SCE_ESCSEQ_BOLD_BLACK_GREEN=118 +val SCE_ESCSEQ_BOLD_RED_GREEN=119 +val SCE_ESCSEQ_BOLD_GREEN_GREEN=120 +val SCE_ESCSEQ_BOLD_YELLOW_GREEN=121 +val SCE_ESCSEQ_BOLD_BLUE_GREEN=122 +val SCE_ESCSEQ_BOLD_MAGENTA_GREEN=123 +val SCE_ESCSEQ_BOLD_CYAN_GREEN=124 +val SCE_ESCSEQ_BOLD_WHITE_GREEN=125 +val SCE_ESCSEQ_BOLD_DEFAULT_YELLOW=126 +val SCE_ESCSEQ_BOLD_BLACK_YELLOW=127 +val SCE_ESCSEQ_BOLD_RED_YELLOW=128 +val SCE_ESCSEQ_BOLD_GREEN_YELLOW=129 +val SCE_ESCSEQ_BOLD_YELLOW_YELLOW=130 +val SCE_ESCSEQ_BOLD_BLUE_YELLOW=131 +val SCE_ESCSEQ_BOLD_MAGENTA_YELLOW=132 +val SCE_ESCSEQ_BOLD_CYAN_YELLOW=133 +val SCE_ESCSEQ_BOLD_WHITE_YELLOW=134 +val SCE_ESCSEQ_BOLD_DEFAULT_BLUE=135 +val SCE_ESCSEQ_BOLD_BLACK_BLUE=136 +val SCE_ESCSEQ_BOLD_RED_BLUE=137 +val SCE_ESCSEQ_BOLD_GREEN_BLUE=138 +val SCE_ESCSEQ_BOLD_YELLOW_BLUE=139 +val SCE_ESCSEQ_BOLD_BLUE_BLUE=140 +val SCE_ESCSEQ_BOLD_MAGENTA_BLUE=141 +val SCE_ESCSEQ_BOLD_CYAN_BLUE=142 +val SCE_ESCSEQ_BOLD_WHITE_BLUE=143 +val SCE_ESCSEQ_BOLD_DEFAULT_MAGENTA=144 +val SCE_ESCSEQ_BOLD_BLACK_MAGENTA=145 +val SCE_ESCSEQ_BOLD_RED_MAGENTA=146 +val SCE_ESCSEQ_BOLD_GREEN_MAGENTA=147 +val SCE_ESCSEQ_BOLD_YELLOW_MAGENTA=148 +val SCE_ESCSEQ_BOLD_BLUE_MAGENTA=149 +val SCE_ESCSEQ_BOLD_MAGENTA_MAGENTA=150 +val SCE_ESCSEQ_BOLD_CYAN_MAGENTA=151 +val SCE_ESCSEQ_BOLD_WHITE_MAGENTA=152 +val SCE_ESCSEQ_BOLD_DEFAULT_CYAN=153 +val SCE_ESCSEQ_BOLD_BLACK_CYAN=154 +val SCE_ESCSEQ_BOLD_RED_CYAN=155 +val SCE_ESCSEQ_BOLD_GREEN_CYAN=156 +val SCE_ESCSEQ_BOLD_YELLOW_CYAN=157 +val SCE_ESCSEQ_BOLD_BLUE_CYAN=158 +val SCE_ESCSEQ_BOLD_MAGENTA_CYAN=159 +val SCE_ESCSEQ_BOLD_CYAN_CYAN=160 +val SCE_ESCSEQ_BOLD_WHITE_CYAN=161 +val SCE_ESCSEQ_BOLD_DEFAULT_WHITE=162 +val SCE_ESCSEQ_BOLD_BLACK_WHITE=163 +val SCE_ESCSEQ_BOLD_RED_WHITE=164 +val SCE_ESCSEQ_BOLD_GREEN_WHITE=165 +val SCE_ESCSEQ_BOLD_YELLOW_WHITE=166 +val SCE_ESCSEQ_BOLD_BLUE_WHITE=167 +val SCE_ESCSEQ_BOLD_MAGENTA_WHITE=168 +val SCE_ESCSEQ_BOLD_CYAN_WHITE=169 +val SCE_ESCSEQ_BOLD_WHITE_WHITE=170 +val SCE_ESCSEQ_IDENTIFIER=171 +val SCE_ESCSEQ_UNKNOWN=172 diff --git a/include/SciLexer.h b/include/SciLexer.h index b37f0d09..f363ebd4 100644 --- a/include/SciLexer.h +++ b/include/SciLexer.h @@ -155,6 +155,7 @@ #define SCLEX_ZIG 139 #define SCLEX_NIX 140 #define SCLEX_SINEX 141 +#define SCLEX_ESCSEQ 142 #define SCLEX_AUTOMATIC 1000 #define SCE_P_DEFAULT 0 #define SCE_P_COMMENTLINE 1 @@ -2196,6 +2197,170 @@ #define SCE_SINEX_BLOCK_END 3 #define SCE_SINEX_DATE 4 #define SCE_SINEX_NUMBER 5 +#define SCE_ESCSEQ_DEFAULT 0 +#define SCE_ESCSEQ_BLACK_DEFAULT 1 +#define SCE_ESCSEQ_RED_DEFAULT 2 +#define SCE_ESCSEQ_GREEN_DEFAULT 3 +#define SCE_ESCSEQ_YELLOW_DEFAULT 4 +#define SCE_ESCSEQ_BLUE_DEFAULT 5 +#define SCE_ESCSEQ_MAGENTA_DEFAULT 6 +#define SCE_ESCSEQ_CYAN_DEFAULT 7 +#define SCE_ESCSEQ_WHITE_DEFAULT 8 +#define SCE_ESCSEQ_DEFAULT_BLACK 9 +#define SCE_ESCSEQ_BLACK_BLACK 10 +#define SCE_ESCSEQ_RED_BLACK 11 +#define SCE_ESCSEQ_GREEN_BLACK 12 +#define SCE_ESCSEQ_YELLOW_BLACK 13 +#define SCE_ESCSEQ_BLUE_BLACK 14 +#define SCE_ESCSEQ_MAGENTA_BLACK 15 +#define SCE_ESCSEQ_CYAN_BLACK 16 +#define SCE_ESCSEQ_WHITE_BLACK 17 +#define SCE_ESCSEQ_DEFAULT_RED 18 +#define SCE_ESCSEQ_BLACK_RED 19 +#define SCE_ESCSEQ_RED_RED 20 +#define SCE_ESCSEQ_GREEN_RED 21 +#define SCE_ESCSEQ_YELLOW_RED 22 +#define SCE_ESCSEQ_BLUE_RED 23 +#define SCE_ESCSEQ_MAGENTA_RED 24 +#define SCE_ESCSEQ_CYAN_RED 25 +#define SCE_ESCSEQ_WHITE_RED 26 +#define SCE_ESCSEQ_DEFAULT_GREEN 27 +#define SCE_ESCSEQ_BLACK_GREEN 28 +#define SCE_ESCSEQ_RED_GREEN 29 +#define SCE_ESCSEQ_GREEN_GREEN 30 +#define SCE_ESCSEQ_YELLOW_GREEN 40 +#define SCE_ESCSEQ_BLUE_GREEN 41 +#define SCE_ESCSEQ_MAGENTA_GREEN 42 +#define SCE_ESCSEQ_CYAN_GREEN 43 +#define SCE_ESCSEQ_WHITE_GREEN 44 +#define SCE_ESCSEQ_DEFAULT_YELLOW 45 +#define SCE_ESCSEQ_BLACK_YELLOW 46 +#define SCE_ESCSEQ_RED_YELLOW 47 +#define SCE_ESCSEQ_GREEN_YELLOW 48 +#define SCE_ESCSEQ_YELLOW_YELLOW 49 +#define SCE_ESCSEQ_BLUE_YELLOW 50 +#define SCE_ESCSEQ_MAGENTA_YELLOW 51 +#define SCE_ESCSEQ_CYAN_YELLOW 52 +#define SCE_ESCSEQ_WHITE_YELLOW 53 +#define SCE_ESCSEQ_DEFAULT_BLUE 54 +#define SCE_ESCSEQ_BLACK_BLUE 55 +#define SCE_ESCSEQ_RED_BLUE 56 +#define SCE_ESCSEQ_GREEN_BLUE 57 +#define SCE_ESCSEQ_YELLOW_BLUE 58 +#define SCE_ESCSEQ_BLUE_BLUE 59 +#define SCE_ESCSEQ_MAGENTA_BLUE 60 +#define SCE_ESCSEQ_CYAN_BLUE 61 +#define SCE_ESCSEQ_WHITE_BLUE 62 +#define SCE_ESCSEQ_DEFAULT_MAGENTA 63 +#define SCE_ESCSEQ_BLACK_MAGENTA 64 +#define SCE_ESCSEQ_RED_MAGENTA 65 +#define SCE_ESCSEQ_GREEN_MAGENTA 66 +#define SCE_ESCSEQ_YELLOW_MAGENTA 67 +#define SCE_ESCSEQ_BLUE_MAGENTA 68 +#define SCE_ESCSEQ_MAGENTA_MAGENTA 69 +#define SCE_ESCSEQ_CYAN_MAGENTA 70 +#define SCE_ESCSEQ_WHITE_MAGENTA 71 +#define SCE_ESCSEQ_DEFAULT_CYAN 72 +#define SCE_ESCSEQ_BLACK_CYAN 73 +#define SCE_ESCSEQ_RED_CYAN 74 +#define SCE_ESCSEQ_GREEN_CYAN 75 +#define SCE_ESCSEQ_YELLOW_CYAN 76 +#define SCE_ESCSEQ_BLUE_CYAN 77 +#define SCE_ESCSEQ_MAGENTA_CYAN 78 +#define SCE_ESCSEQ_CYAN_CYAN 79 +#define SCE_ESCSEQ_WHITE_CYAN 80 +#define SCE_ESCSEQ_DEFAULT_WHITE 81 +#define SCE_ESCSEQ_BLACK_WHITE 82 +#define SCE_ESCSEQ_RED_WHITE 83 +#define SCE_ESCSEQ_GREEN_WHITE 84 +#define SCE_ESCSEQ_YELLOW_WHITE 85 +#define SCE_ESCSEQ_BLUE_WHITE 86 +#define SCE_ESCSEQ_MAGENTA_WHITE 87 +#define SCE_ESCSEQ_CYAN_WHITE 88 +#define SCE_ESCSEQ_WHITE_WHITE 89 +#define SCE_ESCSEQ_BOLD_DEFAULT 90 +#define SCE_ESCSEQ_BOLD_BLACK_DEFAULT 91 +#define SCE_ESCSEQ_BOLD_RED_DEFAULT 92 +#define SCE_ESCSEQ_BOLD_GREEN_DEFAULT 93 +#define SCE_ESCSEQ_BOLD_YELLOW_DEFAULT 94 +#define SCE_ESCSEQ_BOLD_BLUE_DEFAULT 95 +#define SCE_ESCSEQ_BOLD_MAGENTA_DEFAULT 96 +#define SCE_ESCSEQ_BOLD_CYAN_DEFAULT 97 +#define SCE_ESCSEQ_BOLD_WHITE_DEFAULT 98 +#define SCE_ESCSEQ_BOLD_DEFAULT_BLACK 99 +#define SCE_ESCSEQ_BOLD_BLACK_BLACK 100 +#define SCE_ESCSEQ_BOLD_RED_BLACK 101 +#define SCE_ESCSEQ_BOLD_GREEN_BLACK 102 +#define SCE_ESCSEQ_BOLD_YELLOW_BLACK 103 +#define SCE_ESCSEQ_BOLD_BLUE_BLACK 104 +#define SCE_ESCSEQ_BOLD_MAGENTA_BLACK 105 +#define SCE_ESCSEQ_BOLD_CYAN_BLACK 106 +#define SCE_ESCSEQ_BOLD_WHITE_BLACK 107 +#define SCE_ESCSEQ_BOLD_DEFAULT_RED 108 +#define SCE_ESCSEQ_BOLD_BLACK_RED 109 +#define SCE_ESCSEQ_BOLD_RED_RED 110 +#define SCE_ESCSEQ_BOLD_GREEN_RED 111 +#define SCE_ESCSEQ_BOLD_YELLOW_RED 112 +#define SCE_ESCSEQ_BOLD_BLUE_RED 113 +#define SCE_ESCSEQ_BOLD_MAGENTA_RED 114 +#define SCE_ESCSEQ_BOLD_CYAN_RED 115 +#define SCE_ESCSEQ_BOLD_WHITE_RED 116 +#define SCE_ESCSEQ_BOLD_DEFAULT_GREEN 117 +#define SCE_ESCSEQ_BOLD_BLACK_GREEN 118 +#define SCE_ESCSEQ_BOLD_RED_GREEN 119 +#define SCE_ESCSEQ_BOLD_GREEN_GREEN 120 +#define SCE_ESCSEQ_BOLD_YELLOW_GREEN 121 +#define SCE_ESCSEQ_BOLD_BLUE_GREEN 122 +#define SCE_ESCSEQ_BOLD_MAGENTA_GREEN 123 +#define SCE_ESCSEQ_BOLD_CYAN_GREEN 124 +#define SCE_ESCSEQ_BOLD_WHITE_GREEN 125 +#define SCE_ESCSEQ_BOLD_DEFAULT_YELLOW 126 +#define SCE_ESCSEQ_BOLD_BLACK_YELLOW 127 +#define SCE_ESCSEQ_BOLD_RED_YELLOW 128 +#define SCE_ESCSEQ_BOLD_GREEN_YELLOW 129 +#define SCE_ESCSEQ_BOLD_YELLOW_YELLOW 130 +#define SCE_ESCSEQ_BOLD_BLUE_YELLOW 131 +#define SCE_ESCSEQ_BOLD_MAGENTA_YELLOW 132 +#define SCE_ESCSEQ_BOLD_CYAN_YELLOW 133 +#define SCE_ESCSEQ_BOLD_WHITE_YELLOW 134 +#define SCE_ESCSEQ_BOLD_DEFAULT_BLUE 135 +#define SCE_ESCSEQ_BOLD_BLACK_BLUE 136 +#define SCE_ESCSEQ_BOLD_RED_BLUE 137 +#define SCE_ESCSEQ_BOLD_GREEN_BLUE 138 +#define SCE_ESCSEQ_BOLD_YELLOW_BLUE 139 +#define SCE_ESCSEQ_BOLD_BLUE_BLUE 140 +#define SCE_ESCSEQ_BOLD_MAGENTA_BLUE 141 +#define SCE_ESCSEQ_BOLD_CYAN_BLUE 142 +#define SCE_ESCSEQ_BOLD_WHITE_BLUE 143 +#define SCE_ESCSEQ_BOLD_DEFAULT_MAGENTA 144 +#define SCE_ESCSEQ_BOLD_BLACK_MAGENTA 145 +#define SCE_ESCSEQ_BOLD_RED_MAGENTA 146 +#define SCE_ESCSEQ_BOLD_GREEN_MAGENTA 147 +#define SCE_ESCSEQ_BOLD_YELLOW_MAGENTA 148 +#define SCE_ESCSEQ_BOLD_BLUE_MAGENTA 149 +#define SCE_ESCSEQ_BOLD_MAGENTA_MAGENTA 150 +#define SCE_ESCSEQ_BOLD_CYAN_MAGENTA 151 +#define SCE_ESCSEQ_BOLD_WHITE_MAGENTA 152 +#define SCE_ESCSEQ_BOLD_DEFAULT_CYAN 153 +#define SCE_ESCSEQ_BOLD_BLACK_CYAN 154 +#define SCE_ESCSEQ_BOLD_RED_CYAN 155 +#define SCE_ESCSEQ_BOLD_GREEN_CYAN 156 +#define SCE_ESCSEQ_BOLD_YELLOW_CYAN 157 +#define SCE_ESCSEQ_BOLD_BLUE_CYAN 158 +#define SCE_ESCSEQ_BOLD_MAGENTA_CYAN 159 +#define SCE_ESCSEQ_BOLD_CYAN_CYAN 160 +#define SCE_ESCSEQ_BOLD_WHITE_CYAN 161 +#define SCE_ESCSEQ_BOLD_DEFAULT_WHITE 162 +#define SCE_ESCSEQ_BOLD_BLACK_WHITE 163 +#define SCE_ESCSEQ_BOLD_RED_WHITE 164 +#define SCE_ESCSEQ_BOLD_GREEN_WHITE 165 +#define SCE_ESCSEQ_BOLD_YELLOW_WHITE 166 +#define SCE_ESCSEQ_BOLD_BLUE_WHITE 167 +#define SCE_ESCSEQ_BOLD_MAGENTA_WHITE 168 +#define SCE_ESCSEQ_BOLD_CYAN_WHITE 169 +#define SCE_ESCSEQ_BOLD_WHITE_WHITE 170 +#define SCE_ESCSEQ_IDENTIFIER 171 +#define SCE_ESCSEQ_UNKNOWN 172 /* --Autogenerated -- end of section automatically generated from LexicalStyles.iface */ #endif diff --git a/lexers/LexEscSeq.cxx b/lexers/LexEscSeq.cxx new file mode 100644 index 00000000..90ad4584 --- /dev/null +++ b/lexers/LexEscSeq.cxx @@ -0,0 +1,441 @@ +// Scintilla source code edit control +/** @file LexEscSeq.cxx + ** Lexer for terminal escape sequences. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "ILexer.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#include "InList.h" +#include "WordList.h" +#include "LexAccessor.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "CharacterSet.h" +#include "LexerModule.h" +#include "OptionSet.h" +#include "DefaultLexer.h" + +using namespace Scintilla; +using namespace Lexilla; + +namespace { + +#define CSI "\033[" + +// Options used for LexerEscSeq +struct OptionsEscSeq { + bool colourText = false; +}; + + +const char *const emptyWordListDesc[] = { + nullptr +}; + + +struct OptionSetEscSeq : public OptionSet { + OptionSetEscSeq() { + DefineProperty("lexer.escseq.colour.text", &OptionsEscSeq::colourText, + "Set to 1 to colour text following the escape sequences." + ); + + DefineWordListSets(emptyWordListDesc); + } +}; + + +const LexicalClass lexicalClasses[] = { + // Lexer escseq SCLEX_ESCSEQ SCE_ESCSEQ_ + 0, "SCE_ESCSEQ_DEFAULT", "default", "Default", + 1, "SCE_ESCSEQ_BLACK_DEFAULT", "default", "Black Default", + 2, "SCE_ESCSEQ_RED_DEFAULT", "default", "Red Default", + 3, "SCE_ESCSEQ_GREEN_DEFAULT", "default", "Green Default", + 4, "SCE_ESCSEQ_YELLOW_DEFAULT", "default", "Yellow Default", + 5, "SCE_ESCSEQ_BLUE_DEFAULT", "default", "Blue Default", + 6, "SCE_ESCSEQ_MAGENTA_DEFAULT", "default", "Magenta Default", + 7, "SCE_ESCSEQ_CYAN_DEFAULT", "default", "Cyan Default", + 8, "SCE_ESCSEQ_WHITE_DEFAULT", "default", "White Default", + 9, "SCE_ESCSEQ_DEFAULT_BLACK", "default", "Default Black", + 10, "SCE_ESCSEQ_BLACK_BLACK", "default", "Black Black", + 11, "SCE_ESCSEQ_RED_BLACK", "default", "Red Black", + 12, "SCE_ESCSEQ_GREEN_BLACK", "default", "Green Black", + 13, "SCE_ESCSEQ_YELLOW_BLACK", "default", "Yellow Black", + 14, "SCE_ESCSEQ_BLUE_BLACK", "default", "Blue Black", + 15, "SCE_ESCSEQ_MAGENTA_BLACK", "default", "Magenta Black", + 16, "SCE_ESCSEQ_CYAN_BLACK", "default", "Cyan Black", + 17, "SCE_ESCSEQ_WHITE_BLACK", "default", "White Black", + 18, "SCE_ESCSEQ_DEFAULT_RED", "default", "Default Red", + 19, "SCE_ESCSEQ_BLACK_RED", "default", "Black Red", + 20, "SCE_ESCSEQ_RED_RED", "default", "Red Red", + 21, "SCE_ESCSEQ_GREEN_RED", "default", "Green Red", + 22, "SCE_ESCSEQ_YELLOW_RED", "default", "Yellow Red", + 23, "SCE_ESCSEQ_BLUE_RED", "default", "Blue Red", + 24, "SCE_ESCSEQ_MAGENTA_RED", "default", "Magenta Red", + 25, "SCE_ESCSEQ_CYAN_RED", "default", "Cyan Red", + 26, "SCE_ESCSEQ_WHITE_RED", "default", "White Red", + 27, "SCE_ESCSEQ_DEFAULT_GREEN", "default", "Default Green", + 28, "SCE_ESCSEQ_BLACK_GREEN", "default", "Black Green", + 29, "SCE_ESCSEQ_RED_GREEN", "default", "Red Green", + 30, "SCE_ESCSEQ_GREEN_GREEN", "default", "Green Green", + 31, "", "unused", "", + 32, "", "predefined", "", + 33, "", "predefined", "", + 34, "", "predefined", "", + 35, "", "predefined", "", + 36, "", "predefined", "", + 37, "", "predefined", "", + 38, "", "predefined", "", + 39, "", "predefined", "", + 40, "SCE_ESCSEQ_YELLOW_GREEN", "default", "Yellow Green", + 41, "SCE_ESCSEQ_BLUE_GREEN", "default", "Blue Green", + 42, "SCE_ESCSEQ_MAGENTA_GREEN", "default", "Magenta Green", + 43, "SCE_ESCSEQ_CYAN_GREEN", "default", "Cyan Green", + 44, "SCE_ESCSEQ_WHITE_GREEN", "default", "White Green", + 45, "SCE_ESCSEQ_DEFAULT_YELLOW", "default", "Default Yellow", + 46, "SCE_ESCSEQ_BLACK_YELLOW", "default", "Black Yellow", + 47, "SCE_ESCSEQ_RED_YELLOW", "default", "Red Yellow", + 48, "SCE_ESCSEQ_GREEN_YELLOW", "default", "Green Yellow", + 49, "SCE_ESCSEQ_YELLOW_YELLOW", "default", "Yellow Yellow", + 50, "SCE_ESCSEQ_BLUE_YELLOW", "default", "Blue Yellow", + 51, "SCE_ESCSEQ_MAGENTA_YELLOW", "default", "Magenta Yellow", + 52, "SCE_ESCSEQ_CYAN_YELLOW", "default", "Cyan Yellow", + 53, "SCE_ESCSEQ_WHITE_YELLOW", "default", "White Yellow", + 54, "SCE_ESCSEQ_DEFAULT_BLUE", "default", "Default Blue", + 55, "SCE_ESCSEQ_BLACK_BLUE", "default", "Black Blue", + 56, "SCE_ESCSEQ_RED_BLUE", "default", "Red Blue", + 57, "SCE_ESCSEQ_GREEN_BLUE", "default", "Green Blue", + 58, "SCE_ESCSEQ_YELLOW_BLUE", "default", "Yellow Blue", + 59, "SCE_ESCSEQ_BLUE_BLUE", "default", "Blue Blue", + 60, "SCE_ESCSEQ_MAGENTA_BLUE", "default", "Magenta Blue", + 61, "SCE_ESCSEQ_CYAN_BLUE", "default", "Cyan Blue", + 62, "SCE_ESCSEQ_WHITE_BLUE", "default", "White Blue", + 63, "SCE_ESCSEQ_DEFAULT_MAGENTA", "default", "Default Magenta", + 64, "SCE_ESCSEQ_BLACK_MAGENTA", "default", "Black Magenta", + 65, "SCE_ESCSEQ_RED_MAGENTA", "default", "Red Magenta", + 66, "SCE_ESCSEQ_GREEN_MAGENTA", "default", "Green Magenta", + 67, "SCE_ESCSEQ_YELLOW_MAGENTA", "default", "Yellow Magenta", + 68, "SCE_ESCSEQ_BLUE_MAGENTA", "default", "Blue Magenta", + 69, "SCE_ESCSEQ_MAGENTA_MAGENTA", "default", "Magenta Magenta", + 70, "SCE_ESCSEQ_CYAN_MAGENTA", "default", "Cyan Magenta", + 71, "SCE_ESCSEQ_WHITE_MAGENTA", "default", "White Magenta", + 72, "SCE_ESCSEQ_DEFAULT_CYAN", "default", "Default Cyan", + 73, "SCE_ESCSEQ_BLACK_CYAN", "default", "Black Cyan", + 74, "SCE_ESCSEQ_RED_CYAN", "default", "Red Cyan", + 75, "SCE_ESCSEQ_GREEN_CYAN", "default", "Green Cyan", + 76, "SCE_ESCSEQ_YELLOW_CYAN", "default", "Yellow Cyan", + 77, "SCE_ESCSEQ_BLUE_CYAN", "default", "Blue Cyan", + 78, "SCE_ESCSEQ_MAGENTA_CYAN", "default", "Magenta Cyan", + 79, "SCE_ESCSEQ_CYAN_CYAN", "default", "Cyan Cyan", + 80, "SCE_ESCSEQ_WHITE_CYAN", "default", "White Cyan", + 81, "SCE_ESCSEQ_DEFAULT_WHITE", "default", "Default White", + 82, "SCE_ESCSEQ_BLACK_WHITE", "default", "Black White", + 83, "SCE_ESCSEQ_RED_WHITE", "default", "Red White", + 84, "SCE_ESCSEQ_GREEN_WHITE", "default", "Green White", + 85, "SCE_ESCSEQ_YELLOW_WHITE", "default", "Yellow White", + 86, "SCE_ESCSEQ_BLUE_WHITE", "default", "Blue White", + 87, "SCE_ESCSEQ_MAGENTA_WHITE", "default", "Magenta White", + 88, "SCE_ESCSEQ_CYAN_WHITE", "default", "Cyan White", + 89, "SCE_ESCSEQ_WHITE_WHITE", "default", "White White", + 90, "SCE_ESCSEQ_BOLD_DEFAULT", "default", "Bold Default", + 91, "SCE_ESCSEQ_BOLD_BLACK_DEFAULT", "default", "Bold Black Default", + 92, "SCE_ESCSEQ_BOLD_RED_DEFAULT", "default", "Bold Red Default", + 93, "SCE_ESCSEQ_BOLD_GREEN_DEFAULT", "default", "Bold Green Default", + 94, "SCE_ESCSEQ_BOLD_YELLOW_DEFAULT", "default", "Bold Yellow Default", + 95, "SCE_ESCSEQ_BOLD_BLUE_DEFAULT", "default", "Bold Blue Default", + 96, "SCE_ESCSEQ_BOLD_MAGENTA_DEFAULT", "default", "Bold Magenta Default", + 97, "SCE_ESCSEQ_BOLD_CYAN_DEFAULT", "default", "Bold Cyan Default", + 98, "SCE_ESCSEQ_BOLD_WHITE_DEFAULT", "default", "Bold White Default", + 99, "SCE_ESCSEQ_BOLD_DEFAULT_BLACK", "default", "Bold Default Black", + 100, "SCE_ESCSEQ_BOLD_BLACK_BLACK", "default", "Bold Black Black", + 101, "SCE_ESCSEQ_BOLD_RED_BLACK", "default", "Bold Red Black", + 102, "SCE_ESCSEQ_BOLD_GREEN_BLACK", "default", "Bold Green Black", + 103, "SCE_ESCSEQ_BOLD_YELLOW_BLACK", "default", "Bold Yellow Black", + 104, "SCE_ESCSEQ_BOLD_BLUE_BLACK", "default", "Bold Blue Black", + 105, "SCE_ESCSEQ_BOLD_MAGENTA_BLACK", "default", "Bold Magenta Black", + 106, "SCE_ESCSEQ_BOLD_CYAN_BLACK", "default", "Bold Cyan Black", + 107, "SCE_ESCSEQ_BOLD_WHITE_BLACK", "default", "Bold White Black", + 108, "SCE_ESCSEQ_BOLD_DEFAULT_RED", "default", "Bold Default Red", + 109, "SCE_ESCSEQ_BOLD_BLACK_RED", "default", "Bold Black Red", + 110, "SCE_ESCSEQ_BOLD_RED_RED", "default", "Bold Red Red", + 111, "SCE_ESCSEQ_BOLD_GREEN_RED", "default", "Bold Green Red", + 112, "SCE_ESCSEQ_BOLD_YELLOW_RED", "default", "Bold Yellow Red", + 113, "SCE_ESCSEQ_BOLD_BLUE_RED", "default", "Bold Blue Red", + 114, "SCE_ESCSEQ_BOLD_MAGENTA_RED", "default", "Bold Magenta Red", + 115, "SCE_ESCSEQ_BOLD_CYAN_RED", "default", "Bold Cyan Red", + 116, "SCE_ESCSEQ_BOLD_WHITE_RED", "default", "Bold White Red", + 117, "SCE_ESCSEQ_BOLD_DEFAULT_GREEN", "default", "Bold Default Green", + 118, "SCE_ESCSEQ_BOLD_BLACK_GREEN", "default", "Bold Black Green", + 119, "SCE_ESCSEQ_BOLD_RED_GREEN", "default", "Bold Red Green", + 120, "SCE_ESCSEQ_BOLD_GREEN_GREEN", "default", "Bold Green Green", + 121, "SCE_ESCSEQ_BOLD_YELLOW_GREEN", "default", "Bold Yellow Green", + 122, "SCE_ESCSEQ_BOLD_BLUE_GREEN", "default", "Bold Blue Green", + 123, "SCE_ESCSEQ_BOLD_MAGENTA_GREEN", "default", "Bold Magenta Green", + 124, "SCE_ESCSEQ_BOLD_CYAN_GREEN", "default", "Bold Cyan Green", + 125, "SCE_ESCSEQ_BOLD_WHITE_GREEN", "default", "Bold White Green", + 126, "SCE_ESCSEQ_BOLD_DEFAULT_YELLOW", "default", "Bold Default Yellow", + 127, "SCE_ESCSEQ_BOLD_BLACK_YELLOW", "default", "Bold Black Yellow", + 128, "SCE_ESCSEQ_BOLD_RED_YELLOW", "default", "Bold Red Yellow", + 129, "SCE_ESCSEQ_BOLD_GREEN_YELLOW", "default", "Bold Green Yellow", + 130, "SCE_ESCSEQ_BOLD_YELLOW_YELLOW", "default", "Bold Yellow Yellow", + 131, "SCE_ESCSEQ_BOLD_BLUE_YELLOW", "default", "Bold Blue Yellow", + 132, "SCE_ESCSEQ_BOLD_MAGENTA_YELLOW", "default", "Bold Magenta Yellow", + 133, "SCE_ESCSEQ_BOLD_CYAN_YELLOW", "default", "Bold Cyan Yellow", + 134, "SCE_ESCSEQ_BOLD_WHITE_YELLOW", "default", "Bold White Yellow", + 135, "SCE_ESCSEQ_BOLD_DEFAULT_BLUE", "default", "Bold Default Blue", + 136, "SCE_ESCSEQ_BOLD_BLACK_BLUE", "default", "Bold Black Blue", + 137, "SCE_ESCSEQ_BOLD_RED_BLUE", "default", "Bold Red Blue", + 138, "SCE_ESCSEQ_BOLD_GREEN_BLUE", "default", "Bold Green Blue", + 139, "SCE_ESCSEQ_BOLD_YELLOW_BLUE", "default", "Bold Yellow Blue", + 140, "SCE_ESCSEQ_BOLD_BLUE_BLUE", "default", "Bold Blue Blue", + 141, "SCE_ESCSEQ_BOLD_MAGENTA_BLUE", "default", "Bold Magenta Blue", + 142, "SCE_ESCSEQ_BOLD_CYAN_BLUE", "default", "Bold Cyan Blue", + 143, "SCE_ESCSEQ_BOLD_WHITE_BLUE", "default", "Bold White Blue", + 144, "SCE_ESCSEQ_BOLD_DEFAULT_MAGENTA", "default", "Bold Default Magenta", + 145, "SCE_ESCSEQ_BOLD_BLACK_MAGENTA", "default", "Bold Black Magenta", + 146, "SCE_ESCSEQ_BOLD_RED_MAGENTA", "default", "Bold Red Magenta", + 147, "SCE_ESCSEQ_BOLD_GREEN_MAGENTA", "default", "Bold Green Magenta", + 148, "SCE_ESCSEQ_BOLD_YELLOW_MAGENTA", "default", "Bold Yellow Magenta", + 149, "SCE_ESCSEQ_BOLD_BLUE_MAGENTA", "default", "Bold Blue Magenta", + 150, "SCE_ESCSEQ_BOLD_MAGENTA_MAGENTA", "default", "Bold Magenta Magenta", + 151, "SCE_ESCSEQ_BOLD_CYAN_MAGENTA", "default", "Bold Cyan Magenta", + 152, "SCE_ESCSEQ_BOLD_WHITE_MAGENTA", "default", "Bold White Magenta", + 153, "SCE_ESCSEQ_BOLD_DEFAULT_CYAN", "default", "Bold Default Cyan", + 154, "SCE_ESCSEQ_BOLD_BLACK_CYAN", "default", "Bold Black Cyan", + 155, "SCE_ESCSEQ_BOLD_RED_CYAN", "default", "Bold Red Cyan", + 156, "SCE_ESCSEQ_BOLD_GREEN_CYAN", "default", "Bold Green Cyan", + 157, "SCE_ESCSEQ_BOLD_YELLOW_CYAN", "default", "Bold Yellow Cyan", + 158, "SCE_ESCSEQ_BOLD_BLUE_CYAN", "default", "Bold Blue Cyan", + 159, "SCE_ESCSEQ_BOLD_MAGENTA_CYAN", "default", "Bold Magenta Cyan", + 160, "SCE_ESCSEQ_BOLD_CYAN_CYAN", "default", "Bold Cyan Cyan", + 161, "SCE_ESCSEQ_BOLD_WHITE_CYAN", "default", "Bold White Cyan", + 162, "SCE_ESCSEQ_BOLD_DEFAULT_WHITE", "default", "Bold Default White", + 163, "SCE_ESCSEQ_BOLD_BLACK_WHITE", "default", "Bold Black White", + 164, "SCE_ESCSEQ_BOLD_RED_WHITE", "default", "Bold Red White", + 165, "SCE_ESCSEQ_BOLD_GREEN_WHITE", "default", "Bold Green White", + 166, "SCE_ESCSEQ_BOLD_YELLOW_WHITE", "default", "Bold Yellow White", + 167, "SCE_ESCSEQ_BOLD_BLUE_WHITE", "default", "Bold Blue White", + 168, "SCE_ESCSEQ_BOLD_MAGENTA_WHITE", "default", "Bold Magenta White", + 169, "SCE_ESCSEQ_BOLD_CYAN_WHITE", "default", "Bold Cyan White", + 170, "SCE_ESCSEQ_BOLD_WHITE_WHITE", "default", "Bold White White", + 171, "SCE_ESCSEQ_IDENTIFIER", "default", "Sequence Identifier", + 172, "SCE_ESCSEQ_UNKNOWN", "default", "Sequence Unknown", +}; + + +class LexerEscSeq : public DefaultLexer { + OptionsEscSeq options; + OptionSetEscSeq osEscSeq; +public: + LexerEscSeq() : + DefaultLexer("escseq", SCLEX_ESCSEQ, lexicalClasses, std::size(lexicalClasses)) { + } + + const char *SCI_METHOD PropertyNames() override { + return osEscSeq.PropertyNames(); + } + int SCI_METHOD PropertyType(const char *name) override { + return osEscSeq.PropertyType(name); + } + const char *SCI_METHOD DescribeProperty(const char *name) override { + return osEscSeq.DescribeProperty(name); + } + Sci_Position SCI_METHOD PropertySet(const char *key, const char *val) override; + const char *SCI_METHOD PropertyGet(const char *key) override { + return osEscSeq.PropertyGet(key); + } + const char *SCI_METHOD DescribeWordListSets() override { + return osEscSeq.DescribeWordListSets(); + } + + void SCI_METHOD Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override; + + static ILexer5 *LexerFactoryEscSeq() { + return new LexerEscSeq(); + } +}; + + +Sci_Position SCI_METHOD LexerEscSeq::PropertySet(const char *key, const char *val) { + if (osEscSeq.PropertySet(&options, key, val)) { + return 0; + } + return -1; +} + + +constexpr bool Is0To9(char ch) noexcept { + return (ch >= '0') && (ch <= '9'); +} + + +bool AtEOL(Accessor &styler, Sci_Position i) { + return (styler[i] == '\n') || + ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n')); +} + + +constexpr bool SequenceEnd(int ch) noexcept { + return (ch == 0) || ((ch >= '@') && (ch <= '~')); +} + + +int StyleFromSequence(const char *seq) noexcept { + int fore = 0; + int back = 0; + int bold = 0; + + while (!SequenceEnd(*seq)) { + if (Is0To9(*seq)) { + // Get up to 3 digits + int base = *seq - '0'; + + for (int i = 0; i < 2; ++i) { + if (!Is0To9(seq[1])) { + break; + } + + base *= 10; + base += seq[1] - '0'; + seq++; + } + + if (base == 0) { + // Reset to default + fore = 0; + back = 0; + bold = 0; + } else if (base == 1) { + // Set style as bright + bold = 1; + } else if (base == 22) { + // Set style as not bright + bold = 0; + } else if (base >= 30 && base <= 37) { + // Set dim fore style + fore = base - 29; + } else if (base >= 90 && base <= 97) { + // Set bright fore style + fore = base - 89; + bold = 1; + } else if (base >= 40 && base <= 47) { + // Set dim back style + back = base - 39; + } else if (base >= 100 && base <= 107) { + // Set dim back style + back = base - 99; + } + } + + seq++; + } + + // Set fore style as bright style if bold is set + if (bold) { + fore += 81; + } + + // Set to a single style + int style = fore + back * 9; + + // Skip the reserved style range between 30 and 40 + if (style >= 31) { + style += 9; + } + + return style; +} + + +void ColouriseEscSeqLine(const std::string &lineBuffer, + Sci_PositionU endPos, + Accessor &styler, + bool colourText) { + const Sci_PositionU lengthLine = lineBuffer.length(); + const int style = SCE_ESCSEQ_DEFAULT; + + if (strstr(lineBuffer.c_str(), CSI)) { + const Sci_Position startPos = endPos - lengthLine; + const char *linePortion = lineBuffer.c_str(); + Sci_Position startPortion = startPos; + int portionStyle = style; + + while (const char *startSeq = strstr(linePortion, CSI)) { + if (startSeq > linePortion) { + styler.ColourTo(startPortion + (startSeq - linePortion), portionStyle); + } + + const char *endSeq = startSeq + 2; + + while (!SequenceEnd(*endSeq)) + endSeq++; + + const Sci_Position endSeqPosition = startPortion + (endSeq - linePortion) + 1; + + switch (*endSeq) { + case 0: + styler.ColourTo(endPos, SCE_ESCSEQ_UNKNOWN); + return; + case 'm': // Colour command + styler.ColourTo(endSeqPosition, SCE_ESCSEQ_IDENTIFIER); + portionStyle = colourText ? StyleFromSequence(startSeq + 2) : style; + break; + case 'K': // Erase to end of line -> ignore + styler.ColourTo(endSeqPosition, SCE_ESCSEQ_IDENTIFIER); + break; + default: + styler.ColourTo(endSeqPosition, SCE_ESCSEQ_UNKNOWN); + portionStyle = style; + } + + startPortion = endSeqPosition; + linePortion = endSeq + 1; + } + + styler.ColourTo(endPos, portionStyle); + } +} + + +void LexerEscSeq::Lex(Sci_PositionU startPos, Sci_Position length, int /* initStyle */, IDocument *pAccess) { + Accessor styler(pAccess, nullptr); + std::string lineBuffer; + styler.StartAt(startPos); + styler.StartSegment(startPos); + + for (Sci_PositionU i = startPos; i < startPos + length; i++) { + lineBuffer.push_back(styler[i]); + + // End of line met, colourise it + if (AtEOL(styler, i)) { + ColouriseEscSeqLine(lineBuffer, i, styler, options.colourText); + lineBuffer.clear(); + } + } + + // Last line does not have ending characters + if (!lineBuffer.empty()) { + ColouriseEscSeqLine(lineBuffer, startPos + length - 1, styler, options.colourText); + } + + styler.Flush(); +} + + +} + +extern const LexerModule lmEscSeq(SCLEX_ESCSEQ, LexerEscSeq::LexerFactoryEscSeq, "escseq", emptyWordListDesc); diff --git a/src/Lexilla.cxx b/src/Lexilla.cxx index 5b381146..7568b41e 100644 --- a/src/Lexilla.cxx +++ b/src/Lexilla.cxx @@ -71,6 +71,7 @@ extern const LexerModule lmEiffelkw; extern const LexerModule lmErlang; extern const LexerModule lmErrorList; extern const LexerModule lmESCRIPT; +extern const LexerModule lmEscSeq; extern const LexerModule lmF77; extern const LexerModule lmFlagShip; extern const LexerModule lmForth; @@ -225,6 +226,7 @@ void AddEachLexer() { &lmErlang, &lmErrorList, &lmESCRIPT, + &lmEscSeq, &lmF77, &lmFlagShip, &lmForth, diff --git a/src/Lexilla/Lexilla.xcodeproj/project.pbxproj b/src/Lexilla/Lexilla.xcodeproj/project.pbxproj index cc08be16..409d3ab5 100644 --- a/src/Lexilla/Lexilla.xcodeproj/project.pbxproj +++ b/src/Lexilla/Lexilla.xcodeproj/project.pbxproj @@ -162,6 +162,7 @@ CEC8496B8D9712E6EEDBC301 /* LexZig.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 71684CF6BCC80369BCE2F893 /* LexZig.cxx */; }; 4A444CF5A75E52E2C5537328 /* LexNix.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 81E2488CB0A0DC6B67AA08DD /* LexNix.cxx */; }; FE5F4B168F37B523E4D1EFCD /* LexSINEX.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0D814275A1A8A9FA6D10447C /* LexSINEX.cxx */; }; + B049435FAED389EA7C61E3C1 /* LexEscSeq.cxx in Sources */ = {isa = PBXBuildFile; fileRef = F523432FAB6C14A16F12ECE8 /* LexEscSeq.cxx */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -322,6 +323,7 @@ 71684CF6BCC80369BCE2F893 /* LexZig.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LexZig.cxx; path = ../../lexers/LexZig.cxx; sourceTree = SOURCE_ROOT; }; 81E2488CB0A0DC6B67AA08DD /* LexNix.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LexNix.cxx; path = ../../lexers/LexNix.cxx; sourceTree = SOURCE_ROOT; }; 0D814275A1A8A9FA6D10447C /* LexSINEX.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LexSINEX.cxx; path = ../../lexers/LexSINEX.cxx; sourceTree = SOURCE_ROOT; }; + F523432FAB6C14A16F12ECE8 /* LexEscSeq.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LexEscSeq.cxx; path = ../../lexers/LexEscSeq.cxx; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -406,6 +408,7 @@ 28BA72E824E34D9200272C2D /* LexErlang.cxx */, 28BA72EB24E34D9300272C2D /* LexErrorList.cxx */, 28BA72F624E34D9300272C2D /* LexEScript.cxx */, + F523432FAB6C14A16F12ECE8 /* LexEscSeq.cxx */, 28BA72EC24E34D9300272C2D /* LexFlagship.cxx */, 28BA72CB24E34D9100272C2D /* LexForth.cxx */, 28BA72FB24E34D9400272C2D /* LexFortran.cxx */, @@ -753,6 +756,7 @@ CEC8496B8D9712E6EEDBC301 /* LexZig.cxx in Sources */, 4A444CF5A75E52E2C5537328 /* LexNix.cxx in Sources */, FE5F4B168F37B523E4D1EFCD /* LexSINEX.cxx in Sources */, + B049435FAED389EA7C61E3C1 /* LexEscSeq.cxx in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/src/deps.mak b/src/deps.mak index b838cd63..1191315d 100644 --- a/src/deps.mak +++ b/src/deps.mak @@ -596,6 +596,21 @@ $(DIR_O)/LexEScript.o: \ ../lexlib/StyleContext.h \ ../lexlib/CharacterSet.h \ ../lexlib/LexerModule.h +$(DIR_O)/LexEscSeq.o: \ + ../lexers/LexEscSeq.cxx \ + ../../scintilla/include/ILexer.h \ + ../../scintilla/include/Sci_Position.h \ + ../../scintilla/include/Scintilla.h \ + ../include/SciLexer.h \ + ../lexlib/InList.h \ + ../lexlib/WordList.h \ + ../lexlib/LexAccessor.h \ + ../lexlib/Accessor.h \ + ../lexlib/StyleContext.h \ + ../lexlib/CharacterSet.h \ + ../lexlib/LexerModule.h \ + ../lexlib/OptionSet.h \ + ../lexlib/DefaultLexer.h $(DIR_O)/LexFlagship.o: \ ../lexers/LexFlagship.cxx \ ../../scintilla/include/ILexer.h \ diff --git a/src/lexilla.mak b/src/lexilla.mak index 5da969d1..3ee060bf 100644 --- a/src/lexilla.mak +++ b/src/lexilla.mak @@ -132,6 +132,7 @@ LEX_OBJS=\ $(DIR_O)\LexErlang.obj \ $(DIR_O)\LexErrorList.obj \ $(DIR_O)\LexEScript.obj \ + $(DIR_O)\LexEscSeq.obj \ $(DIR_O)\LexFlagship.obj \ $(DIR_O)\LexForth.obj \ $(DIR_O)\LexFortran.obj \ diff --git a/src/nmdeps.mak b/src/nmdeps.mak index 2786af1c..de2bb91b 100644 --- a/src/nmdeps.mak +++ b/src/nmdeps.mak @@ -596,6 +596,21 @@ $(DIR_O)/LexEScript.obj: \ ../lexlib/StyleContext.h \ ../lexlib/CharacterSet.h \ ../lexlib/LexerModule.h +$(DIR_O)/LexEscSeq.obj: \ + ../lexers/LexEscSeq.cxx \ + ../../scintilla/include/ILexer.h \ + ../../scintilla/include/Sci_Position.h \ + ../../scintilla/include/Scintilla.h \ + ../include/SciLexer.h \ + ../lexlib/InList.h \ + ../lexlib/WordList.h \ + ../lexlib/LexAccessor.h \ + ../lexlib/Accessor.h \ + ../lexlib/StyleContext.h \ + ../lexlib/CharacterSet.h \ + ../lexlib/LexerModule.h \ + ../lexlib/OptionSet.h \ + ../lexlib/DefaultLexer.h $(DIR_O)/LexFlagship.obj: \ ../lexers/LexFlagship.cxx \ ../../scintilla/include/ILexer.h \ diff --git a/test/examples/escseq/SciTE.properties b/test/examples/escseq/SciTE.properties new file mode 100644 index 00000000..1a33a4db --- /dev/null +++ b/test/examples/escseq/SciTE.properties @@ -0,0 +1,13 @@ +lexer.*.ans=escseq + +# Identifier and Unknown colour +match colourText0.ans + lexer.escseq.colour.text=0 + style.escseq.171=back:#EEFFEE,visible + style.escseq.172=back:#FFEEEE,visible + +# Full colour +match colourText1.ans + lexer.escseq.colour.text=1 + style.escseq.171=#EEFFEE,notvisible + style.escseq.172=back:#FFEEEE,notvisible diff --git a/test/examples/escseq/colourText0.ans b/test/examples/escseq/colourText0.ans new file mode 100644 index 00000000..c13a1937 --- /dev/null +++ b/test/examples/escseq/colourText0.ans @@ -0,0 +1,37 @@ + Seq Unknown + Seq 0 + Seq 1 + Seq 30 + Seq 31 + Seq 30;1 + Seq 31;1 + Seq 42 + Seq 43 + Seq 30;42 + Seq 30;43 + Seq 31;44 + Seq 31;45 + Seq 32;46 + Seq 32;47 + Seq 33;40 + Seq 33;41 + Seq 34;43 + Seq 34;44 + Seq 35;45 + Seq 35;46 + Seq 36;46 + Seq 36;47 + Seq 37;40 + Seq 37;41 + Seq 30;40;1 + Seq 30;41;1 + Seq 37;46;1 + Seq 37;47;1 + Seq 90;102 + Seq 90;103 + Seq 97;106 + Seq 97;107 + Seq 90;40 + Seq 90;41 + Seq 97;46 + Seq 97;47 diff --git a/test/examples/escseq/colourText0.ans.folded b/test/examples/escseq/colourText0.ans.folded new file mode 100644 index 00000000..0c98c417 --- /dev/null +++ b/test/examples/escseq/colourText0.ans.folded @@ -0,0 +1,38 @@ + 0 400 0  Seq Unknown + 0 400 0  Seq 0 + 0 400 0  Seq 1 + 0 400 0  Seq 30 + 0 400 0  Seq 31 + 0 400 0  Seq 30;1 + 0 400 0  Seq 31;1 + 0 400 0  Seq 42 + 0 400 0  Seq 43 + 0 400 0  Seq 30;42 + 0 400 0  Seq 30;43 + 0 400 0  Seq 31;44 + 0 400 0  Seq 31;45 + 0 400 0  Seq 32;46 + 0 400 0  Seq 32;47 + 0 400 0  Seq 33;40 + 0 400 0  Seq 33;41 + 0 400 0  Seq 34;43 + 0 400 0  Seq 34;44 + 0 400 0  Seq 35;45 + 0 400 0  Seq 35;46 + 0 400 0  Seq 36;46 + 0 400 0  Seq 36;47 + 0 400 0  Seq 37;40 + 0 400 0  Seq 37;41 + 0 400 0  Seq 30;40;1 + 0 400 0  Seq 30;41;1 + 0 400 0  Seq 37;46;1 + 0 400 0  Seq 37;47;1 + 0 400 0  Seq 90;102 + 0 400 0  Seq 90;103 + 0 400 0  Seq 97;106 + 0 400 0  Seq 97;107 + 0 400 0  Seq 90;40 + 0 400 0  Seq 90;41 + 0 400 0  Seq 97;46 + 0 400 0  Seq 97;47 + 0 400 0 \ No newline at end of file diff --git a/test/examples/escseq/colourText0.ans.styled b/test/examples/escseq/colourText0.ans.styled new file mode 100644 index 00000000..f31e39b5 --- /dev/null +++ b/test/examples/escseq/colourText0.ans.styled @@ -0,0 +1,37 @@ +{172}{0} Seq Unknown +{171}{0} Seq 0 +{171}{0} Seq 1 +{171}{0} Seq 30 +{171}{0} Seq 31 +{171}{0} Seq 30;1 +{171}{0} Seq 31;1 +{171}{0} Seq 42 +{171}{0} Seq 43 +{171}{0} Seq 30;42 +{171}{0} Seq 30;43 +{171}{0} Seq 31;44 +{171}{0} Seq 31;45 +{171}{0} Seq 32;46 +{171}{0} Seq 32;47 +{171}{0} Seq 33;40 +{171}{0} Seq 33;41 +{171}{0} Seq 34;43 +{171}{0} Seq 34;44 +{171}{0} Seq 35;45 +{171}{0} Seq 35;46 +{171}{0} Seq 36;46 +{171}{0} Seq 36;47 +{171}{0} Seq 37;40 +{171}{0} Seq 37;41 +{171}{0} Seq 30;40;1 +{171}{0} Seq 30;41;1 +{171}{0} Seq 37;46;1 +{171}{0} Seq 37;47;1 +{171}{0} Seq 90;102 +{171}{0} Seq 90;103 +{171}{0} Seq 97;106 +{171}{0} Seq 97;107 +{171}{0} Seq 90;40 +{171}{0} Seq 90;41 +{171}{0} Seq 97;46 +{171}{0} Seq 97;47 diff --git a/test/examples/escseq/colourText1.ans b/test/examples/escseq/colourText1.ans new file mode 100644 index 00000000..c13a1937 --- /dev/null +++ b/test/examples/escseq/colourText1.ans @@ -0,0 +1,37 @@ + Seq Unknown + Seq 0 + Seq 1 + Seq 30 + Seq 31 + Seq 30;1 + Seq 31;1 + Seq 42 + Seq 43 + Seq 30;42 + Seq 30;43 + Seq 31;44 + Seq 31;45 + Seq 32;46 + Seq 32;47 + Seq 33;40 + Seq 33;41 + Seq 34;43 + Seq 34;44 + Seq 35;45 + Seq 35;46 + Seq 36;46 + Seq 36;47 + Seq 37;40 + Seq 37;41 + Seq 30;40;1 + Seq 30;41;1 + Seq 37;46;1 + Seq 37;47;1 + Seq 90;102 + Seq 90;103 + Seq 97;106 + Seq 97;107 + Seq 90;40 + Seq 90;41 + Seq 97;46 + Seq 97;47 diff --git a/test/examples/escseq/colourText1.ans.folded b/test/examples/escseq/colourText1.ans.folded new file mode 100644 index 00000000..0c98c417 --- /dev/null +++ b/test/examples/escseq/colourText1.ans.folded @@ -0,0 +1,38 @@ + 0 400 0  Seq Unknown + 0 400 0  Seq 0 + 0 400 0  Seq 1 + 0 400 0  Seq 30 + 0 400 0  Seq 31 + 0 400 0  Seq 30;1 + 0 400 0  Seq 31;1 + 0 400 0  Seq 42 + 0 400 0  Seq 43 + 0 400 0  Seq 30;42 + 0 400 0  Seq 30;43 + 0 400 0  Seq 31;44 + 0 400 0  Seq 31;45 + 0 400 0  Seq 32;46 + 0 400 0  Seq 32;47 + 0 400 0  Seq 33;40 + 0 400 0  Seq 33;41 + 0 400 0  Seq 34;43 + 0 400 0  Seq 34;44 + 0 400 0  Seq 35;45 + 0 400 0  Seq 35;46 + 0 400 0  Seq 36;46 + 0 400 0  Seq 36;47 + 0 400 0  Seq 37;40 + 0 400 0  Seq 37;41 + 0 400 0  Seq 30;40;1 + 0 400 0  Seq 30;41;1 + 0 400 0  Seq 37;46;1 + 0 400 0  Seq 37;47;1 + 0 400 0  Seq 90;102 + 0 400 0  Seq 90;103 + 0 400 0  Seq 97;106 + 0 400 0  Seq 97;107 + 0 400 0  Seq 90;40 + 0 400 0  Seq 90;41 + 0 400 0  Seq 97;46 + 0 400 0  Seq 97;47 + 0 400 0 \ No newline at end of file diff --git a/test/examples/escseq/colourText1.ans.styled b/test/examples/escseq/colourText1.ans.styled new file mode 100644 index 00000000..14326c51 --- /dev/null +++ b/test/examples/escseq/colourText1.ans.styled @@ -0,0 +1,37 @@ +{172}{0} Seq Unknown +{171}{0} Seq 0 +{171}{90} Seq 1 +{171}{1} Seq 30 +{171}{2} Seq 31 +{171}{91} Seq 30;1 +{171}{92} Seq 31;1 +{171}{27} Seq 42 +{171}{45} Seq 43 +{171}{28} Seq 30;42 +{171}{46} Seq 30;43 +{171}{56} Seq 31;44 +{171}{65} Seq 31;45 +{171}{75} Seq 32;46 +{171}{84} Seq 32;47 +{171}{13} Seq 33;40 +{171}{22} Seq 33;41 +{171}{50} Seq 34;43 +{171}{59} Seq 34;44 +{171}{69} Seq 35;45 +{171}{78} Seq 35;46 +{171}{79} Seq 36;46 +{171}{88} Seq 36;47 +{171}{17} Seq 37;40 +{171}{26} Seq 37;41 +{171}{100} Seq 30;40;1 +{171}{109} Seq 30;41;1 +{171}{161} Seq 37;46;1 +{171}{170} Seq 37;47;1 +{171}{118} Seq 90;102 +{171}{127} Seq 90;103 +{171}{161} Seq 97;106 +{171}{170} Seq 97;107 +{171}{100} Seq 90;40 +{171}{109} Seq 90;41 +{171}{161} Seq 97;46 +{171}{170} Seq 97;47 From 4f19816cce82ad8736f402f8293f902455cbabe9 Mon Sep 17 00:00:00 2001 From: mpheath <58158242+mpheath@users.noreply.github.com> Date: Thu, 27 Nov 2025 15:27:16 +1000 Subject: [PATCH 2/2] Fix SciTE.properties style --- test/examples/escseq/SciTE.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/examples/escseq/SciTE.properties b/test/examples/escseq/SciTE.properties index 1a33a4db..2bd173c2 100644 --- a/test/examples/escseq/SciTE.properties +++ b/test/examples/escseq/SciTE.properties @@ -9,5 +9,5 @@ match colourText0.ans # Full colour match colourText1.ans lexer.escseq.colour.text=1 - style.escseq.171=#EEFFEE,notvisible + style.escseq.171=back:#EEFFEE,notvisible style.escseq.172=back:#FFEEEE,notvisible