HTML5 Save Export Import

Local Storage Access. Mainly used for html5 game save export or import.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name              HTML5 Save Export Import
// @name:zh           HTML5游戏存档导入导出
// @namespace    http://tampermonkey.net/
// @icon  https://github.com/YuriSizuku/Kirikiroid2/releases/download/1.3.9_yuri/46031510_p0_icon.jpg
// @version      0.7.1
// @description  Local Storage Access. Mainly used for html5 game save export or import.
// @author       devseed
// @match        *://*/*
// @grant        none
// @require https://code.jquery.com/jquery-3.1.1.min.js
// ==/UserScript==

var $=jQuery;
var YURI = YURI || {};
(function($$) {
    "use strict";
    var _saveFile = (name, content) => {
        //console.log(name+" "+content);
        var e = document.createEvent('MouseEvents');
        var a = document.createElement('a');
        var blob = new Blob([content], {type:'application/octet-stream'});
        a.download = name;
        a.href = window.URL.createObjectURL(blob);
        a.dataset.downloadurl = ['application/octet-stream', a.download, a.href].join(':');
        e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
        a.dispatchEvent(e);
    }
    var _requestFiles =  (requestDone) => {
        var i = document.createElement('input');
        i.type = 'file';
        i.addEventListener('change', () => {
            requestDone(i.files);
        });
        i.click(); //can not open without user click
    }

    $$.storage = {
        saveFile:function(path, content) {
            _saveFile(path, content);
        },
        exportSave: function(isMerge) {
            isMerge = isMerge || true
            var key_value={};
            if(arguments.length > 1){
                for(var i=1;i<arguments.length;i++)
                    key_value[arguments[i]] = window.localStorage.getItem(arguments[i]);
            }
            else{
                for(var i=0;i<window.localStorage.length;i++)
                     key_value[window.localStorage.key(i)] =
                         window.localStorage.getItem(window.localStorage.key(i));
            }
            if(isMerge){
                var json = JSON.stringify(key_value);
                _saveFile("saves.json", json);
            } else{
                for (var k in key_value){
                    if(key_value[k]!=null)
                        _saveFile(k.toString()+".sav", key_value[k]);
                }
            }
        },
        importSave: function() {
            var requestDone = (files) => {
               var file = files[0];
               var reader = new FileReader();
               reader.onload = (e) =>{
                   var text=e.target.result;
                   var key_value = {};
                   //console.log(text);
                   if(file.type == 'application/json'){
                       key_value = JSON.parse(text);
                   }else{
                       var key = file.name.split('.');
                       key = key.slice(0, key.length-1).join('.');
                       key_value[key] = text;
                   }
                   for(var key in key_value){
                       window.localStorage.setItem(key, key_value[key]);
                   }
               }
               reader.readAsText(file);
            }
            _requestFiles(requestDone);
        },
    }
})(YURI) //initial functions


var button_export = button_export ||
    $('body').append('<input type="button" id="btn_export" value="Export saves" \
                       style="position relative;margin:0px 10px 0px 0px">')
             .find('#btn_export');
console.log(button_export)
var button_import = button_import ||
    $('body').append('<input type="button" id="btn_import" value="Import saves">')
             .find('#btn_import');

button_export.click(()=>YURI.storage.exportSave())
button_import.click(()=>YURI.storage.importSave())