diff --git a/bin/test_io.py b/bin/test_io.py index 02323eab..cf203a1e 100644 --- a/bin/test_io.py +++ b/bin/test_io.py @@ -8,7 +8,6 @@ realpath = os.path.realpath(__file__) sys.path.insert(1, os.path.join(os.path.dirname(realpath), '..')) -import manuskript.io as io import manuskript.data as data path = os.path.join(sys.path[1], "sample-projects/book-of-acts") diff --git a/manuskript/data/__init__.py b/manuskript/data/__init__.py index 36d07c88..0ce564b9 100644 --- a/manuskript/data/__init__.py +++ b/manuskript/data/__init__.py @@ -1,13 +1,15 @@ #!/usr/bin/env python # --!-- coding: utf8 --!-- +from manuskript.data.characters import Characters, Character +from manuskript.data.color import Color +from manuskript.data.goal import GoalKind, Goal +from manuskript.data.info import Info +from manuskript.data.labels import LabelHost, Label +from manuskript.data.outline import Outline, OutlineFolder, OutlineText from manuskript.data.plots import Plots, PlotLine, PlotStep from manuskript.data.project import Project -from manuskript.data.goal import GoalKind, Goal -from manuskript.data.outline import Outline, OutlineFolder, OutlineText from manuskript.data.revisions import Revisions -from manuskript.data.color import Color -from manuskript.data.labels import LabelHost, Label -from manuskript.data.status import StatusHost, Status from manuskript.data.settings import Settings +from manuskript.data.status import StatusHost, Status from manuskript.data.unique_id import UniqueIDHost, UniqueID diff --git a/manuskript/data/characters.py b/manuskript/data/characters.py new file mode 100644 index 00000000..e7d1f634 --- /dev/null +++ b/manuskript/data/characters.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python +# --!-- coding: utf8 --!-- + +import os + +from manuskript.data.color import Color +from manuskript.data.unique_id import UniqueIDHost +from manuskript.io.mmdFile import MmdFile + + +class Character: + + def __init__(self, path, characters): + self.file = MmdFile(path, 21) + self.characters = characters + + self.UID = None + self.name = None + self.importance = None + self.pov = True + self.motivation = None + self.goal = None + self.conflict = None + self.epiphany = None + self.summarySentence = None + self.summaryParagraph = None + self.summaryFull = None + self.notes = None + self.color = None + self.details = dict() + + @classmethod + def loadAttribute(cls, metadata: dict, name: str, defaultValue=None): + if name in metadata: + return metadata.pop(name) + else: + return defaultValue + + def load(self): + metadata, _ = self.file.loadMMD(True) + + ID = Character.loadAttribute(metadata, "ID") + + if ID is None: + raise IOError("Character is missing ID!") + + self.UID = self.characters.host.loadID(int(ID)) + self.name = Character.loadAttribute(metadata, "Name", None) + self.importance = Character.loadAttribute(metadata, "Importance", None) + self.pov = Character.loadAttribute(metadata, "POV", True) + self.motivation = Character.loadAttribute(metadata, "Motivation", None) + self.goal = Character.loadAttribute(metadata, "Goal", None) + self.conflict = Character.loadAttribute(metadata, "Conflict", None) + self.epiphany = Character.loadAttribute(metadata, "Epiphany", None) + self.summarySentence = Character.loadAttribute(metadata, "Phrase Summary", None) + self.summaryParagraph = Character.loadAttribute(metadata, "Paragraph Summary", None) + self.summaryFull = Character.loadAttribute(metadata, "Full Summary", None) + self.notes = Character.loadAttribute(metadata, "Notes", None) + self.color = Color.parse(Character.loadAttribute(metadata, "Color", None)) + + self.details.clear() + + for (key, value) in metadata.items(): + self.details[key] = value + + def save(self): + metadata = dict() + + for (key, value) in self.details.items(): + metadata[key] = value + + metadata["ID"] = str(self.UID.value) + metadata["Name"] = self.name + metadata["Importance"] = self.importance + metadata["POV"] = self.pov + metadata["Motivation"] = self.motivation + metadata["Goal"] = self.goal + metadata["Conflict"] = self.conflict + metadata["Epiphany"] = self.epiphany + metadata["Phrase Summary"] = self.summarySentence + metadata["Paragraph Summary"] = self.summaryParagraph + metadata["Full Summary"] = self.summaryFull + metadata["Notes"] = self.notes + metadata["Color"] = self.color + + self.file.save((metadata, None)) + + +class Characters: + + def __init__(self, path): + self.dir_path = os.path.join(path, "characters") + self.host = UniqueIDHost() + self.characters = list() + + def load(self): + self.characters.clear() + + for name in os.listdir(self.dir_path): + path = os.path.join(self.dir_path, name) + + if not os.path.isfile(path): + continue + + character = Character(path, self) + + try: + character.load() + except FileNotFoundError: + continue + + self.characters.append(character) + + def save(self): + for character in self.characters: + character.save() diff --git a/manuskript/data/labels.py b/manuskript/data/labels.py index 6c691e78..dea3ff71 100644 --- a/manuskript/data/labels.py +++ b/manuskript/data/labels.py @@ -67,6 +67,6 @@ class LabelHost: metadata = dict() for label in self.labels: - metadata[label.name] = str(label.color) + metadata[label.name] = label.color self.file.save((metadata, None)) diff --git a/manuskript/data/outline.py b/manuskript/data/outline.py index c2509d76..a58f2572 100644 --- a/manuskript/data/outline.py +++ b/manuskript/data/outline.py @@ -5,7 +5,7 @@ import os from enum import Enum, unique from manuskript.data.goal import Goal -from manuskript.data.unique_id import UniqueIDHost, UniqueID +from manuskript.data.unique_id import UniqueIDHost from manuskript.io.mmdFile import MmdFile @@ -23,8 +23,8 @@ class OutlineItem: self.outline = outline self.state = OutlineState.UNDEFINED - self.title = "" self.UID = None + self.title = "" self.type = "" self.summarySentence = None self.summaryFull = None diff --git a/manuskript/data/project.py b/manuskript/data/project.py index 7b6953d1..c3be32bd 100644 --- a/manuskript/data/project.py +++ b/manuskript/data/project.py @@ -7,6 +7,7 @@ from manuskript.data.summary import Summary from manuskript.data.labels import LabelHost from manuskript.data.status import StatusHost from manuskript.data.settings import Settings +from manuskript.data.characters import Characters from manuskript.data.plots import Plots from manuskript.data.outline import Outline from manuskript.data.revisions import Revisions @@ -23,6 +24,7 @@ class Project: self.labels = LabelHost(self.file.dir_path) self.statuses = StatusHost(self.file.dir_path) self.settings = Settings(self.file.dir_path) + self.characters = Characters(self.file.dir_path) self.plots = Plots(self.file.dir_path) self.outline = Outline(self.file.dir_path) self.revisions = Revisions(self.file.dir_path) @@ -43,6 +45,7 @@ class Project: self.labels.load() self.statuses.load() self.settings.load() + self.characters.load() self.plots.load() self.outline.load() self.revisions.load() @@ -58,6 +61,7 @@ class Project: self.labels.save() self.statuses.save() self.settings.save() + self.characters.save() self.plots.save() self.outline.save() #self.revisions.save()