aboutsummaryrefslogtreecommitdiff
path: root/src_js/opcut/fs.js
diff options
context:
space:
mode:
Diffstat (limited to 'src_js/opcut/fs.js')
-rw-r--r--src_js/opcut/fs.js71
1 files changed, 71 insertions, 0 deletions
diff --git a/src_js/opcut/fs.js b/src_js/opcut/fs.js
new file mode 100644
index 0000000..b1d464e
--- /dev/null
+++ b/src_js/opcut/fs.js
@@ -0,0 +1,71 @@
+import h from 'hyperscript';
+import FileSaver from 'file-saver';
+
+import * as ev from 'opcut/ev';
+
+
+export function loadText(ext) {
+ const el = h('input', {
+ style: 'display: none',
+ type: 'file',
+ accept: ext});
+ const promise = new Promise(resolve => {
+ ev.on(el, 'change', evt => {
+ const file = u.get(['files', 0], evt.target);
+ if (!file)
+ return;
+ const fileReader = new FileReader();
+ fileReader.onload = () => {
+ const data = fileReader.result;
+ resolve(data);
+ };
+ fileReader.readAsText(file);
+ });
+ el.click();
+ });
+ return promise;
+}
+
+
+export function saveText(text, fileName) {
+ const blob = stringToBlob(text);
+ FileSaver.saveAs(blob, fileName);
+}
+
+
+export function saveB64Data(b64Data, fileName) {
+ const blob = b64ToBlob(b64Data);
+ FileSaver.saveAs(blob, fileName);
+}
+
+
+function stringToBlob(strData, contentType) {
+ contentType = contentType || '';
+ return new Blob([strData], {type: contentType});
+}
+
+
+// http://stackoverflow.com/a/16245768
+function b64ToBlob(b64Data, contentType, sliceSize) {
+ contentType = contentType || '';
+ sliceSize = sliceSize || 512;
+
+ var byteCharacters = atob(b64Data);
+ var byteArrays = [];
+
+ for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
+ var slice = byteCharacters.slice(offset, offset + sliceSize);
+
+ var byteNumbers = new Array(slice.length);
+ for (var i = 0; i < slice.length; i++) {
+ byteNumbers[i] = slice.charCodeAt(i);
+ }
+
+ var byteArray = new Uint8Array(byteNumbers);
+
+ byteArrays.push(byteArray);
+ }
+
+ var blob = new Blob(byteArrays, {type: contentType});
+ return blob;
+}