Skip to content

Commit 9d94538

Browse files
committed
feat: add support for parsing txt files with only documentation
1 parent e8ee48f commit 9d94538

6 files changed

Lines changed: 65 additions & 7 deletions

File tree

arkdoc/__main__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def compute(args) -> bool:
6464
functions.append(name)
6565
else:
6666
functions.append(prefix + ":" + name)
67-
elif doc.source == Source.Cpp:
67+
elif doc.source == Source.Cpp or doc.source == Source.Txt:
6868
data, _ = extractor({"name": ""}, doc)
6969
functions.append(data["name"])
7070
print("\n".join(functions))

arkdoc/generator/utils.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,24 @@ def from_cpp(doc: Documentation) -> spec.Function:
102102
describe(data, code),
103103
)
104104

105+
def from_txt(doc: Documentation) -> spec.Function:
106+
parameters = {"name": ""}
107+
parameters.update(deepcopy(DEFAULT_KEYS))
108+
data, code = extractor(parameters, doc)
109+
110+
return spec.Function(
111+
data["name"],
112+
f"({data['name']} {' '.join(e.name for e in data['param'])})",
113+
describe(data, code),
114+
)
115+
105116

106117
def documentation_to_specification(doc: Documentation) -> spec.Function:
107118
if doc.source == Source.ArkScript:
108119
return from_ark(doc)
109120
elif doc.source == Source.Cpp:
110121
return from_cpp(doc)
122+
elif doc.source == Source.Txt:
123+
return from_txt(doc)
111124
else:
112125
raise NotImplementedError

arkdoc/parser/documentation.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ def deep_flatten(lst):
2020
class Source(Enum):
2121
ArkScript = 0
2222
Cpp = 1
23+
Txt = 2
2324

2425

2526
@dataclass

arkdoc/parser/parser.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from typing import List
55

66
from . import Documentation, Source
7-
from .tokenizer import cpp_tokenize, tree_from_tokens, tokenize, Token
7+
from .tokenizer import cpp_tokenize, txt_tokenize, tree_from_tokens, tokenize, Token
88
from .. import logger
99

1010

@@ -51,6 +51,9 @@ def extract_documentation(self):
5151
elif self.filename.endswith(".cpp"):
5252
for node in self.ast:
5353
yield Documentation(Source.Cpp, node, None)
54+
elif self.filename.endswith(".txt"):
55+
for node in self.ast:
56+
yield Documentation(Source.Txt, node, None)
5457
else:
5558
raise NotImplementedError
5659

@@ -67,5 +70,8 @@ def parse(self):
6770
elif self.filename.endswith(".cpp"):
6871
self.ast = list(cpp_tokenize(program))
6972
logger.debug(self.ast)
73+
elif self.filename.endswith(".txt"):
74+
self.ast = list(txt_tokenize(program))
75+
logger.debug(self.ast)
7076
else:
7177
logger.error(f"Could not parse {self.filename}")

arkdoc/parser/tokenizer.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def tokenize(code: str) -> Generator[Token, Any, None]:
5959
yield Token(kind, value, line_num, column)
6060

6161

62-
def cpp_tokenize(code: str) -> List[str]:
62+
def cpp_tokenize(code: str) -> Generator[list[Token], Any, None]:
6363
"""
6464
The following regex accepts this kind of comment
6565
@@ -89,6 +89,36 @@ def transform(line: str):
8989
yield list(transform(value))
9090

9191

92+
def txt_tokenize(code: str) -> Generator[list[Token], Any, None]:
93+
"""
94+
The following regex accepts this kind of text blocks
95+
96+
--#
97+
* test
98+
* test
99+
* test
100+
* @brief test
101+
#--
102+
"""
103+
tok_regex = r"^ *--#\n(\*( .*)\n)+#--\n"
104+
line_num = 1
105+
line_start = 0
106+
107+
def transform(line: str):
108+
nonlocal line_num
109+
lines = line.split("\n")
110+
111+
for e in lines[1:]:
112+
line = "#" + e.strip()[1:]
113+
line_num += 1
114+
yield Token("COMMENT", line, line_num, column)
115+
116+
for mo in re.finditer(tok_regex, code, flags=re.MULTILINE):
117+
value = mo.group()
118+
column = mo.start() - line_start
119+
yield list(transform(value))
120+
121+
92122
def tree_from_tokens(tokens: List[Token]) -> List:
93123
if len(tokens) == 0:
94124
raise SyntaxError("unexpected EOF")

arkdoc/reader.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
#!/usr/bin/env python3
22

33
import glob
4-
from typing import List
4+
import os.path
5+
from typing import List, Generator
56

67
from .parser import Parser
78

89

9-
def explore(folder: str) -> List[str]:
10-
for ext in ["ark", "cpp"]:
11-
yield from glob.glob(f"{folder}/*.{ext}", recursive=True)
10+
def explore(folder: str) -> Generator[str, None, None]:
11+
supported_exts = ["txt", "ark", "cpp"]
12+
13+
if os.path.isdir(folder):
14+
for ext in supported_exts:
15+
yield from glob.glob(f"{folder}/*.{ext}", recursive=True)
16+
elif os.path.isfile(folder) and os.path.splitext(folder)[1][1:] in supported_exts:
17+
yield folder
18+
else:
19+
raise RuntimeError(f"{folder} isn't a valid file or folder")
1220

1321

1422
def parse_all_in(folder: str) -> List[Parser]:

0 commit comments

Comments
 (0)