Lutz Roeder 7 лет назад
Родитель
Сommit
fd3f0d3086
5 измененных файлов с 111 добавлено и 70 удалено
  1. 1 1
      setup.py
  2. 101 0
      src/tar.js
  3. 1 0
      src/view-browser.html
  4. 1 0
      src/view-electron.html
  5. 7 69
      src/zip.js

+ 1 - 1
setup.py

@@ -95,7 +95,7 @@ setuptools.setup(
             'caffe2-model.js', 'caffe2-metadata.json', 'caffe2.js',
             'mxnet-model.js', 'mxnet-metadata.json',
             'pytorch-model.js', 'pytorch-metadata.json', 'pickle.js',
-            'numpy.js', 'zip.js',
+            'numpy.js', 'zip.js', 'tar.js',
             'view-browser.html', 'view-browser.js',
             'view-render.css', 'view-render.js',
             'view-sidebar.css', 'view-sidebar.js',

+ 101 - 0
src/tar.js

@@ -0,0 +1,101 @@
+/*jshint esversion: 6 */
+
+var tar = tar || {};
+
+tar.Archive = class {
+
+    constructor(buffer) {
+        this._entries = [];
+        var reader = new tar.Reader(buffer, 0, buffer.length);
+        while (reader.peek()) {
+            this._entries.push(new tar.Entry(reader));
+            if (reader.match(512, 0)) {
+                break;
+            }
+        }
+    }
+
+    get entries() {
+        return this._entries;
+    }
+
+};
+
+tar.Entry = class {
+
+    constructor(reader) {
+        this._name = reader.readString(100);
+        reader.readString(8); // file mode
+        reader.readString(8); // owner
+        reader.readString(8); // group
+        var size = parseInt(reader.readString(12), 8); // size
+        reader.readString(12); // timestamp
+        reader.readString(8); // checksum
+        reader.readString(1); // link indicator
+        reader.readString(100); // name of linked file
+        reader.read(255);
+        this._data = reader.read(size);
+        reader.read(((size % 512) != 0) ? (512 - (size % 512)) : 0);
+    }
+
+    get name() {
+        return this._name;
+    }
+
+    get data() {
+        return this._data; 
+    }
+};
+
+tar.Reader = class {
+
+    constructor(buffer) {
+        this._buffer = buffer;
+        this._position = 0;
+        this._end = buffer.length;
+    }
+
+    peek() {
+        return this._position < this._end;
+    }
+
+    match(size, value) {
+        if (this._position + size <= this._end) {
+            if (this._buffer.subarray(this._position, this._position + size).every((c) => c == value)) {
+                this._position += size;
+                return true;
+            }
+        }
+        return false;
+    }
+
+    read(size) {
+        if (this._position + size > this._end) {
+            throw new tar.Error('Data not available.');
+        }
+        var data = this._buffer.subarray(this._position, this._position + size);
+        this._position += size;
+        return data;
+    }
+
+    readString(size) {
+        var buffer = this.read(size);
+        var position = 0;
+        var str = '';
+        for (var i = 0; i < size; i++) {
+            var c = buffer[position++];
+            if (c == 0) {
+                break;
+            }
+            str += String.fromCharCode(c);
+        }
+        return str;
+    }
+};
+
+tar.Error = class extends Error {
+    constructor(message) {
+        super(message);
+        this.name = 'tar Error';
+    }
+};

+ 1 - 0
src/view-browser.html

@@ -79,6 +79,7 @@
 <script type='text/javascript' src='marked.min.js'></script>
 <script type='text/javascript' src='pako.min.js'></script>
 <script type='text/javascript' src='zip.js'></script>
+<script type='text/javascript' src='tar.js'></script>
 <script type='text/javascript' src='onnx-model.js'></script>
 <script type='text/javascript' src='tf-model.js'></script>
 <script type='text/javascript' src='tflite-model.js'></script>

+ 1 - 0
src/view-electron.html

@@ -68,6 +68,7 @@
 <script type='text/javascript' src='../node_modules/handlebars/dist/handlebars.min.js'></script>
 <script type='text/javascript' src='../node_modules/marked/marked.min.js'></script>
 <script type='text/javascript' src='zip.js'></script>
+<script type='text/javascript' src='tar.js'></script>
 <script type='text/javascript' src='onnx-model.js'></script>
 <script type='text/javascript' src='tf-model.js'></script>
 <script type='text/javascript' src='tflite-model.js'></script>

+ 7 - 69
src/zip.js

@@ -494,29 +494,16 @@ zip.Reader = class {
         return this.readUint16() | (this.readUint16() << 16);
     }
 
-    readString(size) {
+    readString() {
         var result = '';
-        if (size) {
-            while (size > 0) {
-                var c = this.readByte();
-                size--;
-                if (c == 0) {
-                    break;
-                }
-                result += String.fromCharCode(c);
-            }
-            this._position += size;
+        var end = this._buffer.indexOf(0x00, this._position);
+        if (end < 0) {
+            throw new zip.Error('End of string not found.');
         }
-        else {
-            var end = this._buffer.indexOf(0x00, this._position);
-            if (end < 0) {
-                throw new zip.Error('End of string not found.');
-            }
-            while (this._position < end) {
-                result += String.fromCharCode(this._buffer[this._position++]);
-            }
-            this._position++;
+        while (this._position < end) {
+            result += String.fromCharCode(this._buffer[this._position++]);
         }
+        this._position++;
         return result;
     }
 
@@ -599,52 +586,3 @@ gzip.Entry = class {
     }
 
 };
-
-var tar = tar || {};
-
-tar.Archive = class {
-
-    constructor(buffer) {
-        var reader = new zip.Reader(buffer, 0, buffer.length);
-
-        this._entries = [];
-
-        var emptyHeader = new Uint8Array(512);
-
-        while (reader.peek() && !reader.match(emptyHeader)) {
-            this._entries.push(new tar.Entry(reader));
-        }
-    }
-
-    get entries() {
-        return this._entries;
-    }
-
-};
-
-tar.Entry = class {
-
-    constructor(reader) {
-        this._name = reader.readString(100);
-        reader.readString(8); // file mode
-        reader.readString(8); // owner
-        reader.readString(8); // group
-        var size = parseInt(reader.readString(12), 8); // size
-        reader.readString(12); // timestamp
-        reader.readString(8); // checksum
-        reader.readString(1); // link indicator
-        reader.readString(100); // name of linked file
-        reader.read(255);
-        this._data = reader.read(size);
-        reader.read(((size % 512) != 0) ? (512 - (size % 512)) : 0);
-    }
-
-    get name() {
-        return this._name;
-    }
-
-    get data() {
-        return this._data; 
-    }
-
-};