stylus/backup/fileSaveLoad.js

97 lines
3.0 KiB
JavaScript

/* globals getStyles, saveStyle, invalidateCache, refreshAllTabs, handleUpdate */
'use strict';
var STYLISH_DUMP_FILE_EXT = '.txt';
var STYLISH_DUMPFILE_EXTENSION = '.json';
var STYLISH_DEFAULT_SAVE_NAME = 'stylus-mm-dd-yyyy' + STYLISH_DUMP_FILE_EXT;
/**
* !!works only when page has representation - backgound page won't work
*
* opens open file dialog,
* gets selected file,
* gets it's path,
* gets content of it by ajax
*/
function loadFromFile (formatToFilter) {
return new Promise(function (resolve) {
var fileInput = document.createElement('input');
fileInput.style = 'display: none;';
fileInput.type = 'file';
fileInput.accept = formatToFilter || STYLISH_DUMP_FILE_EXT;
fileInput.acceptCharset = 'utf-8';
document.body.appendChild(fileInput);
fileInput.initialValue = fileInput.value;
function changeHandler() {
if (fileInput.value !== fileInput.initialValue) {
var fReader = new FileReader();
fReader.onloadend = function (event) {
fileInput.removeEventListener('change', changeHandler);
fileInput.remove();
resolve(event.target.result);
};
fReader.readAsText(fileInput.files[0], 'utf-8');
}
}
fileInput.addEventListener('change', changeHandler);
fileInput.click();
});
}
function generateFileName() {
var today = new Date();
var dd = '0' + today.getDate();
var mm = '0' + (today.getMonth() + 1);
var yyyy = today.getFullYear();
dd = dd.substr(-2);
mm = mm.substr(-2);
today = mm + '-' + dd + '-' + yyyy;
return 'stylus-' + today + STYLISH_DUMPFILE_EXTENSION;
}
document.getElementById('file-all-styles').addEventListener('click', function () {
getStyles({}, function (styles) {
let text = JSON.stringify(styles);
let fileName = generateFileName() || STYLISH_DEFAULT_SAVE_NAME;
let url = 'data:text/plain;charset=utf-8,' + encodeURIComponent(text);
// for long URLs; https://github.com/schomery/stylish-chrome/issues/13#issuecomment-284582600
fetch(url)
.then(res => res.blob())
.then(blob => {
let a = document.createElement('a');
a.setAttribute('download', fileName);
a.setAttribute('href', URL.createObjectURL(blob));
a.dispatchEvent(new MouseEvent('click'));
});
});
});
document.getElementById('unfile-all-styles').addEventListener('click', () => {
loadFromFile(STYLISH_DUMPFILE_EXTENSION).then(rawText => {
const json = JSON.parse(rawText);
const numStyles = json.length;
invalidateCache(true);
proceed();
function proceed() {
const nextStyle = json.shift();
if (nextStyle) {
saveStyle(nextStyle, {notify: false}).then(style => {
handleUpdate(style);
setTimeout(proceed, 0);
});
} else {
refreshAllTabs().then(() => {
setTimeout(alert, 100, numStyles + ' styles installed/updated');
});
}
}
});
});