Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions Gist.scrippet/Contents/Resources/gist.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
p.input label,
p.input input { margin:0; float:left; display:block; }
p.input label { width:9em; text-align:right; }
p.input input { width:15em; text-align:left; }

p.input { height:2.5em; clear:both; margin:0; }

47 changes: 39 additions & 8 deletions Gist.scrippet/Contents/Resources/gist.rb
Original file line number Diff line number Diff line change
@@ -1,21 +1,52 @@
require 'rexml/document'
require 'net/http'
require 'net/https'
require 'uri'

url = URI.parse('http://gist.github.com/api/v1/xml/new')
url = URI.parse('https://gist.github.com/gists')


name = ENV['SNIPPET_NAME']
name = ENV['SNIPPET_EXPORT_FILENAME']

puts "Uploading: #{name}"

ext = ENV['SNIPPET_EXTENTION']
description = ENV['SNIPPET_NAME']
login = ENV['GIST_LOGIN']
token = ENV['GIST_API_TOKEN']
prv = ENV['GIST_IS_PRIVATE'] == '1'
snippet = ENV['SNIPPET_SOURCE_CODE']

response = Net::HTTP.post_form(url, 'files[file1.ab]' => snippet)
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
req = Net::HTTP::Post.new(url.path)

data = {
'description' => description,
'file_ext[gistfile1]' => ext,
'file_name[gistfile1]' => name,
'file_contents[gistfile1]' => snippet
}

if prv
data = data.merge({ 'action_button' => 'private' })
end

if login != ''
data = data.merge({
:login => login,
:token => token
})

end

req.form_data = data

snippet_url = http.start{|h| h.request(req) }['Location']

doc = REXML::Document.new(response.body)
gist = REXML::XPath.first(doc, "/gists/gist/repo/text()")
unless snippet_url
raise "Failed to upload snippet: " << name
end

snippet_url = "http://gist.github.com/#{gist}"
puts "Snippet is successfully uploaded at #{snippet_url}"

ENV['GIST_SNIPPET_URL'] = snippet_url
102 changes: 96 additions & 6 deletions Gist.scrippet/Contents/Resources/input.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,118 @@
<title>Input</title>
<meta name="author" content="Simon Schoeters">
<link href="default.css" rel="stylesheet" type="text/css">
<link href="gist.css" rel="stylesheet" type="text/css">
<script type="text/javascript" charset="utf-8" src="Scrippet.js"></script>
<script type="text/javascript" charset="utf-8">

var
inputApiToken = null,
inputLogin = null,
checkPrivate = null,
paraConfirmation = null,
recentAPIKey = null,
login = null,
token = null,
prv = false;

Scrippet.onInitialize = function (scrippet) {
// Setup HTML content according to the number of snippets
var snippets = Scrippet.getSnippets();
var confirmation = snippets.length > 1
? "You are about to export " + snippets.length + " snippets as public <a href='http://gist.github.com'>GitHub</a> gists."
: "You are about to export ‘" + snippets[0].getName() + "’ as a public <a href='http://gist.github.com'>GitHub</a> gist.";
document.getElementById("confirmation").innerHTML = confirmation;
// Restore data
inputApiToken = document.getElementById("api-token");
inputLogin = document.getElementById("login");
checkPrivate = document.getElementById("is-private");
paraConfirmation = document.getElementById("confirmation");

inputApiToken.value = Scrippet.loadPersistentItem("GIST_API_TOKEN") || "";
inputLogin.value = Scrippet.loadPersistentItem("GIST_LOGIN") || "";
checkPrivate.checked = Scrippet.loadPersistentItem("GIST_IS_PRIVATE") == "1";

//
validateLogin();
update();
};
Scrippet.onFinalize = function (scrippet) {

// Store data
Scrippet.storePersistentItem("GIST_API_TOKEN", getApiToken());
Scrippet.storePersistentItem("GIST_LOGIN", getLogin());
Scrippet.storePersistentItem("GIST_IS_PRIVATE", isPrivate()?"1":"");

// Provide separate environment variable for every snippet
var snippets = Scrippet.getSnippets();
for (var i = 0; i < snippets.length; i++) {
snippets[i].setProperty("SNIPPET_EXTENTION", "." + snippets[i].getExportFilename().split(".").pop() );
snippets[i].setProperty("GIST_SNIPPET_URL", null);
}

Scrippet.setProperty("GIST_API_TOKEN", token);
Scrippet.setProperty("GIST_LOGIN", login);
Scrippet.setProperty("GIST_IS_PRIVATE", prv?"1":"");

};

function update() {
// Setup HTML content according to the number of snippets
var snippets = Scrippet.getSnippets();
var multiple = snippets.length > 1;
var confirmation = "You are about to export " +
( multiple ?
( snippets.length + " snippets" ) :
snippets[0].getExportFilename()
) +
( multiple ? "s" : "" ) +
" as " +
( prv ? "private" : "public" ) +
" <a href='http://gist.github.com'>GitHub</a> gist" +
( multiple ? "s" : "" ) +
".";

paraConfirmation.innerHTML = confirmation;
}

function isPrivate() { return checkPrivate.checked; }
function getApiToken() { return inputApiToken.value; }
function getLogin() { return inputLogin.value; }

function validateLogin() {
var
valid = false,
newPrv = isPrivate(),
newToken = getApiToken(),
newLogin = getLogin();

if( newPrv != prv || newToken != token || newLogin != login ) {
prv = newPrv;
token = newToken;
login = newLogin;
valid =
( !login && !token ) ||
( /^[a-f\d]{32}$/.test(token) && /^[0-9a-z\-]+$/i.test(login) );

Scrippet.setDefaultButtonEnabled(valid);
}
setTimeout(validateLogin, 200);
}

</script>
</head>
<body>
<div class="center-aligned slightly-padded">
<p class="general-information" id="confirmation"></p>
<p class="input">
<label for="login">Login:&nbsp;</label>
<input id="login" onKeyPress="if (event.keyCode == 13) Scrippet.clickDefaultButton()" type="text"/>
</p>
<p class="input">
<label for="api-token"><a href="http://github.com/account#admin_bucket">API Token</a>:&nbsp;</label>
<input id="api-token" onKeyPress="if (event.keyCode == 13) Scrippet.clickDefaultButton()" maxlength="32" type="text"/>
</p>
<p class="check">
<label for="is-private">
<input id="is-private" type="checkbox" onClick="update();" />
Private gist
</label>
</p>
<p>Leave Login and API Token blank to post as anonymous.</p>
</div>
</body>
</html>
3 changes: 2 additions & 1 deletion Gist.scrippet/Contents/Resources/output.html
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
var clipboardContents = "";
for (var i = 0; i < snippets.length; i++) {
var snippet = snippets[i];
var URL = snippet.getProperty("GIST_SNIPPET_URL");
var URL = ( snippet.getProperty("GIST_SNIPPET_URL") || "" ).replace(/^https/,"http");

var name = snippet.getName();
var link = "<li><img src=\"copy.png\" style=\"cursor:pointer;\" " + "title=\"Copy into Clipboard\" onclick=\"copyURL('" + URL + "', '" + name + "');\"/>&nbsp;&nbsp;<a href='" + URL + "'>" + name + "</a></li>";
listContents = listContents + link;
Expand Down