From f9ad8d214c867b4be094e11485854e99ca3cb35f Mon Sep 17 00:00:00 2001 From: TheJackiMonster Date: Sun, 9 May 2021 01:15:14 +0200 Subject: [PATCH] Added io handling for project info, color and labels Signed-off-by: TheJackiMonster --- bin/test_io.py | 20 ----------- manuskript/data/__init__.py | 4 ++- manuskript/data/color.py | 26 ++++++++++++++ manuskript/data/info.py | 50 ++++++++++++++++++++++++++ manuskript/data/labels.py | 72 +++++++++++++++++++++++++++++++++++++ manuskript/data/project.py | 10 +++++- manuskript/data/summary.py | 5 ++- 7 files changed, 164 insertions(+), 23 deletions(-) create mode 100644 manuskript/data/color.py create mode 100644 manuskript/data/info.py create mode 100644 manuskript/data/labels.py diff --git a/bin/test_io.py b/bin/test_io.py index 3e5dcadd..02323eab 100644 --- a/bin/test_io.py +++ b/bin/test_io.py @@ -15,23 +15,3 @@ path = os.path.join(sys.path[1], "sample-projects/book-of-acts") project = data.Project(path + ".msk") project.load() - -for item in project.outline.all(): - print(str(item.title) + " " + str(item.goal)) - -settings = project.settings - -print(settings.properties) - -plots = project.plots - -revs = project.revisions - -for status in project.statuses: - print("--" + str(status)) - -#settings.set("saveToZip", True) -#project.save() - -#settings.set("saveToZip", False) -#project.save() diff --git a/manuskript/data/__init__.py b/manuskript/data/__init__.py index 526a9d5d..36d07c88 100644 --- a/manuskript/data/__init__.py +++ b/manuskript/data/__init__.py @@ -6,6 +6,8 @@ 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.settings import Settings +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.unique_id import UniqueIDHost, UniqueID diff --git a/manuskript/data/color.py b/manuskript/data/color.py new file mode 100644 index 00000000..12c5f2af --- /dev/null +++ b/manuskript/data/color.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python +# --!-- coding: utf8 --!-- + +import re + + +class Color: + + def __init__(self, red: int, green: int, blue: int): + self.red = red + self.green = green + self.blue = blue + + def __str__(self): + return "#%02x%02x%02x" % (self.red, self.green, self.blue) + + @classmethod + def parse(cls, string: str): + colorPattern = re.compile(r"\#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})") + + m = colorPattern.match(string) + + if m is None: + return None + + return Color(int(m.group(1), 16), int(m.group(2), 16), int(m.group(3), 16)) diff --git a/manuskript/data/info.py b/manuskript/data/info.py new file mode 100644 index 00000000..3758733e --- /dev/null +++ b/manuskript/data/info.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# --!-- coding: utf8 --!-- + +import os + +from manuskript.io.mmdFile import MmdFile + + +class Info: + + def __init__(self, path): + self.file = MmdFile(os.path.join(path, "infos.txt"), 16) + + self.title = None + self.subtitle = None + self.serie = None + self.volume = None + self.genre = None + self.license = None + self.author = None + self.email = None + + def load(self): + try: + metadata, _ = self.file.loadMMD(True) + except FileNotFoundError: + metadata = dict() + + self.title = metadata.get("Title", None) + self.subtitle = metadata.get("Subtitle", None) + self.serie = metadata.get("Serie", None) + self.volume = metadata.get("Volume", None) + self.genre = metadata.get("Genre", None) + self.license = metadata.get("License", None) + self.author = metadata.get("Author", None) + self.email = metadata.get("Email", None) + + def save(self): + metadata = dict() + + metadata["Title"] = self.title + metadata["Subtitle"] = self.subtitle + metadata["Serie"] = self.serie + metadata["Volume"] = self.volume + metadata["Genre"] = self.genre + metadata["License"] = self.license + metadata["Author"] = self.author + metadata["Email"] = self.email + + self.file.save((metadata, None)) diff --git a/manuskript/data/labels.py b/manuskript/data/labels.py new file mode 100644 index 00000000..6c691e78 --- /dev/null +++ b/manuskript/data/labels.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python +# --!-- coding: utf8 --!-- + +import os + +from manuskript.data.color import Color +from manuskript.io.mmdFile import MmdFile + + +class Label: + + def __init__(self, host, name: str, color: Color): + self.host = host + + self.name = name + self.color = color + + def __str__(self): + return self.name + + def load(self): + self.host.load() + + def save(self): + self.host.save() + + +class LabelHost: + + def __init__(self, path): + self.file = MmdFile(os.path.join(path, "labels.txt"), 21) + self.labels = dict() + + def addLabel(self, name: str, color: Color): + self.labels[name] = Label(self, name, color) + + def removeLabel(self, name: str): + self.labels.pop(name) + + def renameLabel(self, oldName: str, newName: str): + label = self.labels.get(oldName) + label.name = newName + self.labels[newName] = label + self.labels.pop(oldName) + + def getLabel(self, name: str): + return self.labels.get(name) + + def __iter__(self): + return self.labels.values().__iter__() + + def load(self): + try: + metadata, _ = self.file.loadMMD(True) + self.labels.clear() + except FileNotFoundError: + self.labels.clear() + return + + for (name, value) in metadata.items(): + if value is None: + continue + + self.addLabel(name, Color.parse(value)) + + def save(self): + metadata = dict() + + for label in self.labels: + metadata[label.name] = str(label.color) + + self.file.save((metadata, None)) diff --git a/manuskript/data/project.py b/manuskript/data/project.py index c7211535..7b6953d1 100644 --- a/manuskript/data/project.py +++ b/manuskript/data/project.py @@ -2,7 +2,9 @@ # --!-- coding: utf8 --!-- from zipfile import BadZipFile +from manuskript.data.info import Info 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.plots import Plots @@ -16,7 +18,9 @@ class Project: def __init__(self, path): self.file = MskFile(path) + self.info = Info(self.file.dir_path) self.summary = Summary(self.file.dir_path) + self.labels = LabelHost(self.file.dir_path) self.statuses = StatusHost(self.file.dir_path) self.settings = Settings(self.file.dir_path) self.plots = Plots(self.file.dir_path) @@ -34,7 +38,9 @@ class Project: except FileNotFoundError: return + self.info.load() self.summary.load() + self.labels.load() self.statuses.load() self.settings.load() self.plots.load() @@ -47,7 +53,9 @@ class Project: saveToZip = self.settings.isEnabled("saveToZip") self.file.setZipFile(saveToZip) - self.summary.load() + self.info.save() + self.summary.save() + self.labels.save() self.statuses.save() self.settings.save() self.plots.save() diff --git a/manuskript/data/summary.py b/manuskript/data/summary.py index 05a57723..88aabda6 100644 --- a/manuskript/data/summary.py +++ b/manuskript/data/summary.py @@ -17,7 +17,10 @@ class Summary: self.full = None def load(self): - metadata, _ = self.file.loadMMD(True) + try: + metadata, _ = self.file.loadMMD(True) + except FileNotFoundError: + metadata = dict() self.sentence = metadata.get("Sentence", None) self.paragraph = metadata.get("Paragraph", None)