WordPress support

This commit is contained in:
benweet 2013-05-16 01:19:58 +01:00
parent ddd4022287
commit 5a3ce0eacf
10 changed files with 257 additions and 16 deletions

View File

@ -1 +1 @@
CACHE MANIFEST # v29 CACHE: index.html viewer.html css/main-min.css js/main-min.js js/require.js img/ajax-loader.gif img/glyphicons-halflings.png img/glyphicons-halflings-white.png img/icons.png img/stackedit-32.ico img/stackedit-promo.png lib/MathJax/MathJax.js?config=TeX-AMS_HTML lib/MathJax/config/TeX-AMS_HTML.js lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_AMS-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Caligraphic-Bold.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Caligraphic-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Fraktur-Bold.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Fraktur-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Bold.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Italic.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Math-BoldItalic.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Math-Italic.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Math-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Bold.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Italic.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Script-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size1-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size2-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size3-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size4-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Typewriter-Regular.woff lib/MathJax/images/CloseX-31.png lib/MathJax/images/MenuArrow-15.png lib/MathJax/jax/output/HTML-CSS/jax.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/fontdata.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Arrows.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BBBold.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BoxDrawing.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/CombDiacritMarks.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Dingbats.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/EnclosedAlphanum.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeneralPunctuation.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeometricShapes.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GreekAndCoptic.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Latin1Supplement.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LatinExtendedA.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LetterlikeSymbols.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Main.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MathOperators.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscMathSymbolsB.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscSymbols.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscTechnical.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/PUA.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SpacingModLetters.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SuppMathOperators.js NETWORK: * CACHE MANIFEST # v30 CACHE: index.html viewer.html css/main-min.css js/main-min.js js/require.js img/ajax-loader.gif img/glyphicons-halflings.png img/glyphicons-halflings-white.png img/icons.png img/stackedit-32.ico img/stackedit-promo.png lib/MathJax/MathJax.js?config=TeX-AMS_HTML lib/MathJax/config/TeX-AMS_HTML.js lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_AMS-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Caligraphic-Bold.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Caligraphic-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Fraktur-Bold.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Fraktur-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Bold.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Italic.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Math-BoldItalic.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Math-Italic.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Math-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Bold.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Italic.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Script-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size1-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size2-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size3-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size4-Regular.woff lib/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Typewriter-Regular.woff lib/MathJax/images/CloseX-31.png lib/MathJax/images/MenuArrow-15.png lib/MathJax/jax/output/HTML-CSS/jax.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/fontdata.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Arrows.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BBBold.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BoxDrawing.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/CombDiacritMarks.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Dingbats.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/EnclosedAlphanum.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeneralPunctuation.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeometricShapes.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GreekAndCoptic.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Latin1Supplement.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LatinExtendedA.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LetterlikeSymbols.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Main.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MathOperators.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscMathSymbolsB.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscSymbols.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscTechnical.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/PUA.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SpacingModLetters.js lib/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SuppMathOperators.js NETWORK: *

View File

@ -362,8 +362,15 @@
placeholder="exemple.tumblr.com"> placeholder="exemple.tumblr.com">
</div> </div>
</div> </div>
<div class="control-group modal-publish-wordpress">
<label class="control-label" for="input-publish-tumblr-hostname">WordPress site</label>
<div class="controls">
<input type="text" id="input-publish-wordpress-site"
placeholder="exemple.wordpress.com">
</div>
</div>
<div <div
class="control-group modal-publish-blogger modal-publish-tumblr"> class="control-group modal-publish-blogger modal-publish-tumblr modal-publish-wordpress">
<label class="control-label" for="input-publish-postid">Update <label class="control-label" for="input-publish-postid">Update
existing post ID (optional)</label> existing post ID (optional)</label>
<div class="controls"> <div class="controls">
@ -378,7 +385,7 @@
placeholder="Label1, Label2"> placeholder="Label1, Label2">
</div> </div>
</div> </div>
<div class="control-group modal-publish-tumblr"> <div class="control-group modal-publish-tumblr modal-publish-wordpress">
<label class="control-label" for="input-publish-tags">Tags <label class="control-label" for="input-publish-tags">Tags
(comma separated)</label> (comma separated)</label>
<div class="controls"> <div class="controls">

View File

