Small fixes

This commit is contained in:
benweet 2014-08-19 09:17:59 +01:00
parent 1231b26710
commit 4b875e798a
4 changed files with 342 additions and 352 deletions

View File

@ -16,7 +16,7 @@ define([
}; };
var monetize = new MonetizeJS({ var monetize = new MonetizeJS({
applicationID: 'iklMbzDI7dvMEScb' applicationID: 'ESTHdCYOi18iLhhO'
}); });
dialogAbout.onReady = function() { dialogAbout.onReady = function() {

View File

@ -48,7 +48,6 @@ define([
utils.setInputChecked("#input-markdownextra-intraword", markdownExtra.config.intraword); utils.setInputChecked("#input-markdownextra-intraword", markdownExtra.config.intraword);
utils.setInputChecked("#input-markdownextra-comments", markdownExtra.config.comments); utils.setInputChecked("#input-markdownextra-comments", markdownExtra.config.comments);
utils.setInputValue("#input-markdownextra-highlighter", markdownExtra.config.highlighter); utils.setInputValue("#input-markdownextra-highlighter", markdownExtra.config.highlighter);
utils.setInputChecked("#input-markdownextra-diagrams", markdownExtra.config.diagrams);
}; };
markdownExtra.onSaveSettings = function(newConfig) { markdownExtra.onSaveSettings = function(newConfig) {
@ -64,7 +63,6 @@ define([
newConfig.intraword = utils.getInputChecked("#input-markdownextra-intraword"); newConfig.intraword = utils.getInputChecked("#input-markdownextra-intraword");
newConfig.comments = utils.getInputChecked("#input-markdownextra-comments"); newConfig.comments = utils.getInputChecked("#input-markdownextra-comments");
newConfig.highlighter = utils.getInputValue("#input-markdownextra-highlighter"); newConfig.highlighter = utils.getInputValue("#input-markdownextra-highlighter");
newConfig.diagrams = utils.getInputChecked("#input-markdownextra-diagrams");
}; };
var eventMgr; var eventMgr;

View File

@ -63,8 +63,7 @@ define([
element: '.navbar-inner', element: '.navbar-inner',
title: 'StackEdit 4 is out!', title: 'StackEdit 4 is out!',
content: [ content: [
'<p>I\'m very pleased to welcome you here!</p>', '<p>I\'m very pleased to welcome you here! StackEdit keeps getting better and I hope you appreciate it.</p>',
'<p>StackEdit keeps getting better and I hope you appreciate it.</p>',
'Please click <b>Next</b> to take a quick tour.' 'Please click <b>Next</b> to take a quick tour.'
].join(""), ].join(""),
placement: 'bottom' placement: 'bottom'
@ -97,20 +96,20 @@ define([
'<b>Tip:</b> Reopen the Welcome Document from Settings>Utils to discover other new features.' '<b>Tip:</b> Reopen the Welcome Document from Settings>Utils to discover other new features.'
].join(""), ].join(""),
placement: 'right', placement: 'right',
reflex: true, reflex: true
}, },
{ {
element: '.navbar-inner', element: '.navbar-inner',
title: 'Happy StackWriting!', title: 'Happy StackWriting!',
content: [ content: [
'<p>Enjoy, and don\'t forget to rate 5 stars on the <a target="_blank" href="https://chrome.google.com/webstore/detail/stackedit/iiooodelglhkcpgbajoejffhijaclcdg/reviews">Chrome Web Store</a>...</p>', '<p>Enjoy, and don\'t forget to rate 5 stars on the <a target="_blank" href="https://chrome.google.com/webstore/detail/stackedit/iiooodelglhkcpgbajoejffhijaclcdg/reviews">Chrome Web Store</a>...</p>',
'<a href="https://twitter.com/share" class="twitter-share-button" data-url="https://stackedit.io" data-text="Great #markdown editor!" data-via="stackedit" data-size="large"></a>', '<a href="https://twitter.com/share" class="twitter-share-button" data-url="https://stackedit.io" data-text="Great #markdown editor!" data-via="stackedit" data-size="large"></a>'
].join(""), ].join(""),
placement: 'bottom', placement: 'bottom',
onShown: function() { onShown: function() {
eventMgr.onTweet(); eventMgr.onTweet();
} }
}, }
]); ]);
if(!_.has(storage, 'welcomeTour')) { if(!_.has(storage, 'welcomeTour')) {
tour.start(); tour.start();

View File

@ -1,361 +1,354 @@
/*global Dropbox */ /*global Dropbox */
define([ define([
"jquery", "jquery",
"underscore", "underscore",
"constants", "constants",
"core", "core",
"utils", "utils",
"storage", "storage",
"logger", "logger",
"settings", "settings",
"eventMgr", "eventMgr",
"classes/AsyncTask", "classes/AsyncTask"
], function($, _, constants, core, utils, storage, logger, settings, eventMgr, AsyncTask) { ], function($, _, constants, core, utils, storage, logger, settings, eventMgr, AsyncTask) {
var client; var client;
var authenticated = false; var authenticated = false;
var dropboxHelper = {}; var dropboxHelper = {};
// Listen to offline status changes
var isOffline = false;
eventMgr.addListener("onOfflineChanged", function(isOfflineParam) {
isOffline = isOfflineParam;
});
// Try to connect dropbox by downloading client.js // Listen to offline status changes
function connect(task) { var isOffline = false;
task.onRun(function() { eventMgr.addListener("onOfflineChanged", function(isOfflineParam) {
if(isOffline === true) { isOffline = isOfflineParam;
client = undefined; });
task.error(new Error("Operation not available in offline mode.|stopPublish"));
return;
}
if(client !== undefined) {
task.chain();
return;
}
$.ajax({
url: "libs/dropbox.min.js",
dataType: "script",
timeout: constants.AJAX_TIMEOUT
}).done(function() {
client = new Dropbox.Client({
key: settings.dropboxFullAccess === true ? constants.DROPBOX_APP_KEY : constants.DROPBOX_RESTRICTED_APP_KEY,
secret: settings.dropboxFullAccess === true ? constants.DROPBOX_APP_SECRET : constants.DROPBOX_RESTRICTED_APP_SECRET
});
client.authDriver(new Dropbox.AuthDriver.Popup({
receiverUrl: constants.BASE_URL + "html/dropbox-oauth-receiver.html",
rememberUser: true
}));
task.chain();
}).fail(function(jqXHR) {
var error = {
status: jqXHR.status,
responseText: jqXHR.statusText
};
handleError(error, task);
});
});
}
// Try to authenticate with Oauth // Try to connect dropbox by downloading client.js
function authenticate(task) { function connect(task) {
task.onRun(function() { task.onRun(function() {
if(authenticated === true) { if(isOffline === true) {
task.chain(); client = undefined;
return; return task.error(new Error("Operation not available in offline mode.|stopPublish"));
} }
var immediate = true; if(client !== undefined) {
function oauthRedirect() { return task.chain();
utils.redirectConfirm('You are being redirected to <strong>Dropbox</strong> authorization page.', function() { }
task.chain(localAuthenticate); $.ajax({
}, function() { url: "libs/dropbox.min.js",
task.error(new Error('Operation canceled.')); dataType: "script",
}); timeout: constants.AJAX_TIMEOUT
} }).done(function() {
function localAuthenticate() { client = new Dropbox.Client({
if(immediate === false) { key: settings.dropboxFullAccess === true ? constants.DROPBOX_APP_KEY : constants.DROPBOX_RESTRICTED_APP_KEY,
// If not immediate we add time for user to enter his secret: settings.dropboxFullAccess === true ? constants.DROPBOX_APP_SECRET : constants.DROPBOX_RESTRICTED_APP_SECRET
// credentials });
task.timeout = constants.ASYNC_TASK_LONG_TIMEOUT; client.authDriver(new Dropbox.AuthDriver.Popup({
} receiverUrl: constants.BASE_URL + "html/dropbox-oauth-receiver.html",
else { rememberUser: true
client.reset(); }));
} task.chain();
client.authenticate({ }).fail(function(jqXHR) {
interactive: !immediate var error = {
}, function(error, client) { status: jqXHR.status,
// Success responseText: jqXHR.statusText
if(client.isAuthenticated() === true) { };
authenticated = true; handleError(error, task);
task.chain(); });
return; });
} }
// If immediate did not work retry without immediate flag
if(immediate === true) {
immediate = false;
task.chain(oauthRedirect);
return;
}
// Error
task.error(new Error("Access to Dropbox account is not authorized."));
});
}
task.chain(localAuthenticate);
});
}
dropboxHelper.upload = function(path, content, callback) { // Try to authenticate with Oauth
var result; function authenticate(task) {
var task = new AsyncTask(); task.onRun(function() {
connect(task); if(authenticated === true) {
authenticate(task); return task.chain();
task.onRun(function() { }
client.writeFile(path, content, function(error, stat) { var immediate = true;
if(!error) {
result = stat;
task.chain();
return;
}
// Handle error
if(error.status === 400) {
error = 'Could not upload document into path "' + path + '".';
}
handleError(error, task);
});
});
task.onSuccess(function() {
callback(undefined, result);
});
task.onError(function(error) {
callback(error);
});
task.enqueue();
};
dropboxHelper.checkChanges = function(lastChangeId, callback) { function oauthRedirect() {
var changes = []; utils.redirectConfirm('You are being redirected to <strong>Dropbox</strong> authorization page.', function() {
var newChangeId = lastChangeId || 0; task.chain(localAuthenticate);
var task = new AsyncTask(); }, function() {
connect(task); task.error(new Error('Operation canceled.'));
authenticate(task); });
task.onRun(function() { }
function retrievePageOfChanges() {
client.pullChanges(newChangeId, function(error, pullChanges) {
if(error) {
handleError(error, task);
return;
}
// Retrieve success
newChangeId = pullChanges.cursor();
if(pullChanges.changes !== undefined) {
changes = changes.concat(pullChanges.changes);
}
if(pullChanges.shouldPullAgain) {
task.chain(retrievePageOfChanges);
}
else {
task.chain();
}
});
}
task.chain(retrievePageOfChanges);
});
task.onSuccess(function() {
callback(undefined, changes, newChangeId);
});
task.onError(function(error) {
callback(error);
});
task.enqueue();
};
dropboxHelper.downloadMetadata = function(paths, callback) { function localAuthenticate() {
var result = []; if(immediate === false) {
var task = new AsyncTask(); // If not immediate we add time for user to enter his
connect(task); // credentials
authenticate(task); task.timeout = constants.ASYNC_TASK_LONG_TIMEOUT;
task.onRun(function() { }
function recursiveDownloadMetadata() { else {
if(paths.length === 0) { client.reset();
task.chain(); }
return; client.authenticate({
} interactive: !immediate
var path = paths[0]; }, function(error, client) {
client.stat(path, function(error, stat) { // Success
if(stat) { if(client.isAuthenticated() === true) {
result.push(stat); authenticated = true;
paths.shift(); return task.chain();
task.chain(recursiveDownloadMetadata); }
return; // If immediate did not work retry without immediate flag
} if(immediate === true) {
handleError(error, task); immediate = false;
}); return task.chain(oauthRedirect);
} }
task.chain(recursiveDownloadMetadata); // Error
}); task.error(new Error("Access to Dropbox account is not authorized."));
task.onSuccess(function() { });
callback(undefined, result); }
});
task.onError(function(error) {
callback(error);
});
task.enqueue();
};
dropboxHelper.downloadContent = function(objects, callback) { task.chain(localAuthenticate);
var result = []; });
var task = new AsyncTask(); }
connect(task);
authenticate(task);
task.onRun(function() {
function recursiveDownloadContent() {
if(objects.length === 0) {
task.chain();
return;
}
var object = objects[0];
result.push(object);
var file;
// object may be a file
if(object.isFile === true) {
file = object;
}
// object may be a change
else if(object.wasRemoved !== undefined) {
file = object.stat;
}
if(!file) {
objects.shift();
task.chain(recursiveDownloadContent);
return;
}
client.readFile(file.path, function(error, data) {
if(_.isString(data)) {
file.content = data;
objects.shift();
task.chain(recursiveDownloadContent);
return;
}
handleError(error, task);
});
}
task.chain(recursiveDownloadContent);
});
task.onSuccess(function() {
callback(undefined, result);
});
task.onError(function(error) {
callback(error);
});
task.enqueue();
};
function handleError(error, task) { dropboxHelper.upload = function(path, content, callback) {
var errorMsg = true; var result;
if(error) { var task = new AsyncTask();
logger.error(error); connect(task);
// Try to analyze the error authenticate(task);
if(typeof error === "string") { task.onRun(function() {
errorMsg = error; client.writeFile(path, content, function(error, stat) {
} if(!error) {
else { result = stat;
errorMsg = "Dropbox error (" + error.status + ": " + error.responseText + ")."; return task.chain();
}
// Handle error
if(error.status === 400) {
error = 'Could not upload document into path "' + path + '".';
}
handleError(error, task);
});
});
task.onSuccess(function() {
callback(undefined, result);
});
task.onError(function(error) {
callback(error);
});
task.enqueue();
};
if(error.status === 401 || error.status === 403) { dropboxHelper.checkChanges = function(lastChangeId, callback) {
authenticated = false; var changes = [];
errorMsg = "Access to Dropbox account is not authorized."; var newChangeId = lastChangeId || 0;
task.retry(new Error(errorMsg), 1); var task = new AsyncTask();
return; connect(task);
} authenticate(task);
else if(error.status === 400 && error.responseText.indexOf("oauth_nonce") !== -1) { task.onRun(function() {
// A bug I guess... function retrievePageOfChanges() {
_.each(_.keys(storage), function(key) { client.pullChanges(newChangeId, function(error, pullChanges) {
// We have to remove the Oauth cache from the if(error) {
// storage return handleError(error, task);
if(key.indexOf("dropbox-auth") === 0) { }
storage.removeItem(key); // Retrieve success
} newChangeId = pullChanges.cursor();
}); if(pullChanges.changes !== undefined) {
authenticated = false; changes = changes.concat(pullChanges.changes);
task.retry(new Error(errorMsg), 1); }
return; if(pullChanges.shouldPullAgain) {
} task.chain(retrievePageOfChanges);
else if(error.status <= 0) { }
client = undefined; else {
authenticated = false; task.chain();
core.setOffline(); }
errorMsg = "|stopPublish"; });
} }
}
}
task.error(new Error(errorMsg));
}
var pickerLoaded = false; task.chain(retrievePageOfChanges);
function loadPicker(task) { });
task.onRun(function() { task.onSuccess(function() {
if(pickerLoaded === true) { callback(undefined, changes, newChangeId);
task.chain(); });
return; task.onError(function(error) {
} callback(error);
function chooserRedirect() { });
utils.redirectConfirm('You are being redirected to <strong>Dropbox Chooser</strong> page.', function() { task.enqueue();
task.chain(); };
}, function() {
task.error(new Error('Operation canceled.'));
});
}
$.ajax({
url: "https://www.dropbox.com/static/api/1/dropbox.js",
dataType: "script",
timeout: constants.AJAX_TIMEOUT
}).done(function() {
pickerLoaded = true;
task.chain(chooserRedirect);
}).fail(function(jqXHR) {
var error = {
status: jqXHR.status,
responseText: jqXHR.statusText
};
handleError(error, task);
});
});
}
dropboxHelper.picker = function(callback) { dropboxHelper.downloadMetadata = function(paths, callback) {
var paths = []; var result = [];
var task = new AsyncTask(); var task = new AsyncTask();
// Add some time for user to choose his files connect(task);
task.timeout = constants.ASYNC_TASK_LONG_TIMEOUT; authenticate(task);
connect(task); task.onRun(function() {
loadPicker(task); function recursiveDownloadMetadata() {
task.onRun(function() { if(paths.length === 0) {
var options = {}; return task.chain();
options.multiselect = true; }
options.linkType = "direct"; var path = paths[0];
options.success = function(files) { client.stat(path, function(error, stat) {
for ( var i = 0; i < files.length; i++) { if(stat) {
var path = files[i].link; result.push(stat);
path = path.replace(/.*\/view\/[^\/]*/, ""); paths.shift();
paths.push(decodeURI(path)); return task.chain(recursiveDownloadMetadata);
} }
task.chain(); handleError(error, task);
}; });
options.cancel = function() { }
task.chain();
};
Dropbox.choose(options);
});
task.onSuccess(function() {
callback(undefined, paths);
});
task.onError(function(error) {
callback(error);
});
task.enqueue();
};
return dropboxHelper; task.chain(recursiveDownloadMetadata);
});
task.onSuccess(function() {
callback(undefined, result);
});
task.onError(function(error) {
callback(error);
});
task.enqueue();
};
dropboxHelper.downloadContent = function(objects, callback) {
var result = [];
var task = new AsyncTask();
connect(task);
authenticate(task);
task.onRun(function() {
function recursiveDownloadContent() {
if(objects.length === 0) {
return task.chain();
}
var object = objects[0];
result.push(object);
var file;
// object may be a file
if(object.isFile === true) {
file = object;
}
// object may be a change
else if(object.wasRemoved !== undefined) {
file = object.stat;
}
if(!file) {
objects.shift();
return task.chain(recursiveDownloadContent);
}
client.readFile(file.path, function(error, data) {
if(_.isString(data)) {
file.content = data;
objects.shift();
return task.chain(recursiveDownloadContent);
}
handleError(error, task);
});
}
task.chain(recursiveDownloadContent);
});
task.onSuccess(function() {
callback(undefined, result);
});
task.onError(function(error) {
callback(error);
});
task.enqueue();
};
function handleError(error, task) {
var errorMsg = true;
if(error) {
logger.error(error);
// Try to analyze the error
if(typeof error === "string") {
errorMsg = error;
}
else {
errorMsg = "Dropbox error (" + error.status + ": " + error.responseText + ").";
if(error.status === 401 || error.status === 403) {
authenticated = false;
errorMsg = "Access to Dropbox account is not authorized.";
return task.retry(new Error(errorMsg), 1);
}
else if(error.status === 400 && error.responseText.indexOf("oauth_nonce") !== -1) {
// A bug I guess...
_.each(_.keys(storage), function(key) {
// We have to remove the Oauth cache from the
// storage
if(key.indexOf("dropbox-auth") === 0) {
storage.removeItem(key);
}
});
authenticated = false;
return task.retry(new Error(errorMsg), 1);
}
else if(error.status <= 0) {
client = undefined;
authenticated = false;
core.setOffline();
errorMsg = "|stopPublish";
}
}
}
task.error(new Error(errorMsg));
}
var pickerLoaded = false;
function loadPicker(task) {
task.onRun(function() {
if(pickerLoaded === true) {
return task.chain();
}
function chooserRedirect() {
utils.redirectConfirm('You are being redirected to <strong>Dropbox Chooser</strong> page.', function() {
task.chain();
}, function() {
task.error(new Error('Operation canceled.'));
});
}
$.ajax({
url: "https://www.dropbox.com/static/api/1/dropbox.js",
dataType: "script",
timeout: constants.AJAX_TIMEOUT
}).done(function() {
pickerLoaded = true;
task.chain(chooserRedirect);
}).fail(function(jqXHR) {
var error = {
status: jqXHR.status,
responseText: jqXHR.statusText
};
handleError(error, task);
});
});
}
dropboxHelper.picker = function(callback) {
var paths = [];
var task = new AsyncTask();
// Add some time for user to choose his files
task.timeout = constants.ASYNC_TASK_LONG_TIMEOUT;
connect(task);
loadPicker(task);
task.onRun(function() {
var options = {};
options.multiselect = true;
options.linkType = "direct";
options.success = function(files) {
for(var i = 0; i < files.length; i++) {
var path = files[i].link;
path = path.replace(/.*\/view\/[^\/]*/, "");
paths.push(decodeURI(path));
}
task.chain();
};
options.cancel = function() {
task.chain();
};
Dropbox.choose(options);
});
task.onSuccess(function() {
callback(undefined, paths);
});
task.onError(function(error) {
callback(error);
});
task.enqueue();
};
return dropboxHelper;
}); });