Summary Files Commits Branches @commit @diff @stats
path: root / awk-edits
diff options
context:
space:
mode:
Commit8ae9ca1c57b5f183ae8e98df3310346aadbc8ddf (patch)
Author
 Kamen Mladenov <kamen@syndamia.com>
2023-04-29 12:29:43 +0000
Committer
 Kamen Mladenov <kamen@syndamia.com>
2023-04-29 12:29:43 +0000
Files07fecb5c85a57195503057f099e193ed2fd3ed39 /awk-edits
syndamia.com-8ae9ca1c57b5f183ae8e98df3310346aadbc8ddf.tar
syndamia.com-8ae9ca1c57b5f183ae8e98df3310346aadbc8ddf.tar.gz
syndamia.com-8ae9ca1c57b5f183ae8e98df3310346aadbc8ddf.zip
Parent5b2ac851b21fcb2a9f7c6cff47637be184881902 (diff)
Parenta9f641a6ec9d70ab4d78f6280ede0d5e64c3d50c (diff)
Merge branch 'better-syntax-highlighting' into 'master'
Reworked code highlighting See merge request Syndamia/syndamiadotcom!8
2 files changed, 165 insertions, 41 deletions
-rw-r--r--awk-edits/#strings.awk40
-rw-r--r--awk-edits/Syntax-highlighting.awk166
diff --git a/awk-edits/#strings.awk b/awk-edits/#strings.awk
index a34757e..3365df2 100644
--- a/awk-edits/#strings.awk
+++ b/awk-edits/#strings.awk
@@ -43,3 +43,43 @@ function gesub(regexp, exregexp, replacement, target) {
return result target;
}
+
+# glsub(lbregexp, regexp, largexp, replacement [, target])
+# Aka global sub with non-capturing look-around (lookbehind and lookahead)
+# Behaves kind of like gsub, however substitution of regexp with replacement
+# only happens, when regexp is preceded by lbregexp and succeeded by laregexp.
+# Only regexp get's replaced, the matches of lbregexp and laregexp are left
+# as-is. Overlapping of any form isn't supported.
+# This function is quite slow, try to use as little as possible.
+# Returns the result string, rather than doing it inplace.
+function glsub(lbregexp, regexp, laregexp, replacement, target) {
+ if (!length(target)) {
+ target = $0;
+ }
+
+ surlen = split(target, surrounds, lbregexp regexp laregexp);
+ result = surrounds[1];
+ # POSIX compliance, seps parameter in split isn't available
+ target = substr(target, length(surrounds[1]) + 1);
+ for (i = 2; i <= surlen; i++) {
+ if (surrounds[i] == "") {
+ match(target, lbregexp regexp laregexp);
+ si = RLENGTH + 1;
+ }
+ else {
+ si = index(target, surrounds[i]);
+ }
+ csep = substr(target, 1, si - 1);
+ target = substr(target, length(surrounds[i]) + si);
+
+ match(csep, regexp);
+ behind = substr(csep, 1, RSTART - 1);
+ ahead = substr(csep, RSTART + RLENGTH);
+ csep = substr(csep, RSTART, RLENGTH);
+
+ sub(/.*/, replacement, csep);
+ result = result behind csep ahead surrounds[i];
+ }
+
+ return result;
+}
diff --git a/awk-edits/Syntax-highlighting.awk b/awk-edits/Syntax-highlighting.awk
index e3a9be2..0e5250e 100644
--- a/awk-edits/Syntax-highlighting.awk
+++ b/awk-edits/Syntax-highlighting.awk
@@ -17,6 +17,24 @@ BEGIN {
syntaxhighlighting=0;
}
+function hi(pat, class) {
+ gsub(pat, "<span class=\"HI-" class "\">&</span>");
+}
+function hie(pat, epat, class) {
+ return gesub(pat, epat, "<span class=\"HI-" class "\">&</span>");
+}
+function hil(lbpat, pat, lrpat, class) {
+ return glsub(lbpat, pat, lrpat, "<span class=\"HI-" class "\">&</span>");
+}
+
+#
+# -- Global --
+#
+
+syntaxhighlighting > 0 || /class="language-/ {
+ $0 = gesub(@/=/, "<[^>]*>", "\\&#61;");
+}
+
#
# -- Grammars --
#
@@ -58,10 +76,10 @@ syntaxhighlighting == 1 {
}
for (i = 1; i <= grammarNamesI; i++) {
- $0 = gesub(grammarNames[i], "<span [^>]*>[^<]*</[^>]*>", "<span class=\"SH-fnc\">&</span>");
+ $0 = hie(grammarNames[i], @/<span [^>]*>[^<]*<\/[^>]*>/, "function");
}
- gsub(/[[:blank:]]*[^-\\]-&#62;/, "<span class=\"SH-kwd\">&</span>");
- gsub(/\|/, "<span class=\"SH-kwd2\">&</span>");
+ hi(@/-&#62;/, "statement");
+ hi(@/\|/, "statement");
}
#
@@ -76,11 +94,11 @@ syntaxhighlighting == 0 && /class="language-regex"/ {
syntaxhighlighting == 2 {
syntaxhighlighting = 2;
- gsub(/[\*]/, "<span class=\"SH-kwd\">&</span>");
- gsub(/[\(\)\|]/, "<span class=\"SH-kwd2\">&</span>");
+ hi(@/\*/, "repeat");
+ hi(@/[\(\)\|]/, "statement");
}
-#
+#
# -- Bash
#
# Supports "bash"
@@ -97,38 +115,46 @@ syntaxhighlighting == 2 {
}
syntaxhighlighting == 3 {
- gsub(/("[^"]*"|'[^']*')/, "<span class=\"SH-str\">&</span>");
- gsub(/\$(\(|\(\(|{).+(\)|\)\)|})/, "<span class=\"SH-kwd3\">&</span>");
- gsub(/\$[^[:blank:]]+/, "<span class=\"SH-kwd3\">&</span>");
- gsub(/[[:blank:]]+-[-_[:alnum:]]+/, "<span class=\"SH-kwd2\">&</span>");
- gsub(/(^|[[:blank:]]+)(function|if|fi|then|case|esac|in|disown|==|!=|-eq|-ne|-gt|-ge|-lt|-le|;|\|\||&#38;&#38;)($|[[:blank:]])/, "<span class=\"SH-kwd\">&</span>");
- gsub(/^[[:blank:]]*[[:alnum:]]+=/, "<span class=\"SH-cls\">&</span>");
- gsub(/[-_[:alnum:]]+[[:blank:]]*\([^\)]*\)/, "<span class=\"SH-fnc\">&</span>");
- gsub(/[\{\}]/, "<span class=\"SH-fnc\">&</span>");
- gsub(/[[:blank:]]#.*$/, "<span class=\"SH-com\">&</span>");
- gsub(/(\|)/, "<span class=\"SH-none\">&</span>");
+ $0 = hie(@/"[^"]*"/, "<[^>]*>", "string");
+ $0 = hil(@/[^\>&]/,
+ @/#.*$/,
+ "",
+ "comment");
+ hi(@/\$(\(|\(\(|{).+(\)|\)\)|})/, "structure");
+ hi(@/\$[[:alnum:]]+/, "structure");
+ $0 = hil(@/[^[:alnum:]#\$]/,
+ @/[[:digit:]]+/,
+ @/[^[:alnum:]]/,
+ "number");
+ $0 = hil(@/[^[:alnum:]#\$]/,
+ @/[[:digit:]]+\.[[:digit:]]+/,
+ @/[^[:alnum:]]/,
+ "float");
+ $0 = hil(@/[[:blank:]]+/, @/-[-_[:alnum:]]+/, "", "operator");
+ $0 = hil(@/(^|[^[:alnum:]])/,
+ @/(if|fi|then|case|esac|&#61;&#61;|!&#61;|-eq|-ne|-gt|-ge|-lt|-le|;;|;|\|\||&#38;&#38;)/,
+ @/([^[:alnum:]]|$)/,
+ "conditional");
+ $0 = hil(@/(^|[^[:alnum:]])/,
+ @/(for|while|until|in|do|done)/,
+ @/([^[:alnum:]]|$)/,
+ "repeat");
+ $0 = hil(@/(^|[[:blank:]]+)/,
+ @/[[:alnum:]]+/,
+ @/(|\+|-)&#61;/,
+ "identifier");
+ $0 = hil("",
+ @/[-_[:alnum:]]+[[:blank:]]*/,
+ @/\([^\)]*\)/,
+ "function");
+ hi(@/[\{\}]/, "function");
+ hi(@/^[[:blank:]]*[[:alnum:]]+/, "statement");
}
+
#
-# -- C --
+# -- C-like programming languages --
#
-# Supports "c" and is used in C-like programming languages
-
-/class="language-c"/ {
- syntaxhighlighting = 100;
-}
-
-syntaxhighlighting >= 100 {
- gsub(/([[:alnum:]]|[-_])+(&#60;[[:alnum:]]+&#62;)?\(/, "<span class=\"SH-fnc\">&</span>");
- gsub(/(&#47;&#47;.*|&#47;*.*&#47;)/, "<span class=\"SH-com\">&</span>");
- gsub(/[\(,\.]/, "<span class=\"SH-none\">&</span>");
- gsub(/(public|protected|private|override|new|if|else|while|for|return|struct|typedef|extern|const)[[:blank:]]/, "<span class=\"SH-kwd\">&</span>");
- gsub(/(&#38;&#38;|\|\||==|!=)/, "<span class=\"SH-kwd2\">&</span>");
- gsub(/#(include|if|ifndef|endif|define)/, "<span class=\"SH-kwd3\">&</span>");
- gsub(/(true|false)[[:blank:]]/, "<span class=\"SH-cst\">&</span>");
- gsub(/(int|void|double|bool|char)[[:blank:]]/, "<span class=\"SH-typ\">&</span>");
- $0 = gesub("(\"[^\"]*\"|'[^']*')", "<[^>]*>", "<span class=\"SH-str\">&</span>");
-}
#
# -- C++ --
@@ -140,7 +166,10 @@ syntaxhighlighting >= 100 {
}
syntaxhighlighting == 101 {
- gsub(/([[:blank:]]|\()*[[:upper:]]([[:upper:]]|[-_])*([[:blank:]]|\)|,|;)+/, "<span class=\"SH-cst\">&</span>");
+ $0 = hil(@/(^|[^[:alnum:]])/,
+ @/(string)/,
+ @/([^[:alnum:]]|$)/,
+ "type");
}
#
@@ -153,10 +182,12 @@ syntaxhighlighting == 101 {
}
syntaxhighlighting == 102 {
- gsub(/new ([[:alnum:]]|[-_])+[\(\.]/, "<span class=\"SH-cls\">&</span>");
- gsub(/(&#60;[[:alnum:]]+&#62;)/, "<span class=\"SH-kwd\">&</span>");
- gsub(/([[:blank:]]|\()*([[:upper:]]|[-_])+([[:blank:]]|\)|,|;)+/, "<span class=\"SH-cst\">&</span>");
- gsub(/(=&#62;)/, "<span class=\"SH-kwd2\">&</span>");
+ $0 = hil(@/(^|[^[:alnum:]])/,
+ @/(new|public|protected|private|override)/,
+ @/([^[:alnum:]]|$)/,
+ "keyword");
+ hi(@/&#60;[-_[:alpha:]]+&#62;/, "typedef");
+ $0 = hie(@/[_[:upper:]][_[:upper:]][_[:upper:]][_[:upper:]]+/, @/<[^>]*>/, "const");
}
#
@@ -169,7 +200,7 @@ syntaxhighlighting == 102 {
}
syntaxhighlighting == 103 {
- gsub(/%[^[:blank:]]+/, "<span class=\"SH-kwd\">&</span>");
+ hi(@/%[^[:blank:]]+/, "storageclass");
}
#
@@ -182,7 +213,60 @@ syntaxhighlighting == 103 {
}
syntaxhighlighting == 104 {
- gsub(/%[^[:blank:]]+/, "<span class=\"SH-kwd\">&</span>");
+ hi(@/%[^[:blank:]]+/, "storageclass");
+}
+
+#
+# -- C --
+#
+# Supports "c" and is used in C-like programming languages
+
+/class="language-c"/ {
+ syntaxhighlighting = 100;
+}
+
+syntaxhighlighting >= 100 {
+ $0 = hie(@/"[^"]*"/, "<[^>]*>", "string");
+ hi(@/(&#47;&#47;.*$|&#47;\*.*$|^[^\*]*\*&#47;)/, "comment");
+ $0 = hil(@/[^[:alnum:]#\$]/,
+ @/[[:digit:]]+/,
+ @/[^[:alnum:]]/,
+ "number");
+ $0 = hil(@/[^[:alnum:]#\$]/,
+ @/[[:digit:]]+\.[[:digit:]]+/,
+ @/[^[:alnum:]]/,
+ "float");
+ $0 = hil("",
+ @/[-_[:alnum:]]+/,
+ @/[[:blank:]]*(|\+|-|\*|&#47;|%|&#60;&#60;|&#62;&#62;|&|\^|\|)&#61;/,
+ "identifier");
+ $0 = hil("",
+ @/[-_[:alnum:]]+[[:blank:]]*/,
+ @/\(/,
+ "function");
+ hi(@/(&#61;&#61;|!&#61;|&#60;&#61;|&#62;&#61;|&#38;&#38;|\|\||!)/, "conditional");
+ $0 = hil(@/(^|[^-[:alnum:]])/,
+ @/(break|continue|do|for|goto|while)/,
+ @/([^[:alnum:]]|$)/,
+ "repeat");
+ $0 = hil(@/(^|[^-[:alnum:]])/,
+ @/(case|const|default|else|extern|if|return|sizeof|switch|typedef)/,
+ @/([^[:alnum:]]|$)/,
+ "keyword");
+ $0 = hil(@/(^|<.*>)[[:blank:]]*/,
+ @/#[[:alpha:]]+/,
+ "",
+ "preproc");
+ $0 = hil(@/(^|[^-[:alnum:]])/,
+ @/(auto|char|double|float|int|long|short|signed|unsigned|bool|void)/,
+ @/([^[:alnum:]]|$)/,
+ "type");
+ hi(@/&#39;[\\]?[ -~]&#39;/, "char");
+ hi(@/(true|false)/, "bool");
+ $0 = hil(@/(^|[^[:alnum:]])/,
+ @/(enum|struct|union)/,
+ @/([^[:alnum:]]|$)/,
+ "storageclass");
}
tagend != 0 {