@ -14,9 +14,11 @@ var AJAX_TIMEOUT = 30000;
var ASYNC_TASK_DEFAULT_TIMEOUT = 60000; var ASYNC_TASK_DEFAULT_TIMEOUT = 60000;
var ASYNC_TASK_LONG_TIMEOUT = 120000; var ASYNC_TASK_LONG_TIMEOUT = 120000;
var SYNC_PERIOD = 180000; var SYNC_PERIOD = 180000;
var USER_IDLE_THRESHOLD = 300000; var USER_IDLE_THRESHOLD = 300000;
var WELCOME_DOCUMENT_TITLE = "Welcome document"; var WELCOME_DOCUMENT_TITLE = "Welcome document";
var DOWNLOAD_PROXY_URL = "http://stackedit-download-proxy.herokuapp.com/"; var DOWNLOAD_PROXY_URL = "http://stackedit-download-proxy.herokuapp.com/";
var WORDPRESS_CLIENT_ID = '3185';
var WORDPRESS_PROXY_URL = "http://stackedit-wordpress-proxy.herokuapp.com/";
// Use by Google's client.js // Use by Google's client.js
var delayedFunction = undefined; var delayedFunction = undefined;

View File

@ -487,6 +487,7 @@ define(
// Create the PageDown editor // Create the PageDown editor
var insertLinkCallback = undefined; var insertLinkCallback = undefined;
core.createEditor = function(onTextChange) { core.createEditor = function(onTextChange) {
var firstChange = true;
skipScrollLink = true; skipScrollLink = true;
lastPreviewScrollTop = -9; lastPreviewScrollTop = -9;
$("#wmd-input, #wmd-preview").scrollTop(0); $("#wmd-input, #wmd-preview").scrollTop(0);
@ -500,14 +501,6 @@ define(
} }
Markdown.Extra.init(converter, options); Markdown.Extra.init(converter, options);
} }
var firstChange = true;
converter.hooks.chain("preConversion", function(text) {
// Used to save changes when typing
if (!firstChange) {
onTextChange();
}
return text;
});
// Convert email addresses (not managed by pagedown) // Convert email addresses (not managed by pagedown)
converter.hooks.chain("postConversion", function(text) { converter.hooks.chain("postConversion", function(text) {
return text.replace(/<(mailto\:)?([^\s>]+@[^\s>]+\.\S+?)>/g, function(match, mailto, email) { return text.replace(/<(mailto\:)?([^\s>]+@[^\s>]+\.\S+?)>/g, function(match, mailto, email) {
@ -567,7 +560,12 @@ define(
}); });
var previewWrapper = function(makePreview) { var previewWrapper = function(makePreview) {
return makePreview; return function() {
if(firstChange !== true) {
onTextChange();
}
makePreview();
};
}; };
if(core.settings.lazyRendering === true) { if(core.settings.lazyRendering === true) {
previewWrapper = function(makePreview) { previewWrapper = function(makePreview) {
@ -577,6 +575,7 @@ define(
makePreview(); makePreview();
} }
else { else {
onTextChange();
debouncedMakePreview(); debouncedMakePreview();
} }
}; };

2
js/main-min.js vendored

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
define(["jquery", "core", "sharing", "blogger-provider", "dropbox-provider", "gist-provider", "github-provider", "gdrive-provider", "tumblr-provider", "underscore"], define(["jquery", "core", "sharing", "blogger-provider", "dropbox-provider", "gist-provider", "github-provider", "gdrive-provider", "tumblr-provider", "wordpress-provider", "underscore"],
function($, core, sharing) { function($, core, sharing) {
var publisher = {}; var publisher = {};

View File

@ -15,7 +15,7 @@ define(["jquery", "core", "async-runner"], function($, core, asyncRunner) {
}); });
} }
// Try to authenticate with Oauth // Try to authenticate with OAuth
function authenticate(task) { function authenticate(task) {
var authWindow = undefined; var authWindow = undefined;
var intervalId = undefined; var intervalId = undefined;

161
js/wordpress-helper.js Normal file
View File

@ -0,0 +1,161 @@
define(["jquery", "core", "async-runner"], function($, core, asyncRunner) {
var token = undefined;
var wordpressHelper = {};
// Only used to check the offline status
function connect(task) {
task.onRun(function() {
if(core.isOffline === true) {
task.error(new Error("Operation not available in offline mode."));
return;
}
task.chain();
});
}
// Try to authenticate with OAuth
function authenticate(task) {
var authWindow = undefined;
var intervalId = undefined;
task.onRun(function() {
token = localStorage["wordpressToken"];
if(token !== undefined) {
task.chain();
return;
}
core.showMessage("Please make sure the Wordpress authorization popup is not blocked by your browser.");
var errorMsg = "Failed to retrieve a token from Wordpress.";
// We add time for user to enter his credentials
task.timeout = ASYNC_TASK_LONG_TIMEOUT;
var code = undefined;
function getCode() {
localStorage.removeItem("wordpressCode");
authWindow = core.popupWindow(
'wordpress-oauth-client.html?client_id=' + WORDPRESS_CLIENT_ID,
'stackedit-wordpress-oauth', 960, 600);
authWindow.focus();
intervalId = setInterval(function() {
if(authWindow.closed === true) {
clearInterval(intervalId);
authWindow = undefined;
intervalId = undefined;
code = localStorage["wordpressCode"];
if(code === undefined) {
task.error(new Error(errorMsg));
return;
}
localStorage.removeItem("wordpressCode");
task.chain(getToken);
}
}, 500);
}
function getToken() {
$.getJSON(WORDPRESS_PROXY_URL + "authenticate/" + code, function(data) {
if(data.token !== undefined) {
token = data.token;
localStorage["wordpressToken"] = token;
task.chain();
}
else {
task.error(new Error(errorMsg));
}
});
}
task.chain(getCode);
});
task.onError(function() {
if(intervalId !== undefined) {
clearInterval(intervalId);
}
if(authWindow !== undefined) {
authWindow.close();
}
});
}
wordpressHelper.upload = function(site, postId, tags, title, content, callback) {
callback = callback || core.doNothing;
var task = asyncRunner.createTask();
connect(task);
authenticate(task);
task.onRun(function() {
var url = WORDPRESS_PROXY_URL + "post";
var data = {
token: token,
site: site,
postId: postId,
tags: tags,
title: title,
content: content
};
$.ajax({
url : url,
data: data,
type: "POST",
dataType : "json",
timeout : AJAX_TIMEOUT
}).done(function(response, textStatus, jqXHR) {
if(response.body.ID) {
postId = response.body.ID;
task.chain();
return;
}
var error = {
code: response.code,
message: response.body.error
};
// Handle error
if(error.code === 404) {
if(error.message == "unknown_blog") {
error = 'Site "' + site + '" not found on WordPress.|removePublish';
}
else if(error.message == "unknown_post"){
error = 'Post ' + postId + ' not found on WordPress.|removePublish';
}
}
handleError(error, task);
}).fail(function(jqXHR) {
var error = {
code: jqXHR.status,
message: jqXHR.statusText
};
handleError(error, task);
});
});
task.onSuccess(function() {
callback(undefined, postId);
});
task.onError(function(error) {
callback(error);
});
asyncRunner.addTask(task);
};
function handleError(error, task) {
var errorMsg = undefined;
if (error) {
console.error(error);
// Try to analyze the error
if (typeof error === "string") {
errorMsg = error;
}
else {
errorMsg = "Could not publish on WordPress.";
if ((error.code === 400 && error.message == "invalid_token") || error.code === 401 || error.code === 403) {
localStorage.removeItem("wordpressToken");
errorMsg = "Access to WordPress account is not authorized.";
task.retry(new Error(errorMsg), 1);
return;
} else if (error.code <= 0) {
core.setOffline();
errorMsg = "|stopPublish";
}
}
}
task.error(new Error(errorMsg));
}
return wordpressHelper;
});

45
js/wordpress-provider.js Normal file
View File

@ -0,0 +1,45 @@
define(["jquery", "core", "wordpress-helper"], function($, core, wordpressHelper) {
var PROVIDER_WORDPRESS = "wordpress";
var wordpressProvider = {
providerId: PROVIDER_WORDPRESS,
providerName: "WordPress",
defaultPublishFormat: "html"
};
wordpressProvider.publish = function(publishAttributes, title, content, callback) {
wordpressHelper.upload(
publishAttributes.site,
publishAttributes.postId,
publishAttributes.tags,
title,
content,
function(error, postId) {
if(error) {
callback(error);
return;
}
publishAttributes.postId = postId;
callback();
}
);
};
wordpressProvider.newPublishAttributes = function(event) {
var publishAttributes = {};
publishAttributes.site = core
.getInputValue(
$("#input-publish-wordpress-site"),
event,
/^(([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])$/);
publishAttributes.postId = $("#input-publish-postid").val() || undefined;
publishAttributes.tags = $("#input-publish-tags").val() || undefined;
if(event.isPropagationStopped()) {
return undefined;
}
return publishAttributes;
};
return wordpressProvider;
});

View File

@ -0,0 +1,27 @@
<!DOCTYPE html>
<html lang="en">
<head>
<script type="text/javascript">
function getParameter(name) {
var regex = new RegExp(name + "=(.+?)(&|$)");
try {
return decodeURI(regex.exec(location.search)[1]);
} catch (e) {
return undefined;
}
}
var client_id = getParameter("client_id");
var code = getParameter("code");
if (client_id) {
var redirectURI = location.href.substring(0, location.href.indexOf("?"));
window.location.href = "https://public-api.wordpress.com/oauth2/authorize?response_type=code&client_id="
+ client_id + "&redirect_uri=" + redirectURI;
} else {
if (code) {
localStorage["wordpressCode"] = code;
}
//window.close();
}
</script>
</head>
</html>