-
Notifications
You must be signed in to change notification settings - Fork 0
/
generate_readmes.py
155 lines (124 loc) · 5.67 KB
/
generate_readmes.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
from typing import List, Dict
SETTINGS_FILE = 'src/main/java/com/rubixdev/carpet/addon/CarpetAddonSettings.java'
MAIN_CATEGORY = 'CUSTOM'
class Rule:
type: str
name: str
value: str
desc: str
extra: str = ""
options: list = []
strict: bool
categories: list
restriction: str = ""
additional: str = ""
def __repr__(self):
nl: str = '\n'
options: List[str] = ['true', 'false'] if self.type == 'boolean' else self.options
if 'COMMAND' in self.categories:
options = ['true', 'false', 'ops']
self.categories.sort()
out = f'### {self.name}\n' \
f'{self.desc} {nl + self.extra if self.extra else ""} \n' \
f'- Type: `{self.type}`\n' \
f'- Default value: `{self.value}`\n' \
f'- {"Required" if self.strict else "Suggested"} ' \
f'options: `{"`, `".join(options)}`\n' \
f'- Categories: `{"`, `".join(self.categories)}`'
if self.restriction or self.additional:
out += '\n- Additional notes:'
if self.restriction:
out += f'\n - {self.restriction}'
if self.additional:
out += f'\n - {self.additional}'
return out
def read_rules() -> List[Rule]:
with open(SETTINGS_FILE, 'r') as settings_file:
print('Reading settings file\n')
settings_string = settings_file.read()
raw_rules: List[str] = [i.split(';')[0] for i in settings_string.split('@Rule')[1:]]
rules: List[Rule] = []
for raw_rule in raw_rules:
rule: Rule = Rule()
field: List[str] = raw_rule.split('\n')[-1][18:].split(' ')
rule.type = field[0]
rule.name = field[1]
print(f'Parsing rule {rule.name}')
rule.value = field[3].replace('"', '')
keys: List[str] = [i[12:].split(' = ')[0] for i in raw_rule.split('\n')[1:-2]]
values: List[str] = [i[12:].split(' = ')[1] for i in raw_rule.split('\n')[1:-2]]
attr_dict: Dict[str: str] = {k: v for k, v in zip(keys, values)}
rule.desc = attr_dict['desc'][1:-2]
if 'extra' in keys:
rule.extra = attr_dict['extra'][1:-2]
if 'options' in keys:
rule.options = [i[1:-1] for i in attr_dict['options'][1:-2].split(', ')]
rule.strict = not ('strict' in keys)
rule.categories = [i.replace('}', '') for i in attr_dict['category'][1:-1].split(', ')]
if MAIN_CATEGORY not in rule.categories:
print(f'{MAIN_CATEGORY} category is missing in {rule.name}')
return []
if not rule.strict:
validator: str = attr_dict['validate'].replace(',', '')[:-6]
rule.restriction = settings_string.split(f'class {validator} extends')[1].split('"')[1]
found_additional: List[str] = settings_string.split(f'// {rule.name}Additional: ')
if len(found_additional) > 1:
rule.additional = found_additional[1].split('\n')[0]
rules.append(rule)
print(f'Successfully parsed {rule.name}')
print('\nFinished parsing rules\n')
return rules
def write_files(rules: List[Rule]):
with open('markdown/README-header.md', 'r') as header_file:
print('Reading header file')
out: str = header_file.read()
print('Listing all categories')
all_categories: List[str] = list(set([item for sublist in [rule.categories for rule in rules] for item in sublist]))
all_categories = [category for category in all_categories if category.upper() != MAIN_CATEGORY]
all_categories.sort()
out += f'## Lists of Categories\n'
for category in all_categories:
out += f'- [`{category}`](markdown/{category}_Category.md)\n'
out += '\n'
print('Sorting rules')
rules.sort(key=lambda e: e.name)
out += list_rules(rules, 'Implemented Rules')
with open('README.md', 'w') as readme_file:
print('Writing README.md\n')
readme_file.write(out[:-1])
for category in all_categories:
print(f'Listing rules in {category} category')
rules_in_category: List[Rule] = [rule for rule in rules if category in rule.categories]
rules_in_category.sort(key=lambda e: e.name)
out = f'# List of Rules in the {category} Category\n\n' \
f'For a list of all implemented Rules go [here](../README.md)\n'
out += list_rules(rules_in_category, f'Rules in {category} Category')
with open(f'markdown/{category}_Category.md', 'w') as category_readme:
print(f'Writing {category}_Category.md')
category_readme.write(out[:-1])
curseforge_list(rules)
def list_rules(rules: List[Rule], rule_headline: str) -> str:
out: str = f'## Index\n' \
f'Count: {len(rules)}\n'
for rule in rules:
out += f'- [{rule.name}](#{rule.name.lower()})\n'
out += f'\n## {rule_headline}\n\n'
for rule in rules:
out += str(rule) + '\n\n'
return out
def curseforge_list(rules: List[Rule]):
out: str = f'# Carpet Addon Mod Template\n\n' \
f'Extension Mod for [gnembon\'s fabric-carpet](https://github.com/gnembon/fabric-carpet) ' \
f'with some more features\n\n' \
f'**Visit the [GitHub page](https://github.com/RubixDev/CarpetAddonTemplate) ' \
f'for a more detailed explanation of all features.**\n\n' \
f'## List of implemented Carpet Rules\n' \
f'Count: {len(rules)} \n'
for rule in rules:
out += f'- {rule.name} \n'
with open('markdown/curseforge.md', 'w') as curse_file:
print('\nWriting curseforge.md')
curse_file.write(out)
if __name__ == '__main__':
write_files(read_rules())
print('\nDone!')