changeset 185:b27557f6d393

Allow to build the documentation when the project is not installed
author Franz Glasner <fzglas.hg@dom66.de>
date Tue, 12 May 2026 19:43:48 +0200
parents 5113d7fbae9e
children 95754197f5b3
files Makefile docs/conf.py pyproject.toml
diffstat 3 files changed, 77 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Tue May 12 15:54:07 2026 +0200
+++ b/Makefile	Tue May 12 19:43:48 2026 +0200
@@ -57,4 +57,5 @@
 
 install-doc:
 	python -m pip install -r requirements-docs.txt
-	python -m pip install --editable .
+	# Not needed any more because handled in docs/conf.py as hack
+	#python -m pip install --editable .
--- a/docs/conf.py	Tue May 12 15:54:07 2026 +0200
+++ b/docs/conf.py	Tue May 12 19:43:48 2026 +0200
@@ -11,9 +11,17 @@
 import sys
 import re
 
+import pygments.lexers
+import pygments.filters
+import sphinx.util.logging
+
 sys.path.insert(0, os.path.dirname(os.path.abspath('.')))
 
-from pygments_lexer_pseudocode2.lexers.algpseudocode import AlgPseudocodeLexer
+from pygments_lexer_pseudocode2.lexers.algpseudocode import (
+    AlgPseudocodeLexer, AlgPseudocodeLexer_DE, AlgPseudocodeLexer_FR)
+from pygments_lexer_pseudocode2.lexers.fr_pseudocode import FrPseudocodeLexer
+from pygments_lexer_pseudocode2.filters import (
+    TokenReplaceFilter, ErrorToGenericErrorTokenFilter)
 
 
 needs_sphinx = '2.1'
@@ -180,3 +188,51 @@
     app.add_lexer("genericerror-algpseudocode",
                   functools.partial(AlgPseudocodeLexer,
                                     filters=["errortogenericerror"]))
+
+    #
+    # Prepare for building docs while the package is not installed:
+    # Install by "hand" into pygments!
+    # This is an ugly *HACK*!
+    #
+    # IMPORTANT: Synchronize names with pyproject.toml!
+    #
+    try:
+        if not pygments.lexers.find_lexer_class("AlgPseudocode"):
+            sphinx.util.logging.getLogger("conf-setup").info(
+                "%s","Installing lexer `AlgPseudocode' and language variants")
+            for clsname, lexer in (
+                    ("AlgPseudocodeLexer", AlgPseudocodeLexer),
+                    ("AlgPseudocodeLexer_DE", AlgPseudocodeLexer_DE),
+                    ("AlgPseudocodeLexer_FR", AlgPseudocodeLexer_FR)):
+                pygments.lexers.LEXERS[clsname] = (
+                "pygments_lexer_pseudocode2.lexers.algpseudocode",
+                lexer.name,
+                tuple(lexer.aliases),
+                tuple(lexer.filenames),
+                tuple(lexer.mimetypes))
+        if not pygments.lexers.find_lexer_class("FrPseudocode"):
+            sphinx.util.logging.getLogger("conf-setup").info(
+                "%s","Installing lexer `FrPseudocode'")
+            for clsname, lexer in (
+                    ("FrPseudocodeLexer", FrPseudocodeLexer),):
+                pygments.lexers.LEXERS[clsname] = (
+                "pygments_lexer_pseudocode2.lexers.fr_pseudocode",
+                lexer.name,
+                tuple(lexer.aliases),
+                tuple(lexer.filenames),
+                tuple(lexer.mimetypes))
+        if not pygments.filters.find_filter_class("tokenreplace"):
+            sphinx.util.logging.getLogger("conf-setup").info(
+                "%s","Installing filter `tokenreplace'")
+            pygments.filters.FILTERS["tokenreplace"] = TokenReplaceFilter
+        if not pygments.filters.find_filter_class("errortogenericerror"):
+            sphinx.util.logging.getLogger("conf-setup").info(
+                "%s","Installing filter `errortogenericerror'")
+            pygments.filters.FILTERS["errortogenericerror"]  = \
+                ErrorToGenericErrorTokenFilter
+    except Exception as ex:
+        sphinx.util.logging.getLogger("conf-setup").error("%s", str(ex))
+        sphinx.util.logging.getLogger("conf-setup").error(
+            "%s",
+            "No lexers/filters from pygments_lexer_pseudocode2 available;"
+            " please install or call `pip install -e .' .")
--- a/pyproject.toml	Tue May 12 15:54:07 2026 +0200
+++ b/pyproject.toml	Tue May 12 19:43:48 2026 +0200
@@ -44,19 +44,6 @@
 # The original homepage of the Pseudo code (fr) lexer
 homepage = "https://github.com/svvac/pseudocode-pygments-lexer"
 
-[project.entry-points.'pygments.lexers']
-# The key is not significant here
-# The mostly original and somewhat extended Pseudocode lexer (fr)
-fr_pseudocodelexer = "pygments_lexer_pseudocode2.lexers.fr_pseudocode:FrPseudocodeLexer"
-algpseudocodelexer = "pygments_lexer_pseudocode2.lexers.algpseudocode:AlgPseudocodeLexer"
-algpseudocodelexer_de = "pygments_lexer_pseudocode2.lexers.algpseudocode:AlgPseudocodeLexer_DE"
-algpseudocodelexer_fr = "pygments_lexer_pseudocode2.lexers.algpseudocode:AlgPseudocodeLexer_FR"
-
-[project.entry-points."pygments.filters"]
-# The key *is* significant: it is the name the filter will be recognized as.
-tokenreplace = "pygments_lexer_pseudocode2.filters:TokenReplaceFilter"
-errortogenericerror = "pygments_lexer_pseudocode2.filters:ErrorToGenericErrorTokenFilter"
-
 [tool.setuptools]
 packages = [
     "pygments_lexer_pseudocode2",
@@ -70,3 +57,21 @@
 [tool.setuptools.dynamic]
 version = {attr = "pygments_lexer_pseudocode2.__version__"}
 readme = {file = ["README.rst"], content-type = "text/x-rst"}
+
+#
+# IMPORTANT:
+# Synchronize lexers and filters with docs/conf.py!
+#
+
+[project.entry-points.'pygments.lexers']
+# The key is not significant here
+# The mostly original and somewhat extended Pseudocode lexer (fr)
+fr_pseudocodelexer = "pygments_lexer_pseudocode2.lexers.fr_pseudocode:FrPseudocodeLexer"
+algpseudocodelexer = "pygments_lexer_pseudocode2.lexers.algpseudocode:AlgPseudocodeLexer"
+algpseudocodelexer_de = "pygments_lexer_pseudocode2.lexers.algpseudocode:AlgPseudocodeLexer_DE"
+algpseudocodelexer_fr = "pygments_lexer_pseudocode2.lexers.algpseudocode:AlgPseudocodeLexer_FR"
+
+[project.entry-points."pygments.filters"]
+# The key *is* significant: it is the name the filter will be recognized as.
+tokenreplace = "pygments_lexer_pseudocode2.filters:TokenReplaceFilter"
+errortogenericerror = "pygments_lexer_pseudocode2.filters:ErrorToGenericErrorTokenFilter"