From df91ba6e105e7a27ea166514fee767bdd7e1fcb7 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Wed, 10 Aug 2022 09:22:53 +0200
Subject: [PATCH] Add a simple pygmentize lexer for syntax coloring of pugs
 examples

---
 cmake/PugsDoc.cmake          |  2 ++
 doc/lisp/build-doc-config.el |  3 +--
 doc/userdoc.org              |  3 +++
 tools/pgs-pygments.py        | 42 ++++++++++++++++++++++++++++++++++++
 tools/pgs-pygments.sh        | 28 ++++++++++++++++++++++++
 5 files changed, 76 insertions(+), 2 deletions(-)
 create mode 100755 tools/pgs-pygments.py
 create mode 100755 tools/pgs-pygments.sh

diff --git a/cmake/PugsDoc.cmake b/cmake/PugsDoc.cmake
index 099eda180..7be934aba 100644
--- a/cmake/PugsDoc.cmake
+++ b/cmake/PugsDoc.cmake
@@ -78,6 +78,8 @@ if (EMACS)
       DEPENDS
       "${PUGS_SOURCE_DIR}/doc/userdoc.org"
       "${PUGS_SOURCE_DIR}/doc/lisp/userdoc-pdf.el"
+      "${PUGS_SOURCE_DIR}/tools/pgs-pygments.sh"
+      "${PUGS_SOURCE_DIR}/tools/pgs-pygments.py"
       pugs
       pugsdoc-dir
       pugsdoc-download-elpa
diff --git a/doc/lisp/build-doc-config.el b/doc/lisp/build-doc-config.el
index 4cf83f692..1da3a5c9f 100644
--- a/doc/lisp/build-doc-config.el
+++ b/doc/lisp/build-doc-config.el
@@ -43,8 +43,7 @@
 
 (custom-set-variables
  '(org-export-html-postamble nil)
- ;; By now pugs is not known by Pygments raw text is better
- '(org-latex-minted-langs '((pugs "Text") (pugs-error "Text")))
+ '(org-latex-minted-langs '((pugs "Pugs") (pugs-error "Pugs")))
  '(org-confirm-babel-evaluate nil)
  '(org-html-validation-link nil)
  '(org-src-fontify-natively t)
diff --git a/doc/userdoc.org b/doc/userdoc.org
index 8b15ca2c0..653821530 100644
--- a/doc/userdoc.org
+++ b/doc/userdoc.org
@@ -43,6 +43,9 @@
 #+LATEX_HEADER_EXTRA: \BeforeBeginEnvironment{warning}{\begin{mdframed}[linecolor=red,backgroundcolor=red!10]}
 #+LATEX_HEADER_EXTRA: \AfterEndEnvironment{warning}{\end{mdframed}}
 
+#+LATEX_HEADER_EXTRA: \usemintedstyle{perldoc}
+#+LATEX_HEADER_EXTRA: \renewcommand{\MintedPygmentize}{${PUGS_SOURCE_DIR}/tools/pgs-pygments.sh}
+
 #+begin_src latex :exports results
   \let\OldTexttt\texttt
   \renewcommand{\texttt}[1]{\fcolorbox{gray!50}{gray!5}{\OldTexttt{#1}}}
diff --git a/tools/pgs-pygments.py b/tools/pgs-pygments.py
new file mode 100755
index 000000000..a6622c0dc
--- /dev/null
+++ b/tools/pgs-pygments.py
@@ -0,0 +1,42 @@
+from pygments.lexer import *
+from pygments.token import *
+
+class PugsLexer(RegexLexer):
+    name = 'Pugs'
+    aliases = ['pgs']
+    filenames = ['*.pgs']
+
+    tokens = {
+        'root': [
+            (r'([Ll]?)(")', bygroups(String.Affix, String.Double), 'string'),
+            (r'([Ll]?)(\')(\\[^\']+)(\')', bygroups(String.Affix, String.Char, String.Escape, String.Char)),
+            (r'\s+', Whitespace),
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'//.*?$', Comment.Singleline),
+            (r'/', Text),
+            (words(('B', 'N', 'Z', 'R', 'R^1', 'R^2','R^3', 'R^1x1', 'R^2x2', 'R^3x3', 'string'), suffix=r'\b'), Keyword.Type),
+            (words(('let', 'import', 'do', 'while', 'for', 'if', 'else' 'break'), suffix=r'\b'), Keyword.Reserved),
+            (words(('and', 'or', 'xor', 'not', 'true', 'false'), suffix=r'\b'), Keyword.Reserved),
+            (words(('cout', 'cerr', 'clog'), suffix=r'\b'), Name.Variable),
+            (r'[,~!%&*+=|?:<>/-]', Operator),
+            (r'[+-]?\d+(\.\d*)?[Ee][+-]?\d+', Number.Float),
+            (r'[+-]?(\d+\.\d*)|(\d*\.\d+)([Ee][+-]?\d+)?', Number.Float),
+            (r'\d+[LlUu]*', Number.Integer),
+            (r'[\(\)\[\];.]', Punctuation),
+            (r'[{}]', Punctuation),
+            (r'\w+', Name),
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'\\\n', String.Escape),  # line continuation
+            (r'[^\\"]+', String),  # all other characters
+            (r'\\', String),  # stray backslash
+        ],
+    }
diff --git a/tools/pgs-pygments.sh b/tools/pgs-pygments.sh
new file mode 100755
index 000000000..98f90c55e
--- /dev/null
+++ b/tools/pgs-pygments.sh
@@ -0,0 +1,28 @@
+#!/bin/env bash
+
+arguments=()
+
+while [[ "$#" -ne 0 ]]; do
+  case "$1" in
+  -l)
+    arguments+=("$1")
+
+    shift
+    lexer=$1
+
+    if [[ "$lexer" == "Pugs" ]]; then
+      arguments+=("${PUGS_SOURCE_DIR}/tools/pgs-pygments.py:PugsLexer")
+      arguments+=("-x")
+    else
+      arguments+=("${lexer}")
+    fi
+
+    ;;
+  *)
+    arguments+=("$1")
+    ;;
+  esac
+  shift
+done
+
+pygmentize -Ostyle=colorful "${arguments[@]}"
-- 
GitLab