aboutsummaryrefslogtreecommitdiff
path: root/bindings/python/tree_sitter_wmap
diff options
context:
space:
mode:
authorRuben Beltran del Rio <jj@r.bdr.sh>2025-12-14 19:59:18 +0100
committerRuben Beltran del Rio <jj@r.bdr.sh>2025-12-14 19:59:33 +0100
commit9b7bda28db0200b628e5f6eb7021a5a717db2e73 (patch)
tree2f477b0fe308da3554fbd0ab807c4c4725715311 /bindings/python/tree_sitter_wmap
Initial grammar
Diffstat (limited to 'bindings/python/tree_sitter_wmap')
-rw-r--r--bindings/python/tree_sitter_wmap/__init__.py43
-rw-r--r--bindings/python/tree_sitter_wmap/__init__.pyi17
-rw-r--r--bindings/python/tree_sitter_wmap/binding.c35
-rw-r--r--bindings/python/tree_sitter_wmap/py.typed0
4 files changed, 95 insertions, 0 deletions
diff --git a/bindings/python/tree_sitter_wmap/__init__.py b/bindings/python/tree_sitter_wmap/__init__.py
new file mode 100644
index 0000000..fa35926
--- /dev/null
+++ b/bindings/python/tree_sitter_wmap/__init__.py
@@ -0,0 +1,43 @@
+"""Parser for wmap Formatted Wardley Maps"""
+
+from importlib.resources import files as _files
+
+from ._binding import language
+
+
+def _get_query(name, file):
+ try:
+ query = _files(f"{__package__}") / file
+ globals()[name] = query.read_text()
+ except FileNotFoundError:
+ globals()[name] = None
+ return globals()[name]
+
+
+def __getattr__(name):
+ if name == "HIGHLIGHTS_QUERY":
+ return _get_query("HIGHLIGHTS_QUERY", "queries/highlights.scm")
+ if name == "INJECTIONS_QUERY":
+ return _get_query("INJECTIONS_QUERY", "queries/injections.scm")
+ if name == "LOCALS_QUERY":
+ return _get_query("LOCALS_QUERY", "queries/locals.scm")
+ if name == "TAGS_QUERY":
+ return _get_query("TAGS_QUERY", "queries/tags.scm")
+
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
+
+
+__all__ = [
+ "language",
+ "HIGHLIGHTS_QUERY",
+ "INJECTIONS_QUERY",
+ "LOCALS_QUERY",
+ "TAGS_QUERY",
+]
+
+
+def __dir__():
+ return sorted(__all__ + [
+ "__all__", "__builtins__", "__cached__", "__doc__", "__file__",
+ "__loader__", "__name__", "__package__", "__path__", "__spec__",
+ ])
diff --git a/bindings/python/tree_sitter_wmap/__init__.pyi b/bindings/python/tree_sitter_wmap/__init__.pyi
new file mode 100644
index 0000000..5c88ff6
--- /dev/null
+++ b/bindings/python/tree_sitter_wmap/__init__.pyi
@@ -0,0 +1,17 @@
+from typing import Final
+from typing_extensions import CapsuleType
+
+HIGHLIGHTS_QUERY: Final[str] | None
+"""The syntax highlighting query for this grammar."""
+
+INJECTIONS_QUERY: Final[str] | None
+"""The language injection query for this grammar."""
+
+LOCALS_QUERY: Final[str] | None
+"""The local variable query for this grammar."""
+
+TAGS_QUERY: Final[str] | None
+"""The symbol tagging query for this grammar."""
+
+def language() -> CapsuleType:
+ """The tree-sitter language function for this grammar."""
diff --git a/bindings/python/tree_sitter_wmap/binding.c b/bindings/python/tree_sitter_wmap/binding.c
new file mode 100644
index 0000000..bbc4012
--- /dev/null
+++ b/bindings/python/tree_sitter_wmap/binding.c
@@ -0,0 +1,35 @@
+#include <Python.h>
+
+typedef struct TSLanguage TSLanguage;
+
+TSLanguage *tree_sitter_wmap(void);
+
+static PyObject* _binding_language(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(args)) {
+ return PyCapsule_New(tree_sitter_wmap(), "tree_sitter.Language", NULL);
+}
+
+static struct PyModuleDef_Slot slots[] = {
+#ifdef Py_GIL_DISABLED
+ {Py_mod_gil, Py_MOD_GIL_NOT_USED},
+#endif
+ {0, NULL}
+};
+
+static PyMethodDef methods[] = {
+ {"language", _binding_language, METH_NOARGS,
+ "Get the tree-sitter language for this grammar."},
+ {NULL, NULL, 0, NULL}
+};
+
+static struct PyModuleDef module = {
+ .m_base = PyModuleDef_HEAD_INIT,
+ .m_name = "_binding",
+ .m_doc = NULL,
+ .m_size = 0,
+ .m_methods = methods,
+ .m_slots = slots,
+};
+
+PyMODINIT_FUNC PyInit__binding(void) {
+ return PyModuleDef_Init(&module);
+}
diff --git a/bindings/python/tree_sitter_wmap/py.typed b/bindings/python/tree_sitter_wmap/py.typed
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/bindings/python/tree_sitter_wmap/py.typed