dnd-file-gen/exploit_parse.py3
2025-02-21 10:20:44 +01:00

114 lines
2.8 KiB
Python

import os, sys, re, unicodedata
def snippet(text, seq1, seq2):
try:
start = text.index(seq1)+len(seq1)
except ValueError:
start=0
end =text.index(seq2, start+1)
return text[start:end]
def slugify(value, allow_unicode=False, whitespace=True):
"""
Taken from https://github.com/django/django/blob/master/django/utils/text.py
Convert to ASCII if 'allow_unicode' is False. Convert spaces or repeated
dashes to single dashes. Remove characters that aren't alphanumerics,
underscores, or hyphens. Convert to lowercase. Also strip leading and
trailing whitespace, dashes, and underscores.
"""
value = str(value)
if allow_unicode:
value = unicodedata.normalize('NFKC', value)
else:
value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore').decode('ascii')
value = re.sub(r'[^\w\s-]', '', value)
if whitespace:
return value.strip()
else:
return re.sub(r'[-\s]+', '-', value).strip('-_')
with open('exploits_raw.txt') as filein:
raw_txt = filein.read().split('\n\n')
if not os.path.exists('./exploits/'):
os.mkdir('exploits')
rank = 0
for para in raw_txt:
if not para:
continue
exploit = {}
try :
lines = para.split('\n')
while True:
if not lines[0]:
lines.pop(0)
else:
break
while True:
if not lines[-1]:
lines.pop()
else:
break
exploit['name'] = lines.pop(0)
exploit['info'] = lines.pop(0)
exploit['rank'] = int(snippet(exploit['info'], 'Rank ', ' Exploit'))
exploit['tags'] = ", ".join([slugify(t, whitespace=False) for t in snippet(exploit['info'],'Exploit', ' (')[3:].split(', ')])
exploit['charge'] = snippet(exploit['info'],'(', ')')
breaks = []
for idx, line in enumerate(lines):
if line and line[-1] in ['.', ':']:
breaks.append(idx)
else:
if idx not in breaks:
lines[-1] = lines[-1]+'.'
breaks.append(idx)
idx_flavor = breaks[-2]+1
if len(breaks) > 2:
for idx in breaks[:-2]:
lines[idx]+='\n'
exploit['text'] = ' '.join(lines[:idx_flavor]).replace('\n ','\n')
exploit['flavor'] = ' '.join(lines[idx_flavor:])
cardtext = """---
rank: {rank}
recharge: {charge}
tags: [{tags}]
---
#### {name}
*{info}*
{text}
*{flavor}*
""".format(**exploit)
# if exploit['rank'] > 1:
# continue
with open('exploits/'+slugify(exploit['name'])+'.md','w') as fileout:
fileout.write(cardtext)
except Exception as e:
print(para)
raise e