Merge branch 'pre' of insomnia247.nl:/home/benweet/stackedit into pre
This commit is contained in:
commit
c879a3abb8
@ -179,8 +179,6 @@ define([
|
|||||||
var selection = rangy.getSelection();
|
var selection = rangy.getSelection();
|
||||||
selection.removeAllRanges();
|
selection.removeAllRanges();
|
||||||
selection.addRange(range, this.selectionStart > this.selectionEnd);
|
selection.addRange(range, this.selectionStart > this.selectionEnd);
|
||||||
selection.detach();
|
|
||||||
range.detach();
|
|
||||||
};
|
};
|
||||||
this.setSelectionStartEnd = function(start, end) {
|
this.setSelectionStartEnd = function(start, end) {
|
||||||
if(start === undefined) {
|
if(start === undefined) {
|
||||||
@ -232,13 +230,12 @@ define([
|
|||||||
selectionEnd = offset + (range + '').length;
|
selectionEnd = offset + (range + '').length;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
selectionRange.detach();
|
|
||||||
}
|
}
|
||||||
selection.detach();
|
|
||||||
self.setSelectionStartEnd(selectionStart, selectionEnd);
|
self.setSelectionStartEnd(selectionStart, selectionEnd);
|
||||||
}
|
}
|
||||||
undoMgr.saveSelectionState();
|
undoMgr.saveSelectionState();
|
||||||
}
|
}
|
||||||
|
|
||||||
var nextTickAdjustScroll = false;
|
var nextTickAdjustScroll = false;
|
||||||
var debouncedSave = utils.debounce(function() {
|
var debouncedSave = utils.debounce(function() {
|
||||||
save();
|
save();
|
||||||
@ -759,9 +756,18 @@ define([
|
|||||||
}, 0);
|
}, 0);
|
||||||
})
|
})
|
||||||
.on('mouseup', _.bind(selectionMgr.saveSelectionState, selectionMgr, true, false))
|
.on('mouseup', _.bind(selectionMgr.saveSelectionState, selectionMgr, true, false))
|
||||||
.on('paste', function() {
|
.on('paste', function(evt) {
|
||||||
undoMgr.currentMode = 'paste';
|
undoMgr.currentMode = 'paste';
|
||||||
adjustCursorPosition();
|
adjustCursorPosition();
|
||||||
|
try {
|
||||||
|
var data = evt.originalEvent.clipboardData.getData("text/plain");
|
||||||
|
if(data) {
|
||||||
|
evt.preventDefault();
|
||||||
|
document.execCommand("insertHTML", false, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(e) {
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.on('cut', function() {
|
.on('cut', function() {
|
||||||
undoMgr.currentMode = 'cut';
|
undoMgr.currentMode = 'cut';
|
||||||
|
@ -40,7 +40,9 @@ define([
|
|||||||
});
|
});
|
||||||
preElt.parentNode.replaceChild(containerElt, preElt);
|
preElt.parentNode.replaceChild(containerElt, preElt);
|
||||||
chart.drawSVG(containerElt, {
|
chart.drawSVG(containerElt, {
|
||||||
'line-width': 2
|
'line-width': 2,
|
||||||
|
'font-family': 'sans-serif',
|
||||||
|
'font-weight': 'normal'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
catch(e) {
|
catch(e) {
|
||||||
|
@ -9,11 +9,12 @@ define([
|
|||||||
"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 connected = false;
|
var connected = false;
|
||||||
var authorizationMgrMap = {};
|
var authorizationMgrMap = {};
|
||||||
|
|
||||||
function AuthorizationMgr(accountId) {
|
function AuthorizationMgr(accountId) {
|
||||||
var permissionList = {
|
var permissionList = {
|
||||||
profile: true
|
profile: true
|
||||||
@ -63,12 +64,10 @@ define([
|
|||||||
task.onRun(function() {
|
task.onRun(function() {
|
||||||
if(isOffline === true) {
|
if(isOffline === true) {
|
||||||
connected = false;
|
connected = false;
|
||||||
task.error(new Error("Operation not available in offline mode.|stopPublish"));
|
return task.error(new Error("Operation not available in offline mode.|stopPublish"));
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
if(connected === true) {
|
if(connected === true) {
|
||||||
task.chain();
|
return task.chain();
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
window.delayedFunction = function() {
|
window.delayedFunction = function() {
|
||||||
gapi.load("client", function() {
|
gapi.load("client", function() {
|
||||||
@ -108,7 +107,7 @@ define([
|
|||||||
'https://www.googleapis.com/auth/photos'
|
'https://www.googleapis.com/auth/photos'
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
var oauthIframes = [];
|
|
||||||
function authenticate(task, permission, accountId) {
|
function authenticate(task, permission, accountId) {
|
||||||
var authorizationMgr = authorizationMgrMap[accountId];
|
var authorizationMgr = authorizationMgrMap[accountId];
|
||||||
if(!authorizationMgr) {
|
if(!authorizationMgr) {
|
||||||
@ -118,6 +117,7 @@ define([
|
|||||||
task.onRun(function() {
|
task.onRun(function() {
|
||||||
var currentToken = gapi.auth.getToken();
|
var currentToken = gapi.auth.getToken();
|
||||||
var newToken;
|
var newToken;
|
||||||
|
|
||||||
function getTokenInfo() {
|
function getTokenInfo() {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: 'https://www.googleapis.com/oauth2/v1/tokeninfo',
|
url: 'https://www.googleapis.com/oauth2/v1/tokeninfo',
|
||||||
@ -145,12 +145,13 @@ define([
|
|||||||
handleError(error, task);
|
handleError(error, task);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var authuser = 0;
|
var authuser = 0;
|
||||||
var immediate;
|
var immediate;
|
||||||
|
|
||||||
function localAuthenticate() {
|
function localAuthenticate() {
|
||||||
if(authuser > 5) {
|
if(authuser > 5) {
|
||||||
task.error(new Error('Unable to authenticate user ' + authorizationMgr.getUserId() + ', please sign in with Google.'));
|
return task.error(new Error('Unable to authenticate user ' + authorizationMgr.getUserId() + ', please sign in with Google.'));
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
if(immediate === false) {
|
if(immediate === false) {
|
||||||
task.timeout = constants.ASYNC_TASK_LONG_TIMEOUT;
|
task.timeout = constants.ASYNC_TASK_LONG_TIMEOUT;
|
||||||
@ -162,16 +163,6 @@ define([
|
|||||||
immediate: immediate,
|
immediate: immediate,
|
||||||
authuser: immediate === false ? '' : authuser
|
authuser: immediate === false ? '' : authuser
|
||||||
}, function(authResult) {
|
}, function(authResult) {
|
||||||
|
|
||||||
// Hack to clean window from old oauth iframes
|
|
||||||
authorizationMgr.$oauthIframe && authorizationMgr.$oauthIframe.remove();
|
|
||||||
var currentOauthIframes = _.filter(document.querySelectorAll('iframe'), function(iframe) {
|
|
||||||
var src = iframe.getAttribute('src');
|
|
||||||
return src && src.indexOf('https://accounts.google.com/o/oauth2/auth') === 0;
|
|
||||||
});
|
|
||||||
authorizationMgr.$oauthIframe = $(_.difference(currentOauthIframes, oauthIframes));
|
|
||||||
oauthIframes = currentOauthIframes;
|
|
||||||
|
|
||||||
newToken = gapi.auth.getToken();
|
newToken = gapi.auth.getToken();
|
||||||
gapi.auth.setToken(currentToken);
|
gapi.auth.setToken(currentToken);
|
||||||
if(!authResult || authResult.error) {
|
if(!authResult || authResult.error) {
|
||||||
@ -193,10 +184,10 @@ define([
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function oauthRedirect() {
|
function oauthRedirect() {
|
||||||
if(immediate === true) {
|
if(immediate === true) {
|
||||||
task.chain(localAuthenticate);
|
return task.chain(localAuthenticate);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
utils.redirectConfirm('You are being redirected to <strong>Google</strong> authorization page.', function() {
|
utils.redirectConfirm('You are being redirected to <strong>Google</strong> authorization page.', function() {
|
||||||
task.chain(localAuthenticate);
|
task.chain(localAuthenticate);
|
||||||
@ -204,6 +195,7 @@ define([
|
|||||||
task.error(new Error('Operation canceled.'));
|
task.error(new Error('Operation canceled.'));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function startAuthenticate() {
|
function startAuthenticate() {
|
||||||
immediate = true;
|
immediate = true;
|
||||||
if(authorizationMgr.token && authorizationMgr.isAuthorized(permission)) {
|
if(authorizationMgr.token && authorizationMgr.isAuthorized(permission)) {
|
||||||
@ -215,9 +207,11 @@ define([
|
|||||||
}
|
}
|
||||||
task.chain(oauthRedirect);
|
task.chain(oauthRedirect);
|
||||||
}
|
}
|
||||||
|
|
||||||
startAuthenticate();
|
startAuthenticate();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
googleHelper.refreshGdriveToken = function(accountId) {
|
googleHelper.refreshGdriveToken = function(accountId) {
|
||||||
var task = new AsyncTask();
|
var task = new AsyncTask();
|
||||||
connect(task);
|
connect(task);
|
||||||
@ -266,7 +260,7 @@ define([
|
|||||||
method = 'PUT';
|
method = 'PUT';
|
||||||
}
|
}
|
||||||
var headers = {
|
var headers = {
|
||||||
'Content-Type': 'multipart/mixed; boundary="' + boundary + '"',
|
'Content-Type': 'multipart/mixed; boundary="' + boundary + '"'
|
||||||
};
|
};
|
||||||
|
|
||||||
var base64Data = utils.encodeBase64(content);
|
var base64Data = utils.encodeBase64(content);
|
||||||
@ -289,18 +283,17 @@ define([
|
|||||||
'path': path,
|
'path': path,
|
||||||
'method': method,
|
'method': method,
|
||||||
'params': {
|
'params': {
|
||||||
'uploadType': 'multipart',
|
'uploadType': 'multipart'
|
||||||
},
|
},
|
||||||
'headers': headers,
|
'headers': headers,
|
||||||
'body': multipartRequestBody,
|
'body': multipartRequestBody
|
||||||
});
|
});
|
||||||
request.execute(function(response) {
|
request.execute(function(response) {
|
||||||
if(response && response.id) {
|
if(response && response.id) {
|
||||||
// Upload success
|
// Upload success
|
||||||
result = response;
|
result = response;
|
||||||
result.content = content;
|
result.content = content;
|
||||||
task.chain();
|
return task.chain();
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
var error = response.error;
|
var error = response.error;
|
||||||
// Handle error
|
// Handle error
|
||||||
@ -343,8 +336,7 @@ define([
|
|||||||
if(response && response.id) {
|
if(response && response.id) {
|
||||||
// Rename success
|
// Rename success
|
||||||
result = response;
|
result = response;
|
||||||
task.chain();
|
return task.chain();
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
var error = response.error;
|
var error = response.error;
|
||||||
// Handle error
|
// Handle error
|
||||||
@ -374,6 +366,7 @@ define([
|
|||||||
authenticate(task, 'gdrive', accountId);
|
authenticate(task, 'gdrive', accountId);
|
||||||
task.onRun(function() {
|
task.onRun(function() {
|
||||||
var nextPageToken;
|
var nextPageToken;
|
||||||
|
|
||||||
function retrievePageOfChanges() {
|
function retrievePageOfChanges() {
|
||||||
runWithToken(accountId, function() {
|
runWithToken(accountId, function() {
|
||||||
var request;
|
var request;
|
||||||
@ -391,8 +384,7 @@ define([
|
|||||||
request.execute(function(response) {
|
request.execute(function(response) {
|
||||||
if(!response || !response.largestChangeId) {
|
if(!response || !response.largestChangeId) {
|
||||||
// Handle error
|
// Handle error
|
||||||
handleError(response.error, task);
|
return handleError(response.error, task);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
// Retrieve success
|
// Retrieve success
|
||||||
newChangeId = response.largestChangeId;
|
newChangeId = response.largestChangeId;
|
||||||
@ -409,6 +401,7 @@ define([
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
task.chain(retrievePageOfChanges);
|
task.chain(retrievePageOfChanges);
|
||||||
});
|
});
|
||||||
task.onSuccess(function() {
|
task.onSuccess(function() {
|
||||||
@ -430,8 +423,7 @@ define([
|
|||||||
task.onRun(function() {
|
task.onRun(function() {
|
||||||
function recursiveDownloadMetadata() {
|
function recursiveDownloadMetadata() {
|
||||||
if(ids.length === 0) {
|
if(ids.length === 0) {
|
||||||
task.chain();
|
return task.chain();
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
var id = ids[0];
|
var id = ids[0];
|
||||||
var headers = {};
|
var headers = {};
|
||||||
@ -463,6 +455,7 @@ define([
|
|||||||
handleError(error, task);
|
handleError(error, task);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
task.chain(recursiveDownloadMetadata);
|
task.chain(recursiveDownloadMetadata);
|
||||||
});
|
});
|
||||||
task.onSuccess(function() {
|
task.onSuccess(function() {
|
||||||
@ -486,8 +479,7 @@ define([
|
|||||||
task.onRun(function() {
|
task.onRun(function() {
|
||||||
function recursiveDownloadContent() {
|
function recursiveDownloadContent() {
|
||||||
if(objects.length === 0) {
|
if(objects.length === 0) {
|
||||||
task.chain();
|
return task.chain();
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
var object = objects[0];
|
var object = objects[0];
|
||||||
result.push(object);
|
result.push(object);
|
||||||
@ -502,8 +494,7 @@ define([
|
|||||||
}
|
}
|
||||||
if(!file) {
|
if(!file) {
|
||||||
objects.shift();
|
objects.shift();
|
||||||
task.chain(recursiveDownloadContent);
|
return task.chain(recursiveDownloadContent);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
var url = file.downloadUrl;
|
var url = file.downloadUrl;
|
||||||
// if file is a real time document
|
// if file is a real time document
|
||||||
@ -537,6 +528,7 @@ define([
|
|||||||
handleError(error, task);
|
handleError(error, task);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
task.chain(recursiveDownloadContent);
|
task.chain(recursiveDownloadContent);
|
||||||
});
|
});
|
||||||
task.onSuccess(function() {
|
task.onSuccess(function() {
|
||||||
@ -615,16 +607,14 @@ define([
|
|||||||
errorMsg = "Google error (" + error.code + ": " + error.message + ").";
|
errorMsg = "Google error (" + error.code + ": " + error.message + ").";
|
||||||
if(error.code >= 500 && error.code < 600) {
|
if(error.code >= 500 && error.code < 600) {
|
||||||
// Retry as described in Google's best practices
|
// Retry as described in Google's best practices
|
||||||
task.retry(new Error(errorMsg));
|
return task.retry(new Error(errorMsg));
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
else if(error.code === 401 || error.code === 403 || error.code == "token_refresh_required") {
|
else if(error.code === 401 || error.code === 403 || error.code == "token_refresh_required") {
|
||||||
_.each(authorizationMgrMap, function(authorizationMgr) {
|
_.each(authorizationMgrMap, function(authorizationMgr) {
|
||||||
authorizationMgr.setRefreshFlag();
|
authorizationMgr.setRefreshFlag();
|
||||||
});
|
});
|
||||||
errorMsg = "Access to Google account is not authorized.";
|
errorMsg = "Access to Google account is not authorized.";
|
||||||
task.retry(new Error(errorMsg), 1);
|
return task.retry(new Error(errorMsg), 1);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
else if(error.code === 0 || error.code === -1) {
|
else if(error.code === 0 || error.code === -1) {
|
||||||
connected = false;
|
connected = false;
|
||||||
@ -640,11 +630,11 @@ define([
|
|||||||
}
|
}
|
||||||
|
|
||||||
var pickerLoaded = false;
|
var pickerLoaded = false;
|
||||||
|
|
||||||
function loadPicker(task) {
|
function loadPicker(task) {
|
||||||
task.onRun(function() {
|
task.onRun(function() {
|
||||||
if(pickerLoaded === true) {
|
if(pickerLoaded === true) {
|
||||||
task.chain();
|
return task.chain();
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: "//www.google.com/jsapi",
|
url: "//www.google.com/jsapi",
|
||||||
@ -673,12 +663,14 @@ define([
|
|||||||
googleHelper.picker = function(callback, pickerType, accountId) {
|
googleHelper.picker = function(callback, pickerType, accountId) {
|
||||||
var docs = [];
|
var docs = [];
|
||||||
var picker;
|
var picker;
|
||||||
|
|
||||||
function hidePicker() {
|
function hidePicker() {
|
||||||
if(picker !== undefined) {
|
if(picker !== undefined) {
|
||||||
picker.setVisible(false);
|
picker.setVisible(false);
|
||||||
$(".modal-backdrop, .picker").remove();
|
$(".modal-backdrop, .picker").remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var task = new AsyncTask();
|
var task = new AsyncTask();
|
||||||
// Add some time for user to choose his files
|
// Add some time for user to choose his files
|
||||||
task.timeout = constants.ASYNC_TASK_LONG_TIMEOUT;
|
task.timeout = constants.ASYNC_TASK_LONG_TIMEOUT;
|
||||||
@ -741,7 +733,7 @@ define([
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
picker = pickerBuilder.build();
|
picker = pickerBuilder.build();
|
||||||
$(utils.createBackdrop()).click(function() {
|
$(utils.createBackdrop()).on('click.backdrop', function() {
|
||||||
hidePicker();
|
hidePicker();
|
||||||
task.chain();
|
task.chain();
|
||||||
});
|
});
|
||||||
@ -812,6 +804,7 @@ define([
|
|||||||
handleError(error, task);
|
handleError(error, task);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function publish() {
|
function publish() {
|
||||||
var url = "https://www.googleapis.com/blogger/v3/blogs/" + blogId + "/posts/" + postId;
|
var url = "https://www.googleapis.com/blogger/v3/blogs/" + blogId + "/posts/" + postId;
|
||||||
if(isDraft) {
|
if(isDraft) {
|
||||||
@ -843,6 +836,7 @@ define([
|
|||||||
handleError(error, task);
|
handleError(error, task);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getBlogId() {
|
function getBlogId() {
|
||||||
if(blogId !== undefined) {
|
if(blogId !== undefined) {
|
||||||
task.chain(uploadPost);
|
task.chain(uploadPost);
|
||||||
@ -871,6 +865,7 @@ define([
|
|||||||
handleError(error, task);
|
handleError(error, task);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
task.chain(getBlogId);
|
task.chain(getBlogId);
|
||||||
});
|
});
|
||||||
task.onSuccess(function() {
|
task.onSuccess(function() {
|
||||||
@ -933,6 +928,7 @@ define([
|
|||||||
handleError(error, task);
|
handleError(error, task);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getBlogId() {
|
function getBlogId() {
|
||||||
if(blogId !== undefined) {
|
if(blogId !== undefined) {
|
||||||
task.chain(uploadPage);
|
task.chain(uploadPage);
|
||||||
@ -961,6 +957,7 @@ define([
|
|||||||
handleError(error, task);
|
handleError(error, task);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
task.chain(getBlogId);
|
task.chain(getBlogId);
|
||||||
});
|
});
|
||||||
task.onSuccess(function() {
|
task.onSuccess(function() {
|
||||||
|
@ -117,7 +117,7 @@ define([
|
|||||||
};
|
};
|
||||||
|
|
||||||
DomObject.prototype.createToggler = function(backdrop) {
|
DomObject.prototype.createToggler = function(backdrop) {
|
||||||
var backdropElt;
|
var $backdropElt;
|
||||||
var pushedEvents = 0;
|
var pushedEvents = 0;
|
||||||
this.toggle = function(show) {
|
this.toggle = function(show) {
|
||||||
if(show === this.isOpen) {
|
if(show === this.isOpen) {
|
||||||
@ -127,7 +127,7 @@ define([
|
|||||||
if(this.isOpen) {
|
if(this.isOpen) {
|
||||||
this.$elt.addClass('panel-open').trigger('show.layout.toggle');
|
this.$elt.addClass('panel-open').trigger('show.layout.toggle');
|
||||||
if(backdrop) {
|
if(backdrop) {
|
||||||
$(backdropElt = utils.createBackdrop(wrapperL1.elt)).click(_.bind(function() {
|
$backdropElt = $(utils.createBackdrop(wrapperL1.elt)).on('click.backdrop', _.bind(function() {
|
||||||
this.toggle(false);
|
this.toggle(false);
|
||||||
}, this));
|
}, this));
|
||||||
this.$elt.addClass('bring-to-front');
|
this.$elt.addClass('bring-to-front');
|
||||||
@ -140,8 +140,11 @@ define([
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
this.$elt.trigger('hide.layout.toggle');
|
this.$elt.trigger('hide.layout.toggle');
|
||||||
backdropElt && backdropElt.removeBackdrop();
|
if($backdropElt) {
|
||||||
backdropElt = undefined;
|
$backdropElt.off('click.backdrop');
|
||||||
|
$backdropElt[0].removeBackdrop();
|
||||||
|
$backdropElt = undefined;
|
||||||
|
}
|
||||||
transitionEndCallbacks.push(_.bind(function() {
|
transitionEndCallbacks.push(_.bind(function() {
|
||||||
if(--pushedEvents === 0) {
|
if(--pushedEvents === 0) {
|
||||||
!this.isOpen && this.$elt.removeClass('panel-open bring-to-front').trigger('hidden.layout.toggle');
|
!this.isOpen && this.$elt.removeClass('panel-open bring-to-front').trigger('hidden.layout.toggle');
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
// Credit to https://editorially.com/
|
// Credit to https://editorially.com/
|
||||||
Prism.languages.md = (function () {
|
Prism.languages.md = (function () {
|
||||||
|
|
||||||
var urlPattern = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>\[\]'"]+|\([^\s()<>\[\]'"]*\))+(?:\([^\s()<>\[\]'"]*\)|[^\s`!()\[\]{}:'".,<>?«»“”‘’]))/gi;
|
var charInsideUrl = "[-A-Z0-9+&@#/%?=~_|[\\]()!:,.;]",
|
||||||
var emailPattern = /[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)\b/gi;
|
charEndingUrl = "[-A-Z0-9+&@#/%=~_|[\\])]";
|
||||||
|
var urlPattern = new RegExp("(=\"|<)?\\b(https?|ftp)(://" + charInsideUrl + "*" + charEndingUrl + ")(?=$|\\W)", "gi");
|
||||||
|
var emailPattern = /(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)/gi;
|
||||||
|
|
||||||
var latex = Prism.languages.latex;
|
var latex = Prism.languages.latex;
|
||||||
|
|
||||||
@ -241,9 +243,6 @@ Prism.languages.md = (function () {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
md.email = {
|
|
||||||
pattern: emailPattern
|
|
||||||
};
|
|
||||||
md.code = {
|
md.code = {
|
||||||
pattern: /(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/g,
|
pattern: /(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/g,
|
||||||
lookbehind: true,
|
lookbehind: true,
|
||||||
@ -297,8 +296,11 @@ Prism.languages.md = (function () {
|
|||||||
conflict: /⧸⧸/g,
|
conflict: /⧸⧸/g,
|
||||||
comment: Prism.languages.markup.comment,
|
comment: Prism.languages.markup.comment,
|
||||||
tag: Prism.languages.markup.tag,
|
tag: Prism.languages.markup.tag,
|
||||||
entity: Prism.languages.markup.entity
|
entity: Prism.languages.markup.entity,
|
||||||
|
url: urlPattern,
|
||||||
|
email: emailPattern
|
||||||
};
|
};
|
||||||
|
|
||||||
for (var c = 6; c >= 1; c--) {
|
for (var c = 6; c >= 1; c--) {
|
||||||
md["h" + c].inside.rest = rest;
|
md["h" + c].inside.rest = rest;
|
||||||
}
|
}
|
||||||
|
@ -91,8 +91,7 @@ define([
|
|||||||
var syncIndex = createSyncIndex(doc.id);
|
var syncIndex = createSyncIndex(doc.id);
|
||||||
var fileDesc = fileMgr.getFileFromSyncIndex(syncIndex);
|
var fileDesc = fileMgr.getFileFromSyncIndex(syncIndex);
|
||||||
if(fileDesc !== undefined) {
|
if(fileDesc !== undefined) {
|
||||||
eventMgr.onError('"' + fileDesc.title + '" was already imported.');
|
return eventMgr.onError('"' + fileDesc.title + '" was already imported.');
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
importIds.push(doc.id);
|
importIds.push(doc.id);
|
||||||
});
|
});
|
||||||
@ -109,16 +108,14 @@ define([
|
|||||||
var fileDesc = fileMgr.getFileFromSyncIndex(syncIndex);
|
var fileDesc = fileMgr.getFileFromSyncIndex(syncIndex);
|
||||||
if(fileDesc !== undefined) {
|
if(fileDesc !== undefined) {
|
||||||
eventMgr.onError('File ID is already synchronized with "' + fileDesc.title + '".');
|
eventMgr.onError('File ID is already synchronized with "' + fileDesc.title + '".');
|
||||||
callback(true);
|
return callback(true);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var parentId = utils.getInputTextValue('#input-sync-export-' + providerId + '-parentid');
|
var parentId = utils.getInputTextValue('#input-sync-export-' + providerId + '-parentid');
|
||||||
var data = gdriveProvider.serializeContent(content, discussionListJSON);
|
var data = gdriveProvider.serializeContent(content, discussionListJSON);
|
||||||
googleHelper.upload(fileId, parentId, title, data, undefined, undefined, accountId, function(error, result) {
|
googleHelper.upload(fileId, parentId, title, data, undefined, undefined, accountId, function(error, result) {
|
||||||
if(error) {
|
if(error) {
|
||||||
callback(error);
|
return callback(error);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
var syncAttributes = createSyncAttributes(result.id, result.etag, content, title, discussionListJSON);
|
var syncAttributes = createSyncAttributes(result.id, result.etag, content, title, discussionListJSON);
|
||||||
callback(undefined, syncAttributes);
|
callback(undefined, syncAttributes);
|
||||||
@ -128,7 +125,7 @@ define([
|
|||||||
gdriveProvider.syncUp = function(content, contentCRC, title, titleCRC, discussionList, discussionListCRC, syncAttributes, callback) {
|
gdriveProvider.syncUp = function(content, contentCRC, title, titleCRC, discussionList, discussionListCRC, syncAttributes, callback) {
|
||||||
if(
|
if(
|
||||||
(syncAttributes.contentCRC == contentCRC) && // Content CRC hasn't changed
|
(syncAttributes.contentCRC == contentCRC) && // Content CRC hasn't changed
|
||||||
(syncAttributes.titleCRC == titleCRC) && // Content CRC hasn't changed
|
(syncAttributes.titleCRC == titleCRC) && // Title CRC hasn't changed
|
||||||
(syncAttributes.discussionListCRC == discussionListCRC) // Discussion list CRC hasn't changed
|
(syncAttributes.discussionListCRC == discussionListCRC) // Discussion list CRC hasn't changed
|
||||||
) {
|
) {
|
||||||
return callback(undefined, false);
|
return callback(undefined, false);
|
||||||
@ -144,8 +141,7 @@ define([
|
|||||||
var data = gdriveProvider.serializeContent(content, discussionList);
|
var data = gdriveProvider.serializeContent(content, discussionList);
|
||||||
googleHelper.upload(syncAttributes.id, undefined, title, data, undefined, syncAttributes.etag, accountId, function(error, result) {
|
googleHelper.upload(syncAttributes.id, undefined, title, data, undefined, syncAttributes.etag, accountId, function(error, result) {
|
||||||
if(error) {
|
if(error) {
|
||||||
callback(error, true);
|
return callback(error, true);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
syncAttributes.etag = result.etag;
|
syncAttributes.etag = result.etag;
|
||||||
// Remove this deprecated flag if any
|
// Remove this deprecated flag if any
|
||||||
@ -167,8 +163,7 @@ define([
|
|||||||
var lastChangeId = parseInt(storage[accountId + ".gdrive.lastChangeId"], 10);
|
var lastChangeId = parseInt(storage[accountId + ".gdrive.lastChangeId"], 10);
|
||||||
googleHelper.checkChanges(lastChangeId, accountId, function(error, changes, newChangeId) {
|
googleHelper.checkChanges(lastChangeId, accountId, function(error, changes, newChangeId) {
|
||||||
if(error) {
|
if(error) {
|
||||||
callback(error);
|
return callback(error);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
var interestingChanges = [];
|
var interestingChanges = [];
|
||||||
_.each(changes, function(change) {
|
_.each(changes, function(change) {
|
||||||
|
@ -103,6 +103,7 @@ li.L9 { background: #eee }
|
|||||||
@line-height-base: 1.45;
|
@line-height-base: 1.45;
|
||||||
@p-margin: 1.1em;
|
@p-margin: 1.1em;
|
||||||
@headings-font-family: inherit;
|
@headings-font-family: inherit;
|
||||||
|
@headings-font-weight: 300;
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'fontello';
|
font-family: 'fontello';
|
||||||
@ -183,6 +184,7 @@ li.L9 { background: #eee }
|
|||||||
|
|
||||||
.container {
|
.container {
|
||||||
margin-bottom: 180px;
|
margin-bottom: 180px;
|
||||||
|
text-align: justify;
|
||||||
}
|
}
|
||||||
|
|
||||||
a code {
|
a code {
|
||||||
@ -229,6 +231,9 @@ hr {
|
|||||||
[stroke="#000000"] {
|
[stroke="#000000"] {
|
||||||
stroke: @text-color;
|
stroke: @text-color;
|
||||||
}
|
}
|
||||||
|
text[stroke="#000000"] {
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
[fill="#000"], [fill="#000000"], [fill="black"] {
|
[fill="#000"], [fill="#000000"], [fill="black"] {
|
||||||
fill: @text-color;
|
fill: @text-color;
|
||||||
}
|
}
|
||||||
|
@ -130,18 +130,19 @@
|
|||||||
@popover-arrow-outer-color: @secondary-border-color;
|
@popover-arrow-outer-color: @secondary-border-color;
|
||||||
@popover-title-bg: @transparent;
|
@popover-title-bg: @transparent;
|
||||||
@alert-border-radius: 0;
|
@alert-border-radius: 0;
|
||||||
@label-warning-bg: spin(darken(@logo-yellow, 4%), -6);
|
@label-warning-bg: spin(darken(@logo-yellow, 4%), -10);
|
||||||
@label-danger-bg: spin(darken(@logo-orange, 4%), -4);
|
@state-warning-text: spin(darken(@logo-yellow, 14%), -10);
|
||||||
@state-warning-text: spin(darken(@logo-yellow, 14%), -6);
|
@state-warning-bg: fade(spin(@logo-yellow, -10), 12%);
|
||||||
@state-warning-bg: fade(spin(@logo-yellow, -6), 12%);
|
@state-warning-border: fade(spin(@logo-yellow, -10), 24%);
|
||||||
@state-warning-border: fade(spin(@logo-yellow, -6), 24%);
|
@label-danger-bg: spin(darken(@logo-orange, 4%), -8);
|
||||||
@state-danger-text: spin(darken(@logo-orange, 18%), -4);
|
@state-danger-text: spin(darken(@logo-orange, 18%), -8);
|
||||||
@state-danger-bg: fade(spin(@logo-orange, -4), 10%);
|
@state-danger-bg: fade(spin(@logo-orange, -8), 10%);
|
||||||
@state-danger-border: fade(spin(@logo-orange, -4), 20%);
|
@state-danger-border: fade(spin(@logo-orange, -8), 20%);
|
||||||
|
|
||||||
|
|
||||||
body {
|
body {
|
||||||
tab-size: 4;
|
tab-size: 4;
|
||||||
|
text-align: start;
|
||||||
}
|
}
|
||||||
|
|
||||||
* {
|
* {
|
||||||
@ -192,6 +193,8 @@ body {
|
|||||||
.translate(0, 0);
|
.translate(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
.modal-content {
|
.modal-content {
|
||||||
background-color: @secondary-bg-light;
|
background-color: @secondary-bg-light;
|
||||||
}
|
}
|
||||||
@ -202,8 +205,15 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.modal-footer {
|
.modal-footer {
|
||||||
|
background-color: @secondary-bg-light;
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.modal-iframe {
|
||||||
|
display: block;
|
||||||
|
margin: 30px auto 0;
|
||||||
|
z-index: 1040;
|
||||||
|
border-radius: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -244,6 +254,8 @@ a {
|
|||||||
|
|
||||||
.list-group-item {
|
.list-group-item {
|
||||||
padding: 10px 15px;
|
padding: 10px 15px;
|
||||||
|
border-left-width: 0;
|
||||||
|
border-right-width: 0;
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
.list-group & {
|
.list-group & {
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
@ -251,9 +263,24 @@ a {
|
|||||||
a&:hover,
|
a&:hover,
|
||||||
a&:focus {
|
a&:focus {
|
||||||
color: darken(@secondary, 30%);
|
color: darken(@secondary, 30%);
|
||||||
border-top-color: @list-group-hover-border-color;
|
border-color: @list-group-hover-border-color;
|
||||||
border-bottom-color: @list-group-hover-border-color;
|
|
||||||
}
|
}
|
||||||
|
.checkbox {
|
||||||
|
float: right;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
input {
|
||||||
|
cursor: pointer;
|
||||||
|
margin: 0 16px;
|
||||||
|
height: @input-height-slim;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-group {
|
||||||
|
margin-bottom: 1px;
|
||||||
|
padding: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.text-danger:hover {
|
.text-danger:hover {
|
||||||
@ -765,17 +792,6 @@ a {
|
|||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
border-top-color: @modal-content-separator-color;
|
border-top-color: @modal-content-separator-color;
|
||||||
}
|
}
|
||||||
.checkbox {
|
|
||||||
float: right;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
cursor: pointer;
|
|
||||||
input {
|
|
||||||
cursor: pointer;
|
|
||||||
margin: 0 16px;
|
|
||||||
height: @input-height-slim;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.input-rename {
|
.input-rename {
|
||||||
width: 220px;
|
width: 220px;
|
||||||
height: @input-height-slim;
|
height: @input-height-slim;
|
||||||
@ -922,7 +938,7 @@ a {
|
|||||||
width: 220px;
|
width: 220px;
|
||||||
margin: 10px auto 20px;
|
margin: 10px auto 20px;
|
||||||
.btn {
|
.btn {
|
||||||
text-align: initial;
|
text-align: start;
|
||||||
padding-left: 15px;
|
padding-left: 15px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1223,11 +1239,6 @@ a {
|
|||||||
.h6 { font-size: 0.9em; }
|
.h6 { font-size: 0.9em; }
|
||||||
|
|
||||||
|
|
||||||
.url,
|
|
||||||
.email {
|
|
||||||
color: @tertiary-color-light;
|
|
||||||
}
|
|
||||||
|
|
||||||
.md, .hr {
|
.md, .hr {
|
||||||
color: @tertiary-color-light;
|
color: @tertiary-color-light;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
@ -1248,10 +1259,16 @@ a {
|
|||||||
text-decoration: line-through
|
text-decoration: line-through
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.url,
|
||||||
|
.email,
|
||||||
.md-underlined-text {
|
.md-underlined-text {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.linkdef .url {
|
||||||
|
color: @tertiary-color-light;
|
||||||
|
}
|
||||||
|
|
||||||
.img,
|
.img,
|
||||||
.imgref {
|
.imgref {
|
||||||
padding: 0.2em 0.4em;
|
padding: 0.2em 0.4em;
|
||||||
|
@ -349,6 +349,36 @@ define([
|
|||||||
].join(""));
|
].join(""));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var $windowElt = $(window);
|
||||||
|
utils.iframe = function(url, width, height) {
|
||||||
|
var $backdropElt = $(utils.createBackdrop());
|
||||||
|
var result = crel('iframe', {
|
||||||
|
src: url,
|
||||||
|
frameborder: 0,
|
||||||
|
class: 'modal-content modal-iframe'
|
||||||
|
});
|
||||||
|
document.body.appendChild(result);
|
||||||
|
function placeIframe() {
|
||||||
|
var actualWidth = window.innerWidth - 20;
|
||||||
|
actualWidth > width && (actualWidth = width);
|
||||||
|
var actualHeight = window.innerHeight - 50;
|
||||||
|
actualHeight > height && (actualHeight = height);
|
||||||
|
result.setAttribute('width', actualWidth);
|
||||||
|
result.setAttribute('height', actualHeight);
|
||||||
|
}
|
||||||
|
placeIframe();
|
||||||
|
$windowElt.on('resize.iframe', placeIframe);
|
||||||
|
function removeIframe() {
|
||||||
|
$backdropElt.off('click.backdrop');
|
||||||
|
$backdropElt[0].removeBackdrop();
|
||||||
|
$windowElt.off('resize.iframe');
|
||||||
|
result.parentNode.removeChild(result);
|
||||||
|
}
|
||||||
|
result.removeIframe = removeIframe;
|
||||||
|
$backdropElt.on('click.backdrop', removeIframe);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
// Shows a dialog to force the user to click a button before opening oauth popup
|
// Shows a dialog to force the user to click a button before opening oauth popup
|
||||||
var redirectCallbackConfirm;
|
var redirectCallbackConfirm;
|
||||||
var redirectCallbackCancel;
|
var redirectCallbackCancel;
|
||||||
|
@ -11,6 +11,7 @@ app.all('*', function(req, res, next) {
|
|||||||
res.redirect('https://stackedit.io' + req.url);
|
res.redirect('https://stackedit.io' + req.url);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
/\.(eot|ttf|woff)$/.test(req.url) && res.header('Access-Control-Allow-Origin', '*');
|
||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user