diff --git a/public/cache.manifest b/public/cache.manifest
index c7057bf9..20184a55 100644
--- a/public/cache.manifest
+++ b/public/cache.manifest
@@ -1,5 +1,5 @@
CACHE MANIFEST
-#Date Sun Dec 08 2013 18:59:04
+#Date Mon Dec 23 2013 23:42:18
CACHE:
res/worker.js
diff --git a/public/res-min/main.js b/public/res-min/main.js
index 2fd326e3..01b1dc90 100644
--- a/public/res-min/main.js
+++ b/public/res-min/main.js
@@ -11523,6 +11523,7 @@ function printStackTrace(e) {
return e.VERSION = "3.0.3", e.MAIN_URL = "https://stackedit.io/", e.GOOGLE_ANALYTICS_ACCOUNT_ID = "UA-39556145-1",
e.GOOGLE_API_KEY = "AIzaSyAeCU8CGcSkn0z9js6iocHuPBX4f_mMWkw", e.GOOGLE_DRIVE_APP_ID = "241271498917",
e.DROPBOX_APP_KEY = "lq6mwopab8wskas", e.DROPBOX_APP_SECRET = "851fgnucpezy84t",
+ e.DROPBOX_RESTRICTED_APP_KEY = "sw0hlixhr8q1xk0", e.DROPBOX_RESTRICTED_APP_SECRET = "1r808p2xygs6lbg",
e.BITLY_ACCESS_TOKEN = "317e033bfd48cf31155a68a536b1860013b09c4c", e.DEFAULT_FILE_TITLE = "Title",
e.DEFAULT_FOLDER_NAME = "New folder", e.GDRIVE_DEFAULT_FILE_TITLE = "New Markdown document",
e.EDITOR_DEFAULT_PADDING = 15, e.CHECK_ONLINE_PERIOD = 12e4, e.AJAX_TIMEOUT = 3e4,
@@ -11530,20 +11531,18 @@ function printStackTrace(e) {
e.IMPORT_FILE_MAX_CONTENT_SIZE = 1e5, e.IMPORT_IMG_MAX_CONTENT_SIZE = 1e7, e.TEMPORARY_FILE_INDEX = "file.tempIndex",
e.WELCOME_DOCUMENT_TITLE = "Welcome document", e.DOWNLOAD_PROXY_URL = "https://stackedit-download-proxy.herokuapp.com/",
e.PICASA_PROXY_URL = "https://stackedit-picasa-proxy.herokuapp.com/", e.SSH_PROXY_URL = "https://stackedit-ssh-proxy.herokuapp.com/",
- e.HTMLTOPDF_URL = "https://stackedit-htmltopdf.herokuapp.com/", window.delayedFunction = void 0,
- window.runDelayedFunction = function() {
- void 0 !== window.delayedFunction && window.delayedFunction();
- }, e.BASE_URL = "http://localhost/", e.GOOGLE_CLIENT_ID = "241271498917-lev37kef013q85avc91am1gccg5g8lrb.apps.googleusercontent.com",
+ e.HTMLTOPDF_URL = "https://stackedit-htmltopdf.herokuapp.com/", e.BASE_URL = "http://localhost/",
+ e.GOOGLE_CLIENT_ID = "241271498917-lev37kef013q85avc91am1gccg5g8lrb.apps.googleusercontent.com",
e.GITHUB_CLIENT_ID = "e47fef6055344579799d", e.GATEKEEPER_URL = "https://stackedit-gatekeeper-localhost.herokuapp.com/",
e.TUMBLR_PROXY_URL = "https://stackedit-tumblr-proxy-local.herokuapp.com/", e.WORDPRESS_CLIENT_ID = "23361",
- e.WORDPRESS_PROXY_URL = "https://stackedit-io-wordpress-proxy.herokuapp.com/", 0 === location.hostname.indexOf("stackedit.io") && (e.BASE_URL = e.MAIN_URL,
+ e.WORDPRESS_PROXY_URL = "https://stackedit-io-wordpress-proxy.herokuapp.com/", 0 === location.hostname.indexOf("stackedit.io") ? (e.BASE_URL = e.MAIN_URL,
e.GOOGLE_CLIENT_ID = "241271498917-t4t7d07qis7oc0ahaskbif3ft6tk63cd.apps.googleusercontent.com",
e.GITHUB_CLIENT_ID = "710fc67886ab1ae8fee6", e.GATEKEEPER_URL = "https://stackedit-io-gatekeeper.herokuapp.com/",
- e.TUMBLR_PROXY_URL = "https://stackedit-io-tumblr-proxy.herokuapp.com/"), 0 === location.hostname.indexOf("benweet.github.io") && (e.BASE_URL = "http://benweet.github.io/stackedit/",
+ e.TUMBLR_PROXY_URL = "https://stackedit-io-tumblr-proxy.herokuapp.com/") : 0 === location.hostname.indexOf("benweet.github.io") ? (e.BASE_URL = "http://benweet.github.io/stackedit/",
e.GOOGLE_CLIENT_ID = "241271498917-jpto9lls9fqnem1e4h6ppds9uob8rpvu.apps.googleusercontent.com",
e.GITHUB_CLIENT_ID = "fa0d09514da8377ee32e", e.GATEKEEPER_URL = "https://stackedit-gatekeeper.herokuapp.com/",
e.TUMBLR_PROXY_URL = "https://stackedit-tumblr-proxy.herokuapp.com/", e.WORDPRESS_CLIENT_ID = "3185",
- e.WORDPRESS_PROXY_URL = "https://stackedit-wordpress-proxy.herokuapp.com/"), 0 === location.hostname.indexOf("benweet.insomnia247.nl") && (e.BASE_URL = "http://benweet.insomnia247.nl/stackedit/",
+ e.WORDPRESS_PROXY_URL = "https://stackedit-wordpress-proxy.herokuapp.com/") : 0 === location.hostname.indexOf("benweet.insomnia247.nl") && (e.BASE_URL = "http://benweet.insomnia247.nl/stackedit/",
e.GOOGLE_CLIENT_ID = "241271498917-52hae7a08hv7ltenv7km8h7lghno9sk3.apps.googleusercontent.com",
e.GITHUB_CLIENT_ID = "d2943d6074b2d9c4a830", e.GATEKEEPER_URL = "https://stackedit-gatekeeper-insomnia.herokuapp.com/",
e.TUMBLR_PROXY_URL = "https://stackedit-tumblr-proxy-beta.herokuapp.com/"), e.THEME_LIST = {
@@ -11624,8 +11623,12 @@ function printStackTrace(e) {
"v14" == r && (e.has(localStorage, "settings") && (i = JSON.parse(localStorage.settings),
i.template && (i.template = i.template.replace("https://stackedit.io/res-min/themes/default.css", "https://stackedit.io/res-min/themes/base.css")),
i.pdfTemplate && (i.pdfTemplate = i.pdfTemplate.replace("https://stackedit.io/res-min/themes/default.css", "https://stackedit.io/res-min/themes/base.css")),
- localStorage.settings = JSON.stringify(i)), r = "v15"), localStorage.version = r,
- localStorage;
+ localStorage.settings = JSON.stringify(i)), r = "v15"), "v15" == r && (localStorage.removeItem("gdrivePermissions"),
+ e.has(localStorage, "gdrive.lastChangeId") && (localStorage["google.gdrive0.gdrive.lastChangeId"] = localStorage["gdrive.lastChangeId"],
+ localStorage.removeItem("gdrive.lastChangeId")), e.has(localStorage, "settings") && (i = JSON.parse(localStorage.settings),
+ ((i.extensionSettings || {}).markdownExtra || {}).extensions && (i.extensionSettings.markdownExtra.extensions.push("newlines"),
+ i.extensionSettings.markdownExtra.extensions.push("strikethrough")), localStorage.settings = JSON.stringify(i)),
+ r = "v16"), localStorage.version = r, localStorage;
}), function(e) {
var t;
"function" == typeof define ? define("xregexp", e) : "object" == typeof exports ? (t = e(),
@@ -13671,7 +13674,9 @@ var saveAs = saveAs || "undefined" != typeof navigator && navigator.msSaveOrOpen
maxWidth: 960,
defaultContent: "\n\n\n> Written with [StackEdit](" + t.MAIN_URL + ").",
commitMsg: "Published with " + t.MAIN_URL,
+ gdriveMultiAccount: 1,
gdriveFullAccess: !0,
+ dropboxFullAccess: !0,
template: [ "\n", "\n", "
\n", ' \n', "<%= documentTitle %> \n", ' \n', '\n', "\n", '<%= documentHTML %>
\n', "" ].join(""),
pdfTemplate: [ "\n", "\n", "\n", ' \n', "<%= documentTitle %> \n", ' \n', '\n", '\n', "\n", '<%= documentHTML %>\n', "" ].join(""),
pdfPageSize: "A4",
@@ -14676,7 +14681,7 @@ var saveAs = saveAs || "undefined" != typeof navigator && navigator.msSaveOrOpen
});
}, i;
}), define("text!html/markdownExtraSettingsBlock.html", [], function() {
- return 'Adds extra features to the original Markdown syntax.
\n\nMore info ';
+ return 'Adds extra features to the original Markdown syntax.
\n\nMore info ';
}), window.PR_SHOULD_USE_CONTINUATION = !0;
var prettyPrintOne, prettyPrint;
@@ -19808,19 +19813,22 @@ function() {
this.attributeBlocks = !1, this.googleCodePrettify = !1, this.highlightJs = !1,
this.tableClass = "", this.tabWidth = 4;
}, Markdown.Extra.init = function(e, t) {
- var n = new Markdown.Extra(), o = [], r = [], s = [ "unHashExtraBlocks" ];
- return t = t || {}, t.extensions = t.extensions || [ "all" ], i(t.extensions, "all") && (t.extensions = [ "tables", "fenced_code_gfm", "def_list", "attr_list", "footnotes", "smartypants" ]),
+ var n = new Markdown.Extra(), o = [], r = [], s = [], a = [ "unHashExtraBlocks" ];
+ return t = t || {}, t.extensions = t.extensions || [ "all" ], i(t.extensions, "all") && (t.extensions = [ "tables", "fenced_code_gfm", "def_list", "attr_list", "footnotes", "smartypants", "strikethrough", "newlines" ]),
r.push("wrapHeaders"), i(t.extensions, "attr_list") && (o.push("hashFcbAttributeBlocks"),
- r.push("hashHeaderAttributeBlocks"), s.push("applyAttributeBlocks"), n.attributeBlocks = !0),
+ r.push("hashHeaderAttributeBlocks"), a.push("applyAttributeBlocks"), n.attributeBlocks = !0),
i(t.extensions, "fenced_code_gfm") && o.push("fencedCodeBlocks"), i(t.extensions, "tables") && r.push("tables"),
i(t.extensions, "def_list") && r.push("definitionLists"), i(t.extensions, "footnotes") && (o.push("stripFootnoteDefinitions"),
- r.push("doFootnotes"), s.push("printFootnotes")), i(t.extensions, "smartypants") && s.push("runSmartyPants"),
+ r.push("doFootnotes"), a.push("printFootnotes")), i(t.extensions, "smartypants") && a.push("runSmartyPants"),
+ i(t.extensions, "strikethrough") && s.push("strikethrough"), i(t.extensions, "newlines") && s.push("newlines"),
e.hooks.chain("postNormalization", function(e) {
return n.doTransform(o, e) + "\n";
}), e.hooks.chain("preBlockGamut", function(e, t) {
return n.blockGamutHookCallback = t, e = u(e), e = n.doTransform(r, e) + "\n", e = d(e);
+ }), e.hooks.chain("postSpanGamut", function(e) {
+ return n.doTransform(s, e);
}), n.previousPostConversion = e.hooks.postConversion, e.hooks.chain("postConversion", function(e) {
- return e = n.doTransform(s, e), n.hashBlocks = [], n.footnotes = {}, n.usedFootnotes = [],
+ return e = n.doTransform(a, e), n.hashBlocks = [], n.footnotes = {}, n.usedFootnotes = [],
e;
}), "highlighter" in t && (n.googleCodePrettify = "prettify" === t.highlighter,
n.highlightJs = "highlight" === t.highlighter), "table_class" in t && (n.tableClass = t.table_class),
@@ -19849,23 +19857,25 @@ function() {
}
return e = e.replace(/^.+[ \t]*\n=+[ \t]*\n+/gm, t), e = e.replace(/^.+[ \t]*\n-+[ \t]*\n+/gm, t),
e = e.replace(/^\#{1,6}[ \t]*.+?[ \t]*\#*\n+/gm, t);
- }, Markdown.Extra.prototype.hashHeaderAttributeBlocks = function(e) {
- function t(e, t, n) {
- return "~XX" + (r.hashBlocks.push(n) - 1) + "XX
\n" + t + "\n";
+ };
+ var m = "\\{[ \\t]*((?:[#.][-_:a-zA-Z0-9]+[ \\t]*)+)\\}", v = new RegExp("^(#{1,6}.*#{0,6})[ \\t]+" + m + "[ \\t]*(?:\\n|0x03)", "gm"), b = new RegExp("^(.*)[ \\t]+" + m + "[ \\t]*\\n" + "(?=[\\-|=]+\\s*(?:\\n|0x03))", "gm"), y = new RegExp("^(```[^{\\n]*)[ \\t]+" + m + "[ \\t]*\\n" + "(?=([\\s\\S]*?)\\n```\\s*(\\n|0x03))", "gm");
+ Markdown.Extra.prototype.hashHeaderAttributeBlocks = function(e) {
+ function t(e, t, i) {
+ return "~XX" + (n.hashBlocks.push(i) - 1) + "XX
\n" + t + "\n";
}
- var n = "\\{\\s*[.|#][^}]+\\}", i = new RegExp("^(#{1,6}.*#{0,6})\\s+(" + n + ")[ \\t]*(\\n|0x03)", "gm"), o = new RegExp("^(.*)\\s+(" + n + ")[ \\t]*\\n" + "(?=[\\-|=]+\\s*(\\n|0x03))", "gm"), r = this;
- return e = e.replace(i, t), e = e.replace(o, t);
+ var n = this;
+ return e = e.replace(v, t), e = e.replace(b, t);
}, Markdown.Extra.prototype.hashFcbAttributeBlocks = function(e) {
- function t(e, t, n) {
- return "~XX" + (o.hashBlocks.push(n) - 1) + "XX
\n" + t + "\n";
+ function t(e, t, i) {
+ return "~XX" + (n.hashBlocks.push(i) - 1) + "XX
\n" + t + "\n";
}
- var n = "\\{\\s*[.|#][^}]+\\}", i = new RegExp("^(```[^{\\n]*)\\s+(" + n + ")[ \\t]*\\n" + "(?=([\\s\\S]*?)\\n```\\s*(\\n|0x03))", "gm"), o = this;
- return e.replace(i, t);
+ var n = this;
+ return e.replace(y, t);
}, Markdown.Extra.prototype.applyAttributeBlocks = function(e) {
var t = this, n = new RegExp('~XX(\\d+)XX
[\\s]*(?:<(h[1-6]|pre)(?: +class="(\\S+)")?(>[\\s\\S]*?\\2>))', "gm");
return e = e.replace(n, function(e, n, i, o, s) {
if (!i) return "";
- for (var a = parseInt(n, 10), l = t.hashBlocks[a], c = l.match(/#[^\s{}]+/g) || [], u = c[0] ? ' id="' + c[0].substr(1, c[0].length - 1) + '"' : "", d = l.match(/\.[^\s{}]+/g) || [], h = 0; h < d.length; h++) d[h] = d[h].substr(1, d[h].length - 1);
+ for (var a = parseInt(n, 10), l = t.hashBlocks[a], c = l.match(/#[^\s#.]+/g) || [], u = c[0] ? ' id="' + c[0].substr(1, c[0].length - 1) + '"' : "", d = l.match(/\.[^\s#.]+/g) || [], h = 0; h < d.length; h++) d[h] = d[h].substr(1, d[h].length - 1);
var p = "";
return o && (d = r(d, [ o ])), d.length > 0 && (p = ' class="' + d.join(" ") + '"'),
"<" + i + u + p + s;
@@ -19940,11 +19950,11 @@ function() {
});
}, Markdown.Extra.prototype.educatePants = function(e) {
var t = this, n = "", i = 0;
- e.replace(/(<)([a-zA-Z1-6]+)([^\n]*?>)([\s\S]*?)(<\/\2>)/g, function(o, r, s, a, l, c, u) {
+ e.replace(/(?:)|(<)([a-zA-Z1-6]+)([^\n]*?>)([\s\S]*?)(<\/\2>)/g, function(o, r, s, a, l, c, u) {
var d = e.substring(i, u);
- n += t.applyPants(d), t.smartyPantsLastChar = n.substring(n.length - 1), i = u + o.length,
- /code|kbd|pre|script|noscript|iframe|math|ins|del|pre/i.test(s) ? t.smartyPantsLastChar = l.substring(l.length - 1) : l = t.educatePants(l),
- n += r + s + a + l + c;
+ return n += t.applyPants(d), t.smartyPantsLastChar = n.substring(n.length - 1),
+ i = u + o.length, r ? (/code|kbd|pre|script|noscript|iframe|math|ins|del|pre/i.test(s) ? t.smartyPantsLastChar = l.substring(l.length - 1) : l = t.educatePants(l),
+ n += r + s + a + l + c, void 0) : (n += o, void 0);
});
var o = e.substring(i);
return n += t.applyPants(o), t.smartyPantsLastChar = n.substring(n.length - 1),
@@ -19979,11 +19989,17 @@ function() {
return i || s.match(/\n{2,}/) ? (s = Array(r.length + 1).join(" ") + s, s = n(s) + "\n\n",
s = "\n" + c(s, o) + "\n") : (s = t(s), s = l(n(s), o)), "\n" + s + " \n";
}), a(i);
+ }, Markdown.Extra.prototype.strikethrough = function(e) {
+ return e.replace(/([\W_]|^)~T~T(?=\S)([^\r]*?\S[\*_]*)~T~T([\W_]|$)/g, "$1$2$3");
+ }, Markdown.Extra.prototype.newlines = function(e) {
+ return e.replace(/( )?\n/g, function(e, t) {
+ return t ? e : " \n";
+ });
};
}(), define("pagedown-extra", function() {}), define("extensions/markdownExtra", [ "jquery", "underscore", "utils", "classes/Extension", "text!html/markdownExtraSettingsBlock.html", "google-code-prettify", "highlightjs", "pagedown-extra" ], function(e, t, n, i, o, r, s) {
var a = new i("markdownExtra", "Markdown Extra", !0);
a.settingsBlock = o, a.defaultConfig = {
- extensions: [ "fenced_code_gfm", "tables", "def_list", "attr_list", "footnotes", "smartypants" ],
+ extensions: [ "fenced_code_gfm", "tables", "def_list", "attr_list", "footnotes", "smartypants", "strikethrough", "newlines" ],
highlighter: "prettify"
}, a.onLoadSettings = function() {
function e(e) {
@@ -19994,6 +20010,7 @@ function() {
n.setInputChecked("#input-markdownextra-fencedcodegfm", e("fenced_code_gfm")), n.setInputChecked("#input-markdownextra-tables", e("tables")),
n.setInputChecked("#input-markdownextra-deflist", e("def_list")), n.setInputChecked("#input-markdownextra-attrlist", e("attr_list")),
n.setInputChecked("#input-markdownextra-footnotes", e("footnotes")), n.setInputChecked("#input-markdownextra-smartypants", e("smartypants")),
+ n.setInputChecked("#input-markdownextra-strikethrough", e("strikethrough")), n.setInputChecked("#input-markdownextra-newlines", e("newlines")),
n.setInputValue("#input-markdownextra-highlighter", a.config.highlighter);
}, a.onSaveSettings = function(e) {
e.extensions = [], n.getInputChecked("#input-markdownextra-fencedcodegfm") && e.extensions.push("fenced_code_gfm"),
@@ -20002,6 +20019,8 @@ function() {
n.getInputChecked("#input-markdownextra-attrlist") && e.extensions.push("attr_list"),
n.getInputChecked("#input-markdownextra-footnotes") && e.extensions.push("footnotes"),
n.getInputChecked("#input-markdownextra-smartypants") && e.extensions.push("smartypants"),
+ n.getInputChecked("#input-markdownextra-strikethrough") && e.extensions.push("strikethrough"),
+ n.getInputChecked("#input-markdownextra-newlines") && e.extensions.push("newlines"),
e.highlighter = n.getInputValue("#input-markdownextra-highlighter");
};
var l;
@@ -20173,7 +20192,7 @@ function() {
var n = i.substring(a, t);
s.push({
text: n,
- textWithDelimiter: "\n~~~SectionDelimiter~~~\n\n" + n + "\n"
+ textWithDelimiter: '\n
\n\n' + n + "\n"
});
}
o.previewStartTime = new Date();
@@ -20183,8 +20202,6 @@ function() {
}), n(a, t.length), o.onSectionsCreated(s), e.reduce(s, function(e, t) {
return e + t.textWithDelimiter;
}, "");
- }), s.hooks.chain("postConversion", function(e) {
- return e.replace(/~~~SectionDelimiter~~~<\/p>/g, '
');
});
}, r;
}), define("text!html/partialRenderingSettingsBlock.html", [], function() {
@@ -20680,17 +20697,17 @@ function() {
o.onLayoutCreated = function(e) {
i = e;
};
- var r, s, a = function(n) {
- if (n === r) {
- var o = r.title;
- document.title = "StackEdit - " + o, s.html(r.composeTitle()), e(".file-title").text(o),
- e(".input-file-title").val(o), void 0 !== i && t.defer(i.resizeAll);
+ var r, s, a = t.debounce(function(t) {
+ if (t === r) {
+ var n = r.title;
+ document.title = "StackEdit - " + n, s.html(r.composeTitle()), e(".file-title").text(n),
+ e(".input-file-title").val(n), i && i.resizeAll();
}
- };
+ }, 50);
return o.onFileSelected = function(e) {
r = e, a(e);
}, o.onTitleChanged = a, o.onSyncExportSuccess = a, o.onSyncRemoved = a, o.onNewPublishSuccess = a,
- o.onPublishRemoved = a, o.onReady = function() {
+ o.onPublishRemoved = a, o.onReady = a, o.onReady = function() {
s = e(".file-title-navbar"), s.hover(function() {
var e = s[0].scrollWidth - s.outerWidth();
s.stop(!0, !0).animate({
@@ -21504,8 +21521,8 @@ function() {
return 'Shows notification messages in the bottom-right corner of the\n screen.
\n';
}), define("extensions/notifications", [ "jquery", "underscore", "utils", "logger", "classes/Extension", "jgrowl", "text!html/notificationsSettingsBlock.html" ], function(e, t, n, i, o, r, s) {
function a() {
- h === !1 && (r.defaults.life = c.config.timeout, r.defaults.closer = !1, r.defaults.closeTemplate = "",
- r.defaults.position = "bottom-right", h = !0);
+ p === !1 && (r.defaults.life = u.config.timeout, r.defaults.closer = !1, r.defaults.closeTemplate = "",
+ r.defaults.position = "bottom-right", p = !0);
}
function l(e, n, o) {
if (i.info(e), a(), e) {
@@ -21514,39 +21531,44 @@ function() {
r(" " + t.escape(e).replace(/\n/g, " "), o));
}
}
- var c = new o("notifications", "Notifications");
- c.settingsBlock = s, c.defaultConfig = {
+ function c() {
+ f !== !1 && (d.toggleClass("hide", !g), h.toggleClass("hide", g));
+ }
+ var u = new o("notifications", "Notifications");
+ u.settingsBlock = s, u.defaultConfig = {
timeout: 8e3
- }, c.onLoadSettings = function() {
- n.setInputValue("#input-notifications-timeout", c.config.timeout);
- }, c.onSaveSettings = function(e, t) {
+ }, u.onLoadSettings = function() {
+ n.setInputValue("#input-notifications-timeout", u.config.timeout);
+ }, u.onSaveSettings = function(e, t) {
e.timeout = n.getInputIntValue("#input-notifications-timeout", t, 1, 6e4);
};
- var u, d, h = !1;
- return c.onReady = function() {
- u = e(".navbar .offline-status"), d = e(".navbar .extension-buttons");
- }, c.onMessage = function(e) {
+ var d, h, p = !1, f = !1;
+ u.onReady = function() {
+ f = !0, d = e(".navbar .offline-status"), h = e(".navbar .extension-buttons"), c();
+ }, u.onMessage = function(e) {
l(e);
- }, c.onError = function(e) {
+ }, u.onError = function(e) {
i.error(e), t.isString(e) ? l(e, "icon-attention") : t.isObject(e) && l(e.message, "icon-attention");
- }, c.onOfflineChanged = function(e) {
- u.toggleClass("hide", !e), d.toggleClass("hide", e), e === !0 ? l("You are offline.", "icon-attention-circled msg-offline") : l("You are back online!", "icon-signal");
- }, c.onSyncImportSuccess = function(e, n) {
+ };
+ var g = !1;
+ return u.onOfflineChanged = function(e) {
+ g = e, c(), g === !0 ? l("You are offline.", "icon-attention-circled msg-offline") : l("You are back online!", "icon-signal");
+ }, u.onSyncImportSuccess = function(e, n) {
var i = t.map(e, function(e) {
return e.title;
}).join(", ");
l(i + " imported successfully from " + n.providerName + ".");
- }, c.onSyncExportSuccess = function(e, t) {
+ }, u.onSyncExportSuccess = function(e, t) {
l('"' + e.title + '" will now be synchronized on ' + t.provider.providerName + ".");
- }, c.onSyncRemoved = function(e, t) {
+ }, u.onSyncRemoved = function(e, t) {
l(t.provider.providerName + " synchronized location has been removed.");
- }, c.onPublishSuccess = function(e) {
+ }, u.onPublishSuccess = function(e) {
l('"' + e.title + '" successfully published.');
- }, c.onNewPublishSuccess = function(e, t) {
+ }, u.onNewPublishSuccess = function(e, t) {
l('"' + e.title + '" is now published on ' + t.provider.providerName + ".");
- }, c.onPublishRemoved = function(e, t) {
+ }, u.onPublishRemoved = function(e, t) {
l(t.provider.providerName + " publish location has been removed.");
- }, c;
+ }, u;
}), define("text!html/buttonToc.html", [], function() {
return '\n \n \n\n';
}), define("text!html/tocSettingsBlock.html", [], function() {
@@ -23518,7 +23540,7 @@ function() {
});
}, r;
}), define("text!html/bodyIndex.html", [], function() {
- return '\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\n\n\n\n\n\n
\n
\n\n \n
\n
\n
\n
\n
The following documents will be\n deleted locally:
\n
Please choose a destination\n folder:
\n
\n
\n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
Please provide the link URL and an optional title:
\n
\n \n
\n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
Please provide the image URL and an optional title:
\n
\n \n
\n
\n \n
\n
\n
\n\n\n\n\n\n\n
\n
\n\n \n
\n
\n Are you sure you want to delete " "?\n
\n
\n NOTE: This will not delete the file on synchronized\n locations.\n \n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
Please provide a link to a Markdown document.
\n
\n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
Please select your Markdown files here:
\n
\n \n
\n
Or drag and drop your Markdown files here:
\n
Drop\n files here
\n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
Please select your HTML files here:
\n
\n \n
\n
Or drag and drop your HTML files here:
\n
Drop\n files here
\n
Or insert your HTML code here:
\n
\n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
\n This will save " " to your \n Google Drive
\n account and keep it synchronized.\n
\n
\n
Options...
\n
\n Tip: You can move or rename the file afterwards within Google\n Drive.\n \n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
\n This will save " " to your \n Dropbox
\n account and keep it synchronized.\n
\n
\n
\n NOTE: \n \n Dropbox file path does not depend on document title. \n The title of your document will not be synchronized. \n Destination folder must exist. \n Any existing file at this location will be overwritten. \n \n \n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
\n " " is synchronized with the\n following location(s):\n
\n
\n
\n NOTE: Removing a synchronized location will not delete any\n file.\n \n
" " is not synchronized yet.
\n
\n Tip: You can add synchronized locations by\n exporting your document using \n Google Drive
\n or \n Dropbox
\n sub-menu.\n \n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
\n
\n Tip: You can use a\n YAML front matter to specify the title and the tags/labels of your publication.
\n Interpreted variables: title
, tags
, published
, date
.
\n \n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
\n " " is published on the following\n location(s):\n
\n
\n
\n NOTE: Removing a publish location will not delete the actual publication.\n \n
\n " " is not published yet.\n
\n
\n Tip: You can add publications using the Publish on
sub-menu.\n \n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
\n " " can be shared using the following link(s):\n
\n
\n
To share this document within StackEdit you need first to publish it as a Gist in\n Markdown format.\n
\n
\n Tip: You can open any URL within StackEdit using viewer#!url=
.\n \n
\n \n
\n
\n
\n\n\n\n\n\n\n
\n
\n\n \n
\n
StackEdit has stopped because another instance was running in\n the same browser.
\n
If you want to reopen StackEdit, click on\n "Reload". \n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
\n
Please click OK to proceed. \n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
This will delete all your local documents.
\n
Are you sure? \n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
This will delete all existing local documents.
\n
Are you sure? \n
\n \n
\n
\n
\n\n\n
\n
\n
';
+ return '\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\n\n\n\n\n\n
\n
\n\n \n
\n
\n
\n
\n
The following documents will be\n deleted locally:
\n
Please choose a destination\n folder:
\n
\n
\n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
Please provide the link URL and an optional title:
\n
\n \n
\n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
Please provide the image URL and an optional title:
\n
\n \n
\n
\n \n
\n
\n
\n\n\n\n\n\n\n
\n
\n\n \n
\n
\n Are you sure you want to delete " "?\n
\n
\n NOTE: This will not delete the file on synchronized\n locations.\n \n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
Please provide a link to a Markdown document.
\n
\n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
Please select your Markdown files here:
\n
\n \n
\n
Or drag and drop your Markdown files here:
\n
Drop\n files here
\n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
Please select your HTML files here:
\n
\n \n
\n
Or drag and drop your HTML files here:
\n
Drop\n files here
\n
Or insert your HTML code here:
\n
\n
\n \n
\n
\n
\n\n\n\n
\n\n
\n\n
\n\n\n\n
\n
\n\n \n
\n
\n This will save " " to your \n Dropbox
\n account and keep it synchronized.\n
\n
\n
\n NOTE: \n \n Dropbox file path does not depend on document title. \n The title of your document will not be synchronized. \n Destination folder must exist. \n Any existing file at this location will be overwritten. \n \n \n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
\n " " is synchronized with the\n following location(s):\n
\n
\n
\n NOTE: Removing a synchronized location will not delete any\n file.\n \n
" " is not synchronized yet.
\n
\n Tip: You can add synchronized locations by\n exporting your document using \n Google Drive
\n or \n Dropbox
\n sub-menu.\n \n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
\n
\n Tip: You can use a\n YAML front matter to specify the title and the tags/labels of your publication.
\n Interpreted variables: title
, tags
, published
, date
.
\n \n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
\n " " is published on the following\n location(s):\n
\n
\n
\n NOTE: Removing a publish location will not delete the actual publication.\n \n
\n " " is not published yet.\n
\n
\n Tip: You can add publications using the Publish on
sub-menu.\n \n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
\n " " can be shared using the following link(s):\n
\n
\n
To share this document within StackEdit you need first to publish it as a Gist in\n Markdown format.\n
\n
\n Tip: You can open any URL within StackEdit using viewer#!url=
.\n \n
\n \n
\n
\n
\n\n\n\n\n\n\n
\n
\n\n \n
\n
StackEdit has stopped because another instance was running in\n the same browser.
\n
If you want to reopen StackEdit, click on\n "Reload". \n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
\n
Please click OK to proceed. \n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
This will delete all your local documents.
\n
Are you sure? \n
\n \n
\n
\n
\n\n\n\n
\n
\n\n \n
\n
This will delete all existing local documents.
\n
Are you sure? \n
\n \n
\n
\n
\n\n\n
\n
\n
';
}), define("text!html/bodyViewer.html", [], function() {
return '\n\n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n
\n
\n
\n\n\n\n\n\n\n
\n
\n\n \n
\n
StackEdit has stopped because another instance was running in\n the same browser.
\n
If you want to reopen StackEdit, click on\n "Reload". \n
\n \n
\n
\n
\n';
}), define("text!html/settingsTemplateTooltip.html", [], function() {
@@ -28276,9 +28298,7 @@ function() {
token: "markup.heading.multi.2",
regex: "^\\-+(?=\\s*$)"
}, {
- token: function(e) {
- return "markup.heading." + e.length;
- },
+ token: "constant.language.escape",
regex: /^#{1,6}(?=\s*[^ #]|\s+#.)/,
next: "header"
}, {
@@ -28318,22 +28338,22 @@ function() {
token: [ "constant.language.escape", "keyword", "constant.language.escape" ],
regex: "(\\$)(.*?)(\\$)"
}, {
- token: "code",
+ token: [ "constant.language.escape", "code", "constant.language.escape" ],
regex: "(`+)(.*?[^`])(\\1)"
}, {
- token: [ "text", "reference", "text", "link", "description", "text" ],
+ token: [ "constant.language.escape", "reference", "constant.language.escape", "link", "description", "constant.language.escape" ],
regex: '^([ ]{0,3}\\[)([^\\]]+)(\\]:\\s*)([^ ]+)(\\s*(?:["][^"]+["])?(\\s*))$'
}, {
- token: [ "text", "markup.underline", "text", "reference", "text" ],
+ token: [ "constant.language.escape", "markup.underline", "constant.language.escape", "reference", "constant.language.escape" ],
regex: "(\\[)((?:[[^\\]]*\\]|[^\\[\\]])*)(\\][ ]?(?:\\n[ ]*)?\\[)(.*?)(\\])"
}, {
- token: [ "text", "markup.underline", "text", "link", "description", "text" ],
+ token: [ "constant.language.escape", "markup.underline", "constant.language.escape", "link", "description", "constant.language.escape" ],
regex: '(\\[)(\\[[^\\]]*\\]|[^\\[\\]]*)(\\]\\([ \\t]*)((?:(?:[^\\(]*?\\([^\\)]*?\\)\\S*?)|(?:.*?))>?)((?:[ ]*"(?:.*?)"[ \\t]*)?)(\\))'
}, {
- token: "strong",
+ token: [ "constant.language.escape", "strong", "constant.language.escape" ],
regex: "([*]{2}|[_]{2}(?=\\S))(.*?\\S[*_]*)(\\1)"
}, {
- token: "emphasis",
+ token: [ "constant.language.escape", "emphasis", "constant.language.escape" ],
regex: "([*]|[_](?=\\S))(.*?\\S[*_]*)(\\1)"
}, {
token: [ "text", "url", "text" ],
@@ -28686,7 +28706,7 @@ function() {
void 0 === F && (F = r.randomString(), s.frontWindowId = F);
var t = s.frontWindowId;
t != F && ($ = !1, void 0 !== _ && clearInterval(_), e(".modal").modal("hide"),
- e(".modal-non-unique").modal("show"));
+ e(".modal-non-unique").modal("show"), window.close());
}
}
function b() {
@@ -28708,7 +28728,8 @@ function() {
r.setInputValue("#input-settings-editor-font-family", a.editorFontFamily), r.setInputValue("#input-settings-editor-font-size", a.editorFontSize),
r.setInputValue("#input-settings-max-width", a.maxWidth), r.setInputValue("#textarea-settings-default-content", a.defaultContent),
r.setInputRadio("radio-settings-mode", s.mode || "_ace_"), r.setInputValue("#input-settings-publish-commit-msg", a.commitMsg),
- r.setInputChecked("#input-settings-gdrive-full-access", a.gdriveFullAccess), r.setInputValue("#textarea-settings-publish-template", a.template),
+ r.setInputValue("#input-settings-gdrive-multiaccount", a.gdriveMultiAccount), r.setInputChecked("#input-settings-gdrive-full-access", a.gdriveFullAccess),
+ r.setInputChecked("#input-settings-dropbox-full-access", a.dropboxFullAccess), r.setInputValue("#textarea-settings-publish-template", a.template),
r.setInputValue("#textarea-settings-pdf-template", a.pdfTemplate), r.setInputValue("#input-settings-pdf-page-size", a.pdfPageSize),
r.setInputValue("#input-settings-ssh-proxy", a.sshProxy), c.loadSettings(), l.onLoadSettings();
}
@@ -28720,12 +28741,13 @@ function() {
n.editorFontSize = r.getInputIntValue("#input-settings-editor-font-size", t, 1, 99),
n.maxWidth = r.getInputIntValue("#input-settings-max-width", t, 1), n.defaultContent = r.getInputValue("#textarea-settings-default-content");
var o = r.getInputRadio("radio-settings-mode");
- n.commitMsg = r.getInputTextValue("#input-settings-publish-commit-msg", t), n.gdriveFullAccess = r.getInputChecked("#input-settings-gdrive-full-access"),
+ n.commitMsg = r.getInputTextValue("#input-settings-publish-commit-msg", t), n.gdriveMultiAccount = r.getInputIntValue("#input-settings-gdrive-multiaccount"),
+ n.gdriveFullAccess = r.getInputChecked("#input-settings-gdrive-full-access"), n.dropboxFullAccess = r.getInputChecked("#input-settings-dropbox-full-access"),
n.template = r.getInputTextValue("#textarea-settings-publish-template", t), n.pdfTemplate = r.getInputTextValue("#textarea-settings-pdf-template", t),
n.pdfPageSize = r.getInputValue("#input-settings-pdf-page-size"), n.sshProxy = r.checkUrl(r.getInputTextValue("#input-settings-ssh-proxy", t), !0),
c.saveSettings(n), n.extensionSettings = {}, l.onSaveSettings(n.extensionSettings, t),
- t.isPropagationStopped() || (e.extend(a, n), s.settings = JSON.stringify(a), s.themeV3 = i,
- s.mode = o);
+ t.isPropagationStopped() || (a.dropboxFullAccess !== n.dropboxFullAccess && s.removeItem("dropbox.lastChangeId"),
+ e.extend(a, n), s.settings = JSON.stringify(a), s.themeV3 = i, s.mode = o);
}
function C(e) {
e === !0 || B.state.north.isClosed ? (P.hide(), O.hide()) : (P.show(), O.show());
@@ -28781,7 +28803,7 @@ function() {
stateManagement__enabled: !1,
north__minSize: 49,
center__minWidth: 250,
- center__minHeight: 250,
+ center__minHeight: 180,
fxSettings: {
easing: "easeInOutQuad",
duration: 350
@@ -29040,7 +29062,7 @@ function() {
});
}), e(".action-import-docs-settings-confirm").click(function() {
s.clear();
- var e = /^file\.|^focusMode$|^folder\.|^publish\.|^settings$|^sync\.|^themeV3$|^mode$|^version$|^welcomeTour$/;
+ var e = /^file\.|^focusMode$|^folder\.|^publish\.|^settings$|^sync\.|^google\.|^themeV3$|^mode$|^version$|^welcomeTour$/;
t.each(h, function(t, n) {
e.test(n) && (s[n] = t);
}), window.location.reload();
@@ -29148,6 +29170,8 @@ function() {
e(".action-create-file").click(function() {
var e = d.createFile();
d.selectFile(e), r.click();
+ }), e(".action-remove-file-confirm").click(function() {
+ e(".modal-remove-file-confirm").modal("show");
}), e(".action-remove-file").click(function() {
d.deleteFile();
}), r.click(function() {
@@ -29176,7 +29200,7 @@ function() {
}), a.onFileMgrCreated(d), d;
}), define("classes/Provider", [], function() {
function e(e, t) {
- this.providerId = e, this.providerName = t;
+ this.providerId = e, this.providerName = t, this.isPublishEnabled = !0;
}
return e;
}), define("classes/AsyncTask", [ "underscore", "constants", "utils", "eventMgr" ], function(e, t, n, i) {
@@ -29238,19 +29262,19 @@ function() {
return i.addListener("onUserActive", function() {
h = !0;
}), i.addListener("onPeriodicRun", r), o;
-}), define("helpers/dropboxHelper", [ "jquery", "underscore", "constants", "core", "storage", "logger", "eventMgr", "classes/AsyncTask" ], function(e, t, n, i, o, r, s, a) {
- function l(t) {
+}), define("helpers/dropboxHelper", [ "jquery", "underscore", "constants", "core", "storage", "logger", "settings", "eventMgr", "classes/AsyncTask" ], function(e, t, n, i, o, r, s, a, l) {
+ function c(t) {
t.onRun(function() {
- return g === !0 ? (h = void 0, t.error(new Error("Operation not available in offline mode.|stopPublish")),
- void 0) : void 0 !== h ? (t.chain(), void 0) : (e.ajax({
+ return m === !0 ? (p = void 0, t.error(new Error("Operation not available in offline mode.|stopPublish")),
+ void 0) : void 0 !== p ? (t.chain(), void 0) : (e.ajax({
url: "libs/dropbox.min.js",
dataType: "script",
timeout: n.AJAX_TIMEOUT
}).done(function() {
- h = new Dropbox.Client({
- key: n.DROPBOX_APP_KEY,
- secret: n.DROPBOX_APP_SECRET
- }), h.authDriver(new Dropbox.AuthDriver.Popup({
+ p = new Dropbox.Client({
+ key: s.dropboxFullAccess === !0 ? n.DROPBOX_APP_KEY : n.DROPBOX_RESTRICTED_APP_KEY,
+ secret: s.dropboxFullAccess === !0 ? n.DROPBOX_APP_SECRET : n.DROPBOX_RESTRICTED_APP_SECRET
+ }), p.authDriver(new Dropbox.AuthDriver.Popup({
receiverUrl: n.BASE_URL + "html/dropbox-oauth-receiver.html",
rememberUser: !0
})), t.chain();
@@ -29259,11 +29283,11 @@ function() {
status: e.status,
responseText: e.statusText
};
- u(n, t);
+ d(n, t);
}), void 0);
});
}
- function c(e) {
+ function u(e) {
e.onRun(function() {
function t() {
i.redirectConfirm("You are being redirected to Dropbox authorization page.", function() {
@@ -29273,32 +29297,32 @@ function() {
});
}
function o() {
- r === !1 ? e.timeout = n.ASYNC_TASK_LONG_TIMEOUT : h.reset(), h.authenticate({
+ r === !1 ? e.timeout = n.ASYNC_TASK_LONG_TIMEOUT : p.reset(), p.authenticate({
interactive: !r
}, function(n, i) {
- return i.isAuthenticated() === !0 ? (p = !0, e.chain(), void 0) : r === !0 ? (r = !1,
+ return i.isAuthenticated() === !0 ? (f = !0, e.chain(), void 0) : r === !0 ? (r = !1,
e.chain(t), void 0) : (e.error(new Error("Access to Dropbox account is not authorized.")),
void 0);
});
}
- if (p === !0) return e.chain(), void 0;
+ if (f === !0) return e.chain(), void 0;
var r = !0;
e.chain(o);
});
}
- function u(e, n) {
+ function d(e, n) {
var s = !0;
if (e) if (r.error(e), "string" == typeof e) s = e; else {
- if (s = "Dropbox error (" + e.status + ": " + e.responseText + ").", 401 === e.status || 403 === e.status) return p = !1,
+ if (s = "Dropbox error (" + e.status + ": " + e.responseText + ").", 401 === e.status || 403 === e.status) return f = !1,
s = "Access to Dropbox account is not authorized.", n.retry(new Error(s), 1), void 0;
if (400 === e.status && -1 !== e.responseText.indexOf("oauth_nonce")) return t.each(t.keys(o), function(e) {
0 === e.indexOf("dropbox-auth") && o.removeItem(e);
- }), p = !1, n.retry(new Error(s), 1), void 0;
- e.status <= 0 && (h = void 0, p = !1, i.setOffline(), s = "|stopPublish");
+ }), f = !1, n.retry(new Error(s), 1), void 0;
+ e.status <= 0 && (p = void 0, f = !1, i.setOffline(), s = "|stopPublish");
}
n.error(new Error(s));
}
- function d(t) {
+ function h(t) {
t.onRun(function() {
function o() {
i.redirectConfirm("You are being redirected to Dropbox Chooser page.", function() {
@@ -29307,42 +29331,42 @@ function() {
t.error(new Error("Operation canceled."));
});
}
- return m === !0 ? (t.chain(), void 0) : (e.ajax({
+ return v === !0 ? (t.chain(), void 0) : (e.ajax({
url: "https://www.dropbox.com/static/api/1/dropbox.js",
dataType: "script",
timeout: n.AJAX_TIMEOUT
}).done(function() {
- m = !0, t.chain(o);
+ v = !0, t.chain(o);
}).fail(function(e) {
var n = {
status: e.status,
responseText: e.statusText
};
- u(n, t);
+ d(n, t);
}), void 0);
});
}
- var h, p = !1, f = {}, g = !1;
- s.addListener("onOfflineChanged", function(e) {
- g = e;
- }), f.upload = function(e, t, n) {
- var i, o = new a();
- l(o), c(o), o.onRun(function() {
- h.writeFile(e, t, function(t, n) {
+ var p, f = !1, g = {}, m = !1;
+ a.addListener("onOfflineChanged", function(e) {
+ m = e;
+ }), g.upload = function(e, t, n) {
+ var i, o = new l();
+ c(o), u(o), o.onRun(function() {
+ p.writeFile(e, t, function(t, n) {
return t ? (400 === t.status && (t = 'Could not upload document into path "' + e + '".'),
- u(t, o), void 0) : (i = n, o.chain(), void 0);
+ d(t, o), void 0) : (i = n, o.chain(), void 0);
});
}), o.onSuccess(function() {
n(void 0, i);
}), o.onError(function(e) {
n(e);
}), o.enqueue();
- }, f.checkChanges = function(e, t) {
- var n = [], i = e || 0, o = new a();
- l(o), c(o), o.onRun(function() {
+ }, g.checkChanges = function(e, t) {
+ var n = [], i = e || 0, o = new l();
+ c(o), u(o), o.onRun(function() {
function e() {
- h.pullChanges(i, function(t, r) {
- return t ? (u(t, o), void 0) : (i = r.cursor(), void 0 !== r.changes && (n = n.concat(r.changes)),
+ p.pullChanges(i, function(t, r) {
+ return t ? (d(t, o), void 0) : (i = r.cursor(), void 0 !== r.changes && (n = n.concat(r.changes)),
r.shouldPullAgain ? o.chain(e) : o.chain(), void 0);
});
}
@@ -29352,14 +29376,14 @@ function() {
}), o.onError(function(e) {
t(e);
}), o.enqueue();
- }, f.downloadMetadata = function(e, t) {
- var n = [], i = new a();
- l(i), c(i), i.onRun(function() {
+ }, g.downloadMetadata = function(e, t) {
+ var n = [], i = new l();
+ c(i), u(i), i.onRun(function() {
function t() {
if (0 === e.length) return i.chain(), void 0;
var o = e[0];
- h.stat(o, function(o, r) {
- return r ? (n.push(r), e.shift(), i.chain(t), void 0) : (u(o, i), void 0);
+ p.stat(o, function(o, r) {
+ return r ? (n.push(r), e.shift(), i.chain(t), void 0) : (d(o, i), void 0);
});
}
i.chain(t);
@@ -29368,16 +29392,16 @@ function() {
}), i.onError(function(e) {
t(e);
}), i.enqueue();
- }, f.downloadContent = function(e, t) {
- var n = [], i = new a();
- l(i), c(i), i.onRun(function() {
+ }, g.downloadContent = function(e, t) {
+ var n = [], i = new l();
+ c(i), u(i), i.onRun(function() {
function t() {
if (0 === e.length) return i.chain(), void 0;
var o = e[0];
n.push(o);
var r;
- return o.isFile === !0 ? r = o : void 0 !== o.wasRemoved && (r = o.stat), r ? (h.readFile(r.path, function(n, o) {
- return o ? (r.content = o, e.shift(), i.chain(t), void 0) : (u(n, i), void 0);
+ return o.isFile === !0 ? r = o : void 0 !== o.wasRemoved && (r = o.stat), r ? (p.readFile(r.path, function(n, o) {
+ return o ? (r.content = o, e.shift(), i.chain(t), void 0) : (d(n, i), void 0);
}), void 0) : (e.shift(), i.chain(t), void 0);
}
i.chain(t);
@@ -29387,10 +29411,10 @@ function() {
t(e);
}), i.enqueue();
};
- var m = !1;
- return f.picker = function(e) {
- var t = [], i = new a();
- i.timeout = n.ASYNC_TASK_LONG_TIMEOUT, l(i), d(i), i.onRun(function() {
+ var v = !1;
+ return g.picker = function(e) {
+ var t = [], i = new l();
+ i.timeout = n.ASYNC_TASK_LONG_TIMEOUT, c(i), h(i), i.onRun(function() {
var e = {};
e.multiselect = !0, e.linkType = "direct", e.success = function(e) {
for (var n = 0; n < e.length; n++) {
@@ -29406,7 +29430,7 @@ function() {
}), i.onError(function(t) {
e(t);
}), i.enqueue();
- }, f;
+ }, g;
}), define("providers/dropboxProvider", [ "underscore", "utils", "storage", "classes/Provider", "eventMgr", "fileMgr", "helpers/dropboxHelper" ], function(e, t, n, i, o, r, s) {
function a(e) {
return void 0 === e ? void 0 : e.match(/^[^\\<>:"\|?\*]+$/) ? 0 !== e.indexOf("/") ? "/" + e : e : (o.onError('"' + e + '" contains invalid characters.'),
@@ -29500,12 +29524,35 @@ function() {
return n.path = t.getInputTextValue("#input-publish-dropbox-path", e), e.isPropagationStopped() ? void 0 : n;
}, h;
}), define("helpers/googleHelper", [ "underscore", "jquery", "constants", "core", "utils", "storage", "logger", "settings", "eventMgr", "classes/AsyncTask" ], function(e, t, n, i, o, r, s, a, l, c) {
- function u(e) {
+ function u(t) {
+ var n = {
+ profile: !0
+ }, i = !0;
+ e.each((r[t + ".permissions"] || "").split(";"), function(e) {
+ e && (n[e] = !0);
+ }), this.setRefreshFlag = function() {
+ i = !0;
+ }, this.isAuthorized = function(t) {
+ return i === !1 && e.has(n, t);
+ }, this.add = function(o) {
+ n[o] = !0, r[t + ".permissions"] = e.keys(n).join(";"), i = !1;
+ }, this.getListWithNew = function(t) {
+ var i = e.keys(n);
+ return e.has(n, t) || i.push(t), i;
+ };
+ var o = r[t + ".userId"];
+ this.setUserId = function(e) {
+ o = e, r[t + ".userId"] = o;
+ }, this.getUserId = function() {
+ return o;
+ };
+ }
+ function d(e) {
e.onRun(function() {
- return v === !0 ? (f = !1, e.error(new Error("Operation not available in offline mode.|stopPublish")),
- void 0) : f === !0 ? (e.chain(), void 0) : (window.delayedFunction = function() {
+ return b === !0 ? (g = !1, e.error(new Error("Operation not available in offline mode.|stopPublish")),
+ void 0) : g === !0 ? (e.chain(), void 0) : (window.delayedFunction = function() {
gapi.load("client,drive-realtime", function() {
- f = !0, e.chain();
+ g = !0, e.chain();
});
}, t.ajax({
url: "https://apis.google.com/js/api.js?onload=runDelayedFunction",
@@ -29516,52 +29563,84 @@ function() {
code: t.status,
message: t.statusText
};
- h(n, e);
+ p(n, e);
}), void 0);
});
}
- function d(t, o, r) {
- t.onRun(function() {
+ function h(o, r, s) {
+ var a = m[s];
+ a || (a = new u(s), m[s] = a), o.onRun(function() {
function s() {
- i.redirectConfirm("You are being redirected to Google authorization page.", function() {
- t.chain(a);
- }, function() {
- t.error(new Error("Operation canceled."));
+ return gapi.client.drive ? (o.chain(), void 0) : (gapi.client.load("drive", "v2", function() {
+ o.chain();
+ }), void 0);
+ }
+ function c() {
+ t.ajax({
+ url: "https://www.googleapis.com/oauth2/v1/tokeninfo",
+ data: {
+ access_token: gapi.auth.getToken().access_token
+ },
+ timeout: n.AJAX_TIMEOUT,
+ type: "GET"
+ }).done(function(e) {
+ a.getUserId() && a.getUserId() != e.user_id ? h() : (a.setUserId(e.user_id), a.add(r),
+ a.token = gapi.auth.getToken(), o.chain(s));
+ }).fail(function(e) {
+ var t = {
+ code: e.status,
+ message: e.statusText
+ };
+ p(t, o);
});
}
- function a() {
- l === !1 && (t.timeout = n.ASYNC_TASK_LONG_TIMEOUT);
- var i = e.chain(b).pick(g.getListWithNew(o)).flatten().value();
+ function u() {
+ m > 5 && (m = 0, f = !1, l.onError("Unable to authenticate user " + a.getUserId() + ", please use login form.")),
+ f === !1 && (o.timeout = n.ASYNC_TASK_LONG_TIMEOUT);
+ var t = e.chain(y).pick(a.getListWithNew(r)).flatten().value();
gapi.auth.authorize({
client_id: n.GOOGLE_CLIENT_ID,
- scope: i,
- immediate: l
+ scope: t,
+ immediate: f,
+ authuser: f === !1 ? "" : m
}, function(e) {
- gapi.client.load("drive", "v2", function() {
- return !e || e.error ? f === !0 && l === !0 ? (l = !1, t.chain(s), void 0) : (t.error(new Error("Access to Google account is not authorized.")),
- void 0) : (g.add(o), t.chain(), void 0);
- });
+ !e || e.error ? g === !0 && f === !0 ? (f = !1, o.chain(d)) : o.error(new Error("Access to Google account is not authorized.")) : (f === !0 && m++,
+ o.chain(c));
});
}
- if (!r && g.isAuthorized(o)) return t.chain(), void 0;
- var l = !0;
- t.chain(a);
+ function d() {
+ return f === !0 ? (o.chain(u), void 0) : (i.redirectConfirm("You are being redirected to Google authorization page.", function() {
+ o.chain(u);
+ }, function() {
+ o.error(new Error("Operation canceled."));
+ }), void 0);
+ }
+ function h() {
+ return f = !0, a.token && a.isAuthorized(r) ? (gapi.auth.setToken(a.token), o.chain(),
+ void 0) : (a.getUserId() || (f = !1), o.chain(d), void 0);
+ }
+ var f, m = 0;
+ h();
});
}
- function h(e, t) {
- var n;
- if (e) if (s.error(e), "string" == typeof e) n = e; else {
- if (n = "Google error (" + e.code + ": " + e.message + ").", e.code >= 500 && e.code < 600) return t.retry(new Error(n)),
+ function p(t, n) {
+ var o;
+ if (t) if (s.error(t), "string" == typeof t) o = t; else {
+ if (o = "Google error (" + t.code + ": " + t.message + ").", t.code >= 500 && t.code < 600) return n.retry(new Error(o)),
void 0;
- if (401 === e.code || 403 === e.code || "token_refresh_required" == e.code) return g.reset(),
- n = "Access to Google account is not authorized.", t.retry(new Error(n), 1), void 0;
- (0 === e.code || -1 === e.code) && (f = !1, g.reset(), i.setOffline(), n = "|stopPublish");
+ if (401 === t.code || 403 === t.code || "token_refresh_required" == t.code) return e.each(m, function(e) {
+ e.setRefreshFlag();
+ }), o = "Access to Google account is not authorized.", n.retry(new Error(o), 1),
+ void 0;
+ (0 === t.code || -1 === t.code) && (g = !1, e.each(m, function(e) {
+ e.setRefreshFlag();
+ }), i.setOffline(), o = "|stopPublish");
}
- t.error(new Error(n));
+ n.error(new Error(o));
}
- function p(e) {
+ function f(e) {
e.onRun(function() {
- return y === !0 ? (e.chain(), void 0) : (t.ajax({
+ return w === !0 ? (e.chain(), void 0) : (t.ajax({
url: "//www.google.com/jsapi",
data: {
key: n.GOOGLE_API_KEY
@@ -29573,104 +29652,91 @@ function() {
callback: function() {
e.chain();
}
- }), y = !0;
+ }), w = !0;
}).fail(function(t) {
var n = {
code: t.status,
message: t.statusText
};
- h(n, e);
+ p(n, e);
}), void 0);
});
}
- var f = !1, g = {};
- !function() {
- var t = {}, n = !1;
- e.each((r.gdrivePermissions || "").split(";"), function(e) {
- e && (t[e] = !0);
- }), g.reset = function() {
- n = !1;
- }, g.isAuthorized = function(i) {
- return n && e.has(t, i);
- }, g.add = function(i) {
- t[i] = !0, r.gdrivePermissions = e.keys(t).join(";"), n = !0;
- }, g.getListWithNew = function(n) {
- var i = e.keys(t);
- return e.has(t, n) || i.push(n), i;
- };
- }();
- var m = {}, v = !1;
+ var g = !1, m = {}, v = {}, b = !1;
l.addListener("onOfflineChanged", function(e) {
- v = e;
+ b = e;
});
- var b = {
+ var y = {
+ profile: [ "https://www.googleapis.com/auth/userinfo.profile" ],
gdrive: [ "https://www.googleapis.com/auth/drive.install", a.gdriveFullAccess === !0 ? "https://www.googleapis.com/auth/drive" : "https://www.googleapis.com/auth/drive.file" ],
blogger: [ "https://www.googleapis.com/auth/blogger" ],
picasa: [ "https://picasaweb.google.com/data/" ]
};
- m.forceGdriveAuthenticate = function() {
- var e = new c();
- u(e), d(e, "gdrive", !0), e.enqueue();
- }, m.upload = function(e, t, n, i, s, a, l) {
- var p, f = new c();
- u(f), d(f, "gdrive"), f.onRun(function() {
- var a = "-------314159265358979323846", l = "\r\n--" + a + "\r\n", c = "\r\n--" + a + "--";
+ v.refreshGdriveToken = function(e) {
+ var t = new c();
+ d(t);
+ var n = m[e];
+ n && n.setRefreshFlag(), h(t, "gdrive", e), t.enqueue();
+ }, v.upload = function(e, t, n, i, s, a, l, u) {
+ var f, g = new c();
+ d(g), h(g, "gdrive", l), g.onRun(function() {
+ var a = "-------314159265358979323846", c = "\r\n--" + a + "\r\n", u = "\r\n--" + a + "--";
s = s || "text/x-markdown";
- var u = {
+ var d = {
title: n,
mimeType: s
};
- t && (u.parents = [ {
+ t && (d.parents = [ {
kind: "drive#fileLink",
id: t
} ]);
- var d = "/upload/drive/v2/files", g = "POST";
- e && (d += "/" + e, g = "PUT");
- var m = {
+ var h = "/upload/drive/v2/files", m = "POST";
+ e && (h += "/" + e, m = "PUT");
+ var v = {
"Content-Type": 'multipart/mixed; boundary="' + a + '"'
- }, v = o.encodeBase64(i), b = [ l, "Content-Type: application/json\r\n\r\n", JSON.stringify(u), l, "Content-Type: ", s, "\r\n", "Content-Transfer-Encoding: base64\r\n", "\r\n", v, c ].join(""), y = gapi.client.request({
- path: d,
- method: g,
+ }, b = o.encodeBase64(i), y = [ c, "Content-Type: application/json\r\n\r\n", JSON.stringify(d), c, "Content-Type: ", s, "\r\n", "Content-Transfer-Encoding: base64\r\n", "\r\n", b, u ].join(""), w = gapi.client.request({
+ path: h,
+ method: m,
params: {
uploadType: "multipart"
},
- headers: m,
- body: b
+ headers: v,
+ body: y
});
- y.execute(function(t) {
- if (t && t.id) return p = t, p.content = i, f.chain(), void 0;
+ w.execute(function(t) {
+ if (t && t.id) return f = t, f.content = i, g.chain(), void 0;
var n = t.error;
- void 0 !== n && void 0 !== e && (404 === n.code ? n = 'File ID "' + e + '" not found on Google Drive.|removePublish' : 412 === n.code && (r.removeItem("gdrive.lastChangeId"),
- n = 'Conflict on file ID "' + e + '". Please restart the synchronization.')), h(n, f);
+ void 0 !== n && void 0 !== e && (404 === n.code ? n = 'File ID "' + e + '" not found on Google Drive.|removePublish' : 412 === n.code && (r.removeItem(l + ".gdrive.lastChangeId"),
+ n = 'Conflict on file ID "' + e + '". Please restart the synchronization.')), p(n, g);
});
- }), f.onSuccess(function() {
- l(void 0, p);
- }), f.onError(function(e) {
- l(e);
- }), f.enqueue();
- }, m.rename = function(e, t, n) {
- var i, o = new c();
- u(o), d(o, "gdrive"), o.onRun(function() {
+ }), g.onSuccess(function() {
+ u(void 0, f);
+ }), g.onError(function(e) {
+ u(e);
+ }), g.enqueue();
+ }, v.rename = function(e, t, n, i) {
+ var o, r = new c();
+ d(r), h(r, "gdrive", n), r.onRun(function() {
var n = {
title: t
- }, r = gapi.client.drive.files.patch({
+ }, i = gapi.client.drive.files.patch({
fileId: e,
resource: n
});
- r.execute(function(t) {
- if (t && t.id) return i = t, o.chain(), void 0;
+ i.execute(function(t) {
+ if (t && t.id) return o = t, r.chain(), void 0;
var n = t.error;
void 0 !== n && void 0 !== e && 404 === n.code && (n = 'File ID "' + e + '" not found on Google Drive.|removePublish'),
- h(n, o);
+ p(n, r);
});
- }), o.onSuccess(function() {
- n(void 0, i);
- }), o.onError(function(e) {
- n(e);
- }), o.enqueue();
- }, m.createRealtimeFile = function(e, t, n) {
- var i, o = new c();
- u(o), d(o, "gdrive"), o.onRun(function() {
+ }), r.onSuccess(function() {
+ i(void 0, o);
+ }), r.onError(function(e) {
+ i(e);
+ }), r.enqueue();
+ }, v.createRealtimeFile = function(e, t, n, i) {
+ var o, r = new c();
+ d(r), h(r, "gdrive", n), r.onRun(function() {
var n = {
title: t,
mimeType: "application/vnd.google-apps.drive-sdk"
@@ -29679,20 +29745,124 @@ function() {
kind: "drive#fileLink",
id: e
} ]);
- var r = gapi.client.drive.files.insert({
+ var i = gapi.client.drive.files.insert({
resource: n
});
- r.execute(function(e) {
- return e && e.id ? (i = e, o.chain(), void 0) : (h(e.error, o), void 0);
+ i.execute(function(e) {
+ return e && e.id ? (o = e, r.chain(), void 0) : (p(e.error, r), void 0);
});
- }), o.onSuccess(function() {
- n(void 0, i);
- }), o.onError(function(e) {
+ }), r.onSuccess(function() {
+ i(void 0, o);
+ }), r.onError(function(e) {
+ i(e);
+ }), r.enqueue();
+ }, v.checkChanges = function(e, t, n) {
+ var i = [], o = e || 0, r = new c();
+ d(r), h(r, "gdrive", t), r.onRun(function() {
+ function e() {
+ var n;
+ n = void 0 === t ? gapi.client.drive.changes.list({
+ startChangeId: o + 1
+ }) : gapi.client.drive.changes.list({
+ pageToken: t
+ }), n.execute(function(n) {
+ return n && n.largestChangeId ? (o = n.largestChangeId, t = n.nextPageToken, void 0 !== n.items && (i = i.concat(n.items)),
+ void 0 !== t ? r.chain(e) : r.chain(), void 0) : (p(n.error, r), void 0);
+ });
+ }
+ var t;
+ r.chain(e);
+ }), r.onSuccess(function() {
+ n(void 0, i, o);
+ }), r.onError(function(e) {
n(e);
- }), o.enqueue();
- }, m.uploadImg = function(e, i, o, r) {
+ }), r.enqueue();
+ }, v.downloadMetadata = function(e, i, o, r) {
+ var s = [], a = new c();
+ d(a), r || h(a, "gdrive", i), a.onRun(function() {
+ function i() {
+ if (0 === e.length) return a.chain(), void 0;
+ var o = e[0], r = {}, l = gapi.auth.getToken();
+ l && (r.Authorization = "Bearer " + l.access_token), t.ajax({
+ url: "https://www.googleapis.com/drive/v2/files/" + o,
+ headers: r,
+ data: {
+ key: n.GOOGLE_API_KEY
+ },
+ dataType: "json",
+ timeout: n.AJAX_TIMEOUT
+ }).done(function(t) {
+ s.push(t), e.shift(), a.chain(i);
+ }).fail(function(e) {
+ var t = {
+ code: e.status,
+ message: e.statusText
+ };
+ 404 === t.code && (t = 'File ID "' + o + '" not found on Google Drive.'), p(t, a);
+ });
+ }
+ a.chain(i);
+ }), a.onSuccess(function() {
+ o(void 0, s);
+ }), a.onError(function(e) {
+ o(e);
+ }), a.enqueue();
+ }, v.downloadContent = function(e, i, o, r) {
+ var s = [], a = new c();
+ a.timeout = n.ASYNC_TASK_LONG_TIMEOUT, d(a), r || h(a, "gdrive", i), a.onRun(function() {
+ function i() {
+ if (0 === e.length) return a.chain(), void 0;
+ var o = e[0];
+ s.push(o);
+ var r;
+ if ("drive#file" == o.kind ? r = o : "drive#change" == o.kind && (r = o.file), !r) return e.shift(),
+ a.chain(i), void 0;
+ if (0 === r.mimeType.indexOf("application/vnd.google-apps.drive-sdk")) return r.content = "",
+ r.isRealtime = !0, e.shift(), a.chain(i), void 0;
+ var l = {}, c = gapi.auth.getToken();
+ c && (l.Authorization = "Bearer " + c.access_token), t.ajax({
+ url: r.downloadUrl,
+ headers: l,
+ data: {
+ key: n.GOOGLE_API_KEY
+ },
+ dataType: "text",
+ timeout: n.AJAX_TIMEOUT
+ }).done(function(t) {
+ r.content = t, e.shift(), a.chain(i);
+ }).fail(function(e) {
+ var t = {
+ code: e.status,
+ message: e.statusText
+ };
+ p(t, a);
+ });
+ }
+ a.chain(i);
+ }), a.onSuccess(function() {
+ o(void 0, s);
+ }), a.onError(function(e) {
+ o(e);
+ }), a.enqueue();
+ }, v.loadRealtime = function(e, t, n, i, o) {
+ var r, s = new c();
+ d(s), h(s, "gdrive", n), s.onRun(function() {
+ gapi.drive.realtime.load(e, function(e) {
+ r = e, s.chain();
+ }, function(e) {
+ var n = e.createString(t);
+ e.getRoot().set("content", n);
+ }, function(e) {
+ o(e), s.error(new Error(e.message));
+ });
+ }), s.onSuccess(function() {
+ i(void 0, r);
+ }), s.onError(function(e) {
+ i(e);
+ }), s.enqueue();
+ }, v.uploadImg = function(e, i, o, r) {
var s, a = new c();
- u(a), d(a, "picasa"), a.onRun(function() {
+ d(a), h(a, "picasa", "google.picasa0"), a.onRun(function() {
var r = {
Slug: e
};
@@ -29713,149 +29883,46 @@ function() {
code: e.status,
message: e.statusText
};
- 200 == t.code && (t.message = e.responseText), h(t, a);
+ 200 == t.code && (t.message = e.responseText), p(t, a);
});
}), a.onSuccess(function() {
r(void 0, s);
}), a.onError(function(e) {
r(e);
}), a.enqueue();
- }, m.checkChanges = function(e, t) {
- var n = [], i = e || 0, o = new c();
- u(o), d(o, "gdrive"), o.onRun(function() {
- function e() {
- var r;
- r = void 0 === t ? gapi.client.drive.changes.list({
- startChangeId: i + 1
- }) : gapi.client.drive.changes.list({
- pageToken: t
- }), r.execute(function(r) {
- return r && r.largestChangeId ? (i = r.largestChangeId, t = r.nextPageToken, void 0 !== r.items && (n = n.concat(r.items)),
- void 0 !== t ? o.chain(e) : o.chain(), void 0) : (h(r.error, o), void 0);
- });
- }
- var t;
- o.chain(e);
- }), o.onSuccess(function() {
- t(void 0, n, i);
- }), o.onError(function(e) {
- t(e);
- }), o.enqueue();
- }, m.downloadMetadata = function(e, i, o) {
- var r = [], s = new c();
- u(s), o || d(s, "gdrive"), s.onRun(function() {
- function i() {
- if (0 === e.length) return s.chain(), void 0;
- var o = e[0], a = {}, l = gapi.auth.getToken();
- l && (a.Authorization = "Bearer " + l.access_token), t.ajax({
- url: "https://www.googleapis.com/drive/v2/files/" + o,
- headers: a,
- data: {
- key: n.GOOGLE_API_KEY
- },
- dataType: "json",
- timeout: n.AJAX_TIMEOUT
- }).done(function(t) {
- r.push(t), e.shift(), s.chain(i);
- }).fail(function(e) {
- var t = {
- code: e.status,
- message: e.statusText
- };
- 404 === t.code && (t = 'File ID "' + o + '" not found on Google Drive.'), h(t, s);
- });
- }
- s.chain(i);
- }), s.onSuccess(function() {
- i(void 0, r);
- }), s.onError(function(e) {
- i(e);
- }), s.enqueue();
- }, m.downloadContent = function(e, i, o) {
- var r = [], s = new c();
- s.timeout = n.ASYNC_TASK_LONG_TIMEOUT, u(s), o || d(s, "gdrive"), s.onRun(function() {
- function i() {
- if (0 === e.length) return s.chain(), void 0;
- var o = e[0];
- r.push(o);
- var a;
- if ("drive#file" == o.kind ? a = o : "drive#change" == o.kind && (a = o.file), !a) return e.shift(),
- s.chain(i), void 0;
- if (0 === a.mimeType.indexOf("application/vnd.google-apps.drive-sdk")) return a.content = "",
- a.isRealtime = !0, e.shift(), s.chain(i), void 0;
- var l = {}, c = gapi.auth.getToken();
- c && (l.Authorization = "Bearer " + c.access_token), t.ajax({
- url: a.downloadUrl,
- headers: l,
- data: {
- key: n.GOOGLE_API_KEY
- },
- dataType: "text",
- timeout: n.AJAX_TIMEOUT
- }).done(function(t) {
- a.content = t, e.shift(), s.chain(i);
- }).fail(function(e) {
- var t = {
- code: e.status,
- message: e.statusText
- };
- h(t, s);
- });
- }
- s.chain(i);
- }), s.onSuccess(function() {
- i(void 0, r);
- }), s.onError(function(e) {
- i(e);
- }), s.enqueue();
- }, m.loadRealtime = function(e, t, n, i) {
- var o, r = new c();
- u(r), d(r, "gdrive"), r.onRun(function() {
- gapi.drive.realtime.load(e, function(e) {
- o = e, r.chain();
- }, function(e) {
- var n = e.createString(t);
- e.getRoot().set("content", n);
- }, function(e) {
- i(e), r.error(new Error(e.message));
- });
- }), r.onSuccess(function() {
- n(void 0, o);
- }), r.onError(function(e) {
- n(e);
- }), r.enqueue();
};
- var y = !1;
- return m.picker = function(e, i) {
- function r() {
- void 0 !== s && (s.setVisible(!1), t(".modal-backdrop, .picker").remove());
+ var w = !1;
+ return v.picker = function(e, i, r) {
+ function s() {
+ void 0 !== a && (a.setVisible(!1), t(".modal-backdrop, .picker").remove());
}
- var s, a = [], l = new c();
- l.timeout = n.ASYNC_TASK_LONG_TIMEOUT, u(l), p(l), l.onRun(function() {
+ var a, l = [], u = new c();
+ u.timeout = n.ASYNC_TASK_LONG_TIMEOUT, d(u), ("doc" == i || "folder" == i) && h(u, "gdrive", r),
+ f(u), u.onRun(function() {
var e = new google.picker.PickerBuilder();
e.setAppId(n.GOOGLE_DRIVE_APP_ID);
- var c;
- "doc" == i ? (c = new google.picker.DocsView(google.picker.ViewId.DOCS), c.setIncludeFolders(!0),
- c.setMimeTypes([ "text/x-markdown", "text/plain", "application/octet-stream", "application/vnd.google-apps.drive-sdk." + n.GOOGLE_DRIVE_APP_ID ].join(",")),
+ var r;
+ "doc" == i ? (r = new google.picker.DocsView(google.picker.ViewId.DOCS), r.setIncludeFolders(!0),
+ r.setMimeTypes([ "text/x-markdown", "text/plain", "application/octet-stream", "application/vnd.google-apps.drive-sdk." + n.GOOGLE_DRIVE_APP_ID ].join(",")),
e.enableFeature(google.picker.Feature.NAV_HIDDEN), e.enableFeature(google.picker.Feature.MULTISELECT_ENABLED),
- e.addView(c)) : "folder" == i ? (c = new google.picker.DocsView(google.picker.ViewId.FOLDERS),
- c.setIncludeFolders(!0), c.setSelectFolderEnabled(!0), c.setMimeTypes("application/vnd.google-apps.folder"),
- e.enableFeature(google.picker.Feature.NAV_HIDDEN), e.addView(c)) : "img" == i && (c = new google.picker.PhotosView(),
- c.setType("flat"), e.addView(c), c = new google.picker.PhotosView(), c.setType("ofuser"),
- e.addView(c), e.addView(google.picker.ViewId.PHOTO_UPLOAD)), e.setCallback(function(e) {
- (e.action == google.picker.Action.PICKED || e.action == google.picker.Action.CANCEL) && (e.action == google.picker.Action.PICKED && (a = e.docs),
- r(), l.chain());
- }), s = e.build(), t(o.createBackdrop()).click(function() {
- r(), l.chain();
- }), s.setVisible(!0);
- }), l.onSuccess(function() {
- e(void 0, a);
- }), l.onError(function(t) {
- r(), e(t);
- }), l.enqueue();
- }, m.uploadBlogger = function(e, i, o, r, s, a, l, p, f) {
+ e.addView(r), e.setOAuthToken(gapi.auth.getToken().access_token)) : "folder" == i ? (r = new google.picker.DocsView(google.picker.ViewId.FOLDERS),
+ r.setIncludeFolders(!0), r.setSelectFolderEnabled(!0), r.setMimeTypes("application/vnd.google-apps.folder"),
+ e.enableFeature(google.picker.Feature.NAV_HIDDEN), e.addView(r), e.setOAuthToken(gapi.auth.getToken().access_token)) : "img" == i && (r = new google.picker.PhotosView(),
+ r.setType("flat"), e.addView(r), r = new google.picker.PhotosView(), r.setType("ofuser"),
+ e.addView(r), e.addView(google.picker.ViewId.PHOTO_UPLOAD)), e.setCallback(function(e) {
+ (e.action == google.picker.Action.PICKED || e.action == google.picker.Action.CANCEL) && (e.action == google.picker.Action.PICKED && (l = e.docs),
+ s(), u.chain());
+ }), a = e.build(), t(o.createBackdrop()).click(function() {
+ s(), u.chain();
+ }), a.setVisible(!0);
+ }), u.onSuccess(function() {
+ e(void 0, l);
+ }), u.onError(function(t) {
+ s(), e(t);
+ }), u.enqueue();
+ }, v.uploadBlogger = function(e, i, o, r, s, a, l, u, f) {
var g = new c();
- u(g), d(g, "blogger"), g.onRun(function() {
+ d(g), h(g, "blogger", "google.blogger0"), g.onRun(function() {
function c() {
var e = "https://www.googleapis.com/blogger/v3/blogs/" + i + "/posts/", s = {
kind: "blogger#post",
@@ -29864,7 +29931,7 @@ function() {
},
labels: r,
title: l,
- content: p
+ content: u
}, a = "POST";
void 0 !== o && (e += o, s.id = o, a = "PUT"), t.ajax({
url: e,
@@ -29875,17 +29942,17 @@ function() {
dataType: "json",
timeout: n.AJAX_TIMEOUT
}).done(function(e) {
- o = e.id, g.chain(u);
+ o = e.id, g.chain(d);
}).fail(function(e) {
var t = {
code: e.status,
message: e.statusText
};
404 === t.code && void 0 !== o && (t = "Post " + o + " not found on Blogger.|removePublish"),
- h(t, g);
+ p(t, g);
});
}
- function u() {
+ function d() {
var e = "https://www.googleapis.com/blogger/v3/blogs/" + i + "/posts/" + o;
s ? e += "/revert" : (e += "/publish", a && (e += "?publishDate=" + a.toISOString())),
t.ajax({
@@ -29901,10 +29968,10 @@ function() {
code: e.status,
message: e.statusText
};
- 404 === t.code && (t = "Post " + o + " not found on Blogger.|removePublish"), h(t, g);
+ 404 === t.code && (t = "Post " + o + " not found on Blogger.|removePublish"), p(t, g);
});
}
- function d() {
+ function h() {
return void 0 !== i ? (g.chain(c), void 0) : (t.ajax({
url: "https://www.googleapis.com/blogger/v3/blogs/byurl",
data: {
@@ -29921,217 +29988,232 @@ function() {
message: t.statusText
};
404 === n.code && (n = 'Blog "' + e + '" not found on Blogger.|removePublish'),
- h(n, g);
+ p(n, g);
}), void 0);
}
var f = {}, m = gapi.auth.getToken();
- m && (f.Authorization = "Bearer " + m.access_token), g.chain(d);
+ m && (f.Authorization = "Bearer " + m.access_token), g.chain(h);
}), g.onSuccess(function() {
f(void 0, i, o);
}), g.onError(function(e) {
f(e);
}), g.enqueue();
- }, m;
-}), define("providers/gdriveProvider", [ "jquery", "underscore", "constants", "utils", "storage", "logger", "classes/Provider", "settings", "eventMgr", "fileMgr", "helpers/googleHelper" ], function(e, t, n, i, o, r, s, a, l, c, u) {
- function d(e) {
- return "sync." + f + "." + e;
- }
- function h(e, t, n, o) {
- var r = {};
- return r.provider = g, r.id = e, r.etag = t, r.contentCRC = i.crc32(n), r.titleCRC = i.crc32(o),
- r.syncIndex = d(e), r;
- }
- function p(e) {
- u.downloadMetadata(e, function(e, n) {
- e || u.downloadContent(n, function(e, n) {
- if (!e) {
- var i, o = [];
+ }, window.delayedFunction = void 0, window.runDelayedFunction = function() {
+ void 0 !== window.delayedFunction && window.delayedFunction();
+ }, v;
+}), define("text!html/dialogExportGdrive.html", [], function() {
+ return '\n
\n\n \n
\n
\n This will save " " to your \n <%= providerName %>
\n account and keep it synchronized.\n
\n
\n
Options...
\n
\n Tip: You can move or rename the file afterwards within Google\n Drive.\n \n
\n \n
\n
\n';
+}), define("providers/gdriveProviderBuilder", [ "jquery", "underscore", "constants", "utils", "storage", "logger", "classes/Provider", "settings", "eventMgr", "fileMgr", "helpers/googleHelper", "text!html/dialogExportGdrive.html" ], function(e, t, n, i, o, r, s, a, l, c, u, d) {
+ return function(h, p, f) {
+ function g(e) {
+ return "sync." + h + "." + e;
+ }
+ function m(e, t, n, o) {
+ var r = {};
+ return r.provider = y, r.id = e, r.etag = t, r.contentCRC = i.crc32(n), r.titleCRC = i.crc32(o),
+ r.syncIndex = g(e), r;
+ }
+ function v(e) {
+ u.downloadMetadata(e, b, function(e, n) {
+ e || u.downloadContent(n, b, function(e, n) {
+ if (!e) {
+ var i, o = [];
+ t.each(n, function(e) {
+ var t = m(e.id, e.etag, e.content, e.title);
+ t.isRealtime = e.isRealtime;
+ var n = {};
+ n[t.syncIndex] = t, i = c.createFile(e.title, e.content, n), o.push(i);
+ }), void 0 !== i && (l.onSyncImportSuccess(o, y), c.selectFile(i));
+ }
+ });
+ });
+ }
+ var b = "google.gdrive" + f, y = new s(h, p);
+ y.defaultPublishFormat = "template", y.exportPreferencesInputIds = [ h + "-parentid", h + "-realtime" ],
+ y.importFiles = function() {
+ u.picker(function(e, n) {
+ if (!e && 0 !== n.length) {
+ var i = [];
t.each(n, function(e) {
- var t = h(e.id, e.etag, e.content, e.title);
- t.isRealtime = e.isRealtime;
- var n = {};
- n[t.syncIndex] = t, i = c.createFile(e.title, e.content, n), o.push(i);
- }), void 0 !== i && (l.onSyncImportSuccess(o, g), c.selectFile(i));
+ var t = g(e.id), n = c.getFileFromSyncIndex(t);
+ return void 0 !== n ? (l.onError('"' + n.title + '" was already imported.'), void 0) : (i.push(e.id),
+ void 0);
+ }), v(i);
}
- });
- });
- }
- var f = "gdrive", g = new s(f, "Google Drive");
- g.defaultPublishFormat = "template", g.exportPreferencesInputIds = [ "gdrive-parentid", "gdrive-realtime" ],
- g.importFiles = function() {
- u.picker(function(e, n) {
- if (!e && 0 !== n.length) {
- var i = [];
- t.each(n, function(e) {
- var t = d(e.id), n = c.getFileFromSyncIndex(t);
- return void 0 !== n ? (l.onError('"' + n.title + '" was already imported.'), void 0) : (i.push(e.id),
- void 0);
- }), p(i);
+ }, "doc", b);
+ }, y.exportFile = function(e, t, n, o) {
+ var r = i.getInputTextValue("#input-sync-export-" + h + "-fileid");
+ if (r) {
+ var s = g(r), a = c.getFileFromSyncIndex(s);
+ if (void 0 !== a) return l.onError('File ID is already synchronized with "' + a.title + '".'),
+ o(!0), void 0;
}
- }, "doc");
- }, g.exportFile = function(e, t, n, o) {
- var r = i.getInputTextValue("#input-sync-export-gdrive-fileid");
- if (r) {
- var s = d(r), a = c.getFileFromSyncIndex(s);
- if (void 0 !== a) return l.onError('File ID is already synchronized with "' + a.title + '".'),
- o(!0), void 0;
- }
- var p = i.getInputTextValue("#input-sync-export-gdrive-parentid");
- u.upload(r, p, t, n, void 0, void 0, function(e, i) {
- if (e) return o(e), void 0;
- var r = h(i.id, i.etag, n, t);
- o(void 0, r);
+ var d = i.getInputTextValue("#input-sync-export-" + h + "-parentid");
+ u.upload(r, d, t, n, void 0, void 0, b, function(e, i) {
+ if (e) return o(e), void 0;
+ var r = m(i.id, i.etag, n, t);
+ o(void 0, r);
+ });
+ }, y.exportRealtimeFile = function(e, t, n, o) {
+ var r = i.getInputTextValue("#input-sync-export-" + h + "-parentid");
+ u.createRealtimeFile(r, t, b, function(e, i) {
+ if (e) return o(e), void 0;
+ var r = m(i.id, i.etag, n, t);
+ o(void 0, r);
+ });
+ }, y.syncUp = function(e, t, n, i, o, r) {
+ return t == o.contentCRC && i == o.titleCRC ? (r(void 0, !1), void 0) : (u.upload(o.id, void 0, n, e, void 0, o.etag, b, function(e, n) {
+ return e ? (r(e, !0), void 0) : (o.etag = n.etag, o.contentCRC = t, o.titleCRC = i,
+ r(void 0, !0), void 0);
+ }), void 0);
+ }, y.syncUpRealtime = function(e, t, n, i, o, r) {
+ return i == o.titleCRC ? (r(void 0, !1), void 0) : (u.rename(o.id, n, b, function(e, t) {
+ return e ? (r(e, !0), void 0) : (o.etag = t.etag, o.titleCRC = i, r(void 0, !0),
+ void 0);
+ }), void 0);
+ }, y.syncDown = function(e) {
+ var n = parseInt(o[b + ".gdrive.lastChangeId"], 10);
+ u.checkChanges(n, b, function(n, r, s) {
+ if (n) return e(n), void 0;
+ var a = [];
+ t.each(r, function(e) {
+ var t = g(e.fileId), n = c.getSyncAttributes(t);
+ return void 0 !== n ? (e.syncAttributes = n, e.deleted === !0 ? (a.push(e), void 0) : (n.etag != e.file.etag && a.push(e),
+ void 0)) : void 0;
+ }), u.downloadContent(a, b, function(n, r) {
+ return n ? (e(n), void 0) : (t.each(r, function(e) {
+ var t = e.syncAttributes, n = t.syncIndex, o = c.getFileFromSyncIndex(n);
+ if (void 0 !== o) {
+ var r = o.title;
+ if (e.deleted === !0) return l.onError('"' + r + '" has been removed from Google Drive.'),
+ o.removeSyncLocation(t), l.onSyncRemoved(o, t), t.isRealtime === !0 && c.currentFile === o && y.stopRealtimeSync(),
+ void 0;
+ var s = t.titleCRC != i.crc32(r), a = o.content, u = t.contentCRC != i.crc32(a), d = e.file, h = i.crc32(d.title), p = t.titleCRC != h, f = r != d.title, g = i.crc32(d.content), m = t.contentCRC != g, v = a != d.content;
+ (f === !0 && s === !0 && p === !0 || !t.isRealtime && v === !0 && u === !0 && m === !0) && (c.createFile(r + " (backup)", a),
+ l.onMessage('Conflict detected on "' + r + '". A backup has been created locally.')),
+ f && p === !0 && (o.title = d.title, l.onTitleChanged(o), l.onMessage('"' + r + '" has been renamed to "' + d.title + '" on Google Drive.')),
+ !t.isRealtime && v && m === !0 && (o.content = d.content, l.onContentChanged(o),
+ l.onMessage('"' + d.title + '" has been updated from Google Drive.'), c.currentFile === o && c.selectFile()),
+ t.etag = d.etag, t.isRealtime || (t.contentCRC = g), t.titleCRC = h, i.storeAttributes(t);
+ }
+ }), o[b + ".gdrive.lastChangeId"] = s, e(), void 0);
+ });
+ });
+ }, y.publish = function(e, t, n, i, o) {
+ var r = "markdown" != e.format ? "text/html" : void 0;
+ u.upload(e.id, void 0, e.fileName || n, i, r, void 0, b, function(t, n) {
+ return t ? (o(t), void 0) : (e.id = n.id, o(), void 0);
+ });
+ }, y.newPublishAttributes = function(e) {
+ var t = {};
+ return t.id = i.getInputTextValue("#input-publish-" + h + "-fileid"), t.fileName = i.getInputTextValue("#input-publish-" + h + "-filename"),
+ e.isPropagationStopped() ? void 0 : t;
+ };
+ var w, x, C, E;
+ l.addListener("onPagedownConfigure", function(e) {
+ w = e;
});
- }, g.exportRealtimeFile = function(e, t, n, o) {
- var r = i.getInputTextValue("#input-sync-export-gdrive-parentid");
- u.createRealtimeFile(r, t, function(e, i) {
- if (e) return o(e), void 0;
- var r = h(i.id, i.etag, n, t);
- o(void 0, r);
- });
- }, g.syncUp = function(e, t, n, i, o, r) {
- return t == o.contentCRC && i == o.titleCRC ? (r(void 0, !1), void 0) : (u.upload(o.id, void 0, n, e, void 0, o.etag, function(e, n) {
- return e ? (r(e, !0), void 0) : (o.etag = n.etag, o.contentCRC = t, o.titleCRC = i,
- r(void 0, !0), void 0);
- }), void 0);
- }, g.syncUpRealtime = function(e, t, n, i, o, r) {
- return i == o.titleCRC ? (r(void 0, !1), void 0) : (u.rename(o.id, n, function(e, t) {
- return e ? (r(e, !0), void 0) : (o.etag = t.etag, o.titleCRC = i, r(void 0, !0),
- void 0);
- }), void 0);
- }, g.syncDown = function(e) {
- var n = parseInt(o[f + ".lastChangeId"], 10);
- u.checkChanges(n, function(n, r, s) {
- if (n) return e(n), void 0;
- var a = [];
- t.each(r, function(e) {
- var t = d(e.fileId), n = c.getSyncAttributes(t);
- return void 0 !== n ? (e.syncAttributes = n, e.deleted === !0 ? (a.push(e), void 0) : (n.etag != e.file.etag && a.push(e),
- void 0)) : void 0;
- }), u.downloadContent(a, function(n, r) {
- return n ? (e(n), void 0) : (t.each(r, function(e) {
- var t = e.syncAttributes, n = t.syncIndex, o = c.getFileFromSyncIndex(n);
- if (void 0 !== o) {
- var r = o.title;
- if (e.deleted === !0) return l.onError('"' + r + '" has been removed from Google Drive.'),
- o.removeSyncLocation(t), l.onSyncRemoved(o, t), t.isRealtime === !0 && c.currentFile === o && g.stopRealtimeSync(),
- void 0;
- var s = t.titleCRC != i.crc32(r), a = o.content, u = t.contentCRC != i.crc32(a), d = e.file, h = i.crc32(d.title), p = t.titleCRC != h, f = r != d.title, m = i.crc32(d.content), v = t.contentCRC != m, b = a != d.content;
- (f === !0 && s === !0 && p === !0 || !t.isRealtime && b === !0 && u === !0 && v === !0) && (c.createFile(r + " (backup)", a),
- l.onMessage('Conflict detected on "' + r + '". A backup has been created locally.')),
- f && p === !0 && (o.title = d.title, l.onTitleChanged(o), l.onMessage('"' + r + '" has been renamed to "' + d.title + '" on Google Drive.')),
- !t.isRealtime && b && v === !0 && (o.content = d.content, l.onContentChanged(o),
- l.onMessage('"' + d.title + '" has been updated from Google Drive.'), c.currentFile === o && c.selectFile()),
- t.etag = d.etag, t.isRealtime || (t.contentCRC = m), t.titleCRC = h, i.storeAttributes(t);
- }
- }), o[f + ".lastChangeId"] = s, e(), void 0);
+ var k, A, S = !0;
+ l.addListener("onAceCreated", function(e) {
+ A = e, A.session.on("change", function() {
+ k && k.string && k.string.setText(A.getValue());
});
});
- }, g.publish = function(e, t, n, i, o) {
- var r = "markdown" != e.format ? "text/html" : void 0;
- u.upload(e.id, void 0, e.fileName || n, i, r, void 0, function(t, n) {
- return t ? (o(t), void 0) : (e.id = n.id, o(), void 0);
- });
- }, g.newPublishAttributes = function(e) {
- var t = {};
- return t.id = i.getInputTextValue("#input-publish-gdrive-fileid"), t.fileName = i.getInputTextValue("#input-publish-gdrive-filename"),
- e.isPropagationStopped() ? void 0 : t;
+ var _ = require("ace/range").Range;
+ return y.startRealtimeSync = function(e, n) {
+ var o = {};
+ k = o, u.loadRealtime(n.id, e.content, b, function(s, a) {
+ function u() {
+ n.contentCRC = i.crc32(h.getText()), i.storeAttributes(n);
+ }
+ if (!s && a) {
+ if (o.isStopped === !0) return a.close(), void 0;
+ r.log("Starting Google Drive realtime synchronization"), o.document = a;
+ var d = a.getModel(), h = d.getRoot().get("content"), p = t.debounce(w.refreshPreview, 100);
+ h.addEventListener(gapi.drive.realtime.EventType.TEXT_INSERTED, function(e) {
+ if (void 0 !== A && (S === !1 || e.isLocal === !1)) {
+ var t = A.session.doc.indexToPosition(e.index);
+ A.session.insert(t, e.text), S = !0;
+ }
+ e.isLocal === !1 && (r.log("Google Drive realtime document updated from server"),
+ u(), void 0 === A && p());
+ }), h.addEventListener(gapi.drive.realtime.EventType.TEXT_DELETED, function(e) {
+ if (void 0 !== A && (S === !1 || e.isLocal === !1)) {
+ var t = function(e, t) {
+ return new _(e.row, e.column, t.row, t.column);
+ }(A.session.doc.indexToPosition(e.index), A.session.doc.indexToPosition(e.index + e.text.length));
+ A.session.remove(t), S = !0;
+ }
+ e.isLocal === !1 && (r.log("Google Drive realtime document updated from server"),
+ u(), void 0 === A && p());
+ }), a.addEventListener(gapi.drive.realtime.EventType.DOCUMENT_SAVE_STATE_CHANGED, function(e) {
+ e.isPending === !1 && e.isSaving === !1 && (r.log("Google Drive realtime document successfully saved on server"),
+ u());
+ });
+ var f = e.content, g = n.contentCRC != i.crc32(f), m = h.getText(), v = i.crc32(m), b = n.contentCRC != v, y = f != m;
+ y === !0 && g === !0 && (b === !0 ? (c.createFile(e.title + " (backup)", f), l.onMessage('Conflict detected on "' + e.title + '". A backup has been created locally.')) : h.setText(f)),
+ void 0 === A && (o.binding = gapi.drive.realtime.databinding.bindString(h, document.getElementById("wmd-input"))),
+ b === !0 && (r.log("Google Drive realtime document updated from server"), void 0 !== A && A.setValue(m, -1),
+ u(), void 0 === A && p()), void 0 !== A && (o.string = h), x = w.uiManager.buttons.undo.execute,
+ C = w.uiManager.buttons.redo.execute, E = w.uiManager.setUndoRedoButtonStates, w.uiManager.buttons.undo.execute = function() {
+ d.canUndo && (S = !1, d.undo());
+ }, w.uiManager.buttons.redo.execute = function() {
+ d.canRedo && (S = !1, d.redo());
+ }, w.uiManager.setUndoRedoButtonStates = function() {
+ setTimeout(function() {
+ w.uiManager.setButtonState(w.uiManager.buttons.undo, d.canUndo), w.uiManager.setButtonState(w.uiManager.buttons.redo, d.canRedo);
+ }, 50);
+ }, w.uiManager.setUndoRedoButtonStates(), d.addEventListener(gapi.drive.realtime.EventType.UNDO_REDO_STATE_CHANGED, function() {
+ w.uiManager.setUndoRedoButtonStates();
+ });
+ }
+ }, function(t) {
+ console.error(t), "token_refresh_required" == t.type ? u.refreshGdriveToken(b) : "not_found" == t.type ? (l.onError('"' + e.title + '" has been removed from Google Drive.'),
+ e.removeSyncLocation(n), l.onSyncRemoved(e, n), y.stopRealtimeSync()) : t.isFatal && (l.onError("An error has forced real time synchronization to stop."),
+ y.stopRealtimeSync());
+ });
+ }, y.stopRealtimeSync = function() {
+ r.log("Stopping Google Drive realtime synchronization"), void 0 !== k && (k.isStopped = !0,
+ k.binding && k.binding.unbind(), k.document && k.document.close(), k = void 0),
+ void 0 !== E && (w.uiManager.buttons.undo.execute = x, w.uiManager.buttons.redo.execute = C,
+ w.uiManager.setUndoRedoButtonStates = E, w.uiManager.setUndoRedoButtonStates());
+ }, y.isPublishEnabled = a.gdriveMultiAccount > f, l.addListener("onReady", function() {
+ e(".submenu-sync-" + h).toggle(a.gdriveMultiAccount > f), document.querySelector(".modal-upload-" + h).innerHTML = t.template(d, {
+ providerId: h,
+ providerName: p
+ }), e(".export-" + h + "-choose-folder").click(function() {
+ u.picker(function(t, n) {
+ t || 0 === n.length || (e(".modal-upload-" + h).modal(), i.setInputValue("#input-sync-export-" + h + "-parentid", n[0].id));
+ }, "folder", b);
+ });
+ var r = e("#input-sync-export-" + h + "-realtime"), s = e("#input-sync-export-" + h + "-fileid");
+ e("#input-sync-export-" + h + "-realtime").change(function() {
+ s.prop("disabled", r.prop("checked"));
+ });
+ var y = i.retrieveIgnoreError(h + ".state");
+ if (void 0 !== y) if (o.removeItem(h + ".state"), "create" == y.action) u.upload(void 0, y.folderId, n.GDRIVE_DEFAULT_FILE_TITLE, a.defaultContent, void 0, void 0, b, function(e, t) {
+ if (!e) {
+ var n = m(t.id, t.etag, t.content, t.title), i = {};
+ i[n.syncIndex] = n;
+ var o = c.createFile(t.title, t.content, i);
+ c.selectFile(o), l.onMessage('"' + t.title + '" created successfully on Google Drive.');
+ }
+ }); else if ("open" == y.action) {
+ var w = [];
+ t.each(y.ids, function(e) {
+ var t = g(e), n = c.getFileFromSyncIndex(t);
+ void 0 !== n ? n !== c.currentFile && c.selectFile(n) : w.push(e);
+ }), v(w);
+ }
+ }), y;
};
- var m, v, b, y;
- l.addListener("onPagedownConfigure", function(e) {
- m = e;
- });
- var w, x, C = !0;
- l.addListener("onAceCreated", function(e) {
- x = e, x.session.on("change", function() {
- w && w.string && w.string.setText(x.getValue());
- });
- });
- var E = require("ace/range").Range;
- return g.startRealtimeSync = function(e, n) {
- var o = {};
- w = o, u.loadRealtime(n.id, e.content, function(s, a) {
- function u() {
- n.contentCRC = i.crc32(h.getText()), i.storeAttributes(n);
- }
- if (!s && a) {
- if (o.isStopped === !0) return a.close(), void 0;
- r.log("Starting Google Drive realtime synchronization"), o.document = a;
- var d = a.getModel(), h = d.getRoot().get("content"), p = t.debounce(m.refreshPreview, 100);
- h.addEventListener(gapi.drive.realtime.EventType.TEXT_INSERTED, function(e) {
- if (void 0 !== x && (C === !1 || e.isLocal === !1)) {
- var t = x.session.doc.indexToPosition(e.index);
- x.session.insert(t, e.text), C = !0;
- }
- e.isLocal === !1 && (r.log("Google Drive realtime document updated from server"),
- u(), void 0 === x && p());
- }), h.addEventListener(gapi.drive.realtime.EventType.TEXT_DELETED, function(e) {
- if (void 0 !== x && (C === !1 || e.isLocal === !1)) {
- var t = function(e, t) {
- return new E(e.row, e.column, t.row, t.column);
- }(x.session.doc.indexToPosition(e.index), x.session.doc.indexToPosition(e.index + e.text.length));
- x.session.remove(t), C = !0;
- }
- e.isLocal === !1 && (r.log("Google Drive realtime document updated from server"),
- u(), void 0 === x && p());
- }), a.addEventListener(gapi.drive.realtime.EventType.DOCUMENT_SAVE_STATE_CHANGED, function(e) {
- e.isPending === !1 && e.isSaving === !1 && (r.log("Google Drive realtime document successfully saved on server"),
- u());
- });
- var f = e.content, g = n.contentCRC != i.crc32(f), w = h.getText(), k = i.crc32(w), A = n.contentCRC != k, S = f != w;
- S === !0 && g === !0 && (A === !0 ? (c.createFile(e.title + " (backup)", f), l.onMessage('Conflict detected on "' + e.title + '". A backup has been created locally.')) : h.setText(f)),
- void 0 === x && (o.binding = gapi.drive.realtime.databinding.bindString(h, document.getElementById("wmd-input"))),
- A === !0 && (r.log("Google Drive realtime document updated from server"), void 0 !== x && x.setValue(w, -1),
- u(), void 0 === x && p()), void 0 !== x && (o.string = h), v = m.uiManager.buttons.undo.execute,
- b = m.uiManager.buttons.redo.execute, y = m.uiManager.setUndoRedoButtonStates, m.uiManager.buttons.undo.execute = function() {
- d.canUndo && (C = !1, d.undo());
- }, m.uiManager.buttons.redo.execute = function() {
- d.canRedo && (C = !1, d.redo());
- }, m.uiManager.setUndoRedoButtonStates = function() {
- setTimeout(function() {
- m.uiManager.setButtonState(m.uiManager.buttons.undo, d.canUndo), m.uiManager.setButtonState(m.uiManager.buttons.redo, d.canRedo);
- }, 50);
- }, m.uiManager.setUndoRedoButtonStates(), d.addEventListener(gapi.drive.realtime.EventType.UNDO_REDO_STATE_CHANGED, function() {
- m.uiManager.setUndoRedoButtonStates();
- });
- }
- }, function(t) {
- console.error(t), "token_refresh_required" == t.type ? u.forceGdriveAuthenticate() : "not_found" == t.type ? (l.onError('"' + e.title + '" has been removed from Google Drive.'),
- e.removeSyncLocation(n), l.onSyncRemoved(e, n), g.stopRealtimeSync()) : t.isFatal && (l.onError("An error has forced real time synchronization to stop."),
- g.stopRealtimeSync());
- });
- }, g.stopRealtimeSync = function() {
- r.log("Stopping Google Drive realtime synchronization"), void 0 !== w && (w.isStopped = !0,
- w.binding && w.binding.unbind(), w.document && w.document.close(), w = void 0),
- void 0 !== y && (m.uiManager.buttons.undo.execute = v, m.uiManager.buttons.redo.execute = b,
- m.uiManager.setUndoRedoButtonStates = y, m.uiManager.setUndoRedoButtonStates());
- }, l.addListener("onReady", function() {
- e(".export-gdrive-choose-folder").click(function() {
- u.picker(function(t, n) {
- t || 0 === n.length || (e(".modal-upload-gdrive").modal(), i.setInputValue("#input-sync-export-gdrive-parentid", n[0].id));
- }, "folder");
- });
- var r = e("#input-sync-export-gdrive-realtime"), s = e("#input-sync-export-gdrive-fileid");
- e("#input-sync-export-gdrive-realtime").change(function() {
- s.prop("disabled", r.prop("checked"));
- });
- var g = i.retrieveIgnoreError(f + ".state");
- if (void 0 !== g) if (o.removeItem(f + ".state"), "create" == g.action) u.upload(void 0, g.folderId, n.GDRIVE_DEFAULT_FILE_TITLE, a.defaultContent, void 0, void 0, function(e, t) {
- if (!e) {
- var n = h(t.id, t.etag, t.content, t.title), i = {};
- i[n.syncIndex] = n;
- var o = c.createFile(t.title, t.content, i);
- c.selectFile(o), l.onMessage('"' + t.title + '" created successfully on Google Drive.');
- }
- }); else if ("open" == g.action) {
- var m = [];
- t.each(g.ids, function(e) {
- var t = d(e), n = c.getFileFromSyncIndex(t);
- void 0 !== n ? n !== c.currentFile && c.selectFile(n) : m.push(e);
- }), p(m);
- }
- }), g;
-}), define("synchronizer", [ "jquery", "underscore", "utils", "storage", "eventMgr", "fileSystem", "fileMgr", "classes/Provider", "providers/dropboxProvider", "providers/gdriveProvider" ], function(e, t, n, i, o, r, s, a) {
+}), define("providers/gdriveProvider", [ "providers/gdriveProviderBuilder" ], function(e) {
+ return e("gdrive", "Google Drive", 0);
+}), define("providers/gdrivesecProvider", [ "providers/gdriveProviderBuilder" ], function(e) {
+ return e("gdrivesec", "Google Drive (2nd account)", 1);
+}), define("providers/gdriveterProvider", [ "providers/gdriveProviderBuilder" ], function(e) {
+ return e("gdriveter", "Google Drive (3rd account)", 2);
+}), define("synchronizer", [ "jquery", "underscore", "utils", "storage", "eventMgr", "fileSystem", "fileMgr", "classes/Provider", "providers/dropboxProvider", "providers/gdriveProvider", "providers/gdrivesecProvider", "providers/gdriveterProvider" ], function(e, t, n, i, o, r, s, a) {
function l(e) {
if (0 === E.length) return c(e), void 0;
var t = E.pop(), i = t.provider.syncUp;
@@ -30794,7 +30876,7 @@ function() {
return n.site = t.getInputTextValue("#input-publish-wordpress-site", e, /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/),
n.postId = t.getInputTextValue("#input-publish-postid"), e.isPropagationStopped() ? void 0 : n;
}, o;
-}), define("publisher", [ "jquery", "underscore", "constants", "utils", "storage", "settings", "eventMgr", "fileSystem", "fileMgr", "sharing", "classes/Provider", "classes/AsyncTask", "providers/bloggerProvider", "providers/dropboxProvider", "providers/gistProvider", "providers/githubProvider", "providers/gdriveProvider", "providers/sshProvider", "providers/tumblrProvider", "providers/wordpressProvider" ], function(e, t, n, i, o, r, s, a, l, c, u, d) {
+}), define("publisher", [ "jquery", "underscore", "constants", "utils", "storage", "settings", "eventMgr", "fileSystem", "fileMgr", "sharing", "classes/Provider", "classes/AsyncTask", "providers/bloggerProvider", "providers/dropboxProvider", "providers/gistProvider", "providers/githubProvider", "providers/gdriveProvider", "providers/gdrivesecProvider", "providers/gdriveterProvider", "providers/sshProvider", "providers/tumblrProvider", "providers/wordpressProvider" ], function(e, t, n, i, o, r, s, a, l, c, u, d) {
function h(e, t, n) {
return void 0 === t.format && (t.format = i.getInputRadio("radio-publish-format"),
"template" == t.format && i.getInputChecked("#checkbox-publish-custom-template") && (t.customTmpl = i.getInputValue("#textarea-publish-custom-template"))),
@@ -30847,7 +30929,7 @@ function() {
}
}
var v = {}, b = t.chain(arguments).map(function(e) {
- return e instanceof u && [ e.providerId, e ];
+ return e instanceof u && e.isPublishEnabled === !0 && [ e.providerId, e ];
}).compact().object().value();
t.each(a, function(e) {
t.each(i.retrieveIndexArray(e.fileIndex + ".publish"), function(t) {
diff --git a/public/res-min/themes/base.css b/public/res-min/themes/base.css
index c6ea0624..8df2e0ef 100644
--- a/public/res-min/themes/base.css
+++ b/public/res-min/themes/base.css
@@ -1167,7 +1167,7 @@ pre .coffeescript .javascript,pre .javascript .xml,pre .lasso .markup,pre .tex .
.icon-code:before{content:'\e844'}
.icon-folder-open:before{content:'\e81e'}
.icon-left-big:before{content:'\e88a'}
-@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url('../font/opensans-light-webfont.svg#open_sanslight') format('svg'),url("../font/opensans-light-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url('../font/opensans-regular-webfont.svg#open_sansregular') format('svg'),url("../font/opensans-regular-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url('../font/opensans-bold-webfont.svg#open_sansbold') format('svg'),url("../font/opensans-bold-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url('../font/opensans-lightitalic-webfont.svg#open_sanslight_italic') format('svg'),url("../font/opensans-lightitalic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url('../font/opensans-italic-webfont.svg#open_sansitalic') format('svg'),url("../font/opensans-italic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url('../font/opensans-bolditalic-webfont.svg#open_sansbold_italic') format('svg'),url("../font/opensans-bolditalic-webfont.woff") format('woff')}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url('../font/opensans-light-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url('../font/opensans-regular-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url('../font/opensans-bold-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url('../font/opensans-lightitalic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url('../font/opensans-italic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url('../font/opensans-bolditalic-webfont.svg') format('svg')}}body{-webkit-font-smoothing:antialiased}
+@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url("../font/opensans-light-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url("../font/opensans-regular-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url("../font/opensans-bold-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url("../font/opensans-lightitalic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url("../font/opensans-italic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url("../font/opensans-bolditalic-webfont.woff") format('woff')}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url('../font/opensans-light-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url('../font/opensans-regular-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url('../font/opensans-bold-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url('../font/opensans-lightitalic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url('../font/opensans-italic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url('../font/opensans-bolditalic-webfont.svg') format('svg')}}body{-webkit-font-smoothing:antialiased}
.container{margin-bottom:180px}
a code{color:inherit}
h1{font-size:36px}
@@ -1206,7 +1206,7 @@ kbd{padding:0.1em 0.6em;border:1px solid rgba(0,0,0,0.25);-webkit-box-shadow:0 1
.icon-link{font-size:104%}
[class^="icon-provider-"],[class*=" icon-provider-"]{background-image:url("../img/icons.png");width:18px;height:16px;margin-top:-2px;margin-left:1px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){[class^="icon-provider-"],[class*=" icon-provider-"]{background-image:url("../img/icons2x.png");background-size:256px 16px}}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){[class^="icon-provider-"],[class*=" icon-provider-"]{background-image:url("../img/icons2x.png");background-size:256px 16px}}
.icon-provider-stackedit{background-position:0 0}
-.icon-provider-gdrive{background-position:-18px 0}.icon-provider-gdrive.realtime{background-position:-162px 0}
+.icon-provider-gdrive,.icon-provider-gdrivesec,.icon-provider-gdriveter{background-position:-18px 0}.icon-provider-gdrive.realtime,.icon-provider-gdrivesec.realtime,.icon-provider-gdriveter.realtime{background-position:-162px 0}
.icon-provider-dropbox{background-position:-37px 0}
.icon-provider-github,.icon-provider-gist{background-position:-54px 0}
.icon-provider-blogger{background-position:-72px 0}
diff --git a/public/res-min/themes/default.css b/public/res-min/themes/default.css
index 20950309..7cb9e93c 100644
--- a/public/res-min/themes/default.css
+++ b/public/res-min/themes/default.css
@@ -94,8 +94,8 @@ blockquote.pull-right small:after{content:'\00A0 \2014'}
q:before,q:after,blockquote:before,blockquote:after{content:""}
address{display:block;margin-bottom:20px;font-style:normal;line-height:1.428571429}
code,pre{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}
-code{padding:2px 4px;font-size:90%;color:#162029;background-color:rgba(102,128,153,0.05);white-space:nowrap;border-radius:4px}
-pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;word-break:break-all;word-wrap:break-word;color:#333;background-color:rgba(102,128,153,0.05);border:1px solid #dee6ed;border-radius:4px}pre.prettyprint{margin-bottom:20px}
+code{padding:2px 4px;font-size:90%;color:#162029;background-color:rgba(102,128,153,0.075);white-space:nowrap;border-radius:4px}
+pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;word-break:break-all;word-wrap:break-word;color:#333;background-color:rgba(102,128,153,0.075);border:1px solid #dee6ed;border-radius:4px}pre.prettyprint{margin-bottom:20px}
pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border:0}
.pre-scrollable{max-height:340px;overflow-y:scroll}
.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container:before,.container:after{content:" ";display:table;}
@@ -1182,7 +1182,7 @@ pre .coffeescript .javascript,pre .javascript .xml,pre .lasso .markup,pre .tex .
.icon-code:before{content:'\e844'}
.icon-folder-open:before{content:'\e81e'}
.icon-left-big:before{content:'\e88a'}
-@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url('../font/opensans-light-webfont.svg#open_sanslight') format('svg'),url("../font/opensans-light-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url('../font/opensans-regular-webfont.svg#open_sansregular') format('svg'),url("../font/opensans-regular-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url('../font/opensans-bold-webfont.svg#open_sansbold') format('svg'),url("../font/opensans-bold-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url('../font/opensans-lightitalic-webfont.svg#open_sanslight_italic') format('svg'),url("../font/opensans-lightitalic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url('../font/opensans-italic-webfont.svg#open_sansitalic') format('svg'),url("../font/opensans-italic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url('../font/opensans-bolditalic-webfont.svg#open_sansbold_italic') format('svg'),url("../font/opensans-bolditalic-webfont.woff") format('woff')}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url('../font/opensans-light-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url('../font/opensans-regular-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url('../font/opensans-bold-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url('../font/opensans-lightitalic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url('../font/opensans-italic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url('../font/opensans-bolditalic-webfont.svg') format('svg')}}body{-webkit-font-smoothing:antialiased}
+@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url("../font/opensans-light-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url("../font/opensans-regular-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url("../font/opensans-bold-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url("../font/opensans-lightitalic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url("../font/opensans-italic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url("../font/opensans-bolditalic-webfont.woff") format('woff')}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url('../font/opensans-light-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url('../font/opensans-regular-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url('../font/opensans-bold-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url('../font/opensans-lightitalic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url('../font/opensans-italic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url('../font/opensans-bolditalic-webfont.svg') format('svg')}}body{-webkit-font-smoothing:antialiased}
.container{margin-bottom:180px}
a code{color:inherit}
h1{font-size:36px}
@@ -1221,7 +1221,7 @@ kbd{padding:0.1em 0.6em;border:1px solid rgba(22,32,41,0.25);-webkit-box-shadow:
.icon-link{font-size:104%}
[class^="icon-provider-"],[class*=" icon-provider-"]{background-image:url("../img/icons.png");width:18px;height:16px;margin-top:-2px;margin-left:1px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){[class^="icon-provider-"],[class*=" icon-provider-"]{background-image:url("../img/icons2x.png");background-size:256px 16px}}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){[class^="icon-provider-"],[class*=" icon-provider-"]{background-image:url("../img/icons2x.png");background-size:256px 16px}}
.icon-provider-stackedit{background-position:0 0}
-.icon-provider-gdrive{background-position:-18px 0}.icon-provider-gdrive.realtime{background-position:-162px 0}
+.icon-provider-gdrive,.icon-provider-gdrivesec,.icon-provider-gdriveter{background-position:-18px 0}.icon-provider-gdrive.realtime,.icon-provider-gdrivesec.realtime,.icon-provider-gdriveter.realtime{background-position:-162px 0}
.icon-provider-dropbox{background-position:-37px 0}
.icon-provider-github,.icon-provider-gist{background-position:-54px 0}
.icon-provider-blogger{background-position:-72px 0}
@@ -1374,7 +1374,7 @@ div.jGrowl div.jGrowl-notification div.jGrowl-header{font-weight:bold;font-size:
div.jGrowl div.jGrowl-notification div.jGrowl-close{z-index:99;float:right;font-weight:bold;font-size:1em;cursor:pointer}
div.jGrowl div.jGrowl-closer{padding-top:4px;padding-bottom:4px;cursor:pointer;font-size:.9em;font-weight:bold;text-align:center}
@media print{div.jGrowl{display:none}}body{tab-size:4}
-#preview-contents{padding:15px;margin:0 auto 180px}
+@media screen and (-webkit-min-device-pixel-ratio:0){select{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}}#preview-contents{padding:15px;margin:0 auto 180px}
.working{cursor:progress}
.btn,.dropdown-menu{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}
.dropdown-menu,.modal-content,.panel-content,.search-bar{-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.125);box-shadow:0 6px 12px rgba(0,0,0,0.125)}
@@ -1425,7 +1425,7 @@ a.list-group-item:hover,a.list-group-item:focus{color:#036;border-top-color:rgba
.navbar .btn{height:38px;padding:8px 10px}
.navbar .btn-group>.btn.disabled *,.navbar .btn-group>.btn.blocked *,.navbar .btn-group>.btn[disabled] *{color:rgba(45,64,83,0.3)}
.navbar .file-title-navbar{display:inline-block;vertical-align:middle;padding:4px 15px;font-size:20px;font-weight:200;max-width:280px;overflow:hidden;white-space:nowrap}
-.navbar .input-file-title-container{display:inline-block;vertical-align:middle}.navbar .input-file-title-container .input-file-title{width:220px}
+.navbar .input-file-title-container{display:inline-block;vertical-align:middle}.navbar .input-file-title-container .input-file-title{width:280px}
.navbar .working-indicator{display:inline-block;vertical-align:middle;overflow:hidden;height:38px;width:60px;padding-top:9px}.navbar .working-indicator .bar{display:inline-block;width:14px;height:6px;border-radius:1px;margin:0 2px;opacity:0.25;background-color:#2d4053;animation:indicator .6s ease-out infinite;-webkit-animation:indicator .6s ease-out infinite;}
.navbar .offline-status>div{display:inline-block;vertical-align:middle;height:38px;padding:9px 10px}
.navbar .left-buttons-dropdown>.nav,.navbar .right-buttons-dropdown>.nav{margin-left:0;margin-right:0}
@@ -1493,28 +1493,28 @@ a.list-group-item:hover,a.list-group-item:focus{color:#036;border-top-color:rgba
.ui-layout-resizer-north{background-color:#e4ebf1;border-bottom:1px solid rgba(0,128,255,0.1)}
.resizer-decorator{position:absolute;display:block !important}.ui-layout-resizer-east .resizer-decorator{width:35px;height:100%;border-left:1px solid rgba(0,128,255,0.06)}
.ui-layout-resizer-south .resizer-decorator{height:35px;width:100%;border-top:1px solid rgba(0,128,255,0.06)}
-.ace_editor{color:#5c738a}
+.ace_editor{color:#414d58}
.ace-tm{background-color:#fff}.ace-tm .ace_text-input{box-sizing:initial}
.ace-tm .ace_marker-layer .ace_active-line{background-color:rgba(89,128,166,0.05)}
.ace-tm .ace_cursor{color:#243342}
.ace-tm .ace_print-margin{background-color:rgba(89,128,166,0.05)}
-.ace-tm .ace_markup.ace_heading{color:#141a1f;font-weight:bold}
-.ace-tm .ace_markup.ace_list{color:#3d4d5c}
-.ace-tm .ace_constant.ace_language{color:#668099}
-.ace-tm .ace_meta.ace_tag{color:#3d4d5c;font-style:italic;font-weight:bold;background-color:rgba(102,128,153,0.05)}
-.ace-tm .ace_keyword.ace_operator{color:#3d4d5c;background-color:transparent}
-.ace-tm .ace_keyword{color:#3d4d5c;background-color:rgba(102,128,153,0.05);font-weight:bold}
-.ace-tm .ace_string{color:#3d4d5c;font-style:italic;background-color:rgba(102,128,153,0.05)}
+.ace-tm .ace_markup.ace_heading{color:#161a1d;font-weight:bold}
+.ace-tm .ace_markup.ace_list{color:#6c8093}
+.ace-tm .ace_constant.ace_language{color:rgba(108,128,147,0.75);font-weight:normal}
+.ace-tm .ace_meta.ace_tag{color:#414d58;font-style:italic;font-weight:bold;background-color:rgba(102,128,153,0.075)}
+.ace-tm .ace_keyword.ace_operator{color:#414d58;background-color:transparent}
+.ace-tm .ace_keyword{color:#414d58;background-color:rgba(102,128,153,0.075);font-weight:bold}
+.ace-tm .ace_string{color:#414d58;font-style:italic;background-color:rgba(102,128,153,0.075)}
.ace-tm .ace_invalid{color:inherit;background:inherit}
-.ace-tm .ace_strong{font-weight:bold}
-.ace-tm .ace_emphasis{color:#141a1f;font-style:italic}
-.ace-tm .ace_blockquote{color:#668099}
-.ace-tm .ace_code{color:#3d4d5c;background-color:rgba(102,128,153,0.05)}
-.ace-tm .ace_code_block{color:#141a1f}
-.ace-tm .ace_link{color:#668099;background-color:rgba(102,128,153,0.05)}
-.ace-tm .ace_description{color:#668099}
-.ace-tm .ace_constant{color:#3d4d5c}
-.ace-tm .ace_comment{color:rgba(92,115,138,0.5);font-style:italic}
+.ace-tm .ace_strong{color:#414d58;font-weight:bold}
+.ace-tm .ace_emphasis{color:#161a1d;font-style:italic}
+.ace-tm .ace_blockquote{color:#6c8093}
+.ace-tm .ace_code{color:#161a1d;background-color:rgba(102,128,153,0.075)}
+.ace-tm .ace_code_block{color:#161a1d}
+.ace-tm .ace_link{color:#6c8093;background-color:rgba(102,128,153,0.075)}
+.ace-tm .ace_description{color:#6c8093}
+.ace-tm .ace_constant{color:#414d58}
+.ace-tm .ace_comment{color:rgba(108,128,147,0.75);font-style:italic}
.ace-tm .ace_marker-layer .misspelled{position:absolute;z-index:-2;border-bottom:1px dotted red;margin-bottom:-1px}
.ace_search{background-color:#f6f7f9;border:1px solid #ebf0f4;border-top:0;padding:10px 15px 5px;font-family:'Open Sans',"Trebuchet MS",Helvetica,sans-serif;min-width:318px}.ace_search .ace_search_form,.ace_search .ace_replace_form{border-color:#dee6ed;margin-bottom:10px}
.ace_search .ace_search_field{width:185px}
@@ -1524,7 +1524,7 @@ a.list-group-item:hover,a.list-group-item:focus{color:#036;border-top-color:rgba
.ace_search .ace_replacebtn{padding:0 4px}
.ace_search .ace_searchbtn_close{background:transparent;margin:0;font-size:21px;font-weight:bold;text-shadow:0 1px 0 #fff;opacity:.3;filter:alpha(opacity=30)}.ace_search .ace_searchbtn_close:before{content:'\d7'}
.ace_search .ace_searchbtn_close:hover,.ace_search .ace_searchbtn_close:focus{color:#162029;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50);background:transparent}
-#wmd-input{border-radius:0;color:#3d4d5c;-webkit-box-shadow:none;box-shadow:none;resize:none;border:none;padding:0 12px}div#wmd-input{padding:0}
+#wmd-input{border-radius:0;color:#414d58;-webkit-box-shadow:none;box-shadow:none;resize:none;border:none;padding:0 12px}div#wmd-input{padding:0}
.textarea-helper{top:-100px;height:1px;padding:0 12px;font-size:14px;line-height:1.428571429;position:absolute;overflow:auto;white-space:pre-wrap;word-wrap:break-word}
.preview-container{overflow:auto;background-color:#f6f7f9}
.wmd-prompt-background{display:none}
diff --git a/public/res-min/themes/gray.css b/public/res-min/themes/gray.css
index 1846d32b..c0fa6fa4 100644
--- a/public/res-min/themes/gray.css
+++ b/public/res-min/themes/gray.css
@@ -94,8 +94,8 @@ blockquote.pull-right small:after{content:'\00A0 \2014'}
q:before,q:after,blockquote:before,blockquote:after{content:""}
address{display:block;margin-bottom:20px;font-style:normal;line-height:1.428571429}
code,pre{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}
-code{padding:2px 4px;font-size:90%;color:#202020;background-color:rgba(128,128,128,0.05);white-space:nowrap;border-radius:4px}
-pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;word-break:break-all;word-wrap:break-word;color:#333;background-color:rgba(128,128,128,0.05);border:1px solid #e6e6e6;border-radius:4px}pre.prettyprint{margin-bottom:20px}
+code{padding:2px 4px;font-size:90%;color:#202020;background-color:rgba(128,128,128,0.075);white-space:nowrap;border-radius:4px}
+pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;word-break:break-all;word-wrap:break-word;color:#333;background-color:rgba(128,128,128,0.075);border:1px solid #e6e6e6;border-radius:4px}pre.prettyprint{margin-bottom:20px}
pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border:0}
.pre-scrollable{max-height:340px;overflow-y:scroll}
.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container:before,.container:after{content:" ";display:table;}
@@ -1182,7 +1182,7 @@ pre .coffeescript .javascript,pre .javascript .xml,pre .lasso .markup,pre .tex .
.icon-code:before{content:'\e844'}
.icon-folder-open:before{content:'\e81e'}
.icon-left-big:before{content:'\e88a'}
-@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url('../font/opensans-light-webfont.svg#open_sanslight') format('svg'),url("../font/opensans-light-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url('../font/opensans-regular-webfont.svg#open_sansregular') format('svg'),url("../font/opensans-regular-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url('../font/opensans-bold-webfont.svg#open_sansbold') format('svg'),url("../font/opensans-bold-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url('../font/opensans-lightitalic-webfont.svg#open_sanslight_italic') format('svg'),url("../font/opensans-lightitalic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url('../font/opensans-italic-webfont.svg#open_sansitalic') format('svg'),url("../font/opensans-italic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url('../font/opensans-bolditalic-webfont.svg#open_sansbold_italic') format('svg'),url("../font/opensans-bolditalic-webfont.woff") format('woff')}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url('../font/opensans-light-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url('../font/opensans-regular-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url('../font/opensans-bold-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url('../font/opensans-lightitalic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url('../font/opensans-italic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url('../font/opensans-bolditalic-webfont.svg') format('svg')}}body{-webkit-font-smoothing:antialiased}
+@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url("../font/opensans-light-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url("../font/opensans-regular-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url("../font/opensans-bold-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url("../font/opensans-lightitalic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url("../font/opensans-italic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url("../font/opensans-bolditalic-webfont.woff") format('woff')}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url('../font/opensans-light-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url('../font/opensans-regular-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url('../font/opensans-bold-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url('../font/opensans-lightitalic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url('../font/opensans-italic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url('../font/opensans-bolditalic-webfont.svg') format('svg')}}body{-webkit-font-smoothing:antialiased}
.container{margin-bottom:180px}
a code{color:inherit}
h1{font-size:36px}
@@ -1221,7 +1221,7 @@ kbd{padding:0.1em 0.6em;border:1px solid rgba(32,32,32,0.25);-webkit-box-shadow:
.icon-link{font-size:104%}
[class^="icon-provider-"],[class*=" icon-provider-"]{background-image:url("../img/icons.png");width:18px;height:16px;margin-top:-2px;margin-left:1px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){[class^="icon-provider-"],[class*=" icon-provider-"]{background-image:url("../img/icons2x.png");background-size:256px 16px}}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){[class^="icon-provider-"],[class*=" icon-provider-"]{background-image:url("../img/icons2x.png");background-size:256px 16px}}
.icon-provider-stackedit{background-position:0 0}
-.icon-provider-gdrive{background-position:-18px 0}.icon-provider-gdrive.realtime{background-position:-162px 0}
+.icon-provider-gdrive,.icon-provider-gdrivesec,.icon-provider-gdriveter{background-position:-18px 0}.icon-provider-gdrive.realtime,.icon-provider-gdrivesec.realtime,.icon-provider-gdriveter.realtime{background-position:-162px 0}
.icon-provider-dropbox{background-position:-37px 0}
.icon-provider-github,.icon-provider-gist{background-position:-54px 0}
.icon-provider-blogger{background-position:-72px 0}
@@ -1374,7 +1374,7 @@ div.jGrowl div.jGrowl-notification div.jGrowl-header{font-weight:bold;font-size:
div.jGrowl div.jGrowl-notification div.jGrowl-close{z-index:99;float:right;font-weight:bold;font-size:1em;cursor:pointer}
div.jGrowl div.jGrowl-closer{padding-top:4px;padding-bottom:4px;cursor:pointer;font-size:.9em;font-weight:bold;text-align:center}
@media print{div.jGrowl{display:none}}body{tab-size:4}
-#preview-contents{padding:15px;margin:0 auto 180px}
+@media screen and (-webkit-min-device-pixel-ratio:0){select{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}}#preview-contents{padding:15px;margin:0 auto 180px}
.working{cursor:progress}
.btn,.dropdown-menu{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}
.dropdown-menu,.modal-content,.panel-content,.search-bar{-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.125);box-shadow:0 6px 12px rgba(0,0,0,0.125)}
@@ -1425,7 +1425,7 @@ a.list-group-item:hover,a.list-group-item:focus{color:#343434;border-top-color:r
.navbar .btn{height:38px;padding:8px 10px}
.navbar .btn-group>.btn.disabled *,.navbar .btn-group>.btn.blocked *,.navbar .btn-group>.btn[disabled] *{color:rgba(64,64,64,0.3)}
.navbar .file-title-navbar{display:inline-block;vertical-align:middle;padding:4px 15px;font-size:20px;font-weight:200;max-width:280px;overflow:hidden;white-space:nowrap}
-.navbar .input-file-title-container{display:inline-block;vertical-align:middle}.navbar .input-file-title-container .input-file-title{width:220px}
+.navbar .input-file-title-container{display:inline-block;vertical-align:middle}.navbar .input-file-title-container .input-file-title{width:280px}
.navbar .working-indicator{display:inline-block;vertical-align:middle;overflow:hidden;height:38px;width:60px;padding-top:9px}.navbar .working-indicator .bar{display:inline-block;width:14px;height:6px;border-radius:1px;margin:0 2px;opacity:0.25;background-color:#404040;animation:indicator .6s ease-out infinite;-webkit-animation:indicator .6s ease-out infinite;}
.navbar .offline-status>div{display:inline-block;vertical-align:middle;height:38px;padding:9px 10px}
.navbar .left-buttons-dropdown>.nav,.navbar .right-buttons-dropdown>.nav{margin-left:0;margin-right:0}
@@ -1493,28 +1493,28 @@ a.list-group-item:hover,a.list-group-item:focus{color:#343434;border-top-color:r
.ui-layout-resizer-north{background-color:#ebebeb;border-bottom:1px solid rgba(128,128,128,0.1)}
.resizer-decorator{position:absolute;display:block !important}.ui-layout-resizer-east .resizer-decorator{width:35px;height:100%;border-left:1px solid rgba(128,128,128,0.06)}
.ui-layout-resizer-south .resizer-decorator{height:35px;width:100%;border-top:1px solid rgba(128,128,128,0.06)}
-.ace_editor{color:#737373}
+.ace_editor{color:#4d4d4d}
.ace-tm{background-color:#fff}.ace-tm .ace_text-input{box-sizing:initial}
.ace-tm .ace_marker-layer .ace_active-line{background-color:rgba(128,128,128,0.05)}
.ace-tm .ace_cursor{color:#343434}
.ace-tm .ace_print-margin{background-color:rgba(128,128,128,0.05)}
.ace-tm .ace_markup.ace_heading{color:#1a1a1a;font-weight:bold}
-.ace-tm .ace_markup.ace_list{color:#4d4d4d}
-.ace-tm .ace_constant.ace_language{color:#808080}
-.ace-tm .ace_meta.ace_tag{color:#4d4d4d;font-style:italic;font-weight:bold;background-color:rgba(128,128,128,0.05)}
+.ace-tm .ace_markup.ace_list{color:#808080}
+.ace-tm .ace_constant.ace_language{color:rgba(128,128,128,0.75);font-weight:normal}
+.ace-tm .ace_meta.ace_tag{color:#4d4d4d;font-style:italic;font-weight:bold;background-color:rgba(128,128,128,0.075)}
.ace-tm .ace_keyword.ace_operator{color:#4d4d4d;background-color:transparent}
-.ace-tm .ace_keyword{color:#4d4d4d;background-color:rgba(128,128,128,0.05);font-weight:bold}
-.ace-tm .ace_string{color:#4d4d4d;font-style:italic;background-color:rgba(128,128,128,0.05)}
+.ace-tm .ace_keyword{color:#4d4d4d;background-color:rgba(128,128,128,0.075);font-weight:bold}
+.ace-tm .ace_string{color:#4d4d4d;font-style:italic;background-color:rgba(128,128,128,0.075)}
.ace-tm .ace_invalid{color:inherit;background:inherit}
-.ace-tm .ace_strong{font-weight:bold}
+.ace-tm .ace_strong{color:#4d4d4d;font-weight:bold}
.ace-tm .ace_emphasis{color:#1a1a1a;font-style:italic}
.ace-tm .ace_blockquote{color:#808080}
-.ace-tm .ace_code{color:#4d4d4d;background-color:rgba(128,128,128,0.05)}
+.ace-tm .ace_code{color:#1a1a1a;background-color:rgba(128,128,128,0.075)}
.ace-tm .ace_code_block{color:#1a1a1a}
-.ace-tm .ace_link{color:#808080;background-color:rgba(128,128,128,0.05)}
+.ace-tm .ace_link{color:#808080;background-color:rgba(128,128,128,0.075)}
.ace-tm .ace_description{color:#808080}
.ace-tm .ace_constant{color:#4d4d4d}
-.ace-tm .ace_comment{color:rgba(115,115,115,0.5);font-style:italic}
+.ace-tm .ace_comment{color:rgba(128,128,128,0.75);font-style:italic}
.ace-tm .ace_marker-layer .misspelled{position:absolute;z-index:-2;border-bottom:1px dotted red;margin-bottom:-1px}
.ace_search{background-color:#f8f8f8;border:1px solid #f0f0f0;border-top:0;padding:10px 15px 5px;font-family:'Open Sans',"Trebuchet MS",Helvetica,sans-serif;min-width:318px}.ace_search .ace_search_form,.ace_search .ace_replace_form{border-color:#e6e6e6;margin-bottom:10px}
.ace_search .ace_search_field{width:185px}
diff --git a/public/res-min/themes/night.css b/public/res-min/themes/night.css
index b237a19f..f1c05578 100644
--- a/public/res-min/themes/night.css
+++ b/public/res-min/themes/night.css
@@ -1182,7 +1182,7 @@ pre .coffeescript .javascript,pre .javascript .xml,pre .lasso .markup,pre .tex .
.icon-code:before{content:'\e844'}
.icon-folder-open:before{content:'\e81e'}
.icon-left-big:before{content:'\e88a'}
-@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url('../font/opensans-light-webfont.svg#open_sanslight') format('svg'),url("../font/opensans-light-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url('../font/opensans-regular-webfont.svg#open_sansregular') format('svg'),url("../font/opensans-regular-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url('../font/opensans-bold-webfont.svg#open_sansbold') format('svg'),url("../font/opensans-bold-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url('../font/opensans-lightitalic-webfont.svg#open_sanslight_italic') format('svg'),url("../font/opensans-lightitalic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url('../font/opensans-italic-webfont.svg#open_sansitalic') format('svg'),url("../font/opensans-italic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url('../font/opensans-bolditalic-webfont.svg#open_sansbold_italic') format('svg'),url("../font/opensans-bolditalic-webfont.woff") format('woff')}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url('../font/opensans-light-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url('../font/opensans-regular-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url('../font/opensans-bold-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url('../font/opensans-lightitalic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url('../font/opensans-italic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url('../font/opensans-bolditalic-webfont.svg') format('svg')}}body{-webkit-font-smoothing:antialiased}
+@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url("../font/opensans-light-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url("../font/opensans-regular-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url("../font/opensans-bold-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url("../font/opensans-lightitalic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url("../font/opensans-italic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url("../font/opensans-bolditalic-webfont.woff") format('woff')}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url('../font/opensans-light-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url('../font/opensans-regular-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url('../font/opensans-bold-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url('../font/opensans-lightitalic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url('../font/opensans-italic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url('../font/opensans-bolditalic-webfont.svg') format('svg')}}body{-webkit-font-smoothing:antialiased}
.container{margin-bottom:180px}
a code{color:inherit}
h1{font-size:36px}
@@ -1221,7 +1221,7 @@ kbd{padding:0.1em 0.6em;border:1px solid rgba(159,159,159,0.4);-webkit-box-shado
.icon-link{font-size:104%}
[class^="icon-provider-"],[class*=" icon-provider-"]{background-image:url("../img/icons.png");width:18px;height:16px;margin-top:-2px;margin-left:1px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){[class^="icon-provider-"],[class*=" icon-provider-"]{background-image:url("../img/icons2x.png");background-size:256px 16px}}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){[class^="icon-provider-"],[class*=" icon-provider-"]{background-image:url("../img/icons2x.png");background-size:256px 16px}}
.icon-provider-stackedit{background-position:0 0}
-.icon-provider-gdrive{background-position:-18px 0}.icon-provider-gdrive.realtime{background-position:-162px 0}
+.icon-provider-gdrive,.icon-provider-gdrivesec,.icon-provider-gdriveter{background-position:-18px 0}.icon-provider-gdrive.realtime,.icon-provider-gdrivesec.realtime,.icon-provider-gdriveter.realtime{background-position:-162px 0}
.icon-provider-dropbox{background-position:-37px 0}
.icon-provider-github,.icon-provider-gist{background-position:-54px 0}
.icon-provider-blogger{background-position:-72px 0}
@@ -1374,7 +1374,7 @@ div.jGrowl div.jGrowl-notification div.jGrowl-header{font-weight:bold;font-size:
div.jGrowl div.jGrowl-notification div.jGrowl-close{z-index:99;float:right;font-weight:bold;font-size:1em;cursor:pointer}
div.jGrowl div.jGrowl-closer{padding-top:4px;padding-bottom:4px;cursor:pointer;font-size:.9em;font-weight:bold;text-align:center}
@media print{div.jGrowl{display:none}}body{tab-size:4}
-#preview-contents{padding:15px;margin:0 auto 180px}
+@media screen and (-webkit-min-device-pixel-ratio:0){select{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}}#preview-contents{padding:15px;margin:0 auto 180px}
.working{cursor:progress}
.btn,.dropdown-menu{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}
.dropdown-menu,.modal-content,.panel-content,.search-bar{-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.125);box-shadow:0 6px 12px rgba(0,0,0,0.125)}
@@ -1425,7 +1425,7 @@ a.list-group-item:hover,a.list-group-item:focus{color:#b3b3b3;border-top-color:r
.navbar .btn{height:38px;padding:8px 10px}
.navbar .btn-group>.btn.disabled *,.navbar .btn-group>.btn.blocked *,.navbar .btn-group>.btn[disabled] *{color:rgba(191,191,191,0.3)}
.navbar .file-title-navbar{display:inline-block;vertical-align:middle;padding:4px 15px;font-size:20px;font-weight:200;max-width:280px;overflow:hidden;white-space:nowrap}
-.navbar .input-file-title-container{display:inline-block;vertical-align:middle}.navbar .input-file-title-container .input-file-title{width:220px}
+.navbar .input-file-title-container{display:inline-block;vertical-align:middle}.navbar .input-file-title-container .input-file-title{width:280px}
.navbar .working-indicator{display:inline-block;vertical-align:middle;overflow:hidden;height:38px;width:60px;padding-top:9px}.navbar .working-indicator .bar{display:inline-block;width:14px;height:6px;border-radius:1px;margin:0 2px;opacity:0.25;background-color:#bfbfbf;animation:indicator .6s ease-out infinite;-webkit-animation:indicator .6s ease-out infinite;}
.navbar .offline-status>div{display:inline-block;vertical-align:middle;height:38px;padding:9px 10px}
.navbar .left-buttons-dropdown>.nav,.navbar .right-buttons-dropdown>.nav{margin-left:0;margin-right:0}
@@ -1493,28 +1493,28 @@ a.list-group-item:hover,a.list-group-item:focus{color:#b3b3b3;border-top-color:r
.ui-layout-resizer-north{background-color:#444;border-bottom:1px solid rgba(255,255,255,0.1)}
.resizer-decorator{position:absolute;display:block !important}.ui-layout-resizer-east .resizer-decorator{width:35px;height:100%;border-left:1px solid rgba(255,255,255,0.06)}
.ui-layout-resizer-south .resizer-decorator{height:35px;width:100%;border-top:1px solid rgba(255,255,255,0.06)}
-.ace_editor{color:#bfbfbf}
+.ace_editor{color:#dfdfdf}
.ace-tm{background-color:#1e1e1e}.ace-tm .ace_text-input{box-sizing:initial}
.ace-tm .ace_marker-layer .ace_active-line{background-color:rgba(255,255,255,0.05)}
.ace-tm .ace_cursor{color:#b3b3b3}
.ace-tm .ace_print-margin{background-color:rgba(255,255,255,0.05)}
.ace-tm .ace_markup.ace_heading{color:#fff;font-weight:bold}
-.ace-tm .ace_markup.ace_list{color:#dfdfdf}
-.ace-tm .ace_constant.ace_language{color:#9f9f9f}
+.ace-tm .ace_markup.ace_list{color:#9f9f9f}
+.ace-tm .ace_constant.ace_language{color:rgba(159,159,159,0.75);font-weight:normal}
.ace-tm .ace_meta.ace_tag{color:#dfdfdf;font-style:italic;font-weight:bold;background-color:rgba(255,255,255,0.1)}
.ace-tm .ace_keyword.ace_operator{color:#dfdfdf;background-color:transparent}
.ace-tm .ace_keyword{color:#dfdfdf;background-color:rgba(255,255,255,0.1);font-weight:bold}
.ace-tm .ace_string{color:#dfdfdf;font-style:italic;background-color:rgba(255,255,255,0.1)}
.ace-tm .ace_invalid{color:inherit;background:inherit}
-.ace-tm .ace_strong{font-weight:bold}
+.ace-tm .ace_strong{color:#dfdfdf;font-weight:bold}
.ace-tm .ace_emphasis{color:#fff;font-style:italic}
.ace-tm .ace_blockquote{color:#9f9f9f}
-.ace-tm .ace_code{color:#dfdfdf;background-color:rgba(255,255,255,0.1)}
+.ace-tm .ace_code{color:#fff;background-color:rgba(255,255,255,0.1)}
.ace-tm .ace_code_block{color:#fff}
.ace-tm .ace_link{color:#9f9f9f;background-color:rgba(255,255,255,0.1)}
.ace-tm .ace_description{color:#9f9f9f}
.ace-tm .ace_constant{color:#dfdfdf}
-.ace-tm .ace_comment{color:rgba(191,191,191,0.5);font-style:italic}
+.ace-tm .ace_comment{color:rgba(159,159,159,0.75);font-style:italic}
.ace-tm .ace_marker-layer .misspelled{position:absolute;z-index:-2;border-bottom:1px dotted red;margin-bottom:-1px}
.ace_search{background-color:#232323;border:1px solid #404040;border-top:0;padding:10px 15px 5px;font-family:'Open Sans',"Trebuchet MS",Helvetica,sans-serif;min-width:318px}.ace_search .ace_search_form,.ace_search .ace_replace_form{border-color:#444;margin-bottom:10px}
.ace_search .ace_search_field{width:185px}
diff --git a/public/res-min/themes/school.css b/public/res-min/themes/school.css
index 89b5b7ed..ee24da92 100644
--- a/public/res-min/themes/school.css
+++ b/public/res-min/themes/school.css
@@ -94,8 +94,8 @@ blockquote.pull-right small:after{content:'\00A0 \2014'}
q:before,q:after,blockquote:before,blockquote:after{content:""}
address{display:block;margin-bottom:20px;font-style:normal;line-height:1.428571429}
code,pre{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}
-code{padding:2px 4px;font-size:90%;color:#112130;background-color:rgba(143,121,104,0.05);white-space:nowrap;border-radius:4px}
-pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;word-break:break-all;word-wrap:break-word;color:#333;background-color:rgba(143,121,104,0.05);border:1px solid #dfdfdf;border-radius:4px}pre.prettyprint{margin-bottom:20px}
+code{padding:2px 4px;font-size:90%;color:#112130;background-color:rgba(143,121,104,0.075);white-space:nowrap;border-radius:4px}
+pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;word-break:break-all;word-wrap:break-word;color:#333;background-color:rgba(143,121,104,0.075);border:1px solid #dfdfdf;border-radius:4px}pre.prettyprint{margin-bottom:20px}
pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border:0}
.pre-scrollable{max-height:340px;overflow-y:scroll}
.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container:before,.container:after{content:" ";display:table;}
@@ -1182,7 +1182,7 @@ pre .coffeescript .javascript,pre .javascript .xml,pre .lasso .markup,pre .tex .
.icon-code:before{content:'\e844'}
.icon-folder-open:before{content:'\e81e'}
.icon-left-big:before{content:'\e88a'}
-@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url('../font/opensans-light-webfont.svg#open_sanslight') format('svg'),url("../font/opensans-light-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url('../font/opensans-regular-webfont.svg#open_sansregular') format('svg'),url("../font/opensans-regular-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url('../font/opensans-bold-webfont.svg#open_sansbold') format('svg'),url("../font/opensans-bold-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url('../font/opensans-lightitalic-webfont.svg#open_sanslight_italic') format('svg'),url("../font/opensans-lightitalic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url('../font/opensans-italic-webfont.svg#open_sansitalic') format('svg'),url("../font/opensans-italic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url('../font/opensans-bolditalic-webfont.svg#open_sansbold_italic') format('svg'),url("../font/opensans-bolditalic-webfont.woff") format('woff')}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url('../font/opensans-light-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url('../font/opensans-regular-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url('../font/opensans-bold-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url('../font/opensans-lightitalic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url('../font/opensans-italic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url('../font/opensans-bolditalic-webfont.svg') format('svg')}}body{-webkit-font-smoothing:antialiased}
+@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url("../font/opensans-light-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url("../font/opensans-regular-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url("../font/opensans-bold-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url("../font/opensans-lightitalic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url("../font/opensans-italic-webfont.woff") format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url("../font/opensans-bolditalic-webfont.woff") format('woff')}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url('../font/opensans-light-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url('../font/opensans-regular-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url('../font/opensans-bold-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:300;src:local('Open Sans Light Italic'),local('OpenSansLight-Italic'),url('../font/opensans-lightitalic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url('../font/opensans-italic-webfont.svg') format('svg')}}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:'Open Sans';font-style:italic;font-weight:700;src:local('Open Sans Bold Italic'),local('OpenSans-BoldItalic'),url('../font/opensans-bolditalic-webfont.svg') format('svg')}}body{-webkit-font-smoothing:antialiased}
.container{margin-bottom:180px}
a code{color:inherit}
h1{font-size:36px}
@@ -1221,7 +1221,7 @@ kbd{padding:0.1em 0.6em;border:1px solid rgba(17,33,48,0.25);-webkit-box-shadow:
.icon-link{font-size:104%}
[class^="icon-provider-"],[class*=" icon-provider-"]{background-image:url("../img/icons.png");width:18px;height:16px;margin-top:-2px;margin-left:1px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){[class^="icon-provider-"],[class*=" icon-provider-"]{background-image:url("../img/icons2x.png");background-size:256px 16px}}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){[class^="icon-provider-"],[class*=" icon-provider-"]{background-image:url("../img/icons2x.png");background-size:256px 16px}}
.icon-provider-stackedit{background-position:0 0}
-.icon-provider-gdrive{background-position:-18px 0}.icon-provider-gdrive.realtime{background-position:-162px 0}
+.icon-provider-gdrive,.icon-provider-gdrivesec,.icon-provider-gdriveter{background-position:-18px 0}.icon-provider-gdrive.realtime,.icon-provider-gdrivesec.realtime,.icon-provider-gdriveter.realtime{background-position:-162px 0}
.icon-provider-dropbox{background-position:-37px 0}
.icon-provider-github,.icon-provider-gist{background-position:-54px 0}
.icon-provider-blogger{background-position:-72px 0}
@@ -1374,7 +1374,7 @@ div.jGrowl div.jGrowl-notification div.jGrowl-header{font-weight:bold;font-size:
div.jGrowl div.jGrowl-notification div.jGrowl-close{z-index:99;float:right;font-weight:bold;font-size:1em;cursor:pointer}
div.jGrowl div.jGrowl-closer{padding-top:4px;padding-bottom:4px;cursor:pointer;font-size:.9em;font-weight:bold;text-align:center}
@media print{div.jGrowl{display:none}}body{tab-size:4}
-#preview-contents{padding:15px;margin:0 auto 180px}
+@media screen and (-webkit-min-device-pixel-ratio:0){select{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}}#preview-contents{padding:15px;margin:0 auto 180px}
.working{cursor:progress}
.btn,.dropdown-menu{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}
.dropdown-menu,.modal-content,.panel-content,.search-bar{-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.125);box-shadow:0 6px 12px rgba(0,0,0,0.125)}
@@ -1425,7 +1425,7 @@ a.list-group-item:hover,a.list-group-item:focus{color:#2d2d2d;border-top-color:r
.navbar .btn{height:38px;padding:8px 10px}
.navbar .btn-group>.btn.disabled *,.navbar .btn-group>.btn.blocked *,.navbar .btn-group>.btn[disabled] *{color:rgba(238,238,238,0.3)}
.navbar .file-title-navbar{display:inline-block;vertical-align:middle;padding:4px 15px;font-size:20px;font-weight:200;max-width:280px;overflow:hidden;white-space:nowrap}
-.navbar .input-file-title-container{display:inline-block;vertical-align:middle}.navbar .input-file-title-container .input-file-title{width:220px}
+.navbar .input-file-title-container{display:inline-block;vertical-align:middle}.navbar .input-file-title-container .input-file-title{width:280px}
.navbar .working-indicator{display:inline-block;vertical-align:middle;overflow:hidden;height:38px;width:60px;padding-top:9px}.navbar .working-indicator .bar{display:inline-block;width:14px;height:6px;border-radius:1px;margin:0 2px;opacity:0.25;background-color:#eee;animation:indicator .6s ease-out infinite;-webkit-animation:indicator .6s ease-out infinite;}
.navbar .offline-status>div{display:inline-block;vertical-align:middle;height:38px;padding:9px 10px}
.navbar .left-buttons-dropdown>.nav,.navbar .right-buttons-dropdown>.nav{margin-left:0;margin-right:0}
@@ -1493,28 +1493,28 @@ a.list-group-item:hover,a.list-group-item:focus{color:#2d2d2d;border-top-color:r
.ui-layout-resizer-north{background-color:#305145;border-bottom:1px solid #305145}
.resizer-decorator{position:absolute;display:block !important}.ui-layout-resizer-east .resizer-decorator{width:35px;height:100%;border-left:1px solid rgba(121,121,121,0.06)}
.ui-layout-resizer-south .resizer-decorator{height:35px;width:100%;border-top:1px solid rgba(121,121,121,0.06)}
-.ace_editor{color:#5690c4}
+.ace_editor{color:#356998}
.ace-tm{background-color:#fff}.ace-tm .ace_text-input{box-sizing:initial}
.ace-tm .ace_marker-layer .ace_active-line{background-color:rgba(121,121,121,0.05)}
.ace-tm .ace_cursor{color:#2d2d2d}
.ace-tm .ace_print-margin{background-color:rgba(121,121,121,0.05)}
.ace-tm .ace_markup.ace_heading{color:#1b354c;font-weight:bold}
-.ace-tm .ace_markup.ace_list{color:#356998}
-.ace-tm .ace_constant.ace_language{color:#699cca}
-.ace-tm .ace_meta.ace_tag{color:#356998;font-style:italic;font-weight:bold;background-color:rgba(143,121,104,0.05)}
+.ace-tm .ace_markup.ace_list{color:#699cca}
+.ace-tm .ace_constant.ace_language{color:rgba(105,156,202,0.75);font-weight:normal}
+.ace-tm .ace_meta.ace_tag{color:#356998;font-style:italic;font-weight:bold;background-color:rgba(143,121,104,0.075)}
.ace-tm .ace_keyword.ace_operator{color:#356998;background-color:transparent}
-.ace-tm .ace_keyword{color:#356998;background-color:rgba(143,121,104,0.05);font-weight:bold}
-.ace-tm .ace_string{color:#356998;font-style:italic;background-color:rgba(143,121,104,0.05)}
+.ace-tm .ace_keyword{color:#356998;background-color:rgba(143,121,104,0.075);font-weight:bold}
+.ace-tm .ace_string{color:#356998;font-style:italic;background-color:rgba(143,121,104,0.075)}
.ace-tm .ace_invalid{color:inherit;background:inherit}
-.ace-tm .ace_strong{font-weight:bold}
+.ace-tm .ace_strong{color:#356998;font-weight:bold}
.ace-tm .ace_emphasis{color:#1b354c;font-style:italic}
.ace-tm .ace_blockquote{color:#699cca}
-.ace-tm .ace_code{color:#356998;background-color:rgba(143,121,104,0.05)}
+.ace-tm .ace_code{color:#1b354c;background-color:rgba(143,121,104,0.075)}
.ace-tm .ace_code_block{color:#1b354c}
-.ace-tm .ace_link{color:#699cca;background-color:rgba(143,121,104,0.05)}
+.ace-tm .ace_link{color:#699cca;background-color:rgba(143,121,104,0.075)}
.ace-tm .ace_description{color:#699cca}
.ace-tm .ace_constant{color:#356998}
-.ace-tm .ace_comment{color:rgba(86,144,196,0.5);font-style:italic}
+.ace-tm .ace_comment{color:rgba(105,156,202,0.75);font-style:italic}
.ace-tm .ace_marker-layer .misspelled{position:absolute;z-index:-2;border-bottom:1px dotted red;margin-bottom:-1px}
.ace_search{background-color:#f5f3f2;border:1px solid #e9e9e9;border-top:0;padding:10px 15px 5px;font-family:'Open Sans',"Trebuchet MS",Helvetica,sans-serif;min-width:318px}.ace_search .ace_search_form,.ace_search .ace_replace_form{border-color:#dfdfdf;margin-bottom:10px}
.ace_search .ace_search_field{width:185px}
diff --git a/public/res/constants.js b/public/res/constants.js
index 0788b031..54954a1d 100644
--- a/public/res/constants.js
+++ b/public/res/constants.js
@@ -8,6 +8,8 @@ define([], function() {
constants.GOOGLE_DRIVE_APP_ID = "241271498917";
constants.DROPBOX_APP_KEY = "lq6mwopab8wskas";
constants.DROPBOX_APP_SECRET = "851fgnucpezy84t";
+ constants.DROPBOX_RESTRICTED_APP_KEY = "sw0hlixhr8q1xk0";
+ constants.DROPBOX_RESTRICTED_APP_SECRET = "1r808p2xygs6lbg";
constants.BITLY_ACCESS_TOKEN = "317e033bfd48cf31155a68a536b1860013b09c4c";
constants.DEFAULT_FILE_TITLE = "Title";
constants.DEFAULT_FOLDER_NAME = "New folder";
diff --git a/public/res/extensions/notifications.js b/public/res/extensions/notifications.js
index 7c9ccb93..1c0c75a4 100644
--- a/public/res/extensions/notifications.js
+++ b/public/res/extensions/notifications.js
@@ -52,11 +52,14 @@ define([
jGrowl(" " + _.escape(message).replace(/\n/g, ' '), options);
}
+ var isReady = false;
var $offlineStatusElt;
var $extensionButtonsElt;
notifications.onReady = function() {
+ isReady = true;
$offlineStatusElt = $('.navbar .offline-status');
$extensionButtonsElt = $('.navbar .extension-buttons');
+ updateOnlineStatus();
};
notifications.onMessage = function(message) {
@@ -73,9 +76,17 @@ define([
}
};
- notifications.onOfflineChanged = function(isOffline) {
+ var isOffline = false;
+ function updateOnlineStatus() {
+ if(isReady === false) {
+ return;
+ }
$offlineStatusElt.toggleClass('hide', !isOffline);
$extensionButtonsElt.toggleClass('hide', isOffline);
+ }
+ notifications.onOfflineChanged = function(isOfflineParam) {
+ isOffline = isOfflineParam;
+ updateOnlineStatus();
if(isOffline === true) {
showMessage("You are offline.", "icon-attention-circled msg-offline");
}
diff --git a/public/res/libs/ace_mode_highlight_rules.js b/public/res/libs/ace_mode_highlight_rules.js
index 7a4a4cd8..80b81ea7 100644
--- a/public/res/libs/ace_mode_highlight_rules.js
+++ b/public/res/libs/ace_mode_highlight_rules.js
@@ -51,9 +51,7 @@ var MarkdownHighlightRules = function() {
token: "markup.heading.multi.2",
regex: "^\\-+(?=\\s*$)"
}, {
- token : function(value) {
- return "markup.heading." + value.length;
- },
+ token : "constant.language.escape",
regex : /^#{1,6}(?=\s*[^ #]|\s+#.)/,
next : "header"
},
@@ -96,16 +94,16 @@ var MarkdownHighlightRules = function() {
token : ["constant.language.escape", "keyword", "constant.language.escape"],
regex : "(\\$)(.*?)(\\$)"
}, { // code span `
- token : "code",
+ token : ["constant.language.escape", "code", "constant.language.escape"],
regex : "(`+)(.*?[^`])(\\1)"
}, { // reference
- token : ["text", "reference", "text", "link", "description", "text"],
+ token : ["constant.language.escape", "reference", "constant.language.escape", "link", "description", "constant.language.escape"],
regex : "^([ ]{0,3}\\[)([^\\]]+)(\\]:\\s*)([^ ]+)(\\s*(?:[\"][^\"]+[\"])?(\\s*))$"
}, { // link by reference
- token : ["text", "markup.underline", "text", "reference", "text"],
+ token : ["constant.language.escape", "markup.underline", "constant.language.escape", "reference", "constant.language.escape"],
regex : "(\\[)((?:[[^\\]]*\\]|[^\\[\\]])*)(\\][ ]?(?:\\n[ ]*)?\\[)(.*?)(\\])"
}, { // link by url
- token : ["text", "markup.underline", "text", "link", "description", "text"],
+ token : ["constant.language.escape", "markup.underline", "constant.language.escape", "link", "description", "constant.language.escape"],
regex : "(\\[)"+
"(\\[[^\\]]*\\]|[^\\[\\]]*)"+
"(\\]\\([ \\t]*)"+
@@ -113,10 +111,10 @@ var MarkdownHighlightRules = function() {
"((?:[ \t]*\"(?:.*?)\"[ \\t]*)?)"+
"(\\))"
}, { // strong ** __
- token : "strong",
+ token : ["constant.language.escape", "strong", "constant.language.escape"],
regex : "([*]{2}|[_]{2}(?=\\S))(.*?\\S[*_]*)(\\1)"
}, { // emphasis * _
- token : "emphasis",
+ token : ["constant.language.escape", "emphasis", "constant.language.escape"],
regex : "([*]|[_](?=\\S))(.*?\\S[*_]*)(\\1)"
}, { //
token : ["text", "url", "text"],
diff --git a/public/res/storage.js b/public/res/storage.js
index 746fcf17..68514031 100644
--- a/public/res/storage.js
+++ b/public/res/storage.js
@@ -234,14 +234,19 @@ define([
// Upgrade from v15 to v16
if(version == "v15") {
- if(_.has(localStorage, 'gdrivePermissions')) {
- localStorage['google.0.permissions'] = localStorage.gdrivePermissions;
- localStorage.removeItem('gdrivePermissions');
- }
+ localStorage.removeItem('gdrivePermissions');
if(_.has(localStorage, 'gdrive.lastChangeId')) {
- localStorage['google.0.gdrive.lastChangeId'] = localStorage['gdrive.lastChangeId'];
+ localStorage['google.gdrive0.gdrive.lastChangeId'] = localStorage['gdrive.lastChangeId'];
localStorage.removeItem('gdrive.lastChangeId');
}
+ if(_.has(localStorage, 'settings')) {
+ settings = JSON.parse(localStorage.settings);
+ if(((settings.extensionSettings || {}).markdownExtra || {}).extensions) {
+ settings.extensionSettings.markdownExtra.extensions.push('newlines');
+ settings.extensionSettings.markdownExtra.extensions.push('strikethrough');
+ }
+ localStorage.settings = JSON.stringify(settings);
+ }
version = "v16";
}
diff --git a/public/res/styles/base.less b/public/res/styles/base.less
index b26a96d5..02e1260c 100644
--- a/public/res/styles/base.less
+++ b/public/res/styles/base.less
@@ -325,7 +325,7 @@ kbd {
background-position: 0 0;
}
-.icon-provider-gdrive, .icon-provider-gdrivesec {
+.icon-provider-gdrive, .icon-provider-gdrivesec, .icon-provider-gdriveter {
background-position: -18px 0;
&.realtime {
background-position: -162px 0;
diff --git a/public/res/styles/main.less b/public/res/styles/main.less
index 02cf4481..a0d23f40 100644
--- a/public/res/styles/main.less
+++ b/public/res/styles/main.less
@@ -15,7 +15,6 @@
@tertiary: @primary;
@primary-desaturated: desaturate(@primary, 70%);
@secondary-desaturated: desaturate(@secondary, 80%);
-@tertiary-desaturated: desaturate(@tertiary, 90%);
@transparent: fade(#000, 0%);
// Navbar
@@ -36,10 +35,10 @@
// Editor
@tertiary-bg: #fff;
-@tertiary-color: @secondary-desaturated;
-@tertiary-color-dark: darken(@tertiary-color, 5%);
-@tertiary-color-darker: darken(@tertiary-color, 20%);
-@tertiary-color-darkest: darken(@tertiary-color, 40%);
+@tertiary-color-light: fade(@tertiary-color, 75%);
+@tertiary-color: desaturate(@tertiary, 85%);
+@tertiary-color-dark: darken(@tertiary-color, 20%);
+@tertiary-color-darker: darken(@tertiary-color, 40%);
// Panel buttons
@panel-button-bg-color: #FFF;
@@ -52,6 +51,7 @@
@jgrowl-bg-color: fade(@modal-backdrop-bg, 90%);
/* Sizes */
+@file-title-width: 280px;
@menu-panel-width: 280px;
@document-panel-width: 340px;
@jgrowl-width: 260px;
@@ -67,8 +67,8 @@
@blockquote-border-color: fade(@secondary-desaturated, 7.5%);
@blockquote-bg: fade(@secondary-desaturated, 5%);
@code-color: @secondary-color-darkest;
-@code-bg: fade(@secondary-desaturated, 5%);
-@pre-bg: fade(@secondary-desaturated, 5%);
+@code-bg: fade(@secondary-desaturated, 7.5%);
+@pre-bg: fade(@secondary-desaturated, 7.5%);
@pre-border-color: @secondary-border-color;
@hr-border: fade(@secondary-desaturated, 10%);
@navbar-height: 49px;
@@ -116,7 +116,7 @@
@modal-content-border-color: @secondary-border-color;
@modal-footer-border-color: @secondary-border-color-light;
@modal-content-separator-color: @secondary-border-color-lighter;
-@modal-backdrop-bg: @tertiary-desaturated;
+@modal-backdrop-bg: desaturate(@tertiary, 90%);
@tooltip-max-width: 240px;
@close-color: @secondary-color-darkest;
@popover-bg: @secondary-bg;
@@ -443,7 +443,7 @@ a {
padding: 4px 15px;
font-size: 20px;
font-weight: 200;
- max-width: 280px;
+ max-width: @file-title-width;
overflow: hidden;
white-space: nowrap;
}
@@ -452,7 +452,7 @@ a {
display: inline-block;
vertical-align: middle;
.input-file-title {
- width: 220px;
+ width: @file-title-width;
}
}
@@ -1007,38 +1007,39 @@ a {
}
.ace_markup.ace_heading {
- color: @tertiary-color-darkest;
+ color: @tertiary-color-darker;
font-weight: bold;
}
.ace_markup.ace_list {
- color: @tertiary-color-darker;
+ color: @tertiary-color;
}
.ace_constant.ace_language {
- color: @tertiary-color;
+ color: @tertiary-color-light;
+ font-weight: normal;
}
.ace_meta.ace_tag {
- color: @tertiary-color-darker;
+ color: @tertiary-color-dark;
font-style: italic;
font-weight: bold;
background-color: @code-bg;
}
.ace_keyword.ace_operator {
- color: @tertiary-color-darker;
+ color: @tertiary-color-dark;
background-color: transparent;
}
.ace_keyword {
- color: @tertiary-color-darker;
+ color: @tertiary-color-dark;
background-color: @code-bg;
font-weight: bold;
}
.ace_string {
- color: @tertiary-color-darker;
+ color: @tertiary-color-dark;
font-style: italic;
background-color: @code-bg;
}
@@ -1049,11 +1050,12 @@ a {
}
.ace_strong {
+ color: @tertiary-color-dark;
font-weight: bold;
}
.ace_emphasis {
- color: @tertiary-color-darkest;
+ color: @tertiary-color-darker;
font-style: italic;
}
@@ -1067,7 +1069,7 @@ a {
}
.ace_code_block {
- color: @tertiary-color-darkest;
+ color: @tertiary-color-darker;
}
.ace_link {
@@ -1080,11 +1082,11 @@ a {
}
.ace_constant {
- color: @tertiary-color-darker;
+ color: @tertiary-color-dark;
}
.ace_comment {
- color: fade(@tertiary-color-dark, 50%);
+ color: @tertiary-color-light;
font-style: italic;
}
@@ -1159,7 +1161,7 @@ a {
#wmd-input {
border-radius: 0;
- color: @tertiary-color-darker;
+ color: @tertiary-color-dark;
.box-shadow(none);
resize: none;
border: none;
diff --git a/public/res/themes/night.less b/public/res/themes/night.less
index f8d13680..fa3d1f1a 100644
--- a/public/res/themes/night.less
+++ b/public/res/themes/night.less
@@ -9,9 +9,8 @@
@secondary-border-color-light: darken(@primary-desaturated, 75%);
@secondary-border-color-lighter: darken(@primary-desaturated, 80%);
@tertiary-bg: darken(@primary-bg, 15%);
-@tertiary-color-darkest: @primary;
-@tertiary-color-darker: darken(@primary, 12.5%);
-@tertiary-color-dark: darken(@primary, 25%);
+@tertiary-color-darker: @primary;
+@tertiary-color-dark: darken(@primary, 12.5%);
@tertiary-color: darken(@primary, 37.5%);
@panel-button-bg-color: #aaa;