diff --git a/cmake/PugsDoc.cmake b/cmake/PugsDoc.cmake index 099eda180d7b37d3824fbfac370151c018718952..7be934abae82d06b1e5dcf7265c7710521e02c8e 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 4cf83f69251b96aaa0f9473a4c6b0ba8fa8a1e51..1da3a5c9fecf3540dfd701380a340722379642cf 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 8b15ca2c04a5b9cb77df1d60e66a3b1fb5424b9c..6538215304ff3da89bd385e8b7918569490cc85e 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 0000000000000000000000000000000000000000..a6622c0dc1b25aa8f998a2480af0f5d080c4a5d5 --- /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 0000000000000000000000000000000000000000..98f90c55e028546aa8fa49fc069f06b1fe3f057a --- /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[@]}"