Billy Barrow 3 gadi atpakaļ
vecāks
revīzija
fce585dd8a
3 mainītis faili ar 93 papildinājumiem un 10 dzēšanām
  1. 1 1
      ppix_builder.py
  2. 13 9
      ppub_builder.py
  3. 79 0
      ppvm.py

+ 1 - 1
ppix_builder.py

@@ -177,7 +177,7 @@ if(__name__ == "__main__"):
     print("{} publication(s)".format(ix.get_publications_count()))
     print("{} tag(s)".format(ix.get_tags_count()))
     for tag in ix.get_tags():
-        print(tag);
+        print(tag)
     word = "ethics"
     col = ix.find_word_matches(word)
     if(col != None):

+ 13 - 9
ppub_builder.py

@@ -1,3 +1,4 @@
+from io import BytesIO, StringIO
 from PyPPUB.asset import Asset
 from PyPPUB.asset_index import AssetIndex
 from PyPPUB.metadata import Metadata
@@ -11,21 +12,23 @@ class PpubBuilder:
         self.metadata = Metadata()
 
 
-    def add_asset(self, path, mimetype, data, flags = None):
-        self.assets.append(BuilderAsset(path, mimetype, data, flags))
+    def add_asset(self, path, mimetype, data, flags = None, streamable = False):
+        self.assets.append(BuilderAsset(path, mimetype, BytesIO(data), flags, streamable))
 
     def write_to_stream(self, stream):
         stream.write(b"ppub\n")
         data_blob = b""
         index = AssetIndex()
-        assets = [BuilderAsset("metadata", "application/x-ppub-metadata", str(self.metadata).encode('utf-8')),] + self.assets
+        assets = [BuilderAsset("metadata", "application/x-ppub-metadata", BytesIO(str(self.metadata).encode('utf-8'))),] + self.assets
         for builder_asset in assets:
             start_location = len(data_blob)
-            asset_data = builder_asset.data
-            asset_data_gzip = gzip.compress(asset_data, 9)
-            if(len(asset_data) > len(asset_data_gzip)):
-                asset_data = asset_data_gzip
-                builder_asset.flags.append("gzip")
+            asset_data = builder_asset.data.read()
+            if(not builder_asset.streamable):
+                asset_data_gzip = gzip.compress(asset_data, 9)
+                if(len(asset_data) > len(asset_data_gzip)):
+                    asset_data = asset_data_gzip
+                    builder_asset.flags.append("gzip")
+                    
             data_blob += asset_data
             end_location = len(data_blob)
             asset = Asset(builder_asset.path, builder_asset.mimetype, start_location, end_location, builder_asset.flags)
@@ -37,10 +40,11 @@ class PpubBuilder:
         stream.write(data_blob)
 
 class BuilderAsset:
-    def __init__(self, path, mimetype, data, flags = None):
+    def __init__(self, path, mimetype, data, flags = None, streamable = False):
         self.path = path
         self.mimetype = mimetype
         self.data = data
         self.flags = flags
+        self.streamable = streamable
         if(self.flags == None):
             self.flags = []

+ 79 - 0
ppvm.py

@@ -0,0 +1,79 @@
+
+
+class FileEntry:
+    def __init__(self, type, label, filename, meta):
+        self.type = type
+        self.filename = filename
+        self.label = label
+        self.metadata = meta
+
+    @staticmethod
+    def from_string(string):
+        parts = string.split(":", 2)
+        type = parts[0]
+        parts = parts[1].split(",", 3)
+        label = parts[0].strip()
+        filename = parts[1].strip()
+        
+        meta = {}
+        for property in parts[2].split("\";"):
+            if(property == ""):
+                continue
+            data = property.split("=\"")
+            meta[data[0].strip()] = data[1].strip()
+
+        return FileEntry(type, label, filename, meta)
+
+    def __str__(self) -> str:
+        meta = ""
+        for key in self.metadata:
+            meta += " {}=\"{}\";".format(key, self.metadata[key])
+        
+        return "{}: {}, {},{}".format(self.type, self.label, self.filename, meta)
+
+class Ppvm:
+
+    def __init__(self, files, metadata):
+        self.files = files
+        self.metadata = metadata
+
+    @staticmethod
+    def from_string(string: str):
+        lines = string.split("\n")
+        if lines[0] != "PPVM":
+            raise Exception("Not a PPVM string")
+
+        line_count = 1
+        metadata = {}
+        while True:
+            line = lines[line_count]
+            line_count += 1
+            if(line == ""):
+                break
+
+            parts = line.split(":", 2)
+            metadata[parts[0]] = parts[1].strip()
+
+        entries = []
+        while len(lines) > line_count:
+            line = lines[line_count]
+            line_count += 1
+            if(line == ""):
+                continue
+            entries.append(FileEntry.from_string(line))
+
+        return Ppvm(entries, metadata)
+        
+
+    def __str__(self) -> str:
+        string = "PPVM\n"
+        for key in self.metadata:
+            string += "{}: {}\n".format(key, self.metadata[key])
+
+        string += "\n"
+
+        for file in self.files:
+            string += "{}\n".format(file)
+
+        string += "\n"
+        return string