Skip to content

Commit 33a83c0

Browse files
committed
feat: add function in namespace snippet
1 parent 1702d0f commit 33a83c0

File tree

3 files changed

+91
-16
lines changed

3 files changed

+91
-16
lines changed

docs/snippets/functions.md

+37
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,40 @@ indent_level: 4
3131
::: doxy.animal.function
3232
name: mEin
3333
indent_level: 4
34+
35+
## `::: doxy.<project>.namespace.function`
36+
37+
This tag generates full function documentation.
38+
39+
| Parameter | Description | Required |
40+
|-----------------------------------------|----------|
41+
| `namespace` | The name of the amespace. | Yes |
42+
| `name` | The name of the function. | Yes |
43+
44+
45+
=== "Tag usage"
46+
```yaml
47+
::: doxy.animal.namespace.function
48+
namespace: example
49+
name: void some_namespace_function(Animal* animal)
50+
```
51+
=== "Tag result"
52+
::: doxy.animal.namespace.function
53+
namespace: example
54+
name: void some_namespace_function(Animal* animal)
55+
indent_level: 4
56+
57+
58+
## `::: doxy.<project>.function` error message
59+
60+
=== "Tag usage"
61+
```yaml
62+
::: doxy.animal.namespace.function
63+
namespace: example
64+
name: void no_function()
65+
```
66+
=== "Tag result"
67+
::: doxy.animal.function
68+
namespace: example
69+
name: void no_function()
70+
indent_level: 4

mkdoxy/finder.py

+30-16
Original file line numberDiff line numberDiff line change
@@ -16,33 +16,47 @@ def _normalize(self, name: str) -> str:
1616
def listToNames(self, list):
1717
return [part.name_params for part in list]
1818

19-
def doxyClass(self, project, className: str):
20-
classes = recursive_find(self.doxygen[project].root.children, Kind.CLASS)
21-
if classes:
22-
for findClass in classes:
23-
if findClass.name_long == className:
24-
return findClass
25-
return self.listToNames(classes)
19+
def _doxyParent(self, project, parent: str, kind: Kind):
20+
if not kind.is_parent():
21+
return None
22+
parents = recursive_find(self.doxygen[project].root.children, kind)
23+
if parents:
24+
for findParent in parents:
25+
if findParent.name_log == parent:
26+
return findParent
27+
return self.listToNames(parents)
2628
return None
2729

28-
def doxyClassMethod(self, project, className: str, methodName: str):
29-
findClass = self.doxyClass(project, className)
30-
if findClass:
31-
if isinstance(findClass, list):
32-
for member in findClass:
33-
if self._normalize(methodName) in self._normalize(member):
30+
def _doxyMemberInParent(self, project, parent: str, parentKind: Kind, memberName: str, memberKind: Kind):
31+
findParent = self._doxyParent(project, parent, parentKind)
32+
if findParent:
33+
if isinstance(findParent, list):
34+
for member in findParent:
35+
if self._normalize(memberName) in self._normalize(member):
3436
return member
35-
return findClass
37+
return findParent
3638
else:
37-
members = recursive_find(findClass.children, Kind.FUNCTION)
39+
members = recursive_find(findParent.children, memberKind)
3840
if members:
3941
for member in members:
40-
if self._normalize(methodName) in self._normalize(member.name_params):
42+
if self._normalize(memberName) in self._normalize(member.name_params):
4143
return member
4244
return self.listToNames(members)
4345
return None
4446
return None
4547

48+
def doxyClass(self, project, className: str):
49+
return self._doxyParent(project, className, Kind.CLASS)
50+
51+
def doxyNamespace(self, project, namespace: str):
52+
return self._doxyParent(project, namespace, Kind.NAMESPACE)
53+
54+
def doxyClassMethod(self, project, className: str, methodName: str):
55+
return self._doxyMemberInParent(project, className, Kind.CLASS, methodName, Kind.FUNCTION)
56+
57+
def doxyNamespaceFunction(self, project, namespace: str, functionName: str):
58+
return self._doxyMemberInParent(project, namespace, Kind.NAMESPACE, functionName, Kind.FUNCTION)
59+
4660
def doxyFunction(self, project, functionName: str):
4761
functions = recursive_find_with_parent(self.doxygen[project].files.children, [Kind.FUNCTION], [Kind.FILE])
4862
if functions:

mkdoxy/generatorSnippets.py

+24
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def __init__(
4242
self.doxy_arguments = {
4343
"code": self.doxyCode,
4444
"function": self.doxyFunction,
45+
"namespace.function": self.doxyNamespaceFunction,
4546
"class": self.doxyClass,
4647
"class.method": self.doxyClassMethod,
4748
"class.list": self.doxyClassList,
@@ -370,6 +371,29 @@ def doxyNamespaceList(self, snippet, project: str, config):
370371
self._setLinkPrefixNodes(nodes, self.pageUrlPrefix + project + "/")
371372
return self.generatorBase[project].namespaces(nodes, config)
372373

374+
def doxyNamespaceFunction(self, snippet, project: str, config):
375+
errorMsg = self.checkConfig(snippet, project, config, ["namespace", "name"])
376+
if errorMsg:
377+
return errorMsg
378+
379+
node = self.finder.doxyNamespaceFunction(project, config.get("namespace"), config.get("name"))
380+
if node is None:
381+
return self.doxyNodeIsNone(project, config, snippet)
382+
383+
if isinstance(node, Node):
384+
self._setLinkPrefixNode(node, self.pageUrlPrefix + project + "/")
385+
return self.generatorBase[project].function(node, config)
386+
return self.doxyError(
387+
project,
388+
config,
389+
"Incorrect namespace function configuration",
390+
f"Did not find Namespace with name: `{config.get('namespace')}` and function: `{config.get('name')}`",
391+
"Available classes and methods:",
392+
"\n".join(node),
393+
"yaml",
394+
snippet,
395+
)
396+
373397
def doxyFileList(self, snippet, project: str, config):
374398
errorMsg = self.checkConfig(snippet, project, config, [])
375399
if errorMsg:

0 commit comments

Comments
 (0)