2013-04-13 18:11:54 +00:00
|
|
|
define(["jquery", "google-helper", "dropbox-helper", "github-helper", "synchronizer", "publisher", "underscore"],
|
2013-04-11 22:38:41 +00:00
|
|
|
function($, googleHelper, dropboxHelper, githubHelper, synchronizer, publisher) {
|
2013-04-02 18:42:47 +00:00
|
|
|
|
|
|
|
var fileManager = {};
|
|
|
|
|
2013-04-10 18:14:59 +00:00
|
|
|
// Dependencies
|
|
|
|
var core = undefined;
|
|
|
|
|
2013-04-13 18:11:54 +00:00
|
|
|
// Defines the current file
|
|
|
|
var currentFileIndex = localStorage["file.current"];
|
|
|
|
fileManager.getCurrentFileIndex = function() {
|
|
|
|
return currentFileIndex;
|
|
|
|
};
|
|
|
|
fileManager.isCurrentFileIndex = function(fileIndex) {
|
|
|
|
return fileIndex == currentFileIndex;
|
|
|
|
};
|
|
|
|
fileManager.setCurrentFileIndex = function(fileIndex) {
|
|
|
|
currentFileIndex = fileIndex;
|
|
|
|
// Sanity check since we are going to modify current file in localStorage
|
|
|
|
core.checkWindowUnique();
|
|
|
|
if(fileIndex === undefined) {
|
|
|
|
localStorage.removeItem("file.current");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
localStorage["file.current"] = fileIndex;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-04-02 18:42:47 +00:00
|
|
|
// Caution: this function recreate the editor (reset undo operations)
|
|
|
|
var fileDescList = [];
|
|
|
|
fileManager.selectFile = function(fileIndex) {
|
|
|
|
// If no file create one
|
|
|
|
if (localStorage["file.list"].length === 1) {
|
|
|
|
fileIndex = this.createFile();
|
|
|
|
}
|
|
|
|
|
|
|
|
if(fileIndex !== undefined) {
|
2013-04-13 18:11:54 +00:00
|
|
|
fileManager.setCurrentFileIndex(fileIndex);
|
2013-04-02 18:42:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Update the file titles
|
2013-04-10 23:13:31 +00:00
|
|
|
fileManager.updateFileTitles();
|
2013-04-20 00:14:20 +00:00
|
|
|
synchronizer.refreshManageSync();
|
2013-04-14 13:24:29 +00:00
|
|
|
publisher.notifyPublish();
|
2013-04-02 18:42:47 +00:00
|
|
|
|
|
|
|
// Recreate the editor
|
2013-04-13 18:11:54 +00:00
|
|
|
fileIndex = fileManager.getCurrentFileIndex();
|
2013-04-02 18:42:47 +00:00
|
|
|
$("#wmd-input").val(localStorage[fileIndex + ".content"]);
|
|
|
|
core.createEditor(function() {
|
|
|
|
fileManager.saveFile();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
fileManager.createFile = function(title, content, syncIndexes) {
|
|
|
|
content = content || "";
|
|
|
|
syncIndexes = syncIndexes || [];
|
|
|
|
if (!title) {
|
|
|
|
// Create a file title
|
|
|
|
title = DEFAULT_FILE_TITLE;
|
|
|
|
var indicator = 2;
|
2013-04-13 18:11:54 +00:00
|
|
|
while(_.some(fileDescList, function(fileDesc) {
|
|
|
|
return fileDesc.title == title;
|
|
|
|
})) {
|
2013-04-02 18:42:47 +00:00
|
|
|
title = DEFAULT_FILE_TITLE + indicator++;
|
|
|
|
}
|
|
|
|
}
|
2013-04-11 22:38:41 +00:00
|
|
|
|
|
|
|
// Generate a unique fileIndex
|
|
|
|
var fileIndex = undefined;
|
|
|
|
do {
|
|
|
|
fileIndex = "file." + core.randomString();
|
2013-04-13 18:11:54 +00:00
|
|
|
} while(_.has(localStorage, fileIndex + ".title"));
|
2013-04-11 22:38:41 +00:00
|
|
|
|
2013-04-02 18:42:47 +00:00
|
|
|
// Create the file in the localStorage
|
|
|
|
localStorage[fileIndex + ".content"] = content;
|
|
|
|
localStorage[fileIndex + ".title"] = title;
|
2013-04-13 18:11:54 +00:00
|
|
|
var sync = _.reduce(syncIndexes, function(sync, syncIndex) {
|
|
|
|
return sync + syncIndex + ";";
|
|
|
|
}, ";");
|
2013-04-02 18:42:47 +00:00
|
|
|
localStorage[fileIndex + ".sync"] = sync;
|
2013-04-09 07:58:06 +00:00
|
|
|
localStorage[fileIndex + ".publish"] = ";";
|
2013-04-02 18:42:47 +00:00
|
|
|
localStorage["file.list"] += fileIndex + ";";
|
|
|
|
return fileIndex;
|
|
|
|
};
|
|
|
|
|
|
|
|
fileManager.deleteFile = function(fileIndex) {
|
2013-04-13 18:11:54 +00:00
|
|
|
fileIndex = fileIndex || fileManager.getCurrentFileIndex();
|
|
|
|
if(fileManager.isCurrentFileIndex(fileIndex)) {
|
|
|
|
// Unset the current fileIndex
|
|
|
|
fileManager.setCurrentFileIndex();
|
2013-04-02 18:42:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Remove synchronized locations
|
2013-04-13 18:11:54 +00:00
|
|
|
var syncIndexList = _.compact(localStorage[fileIndex + ".sync"].split(";"));
|
2013-04-02 18:42:47 +00:00
|
|
|
localStorage.removeItem(fileIndex + ".sync");
|
2013-04-13 18:11:54 +00:00
|
|
|
_.each(syncIndexList, function(syncIndex) {
|
|
|
|
fileManager.removeSync(syncIndex);
|
|
|
|
});
|
2013-04-11 22:38:41 +00:00
|
|
|
|
|
|
|
// Remove publish locations
|
2013-04-13 18:11:54 +00:00
|
|
|
var publishIndexList = _.compact(localStorage[fileIndex + ".publish"].split(";"));
|
|
|
|
localStorage.removeItem(fileIndex + ".publish");
|
|
|
|
_.each(publishIndexList, function(publishIndex) {
|
2013-04-11 22:38:41 +00:00
|
|
|
fileManager.removePublish(publishIndex);
|
2013-04-13 18:11:54 +00:00
|
|
|
});
|
2013-04-02 18:42:47 +00:00
|
|
|
|
|
|
|
localStorage["file.list"] = localStorage["file.list"].replace(";"
|
|
|
|
+ fileIndex + ";", ";");
|
|
|
|
localStorage.removeItem(fileIndex + ".title");
|
|
|
|
localStorage.removeItem(fileIndex + ".content");
|
|
|
|
};
|
|
|
|
|
|
|
|
fileManager.saveFile = function() {
|
|
|
|
var content = $("#wmd-input").val();
|
2013-04-13 18:11:54 +00:00
|
|
|
var fileIndex = fileManager.getCurrentFileIndex();
|
2013-04-02 18:42:47 +00:00
|
|
|
localStorage[fileIndex + ".content"] = content;
|
2013-04-10 18:14:59 +00:00
|
|
|
synchronizer.notifyChange(fileIndex);
|
2013-04-02 18:42:47 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
fileManager.updateFileTitles = function() {
|
|
|
|
$("#file-selector").empty();
|
2013-04-14 13:24:29 +00:00
|
|
|
fileDescList = _.chain(localStorage["file.list"].split(";")).compact()
|
2013-04-13 18:11:54 +00:00
|
|
|
.reduce(function(fileDescList, fileIndex) {
|
|
|
|
var title = localStorage[fileIndex + ".title"];
|
|
|
|
fileDescList.push({ index : fileIndex, title : title });
|
|
|
|
return fileDescList;
|
|
|
|
}, [])
|
|
|
|
.sortBy(function(fileDesc) {
|
|
|
|
return fileDesc.title.toLowerCase();
|
|
|
|
}).value();
|
2013-04-02 18:42:47 +00:00
|
|
|
|
2013-04-13 18:11:54 +00:00
|
|
|
var fileIndex = fileManager.getCurrentFileIndex();
|
2013-04-02 18:42:47 +00:00
|
|
|
// If no default file take first one
|
2013-04-13 18:11:54 +00:00
|
|
|
if (fileIndex === undefined) {
|
2013-04-02 18:42:47 +00:00
|
|
|
fileIndex = fileDescList[0].index;
|
2013-04-13 18:11:54 +00:00
|
|
|
fileManager.setCurrentFileIndex(fileIndex);
|
2013-04-02 18:42:47 +00:00
|
|
|
}
|
|
|
|
|
2013-04-20 17:40:05 +00:00
|
|
|
synchronizer.resetSyncFlags();
|
2013-04-02 18:42:47 +00:00
|
|
|
function composeTitle(fileIndex) {
|
2013-04-07 15:22:13 +00:00
|
|
|
var result = " " + localStorage[fileIndex + ".title"];
|
2013-04-20 17:40:05 +00:00
|
|
|
var providerIdList = synchronizer.getSyncProvidersFromFile(fileIndex);
|
|
|
|
_.each(providerIdList, function(providerId) {
|
|
|
|
result = '<i class="icon-' + providerId '"></i>' + result;
|
|
|
|
});
|
2013-04-02 18:42:47 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Update the file title
|
|
|
|
var title = localStorage[fileIndex + ".title"];
|
|
|
|
document.title = "StackEdit - " + title;
|
|
|
|
$("#file-title").html(composeTitle(fileIndex));
|
|
|
|
$(".file-title").text(title);
|
|
|
|
$("#file-title-input").val(title);
|
|
|
|
|
|
|
|
// Update the file selector
|
|
|
|
$("#file-selector").empty();
|
2013-04-14 13:24:29 +00:00
|
|
|
_.each(fileDescList, function(fileDesc) {
|
2013-04-02 18:42:47 +00:00
|
|
|
var a = $("<a>").html(composeTitle(fileDesc.index));
|
|
|
|
var li = $("<li>").append(a);
|
|
|
|
if (fileDesc.index == fileIndex) {
|
|
|
|
li.addClass("disabled");
|
|
|
|
} else {
|
|
|
|
a.prop("href", "#").click((function(fileIndex) {
|
|
|
|
return function() {
|
2013-04-13 18:11:54 +00:00
|
|
|
fileManager.selectFile(fileIndex);
|
2013-04-02 18:42:47 +00:00
|
|
|
};
|
|
|
|
})(fileDesc.index));
|
|
|
|
}
|
2013-04-14 13:24:29 +00:00
|
|
|
$("#file-selector").append(li);
|
|
|
|
});
|
2013-04-02 18:42:47 +00:00
|
|
|
};
|
|
|
|
|
2013-04-14 13:24:29 +00:00
|
|
|
// Remove a syncIndex (synchronized location)
|
2013-04-13 18:11:54 +00:00
|
|
|
fileManager.removeSync = function(syncIndex) {
|
2013-04-14 13:24:29 +00:00
|
|
|
var fileIndex = fileManager.getFileIndexFromSync(syncIndex);
|
2013-04-02 18:42:47 +00:00
|
|
|
if(fileIndex !== undefined) {
|
|
|
|
localStorage[fileIndex + ".sync"] = localStorage[fileIndex + ".sync"].replace(";"
|
2013-04-13 18:11:54 +00:00
|
|
|
+ syncIndex + ";", ";");
|
2013-04-14 13:24:29 +00:00
|
|
|
if(fileManager.isCurrentFileIndex(fileIndex)) {
|
2013-04-20 00:14:20 +00:00
|
|
|
synchronizer.refreshManageSync();
|
2013-04-02 18:42:47 +00:00
|
|
|
}
|
|
|
|
}
|
2013-04-20 00:14:20 +00:00
|
|
|
// Remove sync attributes
|
|
|
|
localStorage.removeItem(syncIndex);
|
2013-04-02 18:42:47 +00:00
|
|
|
};
|
|
|
|
|
2013-04-14 13:24:29 +00:00
|
|
|
// Get the fileIndex associated to a syncIndex
|
2013-04-13 18:11:54 +00:00
|
|
|
fileManager.getFileIndexFromSync = function(syncIndex) {
|
2013-04-14 13:24:29 +00:00
|
|
|
return _.chain(localStorage["file.list"].split(";")).compact()
|
|
|
|
.find(function(fileIndex) {
|
|
|
|
var sync = localStorage[fileIndex + ".sync"];
|
|
|
|
return sync.indexOf(";" + syncIndex + ";") !== -1;
|
|
|
|
}).value();
|
2013-04-02 18:42:47 +00:00
|
|
|
};
|
|
|
|
|
2013-04-14 13:24:29 +00:00
|
|
|
// Remove a publishIndex (publish location)
|
2013-04-11 22:38:41 +00:00
|
|
|
fileManager.removePublish = function(publishIndex) {
|
2013-04-14 13:24:29 +00:00
|
|
|
var fileIndex = fileManager.getFileIndexFromPublish(publishIndex);
|
2013-04-11 22:38:41 +00:00
|
|
|
if(fileIndex !== undefined) {
|
|
|
|
localStorage[fileIndex + ".publish"] = localStorage[fileIndex + ".publish"].replace(";"
|
|
|
|
+ publishIndex + ";", ";");
|
2013-04-14 13:24:29 +00:00
|
|
|
if(fileManager.isCurrentFileIndex(fileIndex)) {
|
|
|
|
publisher.notifyPublish();
|
2013-04-11 22:38:41 +00:00
|
|
|
}
|
|
|
|
}
|
2013-04-20 00:14:20 +00:00
|
|
|
// Remove publish attributes
|
2013-04-11 22:38:41 +00:00
|
|
|
localStorage.removeItem(publishIndex);
|
|
|
|
};
|
|
|
|
|
2013-04-14 13:24:29 +00:00
|
|
|
// Get the fileIndex associated to a publishIndex
|
2013-04-11 22:38:41 +00:00
|
|
|
fileManager.getFileIndexFromPublish = function(publishIndex) {
|
2013-04-14 13:24:29 +00:00
|
|
|
return _.chain(localStorage["file.list"].split(";")).compact()
|
|
|
|
.find(function(fileIndex) {
|
|
|
|
var sync = localStorage[fileIndex + ".publish"];
|
|
|
|
return sync.indexOf(";" + publishIndex + ";") !== -1;
|
|
|
|
}).value();
|
2013-04-11 22:38:41 +00:00
|
|
|
};
|
|
|
|
|
2013-04-10 18:14:59 +00:00
|
|
|
fileManager.init = function(coreModule) {
|
|
|
|
core = coreModule;
|
|
|
|
|
|
|
|
fileManager.selectFile();
|
|
|
|
|
|
|
|
$(".action-create-file").click(function() {
|
|
|
|
var fileIndex = fileManager.createFile();
|
|
|
|
fileManager.selectFile(fileIndex);
|
|
|
|
$("#file-title").click();
|
|
|
|
});
|
|
|
|
$(".action-remove-file").click(function() {
|
|
|
|
fileManager.deleteFile();
|
|
|
|
fileManager.selectFile();
|
|
|
|
});
|
|
|
|
$("#file-title").click(function() {
|
|
|
|
$(this).hide();
|
|
|
|
$("#file-title-input").show().focus();
|
|
|
|
});
|
2013-04-20 00:14:20 +00:00
|
|
|
function applyTitle(input) {
|
|
|
|
var title = $.trim(input.val());
|
|
|
|
var fileIndexTitle = fileManager.getCurrentFileIndex() + ".title";
|
2013-04-10 18:14:59 +00:00
|
|
|
if (title) {
|
|
|
|
if (title != localStorage[fileIndexTitle]) {
|
|
|
|
localStorage[fileIndexTitle] = title;
|
|
|
|
fileManager.updateFileTitles();
|
|
|
|
fileManager.saveFile();
|
|
|
|
}
|
|
|
|
}
|
2013-04-20 00:14:20 +00:00
|
|
|
input.hide().val(localStorage[fileIndexTitle]);
|
2013-04-10 18:14:59 +00:00
|
|
|
$("#file-title").show();
|
2013-04-20 00:14:20 +00:00
|
|
|
}
|
|
|
|
$("#file-title-input").blur(function() {
|
|
|
|
applyTitle($(this));
|
|
|
|
}).keyup(function(e) {
|
|
|
|
if (e.keyCode == 13) {
|
|
|
|
applyTitle($(this));
|
|
|
|
}
|
|
|
|
if (e.keyCode == 27) {
|
|
|
|
$(this).val("");
|
|
|
|
applyTitle($(this));
|
|
|
|
}
|
2013-04-10 18:14:59 +00:00
|
|
|
});
|
|
|
|
$(".action-download-md").click(
|
|
|
|
function() {
|
|
|
|
var content = $("#wmd-input").val();
|
|
|
|
var uriContent = "data:application/octet-stream;base64,"
|
|
|
|
+ core.encodeBase64(content);
|
|
|
|
window.open(uriContent, 'file');
|
|
|
|
});
|
|
|
|
$(".action-download-html").click(
|
|
|
|
function() {
|
|
|
|
var content = $("#wmd-preview").html();
|
|
|
|
var uriContent = "data:application/octet-stream;base64,"
|
|
|
|
+ core.encodeBase64(content);
|
|
|
|
window.open(uriContent, 'file');
|
2013-04-14 13:24:29 +00:00
|
|
|
});
|
|
|
|
$(".action-download-template").click(
|
|
|
|
function() {
|
|
|
|
var content = publisher.applyTemplate();
|
|
|
|
var uriContent = "data:application/octet-stream;base64,"
|
|
|
|
+ core.encodeBase64(content);
|
|
|
|
window.open(uriContent, 'file');
|
2013-04-10 18:14:59 +00:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2013-04-02 18:42:47 +00:00
|
|
|
return fileManager;
|
|
|
|
});
|