Added Gist provider

This commit is contained in:
benweet 2013-04-30 00:19:54 +01:00
parent bd7b5a3b5e
commit 4c976fa77e
11 changed files with 164 additions and 54 deletions

View File

@ -1 +1 @@
CACHE MANIFEST # v18 CACHE: index.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 NETWORK: * CACHE MANIFEST # v19 CACHE: index.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 NETWORK: *

6
css/main-min.css vendored
View File

@ -5541,7 +5541,8 @@ hr {
height: 16px; height: 16px;
background-position: -37px 0; background-position: -37px 0;
} }
.icon-github { .icon-github,
.icon-gist {
background-image: url("../img/icons.png") !important; background-image: url("../img/icons.png") !important;
width: 16px; width: 16px;
height: 16px; height: 16px;
@ -5613,7 +5614,8 @@ hr {
z-index: 1050 !important; z-index: 1050 !important;
} }
#modal-settings textarea { #modal-settings textarea {
height: 180px; height: 80px;
max-width: 206px;
} }
.tooltip-inner { .tooltip-inner {
text-align: left; text-align: left;

View File

@ -246,7 +246,8 @@ hr {
background-position: -37px 0; background-position: -37px 0;
} }
.icon-github { .icon-github,
.icon-gist {
background-image: url("../img/icons.png") !important; background-image: url("../img/icons.png") !important;
width: 16px; width: 16px;
height: 16px; height: 16px;

View File

@ -14,7 +14,7 @@
var code = getParameter("code"); var code = getParameter("code");
if (client_id) { if (client_id) {
window.location.href = "https://github.com/login/oauth/authorize?client_id=" window.location.href = "https://github.com/login/oauth/authorize?client_id="
+ client_id + "&scope=repo"; + client_id + "&scope=repo,gist";
} else { } else {
if (code) { if (code) {
localStorage["githubCode"] = code; localStorage["githubCode"] = code;

View File

@ -88,17 +88,7 @@
<li class="divider"></li> <li class="divider"></li>
<li class="dropdown-submenu"><a href="#"><i <li class="dropdown-submenu"><a href="#"><i
class="icon-share"></i> Publish on</a> class="icon-share"></i> Publish on</a>
<ul class="dropdown-menu"> <ul id="publish-menu" class="dropdown-menu">
<li><a href="#" class="action-publish-blogger"><i
class="icon-blogger"></i> Blogger</a></li>
<li><a href="#" class="action-publish-dropbox"><i
class="icon-dropbox"></i> Dropbox</a></li>
<li><a href="#" class="action-publish-github"><i
class="icon-github"></i> GitHub</a></li>
<li><a href="#" class="action-publish-gdrive"><i
class="icon-gdrive"></i> Google Drive</a></li>
<li><a href="#" class="action-publish-tumblr"><i
class="icon-tumblr"></i> Tumblr</a></li>
</ul></li> </ul></li>
<li><a href="#" data-toggle="modal" <li><a href="#" data-toggle="modal"
data-target="#modal-manage-publish" class="action-reset-input"><i data-target="#modal-manage-publish" class="action-reset-input"><i
@ -176,8 +166,10 @@
<div class="modal-body"> <div class="modal-body">
<p>Are you sure you want to remove "<span class="file-title"></span>"? <p>Are you sure you want to remove "<span class="file-title"></span>"?
</p> </p>
<blockquote class="muted"><b>NOTE:</b> This will not remove the file on <blockquote class="muted">
synchronized locations.</blockquote> <b>NOTE:</b> This will not remove the file on synchronized
locations.
</blockquote>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<a href="#" class="btn" data-dismiss="modal">Cancel</a> <a href="#" <a href="#" class="btn" data-dismiss="modal">Cancel</a> <a href="#"
@ -194,8 +186,10 @@
<div class="modal-body"> <div class="modal-body">
<p>This will upload the current document into your Google Drive <p>This will upload the current document into your Google Drive
root folder and keep it synchronized.</p> root folder and keep it synchronized.</p>
<blockquote class="muted"><b>NOTE:</b> You can move or rename the file <blockquote class="muted">
afterwards within Google Drive.</blockquote> <b>NOTE:</b> You can move or rename the file afterwards within
Google Drive.
</blockquote>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<a href="#" class="btn" data-dismiss="modal">Cancel</a> <a href="#" <a href="#" class="btn" data-dismiss="modal">Cancel</a> <a href="#"
@ -222,13 +216,13 @@
</div> </div>
<br /> <br /> <br /> <br />
<blockquote class="muted"> <blockquote class="muted">
<b>NOTE:</b> <b>NOTE:</b>
<ul> <ul>
<li>Dropbox file path does not depend on document title.</li> <li>Dropbox file path does not depend on document title.</li>
<li>The title of your document will not be synchronized.</li> <li>The title of your document will not be synchronized.</li>
<li>Destination folder must exist.</li> <li>Destination folder must exist.</li>
<li>Any existing file at this location will be overwritten.</li> <li>Any existing file at this location will be overwritten.</li>
</ul> </ul>
</blockquote> </blockquote>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
@ -269,8 +263,10 @@
class="btn action-sync-manual-dropbox" title="Add location" class="btn action-sync-manual-dropbox" title="Add location"
data-dismiss="modal"><i class="icon-ok"></i></a> data-dismiss="modal"><i class="icon-ok"></i></a>
</div> </div>
<blockquote class="muted"><b>NOTE:</b> This will upload the local document <blockquote class="muted">
firstly and overwrite the existing file on the server.</blockquote> <b>NOTE:</b> This will upload the local document firstly and
overwrite the existing file on the server.
</blockquote>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<a href="#" class="btn btn-primary" data-dismiss="modal">Close</a> <a href="#" class="btn btn-primary" data-dismiss="modal">Close</a>
@ -309,6 +305,28 @@
placeholder="path/to/file.md"> placeholder="path/to/file.md">
</div> </div>
</div> </div>
<div class="control-group modal-publish-gist">
<label class="control-label" for="input-publish-filename">Filename</label>
<div class="controls">
<input type="text" id="input-publish-filename"
placeholder="Filename">
</div>
</div>
<div class="control-group modal-publish-gist">
<label class="control-label" for="input-publish-gist-id">Existing
ID (optional)</label>
<div class="controls">
<input type="text" id="input-publish-gist-id"
placeholder="Gist ID">
</div>
</div>
<div class="control-group modal-publish-gist">
<label class="control-label" for="input-publish-gist-public">Public</label>
<div class="controls">
<input type="checkbox" id="input-publish-gist-public"
checked="checked" />
</div>
</div>
<div class="control-group modal-publish-blogger"> <div class="control-group modal-publish-blogger">
<label class="control-label" for="input-publish-blogger-url">Blog <label class="control-label" for="input-publish-blogger-url">Blog
URL</label> URL</label>
@ -325,12 +343,12 @@
placeholder="exemple.tumblr.com"> placeholder="exemple.tumblr.com">
</div> </div>
</div> </div>
<div class="control-group modal-publish-blogger modal-publish-tumblr"> <div
class="control-group modal-publish-blogger modal-publish-tumblr">
<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">
<input type="text" id="input-publish-postid" <input type="text" id="input-publish-postid" placeholder="Post ID">
placeholder="Post ID">
</div> </div>
</div> </div>
<div class="control-group modal-publish-blogger"> <div class="control-group modal-publish-blogger">
@ -417,8 +435,9 @@
<p class="msg-no-publish hide">"<span class="file-title"></span>" <p class="msg-no-publish hide">"<span class="file-title"></span>"
is not published. is not published.
</p> </p>
<blockquote class="muted"><b>NOTE:</b> You can add locations using <blockquote class="muted">
"Publish on" sub-menu.</blockquote> <b>NOTE:</b> You can add locations using "Publish on" sub-menu.
</blockquote>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<a href="#" class="btn btn-primary" data-dismiss="modal">Close</a> <a href="#" class="btn btn-primary" data-dismiss="modal">Close</a>
@ -483,15 +502,15 @@
class="input-mini"><span class="help-inline">px</span> class="input-mini"><span class="help-inline">px</span>
</div> </div>
</div> </div>
<div class="control-group"> <div class="control-group">
<label class="control-label" <label class="control-label"
for="textarea-settings-default-content">Default content <a for="textarea-settings-default-content">Default content
href="#" class="tooltip-default-content">(?)</a> <a href="#" class="tooltip-default-content">(?)</a>
</label> </label>
<div class="controls"> <div class="controls">
<textarea id="textarea-settings-default-content"></textarea> <textarea id="textarea-settings-default-content"></textarea>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="tab-pane" id="tabpane-settings-publish"> <div class="tab-pane" id="tabpane-settings-publish">
@ -643,8 +662,8 @@
<div class="modal-body"> <div class="modal-body">
<p>StackEdit has stopped because another instance was running in <p>StackEdit has stopped because another instance was running in
the same browser.</p> the same browser.</p>
<blockquote class="muted">If you want to reopen StackEdit, click on <blockquote class="muted">If you want to reopen
"Reload".</blockquote> StackEdit, click on "Reload".</blockquote>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<a href="javascript:window.location.reload();" <a href="javascript:window.location.reload();"
@ -661,8 +680,8 @@
<blockquote class="muted">Are you sure?</blockquote> <blockquote class="muted">Are you sure?</blockquote>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<a href="#" class="btn" data-dismiss="modal">Cancel</a> <a href="#" <a href="#" class="btn" data-dismiss="modal">Cancel</a> <a href="#"
class="btn btn-primary action-app-reset" data-dismiss="modal">OK</a> class="btn btn-primary action-app-reset" data-dismiss="modal">OK</a>
</div> </div>
</div> </div>

View File

@ -15,6 +15,7 @@ var USER_IDLE_THRESHOLD = 300000;
var PROVIDER_BLOGGER = "blogger"; var PROVIDER_BLOGGER = "blogger";
var PROVIDER_DROPBOX = "dropbox"; var PROVIDER_DROPBOX = "dropbox";
var PROVIDER_GDRIVE = "gdrive"; var PROVIDER_GDRIVE = "gdrive";
var PROVIDER_GIST = "gist";
var PROVIDER_GITHUB = "github"; var PROVIDER_GITHUB = "github";
var PROVIDER_TUMBLR = "tumblr"; var PROVIDER_TUMBLR = "tumblr";
var WELCOME_DOCUMENT_TITLE = "Welcome document"; var WELCOME_DOCUMENT_TITLE = "Welcome document";

View File

@ -762,6 +762,14 @@ define(
} }
version = "v4"; version = "v4";
} }
// Upgrade from v4 to v5
if(version == "v4") {
// Recreate GitHub token
localStorage.removeItem("githubToken");
version = "v5";
}
localStorage["version"] = version; localStorage["version"] = version;
} }
// Setup the localStorage when starting // Setup the localStorage when starting

33
js/gist-provider.js Normal file
View File

@ -0,0 +1,33 @@
define(["jquery", "core", "github-helper"], function($, core, githubHelper) {
var gistProvider = {
providerId: PROVIDER_GIST,
providerName: "Gist"
};
gistProvider.publish = function(publishAttributes, title, content, callback) {
githubHelper.gistUpload(publishAttributes.gistId, publishAttributes.filename, publishAttributes.isPublic,
title, content, function(error, gistId) {
if(error) {
callback(error);
return;
}
publishAttributes.gistId = gistId;
callback();
}
);
};
gistProvider.newPublishAttributes = function(event) {
var publishAttributes = {};
publishAttributes.gistId = core.getInputValue($("#input-publish-gist-id"));
publishAttributes.filename = core.getInputValue($("#input-publish-filename"), event);
publishAttributes.isPublic = $("#input-publish-gist-public").is(":checked");
if(event.isPropagationStopped()) {
return undefined;
}
return publishAttributes;
};
return gistProvider;
});

View File

@ -144,6 +144,45 @@ define(["jquery", "core", "async-runner"], function($, core, asyncRunner) {
asyncRunner.addTask(task); asyncRunner.addTask(task);
}; };
githubHelper.gistUpload = function(gistId, filename, isPublic, title, content, callback) {
callback = callback || core.doNothing;
var task = asyncRunner.createTask();
connect(task);
authenticate(task);
task.onRun(function() {
var gist = github.getGist(gistId);
var files = {};
files[filename] = {content: content};
githubFunction = gist.update;
if(gistId === undefined) {
githubFunction = gist.create;
}
githubFunction({
description: title,
"public": isPublic,
files: files
}, function(err, gist) {
if(err) {
// Handle error
if(err.error === 404 && gistId !== undefined) {
err = 'Gist ' + gistId + ' not found on GitHub.|removePublish';
}
handleError(err, task);
return;
}
gistId = gist.id;
task.chain();
});
});
task.onSuccess(function() {
callback(undefined, gistId);
});
task.onError(function(error) {
callback(error);
});
asyncRunner.addTask(task);
};
function handleError(error, task) { function handleError(error, task) {
var errorMsg = undefined; var errorMsg = undefined;
if (error) { if (error) {

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", "github-provider", "blogger-provider", "dropbox-provider", "gdrive-provider", "tumblr-provider", "underscore"], function($, core) { define(["jquery", "core", "blogger-provider", "dropbox-provider", "gist-provider", "github-provider", "gdrive-provider", "tumblr-provider", "underscore"], function($, core) {
var publisher = {}; var publisher = {};
@ -219,12 +219,19 @@ define(["jquery", "core", "github-provider", "blogger-provider", "dropbox-provid
}; };
core.onReady(function() { core.onReady(function() {
// Init each provider // Add every provider
var publishMenu = $("#publish-menu");
_.each(providerMap, function(provider) { _.each(providerMap, function(provider) {
// Publish provider button // Provider's publish button
$(".action-publish-" + provider.providerId).click(function() { publishMenu.append(
initNewLocation(provider); $("<li>").append(
}); $('<a href="#"><i class="icon-' + provider.providerId + '"></i> ' + provider.providerName + '</a>')
.click(function() {
initNewLocation(provider);
}
)
)
);
}); });
$(".action-process-publish").click(performNewLocation); $(".action-process-publish").click(performNewLocation);