mirror of
https://github.com/olivierkes/manuskript.git
synced 2024-10-01 09:46:30 +13:00
Added data model for world and its items
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
This commit is contained in:
parent
674cebdea2
commit
ee881bdb17
4 changed files with 160 additions and 16 deletions
|
@ -9,10 +9,20 @@ realpath = os.path.realpath(__file__)
|
||||||
sys.path.insert(1, os.path.join(os.path.dirname(realpath), '..'))
|
sys.path.insert(1, os.path.join(os.path.dirname(realpath), '..'))
|
||||||
|
|
||||||
import manuskript.data as data
|
import manuskript.data as data
|
||||||
|
import manuskript.load_save.version_1 as v1
|
||||||
|
|
||||||
path = os.path.join(sys.path[1], "sample-projects/book-of-acts")
|
path = os.path.join(sys.path[1], "sample-projects/book-of-acts")
|
||||||
|
|
||||||
|
import time
|
||||||
|
|
||||||
|
start = time.time()
|
||||||
|
|
||||||
project = data.Project(path + ".msk")
|
project = data.Project(path + ".msk")
|
||||||
project.load()
|
project.load()
|
||||||
|
|
||||||
|
end = time.time()
|
||||||
|
duration = end - start
|
||||||
|
|
||||||
|
print(duration)
|
||||||
|
|
||||||
project.save()
|
project.save()
|
||||||
|
|
|
@ -9,6 +9,7 @@ from manuskript.data.status import StatusHost
|
||||||
from manuskript.data.settings import Settings
|
from manuskript.data.settings import Settings
|
||||||
from manuskript.data.characters import Characters
|
from manuskript.data.characters import Characters
|
||||||
from manuskript.data.plots import Plots
|
from manuskript.data.plots import Plots
|
||||||
|
from manuskript.data.world import World
|
||||||
from manuskript.data.outline import Outline
|
from manuskript.data.outline import Outline
|
||||||
from manuskript.data.revisions import Revisions
|
from manuskript.data.revisions import Revisions
|
||||||
from manuskript.io.mskFile import MskFile
|
from manuskript.io.mskFile import MskFile
|
||||||
|
@ -26,6 +27,7 @@ class Project:
|
||||||
self.settings = Settings(self.file.dir_path)
|
self.settings = Settings(self.file.dir_path)
|
||||||
self.characters = Characters(self.file.dir_path)
|
self.characters = Characters(self.file.dir_path)
|
||||||
self.plots = Plots(self.file.dir_path)
|
self.plots = Plots(self.file.dir_path)
|
||||||
|
self.world = World(self.file.dir_path)
|
||||||
self.outline = Outline(self.file.dir_path)
|
self.outline = Outline(self.file.dir_path)
|
||||||
self.revisions = Revisions(self.file.dir_path)
|
self.revisions = Revisions(self.file.dir_path)
|
||||||
|
|
||||||
|
@ -47,6 +49,7 @@ class Project:
|
||||||
self.settings.load()
|
self.settings.load()
|
||||||
self.characters.load()
|
self.characters.load()
|
||||||
self.plots.load()
|
self.plots.load()
|
||||||
|
self.world.load()
|
||||||
self.outline.load()
|
self.outline.load()
|
||||||
self.revisions.load()
|
self.revisions.load()
|
||||||
|
|
||||||
|
@ -63,6 +66,7 @@ class Project:
|
||||||
self.settings.save()
|
self.settings.save()
|
||||||
self.characters.save()
|
self.characters.save()
|
||||||
self.plots.save()
|
self.plots.save()
|
||||||
|
self.world.save()
|
||||||
self.outline.save()
|
self.outline.save()
|
||||||
#self.revisions.save()
|
#self.revisions.save()
|
||||||
|
|
||||||
|
|
116
manuskript/data/world.py
Normal file
116
manuskript/data/world.py
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# --!-- coding: utf8 --!--
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from manuskript.data.unique_id import UniqueIDHost, UniqueID
|
||||||
|
from manuskript.io.opmlFile import OpmlFile, OpmlOutlineItem
|
||||||
|
|
||||||
|
|
||||||
|
class WorldItem:
|
||||||
|
|
||||||
|
def __init__(self, world, UID: UniqueID, name: str):
|
||||||
|
self.world = world
|
||||||
|
|
||||||
|
self.UID = UID
|
||||||
|
self.name = name
|
||||||
|
self.description = None
|
||||||
|
self.passion = None
|
||||||
|
self.conflict = None
|
||||||
|
self.children = list()
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
return self.children.__iter__()
|
||||||
|
|
||||||
|
def load(self):
|
||||||
|
self.world.load()
|
||||||
|
|
||||||
|
|
||||||
|
class World:
|
||||||
|
|
||||||
|
def __init__(self, path):
|
||||||
|
self.file = OpmlFile(os.path.join(path, "world.opml"))
|
||||||
|
self.host = UniqueIDHost()
|
||||||
|
self.items = dict()
|
||||||
|
self.top = list()
|
||||||
|
|
||||||
|
def addItem(self, name: str) -> WorldItem:
|
||||||
|
item = WorldItem(self, self.host.newID(), name)
|
||||||
|
self.items[item.UID.value] = item
|
||||||
|
return item
|
||||||
|
|
||||||
|
def loadItem(self, ID: int, name: str) -> WorldItem:
|
||||||
|
item = WorldItem(self, self.host.loadID(ID), name)
|
||||||
|
self.items[item.UID.value] = item
|
||||||
|
return item
|
||||||
|
|
||||||
|
def removeItem(self, item: WorldItem):
|
||||||
|
self.host.removeID(item.UID)
|
||||||
|
self.items.pop(item.UID.value)
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
return self.items.values().__iter__()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def loadWorldItem(cls, world, outline: OpmlOutlineItem):
|
||||||
|
ID = outline.attributes.get("ID", None)
|
||||||
|
|
||||||
|
if ID is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
item = world.loadItem(int(ID), outline.attributes.get("name", None))
|
||||||
|
|
||||||
|
item.description = outline.attributes.get("description", None)
|
||||||
|
item.passion = outline.attributes.get("passion", None)
|
||||||
|
item.conflict = outline.attributes.get("conflict", None)
|
||||||
|
|
||||||
|
for child in outline.children:
|
||||||
|
childItem = cls.loadWorldItem(world, child)
|
||||||
|
|
||||||
|
if childItem is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
item.children.append(childItem)
|
||||||
|
|
||||||
|
return item
|
||||||
|
|
||||||
|
def load(self):
|
||||||
|
try:
|
||||||
|
outlines = self.file.load()
|
||||||
|
|
||||||
|
self.items.clear()
|
||||||
|
self.top.clear()
|
||||||
|
|
||||||
|
for outline in outlines:
|
||||||
|
item = World.loadWorldItem(self, outline)
|
||||||
|
|
||||||
|
if item is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
self.top.append(item)
|
||||||
|
except FileNotFoundError:
|
||||||
|
self.items.clear()
|
||||||
|
self.top.clear()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def saveWorldItem(cls, item: WorldItem):
|
||||||
|
outline = OpmlOutlineItem()
|
||||||
|
|
||||||
|
outline.attributes["name"] = item.name
|
||||||
|
outline.attributes["ID"] = str(item.UID.value)
|
||||||
|
outline.attributes["description"] = item.description
|
||||||
|
outline.attributes["passion"] = item.passion
|
||||||
|
outline.attributes["conflict"] = item.conflict
|
||||||
|
|
||||||
|
for childItem in item.children:
|
||||||
|
outline.children.append(cls.saveWorldItem(childItem))
|
||||||
|
|
||||||
|
return outline
|
||||||
|
|
||||||
|
def save(self):
|
||||||
|
outlines = list()
|
||||||
|
|
||||||
|
for item in self.top:
|
||||||
|
outlines.append(World.saveWorldItem(item))
|
||||||
|
|
||||||
|
self.file.save(outlines)
|
|
@ -7,10 +7,12 @@ from manuskript.io.xmlFile import XmlFile
|
||||||
|
|
||||||
class OpmlOutlineItem:
|
class OpmlOutlineItem:
|
||||||
|
|
||||||
def __init__(self, tag="outline"):
|
def __init__(self):
|
||||||
self.tag = tag
|
|
||||||
self.attributes = dict()
|
self.attributes = dict()
|
||||||
self.children = []
|
self.children = list()
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
return self.children.__iter__()
|
||||||
|
|
||||||
def keys(self):
|
def keys(self):
|
||||||
return self.attributes.keys()
|
return self.attributes.keys()
|
||||||
|
@ -23,7 +25,7 @@ class OpmlFile(XmlFile):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def loadOutline(cls, element):
|
def loadOutline(cls, element):
|
||||||
outline = OpmlOutlineItem(element.tag)
|
outline = OpmlOutlineItem()
|
||||||
|
|
||||||
for key in element.keys():
|
for key in element.keys():
|
||||||
outline.attributes[key] = element.get(key)
|
outline.attributes[key] = element.get(key)
|
||||||
|
@ -37,25 +39,37 @@ class OpmlFile(XmlFile):
|
||||||
tree = XmlFile.load(self)
|
tree = XmlFile.load(self)
|
||||||
root = tree.getroot()
|
root = tree.getroot()
|
||||||
|
|
||||||
return OpmlFile.loadOutline(root)
|
if root.tag != "opml":
|
||||||
|
raise IOError("No valid OPML!")
|
||||||
|
|
||||||
|
body = root.find("body")
|
||||||
|
|
||||||
|
if body is None:
|
||||||
|
return []
|
||||||
|
|
||||||
|
return [OpmlFile.loadOutline(element) for element in body.getchildren()]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def saveOutline(cls, outline, parent=None):
|
def saveOutline(cls, outline, parent):
|
||||||
if parent is None:
|
element = etree.SubElement(parent, "outline")
|
||||||
element = etree.Element(outline.tag)
|
|
||||||
else:
|
|
||||||
element = etree.SubElement(parent, outline.tag)
|
|
||||||
|
|
||||||
for key in outline.keys():
|
for (key, value) in outline.attributes.items():
|
||||||
element.attrib[key] = outline.attributes[key]
|
if value is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
element.attrib[key] = value
|
||||||
|
|
||||||
for child in outline.children:
|
for child in outline.children:
|
||||||
cls.saveOutline(child, element)
|
cls.saveOutline(child, element)
|
||||||
|
|
||||||
return element
|
|
||||||
|
|
||||||
def save(self, content):
|
def save(self, content):
|
||||||
root = OpmlFile.saveOutline(content)
|
root = etree.Element("opml")
|
||||||
tree = etree.ElementTree(root)
|
root.set("version", "1.0")
|
||||||
|
|
||||||
|
body = etree.SubElement(root, "body")
|
||||||
|
|
||||||
|
for outline in content:
|
||||||
|
OpmlFile.saveOutline(outline, body)
|
||||||
|
|
||||||
|
tree = etree.ElementTree(root)
|
||||||
XmlFile.save(self, tree)
|
XmlFile.save(self, tree)
|
||||||
|
|
Loading…
Reference in a new issue