I didn't realize but traits were completely broken in that version. I've fixed that in the script and also uploaded a new version in the drive link.
Code:
#!/usr/bin/env python3
from ebooklib import epub
from enum import Enum, auto
class Modes(Enum):
NAMEID = auto()
EFFECTSORDESC = auto()
DESC = auto()
EFFECTS = auto()
DONE = auto()
SKIP = auto()
def get_ancillaries(fname):
endtrait = '¬---------------\n'
mode = Modes.NAMEID
nameid = ''
name = ''
desc = ''
effects = ''
html = ''
with open(fname, encoding='utf_16_le') as f:
for line in f.readlines():
line = line.replace(r'\n', '</p><p>')
tokens = line.split()
if mode != Modes.SKIP:
if mode == Modes.NAMEID:
if line[0] == '{':
tokens = line.split('}')
if len(tokens) == 1:
# This probably shouldn't be included.
mode = Modes.SKIP
else:
nameid = tokens[0] + '}'
name = tokens[1].strip()
#print(f"{nameid} - {name} - {len(tokens)}")
if name == "GOD NOT DEFINED":
mode = Modes.SKIP
mode = Modes.EFFECTSORDESC
if line == endtrait:
mode = Modes.DONE
elif mode == Modes.EFFECTSORDESC:
if '_effects_desc' in line:
mode = Modes.EFFECTS
elif '_desc' in line:
mode = Modes.DESC
elif line == endtrait:
mode = Modes.DONE
elif mode == Modes.DESC:
if line[0] == '{':
mode = Modes.EFFECTS
else:
desc += line
if line == endtrait:
mode = Modes.DONE
elif mode == Modes.EFFECTS:
if line[0] == '{':
mode = Modes.DESC
else:
effects += line
if line == endtrait:
mode = Modes.DONE
if mode == Modes.DONE or mode == Modes.SKIP:
if mode != Modes.SKIP:
if desc or effects:
# Skip if neither desc or effects are defined
html += f'\n<h2>{name}</h2>\n<small><i>{nameid}</i></small>\n'
if desc:
html += f'<h3>Description</h3>\n{desc}\n'
if effects:
html += f'<h3>Effects</h3>\n<p>{effects}\n'
nameid = ''
name = ''
desc = ''
effects = ''
mode = Modes.NAMEID
return html
def get_vnvs(fname):
mode = Modes.NAMEID
nameid = ''
name = ''
desc = ''
effects = ''
html = ''
with open(fname, encoding='utf_16_le') as f:
for line in f.readlines():
line = line.replace(r'\n', '</p><p>')
tokens = line.split('}')
if mode != Modes.SKIP:
if mode == Modes.NAMEID:
if len(tokens) == 1:
# Probably the first line containing ¬
mode = Modes.SKIP
elif '_desc' in line:
# _desc with no nameid or epithet
mode = Modes.SKIP
elif 'GOD NOT DEFINED' in line:
mode = Modes.SKIP
else:
nameid = tokens[0] + '}'
name = tokens[1]
mode = Modes.EFFECTSORDESC
elif mode == Modes.EFFECTSORDESC:
if '_effects_desc' in line:
if not tokens[1].isspace():
effects = tokens[1]
mode = Modes.DONE
elif 'epithet_desc' in line:
# skip
pass
elif '_desc' in line:
if not tokens[1].isspace():
desc = tokens[1]
else:
mode = Modes.DONE
if mode == Modes.DONE or mode == Modes.SKIP:
if mode != Modes.SKIP:
if desc or effects:
# Skip if neither desc or effects are defined
html += f'\n<h2>{name}</h2>\n<small><i>{nameid}</i></small>\n'
if desc:
html += f'<h3>Description</h3>\n{desc}\n'
if effects:
html += f'<h3>Effects</h3>\n<p>{effects}\n'
#print(f"{name} - {nameid} - {desc} - {effects}")
nameid = ''
name = ''
desc = ''
effects = ''
mode = Modes.NAMEID
return html
if __name__ == "__main__":
traits = get_vnvs('export_vnvs.txt')
ancillaries = get_ancillaries('export_ancillaries.txt')
book = book = epub.EpubBook()
book.set_title('Europa Barbarorum II - Traits and Ancillaries')
book.add_metadata('DC', 'description', 'Traits and Ancillaries for easy reference')
c1 = epub.EpubHtml(title='Ancillaries',
file_name='ancillaries.xhtml',
lang='en')
c1.set_content(f"<html><body><h1>Ancillaries</h1>{ancillaries}</body></html>")
c2 = epub.EpubHtml(title='Traits',
file_name='traits.xhtml',
lang='en')
c2.set_content(f"<html><body><h1>Traits</h1>{traits}</body></html>")
book.add_item(c1)
book.add_item(c2)
book.toc = [c1, c2]
book.spine = [c1, c2]
epub.write_epub('Europa Barbarorum II - Traits and Ancillaries.epub', book)