[geany/geany] a3031e: Imports and enables Asciidoc lexer from Lexilla 5.1.4 (#3097)

Antonio Cebrián git-noreply at xxxxx
Sat Feb 12 14:14:59 UTC 2022


Branch:      refs/heads/master
Author:      Antonio Cebrián <ancebfer at gmail.com>
Committer:   GitHub <noreply at github.com>
Date:        Sat, 12 Feb 2022 14:14:59 UTC
Commit:      a3031e96bda15f77c9b132dcf138cf791c085e2d
             https://github.com/geany/geany/commit/a3031e96bda15f77c9b132dcf138cf791c085e2d

Log Message:
-----------
Imports and enables Asciidoc lexer from Lexilla 5.1.4 (#3097)


Modified Paths:
--------------
    data/filedefs/filetypes.asciidoc
    scintilla/Makefile.am
    scintilla/lexilla/lexers/LexAsciidoc.cxx
    scintilla/lexilla/src/Lexilla.cxx
    src/highlighting.c
    src/highlightingmappings.h

Modified: data/filedefs/filetypes.asciidoc
50 lines changed, 24 insertions(+), 26 deletions(-)
===================================================================
@@ -1,35 +1,33 @@
 # For complete documentation of this file, please see Geany's main documentation
 [styling]
-# no syntax highlighting yet
+# Edit these in the colorscheme .conf file instead
+default=default
+strong=default,bold
+emphasis=default,italic
+header1=keyword_1
+header2=keyword_1
+header3=keyword_1
+header4=keyword_1
+header5=keyword_1
+header6=keyword_1
+ulist_item=tag_unknown
+olist_item=tag_unknown
+blockquote=tag_unknown
+link=keyword_1
+code=attribute_unknown
+passthrough=default
+comment=comment
+literal=default
+attrib=default
+attribval=string
+macro=preprocessor
 
 [settings]
 # default extension used when saving files
-extension=asciidoc
+extension=adoc
 
-# the following characters are these which a "word" can contains, see documentation
-#wordchars=_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
-
-# single comments, like # in this file
-comment_single=//
-# multiline comments
-#comment_open=////
-#comment_close=////
-
-# set to false if a comment character/string should start at column 0 of a line, true uses any
-# indentation of the line, e.g. setting to true causes the following on pressing CTRL+d
-	#command_example();
-# setting to false would generate this
-#	command_example();
-# This setting works only for single line comments
-comment_use_indent=false
-
-# context action command (please see Geany's main documentation for details)
-context_action_cmd=
+# MIME type
+mime_type=text/x-asciidoc
 
 # sort tags by appearance
 symbol_list_sort_mode=1
-
-[indentation]
-#width=4
-# 0 is spaces, 1 is tabs, 2 is tab & spaces
-#type=1


Modified: scintilla/Makefile.am
1 lines changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -14,6 +14,7 @@ lexilla/include/SciLexer.h
 LEXER_SRCS =                           \
 lexilla/lexers/LexAbaqus.cxx           \
 lexilla/lexers/LexAda.cxx              \
+lexilla/lexers/LexAsciidoc.cxx         \
 lexilla/lexers/LexAsm.cxx              \
 lexilla/lexers/LexBash.cxx             \
 lexilla/lexers/LexBasic.cxx            \


Modified: scintilla/lexilla/lexers/LexAsciidoc.cxx
393 lines changed, 393 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,393 @@
+/******************************************************************
+ *  LexAsciidoc.cxx
+ *
+ *  A simple Asciidoc lexer for scintilla.
+ *
+ *  Based on the LexMarkdown.cxx by Jon Strait - jstrait at moonloop.net
+ *
+ *  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 <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;
+
+namespace {
+
+typedef struct {
+    bool start;
+    int len1;
+    int len2;
+    const char *name;
+} MacroItem;
+
+static const MacroItem MacroList[] = {
+    // Directives
+    {true,  5, 2, "ifdef::"},
+    {true,  6, 2, "ifeval::"},
+    {true,  6, 2, "ifndef::"},
+    {true,  5, 2, "endif::"},
+    // Macros
+    {true,  5, 2, "audio::"},
+    {true,  7, 2, "include::"},
+    {true,  5, 2, "image::"},
+    {true,  5, 2, "video::"},
+    {false, 8, 1, "asciimath:"},
+    {false, 3, 1, "btn:"},
+    {false, 5, 1, "image:"},
+    {false, 3, 1, "kbd:"},
+    {false, 9, 1, "latexmath:"},
+    {false, 4, 1, "link:"},
+    {false, 6, 1, "mailto:"},
+    {false, 4, 1, "menu:"},
+    {false, 4, 1, "pass:"},
+    {false, 4, 1, "stem:"},
+    {false, 4, 1, "xref:"},
+    // Admonitions
+    {true,  7, 1, "CAUTION:"},
+    {true,  9, 1, "IMPORTANT:"},
+    {true,  4, 1, "NOTE:"},
+    {true,  3, 1, "TIP:"},
+    {true,  7, 1, "WARNING:"},
+    {false, 0, 0, NULL}
+};
+
+constexpr bool IsNewline(const int ch) {
+    // sc.GetRelative(i) returns '\0' if out of range
+    return (ch == '\n' || ch == '\r' || ch == '\0');
+}
+
+}
+
+static bool AtTermStart(StyleContext &sc) {
+    return sc.currentPos == 0 || sc.chPrev == 0 || isspacechar(sc.chPrev);
+}
+
+static void ColorizeAsciidocDoc(Sci_PositionU startPos, Sci_Position length, int initStyle,
+                                WordList **, Accessor &styler) {
+    bool freezeCursor = false;
+
+    StyleContext sc(startPos, static_cast<Sci_PositionU>(length), initStyle, styler);
+
+    while (sc.More()) {
+        // Skip past escaped characters
+        if (sc.ch == '\\') {
+            sc.Forward();
+            continue;
+        }
+
+        // Skip newline.
+        if (IsNewline(sc.ch)) {
+            // Newline doesn't end blocks
+            if (sc.state != SCE_ASCIIDOC_CODEBK && \
+                sc.state != SCE_ASCIIDOC_PASSBK && \
+                sc.state != SCE_ASCIIDOC_COMMENTBK && \
+                sc.state != SCE_ASCIIDOC_LITERALBK) {
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            sc.Forward();
+            continue;
+        }
+
+        // Conditional state-based actions
+        switch (sc.state) {
+
+        // Strong
+        case SCE_ASCIIDOC_STRONG1:
+            if (sc.ch == '*' && sc.chPrev != ' ') {
+                sc.Forward();
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+                freezeCursor = true;
+            }
+            break;
+        case SCE_ASCIIDOC_STRONG2:
+            if (sc.Match("**") && sc.chPrev != ' ') {
+                sc.Forward(2);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+                freezeCursor = true;
+            }
+            break;
+
+        // Emphasis
+        case SCE_ASCIIDOC_EM1:
+            if (sc.ch == '_' && sc.chPrev != ' ') {
+                sc.Forward();
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+                freezeCursor = true;
+            }
+            break;
+        case SCE_ASCIIDOC_EM2:
+            if (sc.Match("__") && sc.chPrev != ' ') {
+                sc.Forward(2);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+                freezeCursor = true;
+            }
+            break;
+
+        // Link
+        case SCE_ASCIIDOC_LINK:
+            if (sc.ch == ']' && sc.chPrev != '\\') {
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            break;
+
+        // Code block
+        case SCE_ASCIIDOC_CODEBK:
+            if (sc.atLineStart && sc.Match("----") && IsNewline(sc.GetRelative(4))) {
+                sc.Forward(4);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            break;
+
+        // Passthrough block
+        case SCE_ASCIIDOC_PASSBK:
+            if (sc.atLineStart && sc.Match("++++") && IsNewline(sc.GetRelative(4))) {
+                sc.Forward(4);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            break;
+
+        // Comment block
+        case SCE_ASCIIDOC_COMMENTBK:
+            if (sc.atLineStart && sc.Match("////") && IsNewline(sc.GetRelative(4))) {
+                sc.Forward(4);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            break;
+
+        // Literal
+        case SCE_ASCIIDOC_LITERAL:
+            if (sc.ch == '+' && sc.chPrev != '\\') {
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            break;
+
+        // Literal block
+        case SCE_ASCIIDOC_LITERALBK:
+            if (sc.atLineStart && sc.Match("....") && IsNewline(sc.GetRelative(4))) {
+                sc.Forward(4);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            break;
+
+        // Attribute
+        case SCE_ASCIIDOC_ATTRIB:
+            if (sc.ch == ':' && sc.chPrev != ' ' && sc.chNext == ' ') {
+                sc.Forward();
+                sc.SetState(SCE_ASCIIDOC_ATTRIBVAL);
+            }
+            break;
+
+        // Macro
+        case SCE_ASCIIDOC_MACRO:
+            if (sc.ch == ']' && sc.chPrev != '\\') {
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            break;
+
+        // Default
+        case SCE_ASCIIDOC_DEFAULT:
+            // Headers
+            if (sc.atLineStart && sc.Match("====== ")) {
+                sc.SetState(SCE_ASCIIDOC_HEADER6);
+                sc.Forward(6);
+            }
+            else if (sc.atLineStart && sc.Match("===== ")) {
+                sc.SetState(SCE_ASCIIDOC_HEADER5);
+                sc.Forward(5);
+            }
+            else if (sc.atLineStart && sc.Match("==== ")) {
+                sc.SetState(SCE_ASCIIDOC_HEADER4);
+                sc.Forward(4);
+            }
+            else if (sc.atLineStart && sc.Match("=== ")) {
+                sc.SetState(SCE_ASCIIDOC_HEADER3);
+                sc.Forward(3);
+            }
+            else if (sc.atLineStart && sc.Match("== ")) {
+                sc.SetState(SCE_ASCIIDOC_HEADER2);
+                sc.Forward(2);
+            }
+            else if (sc.atLineStart && sc.Match("= ")) {
+                sc.SetState(SCE_ASCIIDOC_HEADER1);
+                sc.Forward(1);
+            }
+            // Unordered list item
+            else if (sc.atLineStart && sc.Match("****** ")) {
+                sc.SetState(SCE_ASCIIDOC_ULIST_ITEM);
+                sc.Forward(6);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            else if (sc.atLineStart && sc.Match("***** ")) {
+                sc.SetState(SCE_ASCIIDOC_ULIST_ITEM);
+                sc.Forward(5);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            else if (sc.atLineStart && sc.Match("**** ")) {
+                sc.SetState(SCE_ASCIIDOC_ULIST_ITEM);
+                sc.Forward(4);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            else if (sc.atLineStart && sc.Match("*** ")) {
+                sc.SetState(SCE_ASCIIDOC_ULIST_ITEM);
+                sc.Forward(3);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            else if (sc.atLineStart && sc.Match("** ")) {
+                sc.SetState(SCE_ASCIIDOC_ULIST_ITEM);
+                sc.Forward(2);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            else if (sc.atLineStart && sc.Match("* ")) {
+                sc.SetState(SCE_ASCIIDOC_ULIST_ITEM);
+                sc.Forward(1);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            // Ordered list item
+            else if (sc.atLineStart && sc.Match("...... ")) {
+                sc.SetState(SCE_ASCIIDOC_OLIST_ITEM);
+                sc.Forward(6);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            else if (sc.atLineStart && sc.Match("..... ")) {
+                sc.SetState(SCE_ASCIIDOC_OLIST_ITEM);
+                sc.Forward(5);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            else if (sc.atLineStart && sc.Match(".... ")) {
+                sc.SetState(SCE_ASCIIDOC_OLIST_ITEM);
+                sc.Forward(4);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            else if (sc.atLineStart && sc.Match("... ")) {
+                sc.SetState(SCE_ASCIIDOC_OLIST_ITEM);
+                sc.Forward(3);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            else if (sc.atLineStart && sc.Match(".. ")) {
+                sc.SetState(SCE_ASCIIDOC_OLIST_ITEM);
+                sc.Forward(2);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            else if (sc.atLineStart && sc.Match(". ")) {
+                sc.SetState(SCE_ASCIIDOC_OLIST_ITEM);
+                sc.Forward(1);
+                sc.SetState(SCE_ASCIIDOC_DEFAULT);
+            }
+            // Blockquote
+            else if (sc.atLineStart && sc.Match("> ")) {
+                sc.SetState(SCE_ASCIIDOC_BLOCKQUOTE);
+                sc.Forward();
+            }
+            // Link
+            else if (!sc.atLineStart && sc.ch == '[' && sc.chPrev != '\\' && sc.chNext != ' ') {
+                sc.Forward();
+                sc.SetState(SCE_ASCIIDOC_LINK);
+                freezeCursor = true;
+            }
+            // Code block
+            else if (sc.atLineStart && sc.Match("----") && IsNewline(sc.GetRelative(4))) {
+                sc.SetState(SCE_ASCIIDOC_CODEBK);
+                sc.Forward(4);
+            }
+            // Passthrough block
+            else if (sc.atLineStart && sc.Match("++++") && IsNewline(sc.GetRelative(4))) {
+                sc.SetState(SCE_ASCIIDOC_PASSBK);
+                sc.Forward(4);
+            }
+            // Comment block
+            else if (sc.atLineStart && sc.Match("////") && IsNewline(sc.GetRelative(4))) {
+                sc.SetState(SCE_ASCIIDOC_COMMENTBK);
+                sc.Forward(4);
+            }
+            // Comment
+            else if (sc.atLineStart && sc.Match("//")) {
+                sc.SetState(SCE_ASCIIDOC_COMMENT);
+                sc.Forward();
+            }
+            // Literal
+            else if (sc.ch == '+' && sc.chPrev != '\\' && sc.chNext != ' ' && AtTermStart(sc)) {
+                sc.Forward();
+                sc.SetState(SCE_ASCIIDOC_LITERAL);
+                freezeCursor = true;
+            }
+            // Literal block
+            else if (sc.atLineStart && sc.Match("....") && IsNewline(sc.GetRelative(4))) {
+                sc.SetState(SCE_ASCIIDOC_LITERALBK);
+                sc.Forward(4);
+            }
+            // Attribute
+            else if (sc.atLineStart && sc.ch == ':' && sc.chNext != ' ') {
+                sc.SetState(SCE_ASCIIDOC_ATTRIB);
+            }
+            // Strong
+            else if (sc.Match("**") && sc.GetRelative(2) != ' ') {
+                sc.SetState(SCE_ASCIIDOC_STRONG2);
+                sc.Forward();
+            }
+            else if (sc.ch == '*' && sc.chNext != ' ' && AtTermStart(sc)) {
+                sc.SetState(SCE_ASCIIDOC_STRONG1);
+            }
+            // Emphasis
+            else if (sc.Match("__") && sc.GetRelative(2) != ' ') {
+                sc.SetState(SCE_ASCIIDOC_EM2);
+                sc.Forward();
+            }
+            else if (sc.ch == '_' && sc.chNext != ' ' && AtTermStart(sc)) {
+                sc.SetState(SCE_ASCIIDOC_EM1);
+            }
+            // Macro
+            else if (sc.atLineStart && sc.ch == '[' && sc.chNext != ' ') {
+                sc.Forward();
+                sc.SetState(SCE_ASCIIDOC_MACRO);
+                freezeCursor = true;
+            }
+            else {
+                int i = 0;
+                bool found = false;
+                while (!found && MacroList[i].name != NULL) {
+                    if (MacroList[i].start)
+                        found = sc.atLineStart && sc.Match(MacroList[i].name);
+                    else
+                        found = sc.Match(MacroList[i].name);
+                    if (found) {
+                        sc.SetState(SCE_ASCIIDOC_MACRO);
+                        sc.Forward(MacroList[i].len1);
+                        sc.SetState(SCE_ASCIIDOC_DEFAULT);
+                        if (MacroList[i].len2 > 1)
+                            sc.Forward(MacroList[i].len2 - 1);
+                    }
+                    i++;
+                }
+            }
+            break;
+        }
+        // Advance if not holding back the cursor for this iteration.
+        if (!freezeCursor)
+            sc.Forward();
+        freezeCursor = false;
+    }
+    sc.Complete();
+}
+
+LexerModule lmAsciidoc(SCLEX_ASCIIDOC, ColorizeAsciidocDoc, "asciidoc");


Modified: scintilla/lexilla/src/Lexilla.cxx
1 lines changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -173,6 +173,7 @@ static void AddGeanyLexers()
 		&lmAbaqus,
 		&lmAda,
 		&lmAsm,
+		&lmAsciidoc,
 		&lmBash,
 		&lmBatch,
 		&lmCaml,


Modified: src/highlighting.c
2 lines changed, 2 insertions(+), 0 deletions(-)
===================================================================
@@ -1000,6 +1000,7 @@ void highlighting_init_styles(guint filetype_idx, GKeyFile *config, GKeyFile *co
 	{
 		init_styleset_case(ABAQUS);
 		init_styleset_case(ADA);
+		init_styleset_case(ASCIIDOC);
 		init_styleset_case(ASM);
 		init_styleset_case(BASIC);
 		init_styleset_case(BATCH);
@@ -1091,6 +1092,7 @@ void highlighting_set_styles(ScintillaObject *sci, GeanyFiletype *ft)
 	{
 		styleset_case(ABAQUS);
 		styleset_case(ADA);
+		styleset_case(ASCIIDOC);
 		styleset_case(ASM);
 		styleset_case(BASIC);
 		styleset_case(BATCH);


Modified: src/highlightingmappings.h
33 lines changed, 33 insertions(+), 0 deletions(-)
===================================================================
@@ -133,6 +133,39 @@ static const HLKeyword highlighting_keywords_AS[] =
 #define highlighting_properties_AS	highlighting_properties_C
 
 
+/* Asccidoc */
+#define highlighting_lexer_ASCIIDOC			SCLEX_ASCIIDOC
+static const HLStyle highlighting_styles_ASCIIDOC[] =
+{
+	{ SCE_ASCIIDOC_DEFAULT,		"default",		FALSE },
+	{ SCE_ASCIIDOC_STRONG1,		"strong",		FALSE },
+	{ SCE_ASCIIDOC_STRONG2,		"strong",		FALSE },
+	{ SCE_ASCIIDOC_EM1,			"emphasis",		FALSE },
+	{ SCE_ASCIIDOC_EM2,			"emphasis",		FALSE },
+	{ SCE_ASCIIDOC_HEADER1,		"header1",		FALSE },
+	{ SCE_ASCIIDOC_HEADER2,		"header2",		FALSE },
+	{ SCE_ASCIIDOC_HEADER3,		"header3",		FALSE },
+	{ SCE_ASCIIDOC_HEADER4,		"header4",		FALSE },
+	{ SCE_ASCIIDOC_HEADER5,		"header5",		FALSE },
+	{ SCE_ASCIIDOC_HEADER6,		"header6",		FALSE },
+	{ SCE_ASCIIDOC_ULIST_ITEM,	"ulist_item",	FALSE },
+	{ SCE_ASCIIDOC_OLIST_ITEM,	"olist_item",	FALSE },
+	{ SCE_ASCIIDOC_BLOCKQUOTE,	"blockquote",	FALSE },
+	{ SCE_ASCIIDOC_LINK,		"link",			FALSE },
+	{ SCE_ASCIIDOC_CODEBK,		"code",			FALSE },
+	{ SCE_ASCIIDOC_PASSBK,		"passthrough",	FALSE },
+	{ SCE_ASCIIDOC_COMMENT,		"comment",		FALSE },
+	{ SCE_ASCIIDOC_COMMENTBK,	"comment",		FALSE },
+	{ SCE_ASCIIDOC_LITERAL,		"literal",		FALSE },
+	{ SCE_ASCIIDOC_LITERALBK,	"literal",		FALSE },
+	{ SCE_ASCIIDOC_ATTRIB,		"attrib",		FALSE },
+	{ SCE_ASCIIDOC_ATTRIBVAL,	"attribval",	FALSE },
+	{ SCE_ASCIIDOC_MACRO,		"macro",		FALSE }
+};
+#define highlighting_keywords_ASCIIDOC		EMPTY_KEYWORDS
+#define highlighting_properties_ASCIIDOC	EMPTY_PROPERTIES
+
+
 /* ASM */
 #define highlighting_lexer_ASM			SCLEX_ASM
 static const HLStyle highlighting_styles_ASM[] =



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Commits mailing list