mirror of
https://github.com/Tygs/0bin.git
synced 2023-08-10 21:13:00 +03:00
Merge pull request #17 from Natim/master
Display bin image file as image.
This commit is contained in:
@@ -10,7 +10,7 @@
|
||||
import os
|
||||
import sys
|
||||
import thread
|
||||
|
||||
import urlparse
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
# add project dir and libs dir to the PYTHON PATH to ensure they are
|
||||
@@ -48,22 +48,28 @@ def faq():
|
||||
|
||||
@app.route('/paste/create', method='POST')
|
||||
def create_paste():
|
||||
try:
|
||||
body = urlparse.parse_qs(request.body.read(int(settings.MAX_SIZE * 1.1)))
|
||||
except ValueError:
|
||||
return {'status': 'error',
|
||||
'message': u"Wrong data payload."}
|
||||
|
||||
try:
|
||||
content = unicode(request.forms.get('content', ''), 'utf8')
|
||||
except UnicodeDecodeError:
|
||||
content = unicode(''.join(body['content']), 'utf8')
|
||||
except (UnicodeDecodeError, KeyError):
|
||||
return {'status': 'error',
|
||||
'message': u"Encoding error: the paste couldn't be saved."}
|
||||
|
||||
if '{"iv":' not in content: # reject silently non encrypted content
|
||||
return ''
|
||||
return {'status': 'error',
|
||||
'message': u"Wrong data payload."}
|
||||
|
||||
if content:
|
||||
# check size of the paste. if more than settings return error without saving paste.
|
||||
# prevent from unusual use of the system.
|
||||
# need to be improved
|
||||
# check size of the paste. if more than settings return error
|
||||
# without saving paste. prevent from unusual use of the
|
||||
# system. need to be improved
|
||||
if len(content) < settings.MAX_SIZE:
|
||||
expiration = request.forms.get('expiration', u'burn_after_reading')
|
||||
expiration = body.get('expiration', [u'burn_after_reading'])[0]
|
||||
paste = Paste(expiration=expiration, content=content)
|
||||
paste.save()
|
||||
|
||||
@@ -81,12 +87,12 @@ def create_paste():
|
||||
GLOBAL_CONTEXT['pastes_count'] = Paste.get_pastes_count()
|
||||
GLOBAL_CONTEXT['refresh_counter'] = now
|
||||
|
||||
|
||||
return {'status': 'ok',
|
||||
'paste': paste.uuid}
|
||||
|
||||
return {'status': 'error',
|
||||
'message': u"Serveur error: the paste couldn't be saved. Please try later."}
|
||||
'message': u"Serveur error: the paste couldn't be saved. "
|
||||
u"Please try later."}
|
||||
|
||||
|
||||
@app.route('/paste/:paste_id')
|
||||
@@ -105,7 +111,8 @@ def display_paste(paste_id):
|
||||
# to the paste that happens during the paste creation
|
||||
try:
|
||||
keep_alive = paste.expiration.split('#')[1]
|
||||
keep_alive = datetime.strptime(keep_alive, '%Y-%m-%d %H:%M:%S.%f')
|
||||
keep_alive = datetime.strptime(keep_alive,
|
||||
'%Y-%m-%d %H:%M:%S.%f')
|
||||
keep_alive = now < keep_alive + timedelta(seconds=10)
|
||||
except IndexError:
|
||||
keep_alive = False
|
||||
@@ -136,8 +143,8 @@ def server_static(filename):
|
||||
|
||||
def get_app(debug=None, settings_file='', compressed_static=None):
|
||||
"""
|
||||
Return a tuple (settings, app) configured using passed parameters and/or
|
||||
a setting file.
|
||||
Return a tuple (settings, app) configured using passed
|
||||
parameters and/or a setting file.
|
||||
"""
|
||||
if settings_file:
|
||||
settings.update_with_file(os.path.abspath(settings_file))
|
||||
@@ -159,8 +166,8 @@ def get_app(debug=None, settings_file='', compressed_static=None):
|
||||
|
||||
|
||||
@clize.clize(coerce={'debug': bool, 'compressed_static': bool})
|
||||
def runserver(host='', port='', debug=None, user='',
|
||||
group='', settings_file='', compressed_static=None, version=False):
|
||||
def runserver(host='', port='', debug=None, user='', group='',
|
||||
settings_file='', compressed_static=None, version=False):
|
||||
|
||||
settings, app = get_app(debug, settings_file, compressed_static)
|
||||
|
||||
|
||||
@@ -384,3 +384,7 @@ canvas {
|
||||
-webkit-background-clip: padding-box;
|
||||
background-clip: padding-box;
|
||||
}
|
||||
|
||||
#content.hover {
|
||||
background-color: #eee;
|
||||
}
|
||||
2
zerobin/static/css/style.min.css
vendored
2
zerobin/static/css/style.min.css
vendored
@@ -4,4 +4,4 @@ article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display
|
||||
/* Prettify */
|
||||
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
|
||||
/* Custom */
|
||||
.brand{font-size:38px!important;padding:0 55px 3px!important;text-shadow:0 1px 0 rgba(255,255,255,.1),0 0 30px rgba(255,255,255,.125);-webkit-transition:all .2s linear;-moz-transition:all .2s linear;-o-transition:all .2s linear;-ms-transition:all .2s linear;transition:all .2s linear}.brand span{font-size:48px;line-height:0}.brand em{display:inline;color:#d40202;font-size:27px}.about{line-height:13px;font-style:italic;text-align:right;padding-top:9px;margin-bottom:0!important}.center{text-align:center}.about span{font-size:10px}body{padding-top:60px;padding-bottom:40px}.sidebar-nav{padding:9px 0}select{width:135px}label{display:inline;margin-left:18px;font-style:italic;font-size:11px;color:#888}ul,ol{padding:0;margin:0}li{margin-left:-9px}p{margin:0 0 20px}.grey{color:#999}.nav-list{padding-right:0!important;font-size:12px}blockquote{width:630px;float:left}h4 p{float:left;font-size:80px;text-shadow:1px 3px 1px #DDD,0 0 4px #333;-webkit-transition:all .2s linear;-o-transition:all .2s linear;-ms-transition:all .2s linear;-moz-transition:all .2s linear;transition:all .2s linear;margin-right:7px;margin-top:3px}h4#pixels-total{position:relative;width:166px;float:right;margin:8px 0 0 0;padding:0 0 0 54px;font-size:1.1em;line-height:1.4;font-weight:normal;color:#777;-webkit-border-top-right-radius:6px;-webkit-border-top-left-radius:20px;-moz-border-top-right-radius:6px;-moz-border-top-left-radius:20px;border-top-right-radius:6px;border-top-left-radius:20px}.greetings{clear:both;margin:0 auto;text-align:center;margin-top:40px}.alert .title{display:block}.btn-group{float:left}html.file-upload p.file-upload{float:left;margin:22px 0 0 21px;display:none}html.file-upload p.file-upload{display:inherit}html.no-file-upload p.file-upload{display:none}input.btn-upload{position:relative;left:-6px;width:100px;z-index:1;margin-top:-13px}input.hide-upload{position:relative;left:-110px;-moz-opacity:0;filter:alpha(opacity=0);opacity:0;z-index:2;width:100px;margin-top:-20px;cursor:pointer;cursor:hand;height:49px}#paste-content{background-color:white;padding:1em}#paste-content.linenums{padding-left:0}.submit-form{display:none}.paste-option{float:right}a#clip-button.hover{cursor:pointer;text-decoration:underline}li.L0,li.L1,li.L2,li.L3,li.L4,li.L5,li.L6,li.L7,li.L8,li.L9{list-style-type:decimal;background:inherit}.prettyprint.linenums{-webkit-box-shadow:inset 40px 0 0 #fbfbfc,inset 41px 0 0 #ececf0;-moz-box-shadow:inset 40px 0 0 #fbfbfc,inset 41px 0 0 #ececf0;box-shadow:inset 40px 0 0 #fbfbfc,inset 41px 0 0 #ececf0}ol.linenums{margin:0 0 0 55px}ol.linenums li{color:#bebec5;line-height:18px;text-shadow:0 1px 0 #fff}.prettyprint{padding:8px;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{font-family:Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,monospace,serif;line-height:21px;font-size:12px}.kwd{color:#66F}.pun,.opn,.clo{color:#0A0}.lit{color:#933}.com{color:#C0C}form{padding-bottom:3em!important;padding-right:17px}form textarea{overflow-y:auto;min-height:250px}button.btn,input[type="submit"].btn{margin-left:5px}.well{padding-bottom:40px;padding-right:17px}.legal{margin:0 auto;width:300px;text-align:center;margin-top:30px}.btn{margin-left:5px}.btn-primary,.btn-danger{position:relative;top:-4px}#alert-template{display:none}.progress{display:none}.progress .bar{width:25%;text-indent:10px;text-align:left}.lnk-option canvas{vertical-align:middle;margin-right:10px}.previous-pastes .item{margin-top:5px;vertical-align:middle;line-height:24px;padding-left:1em}li.item{margin-left:-13px;margin-right:-5px}.previous-pastes canvas{display:block;float:left;margin-right:5px}html.local-storage .no-local-storage{display:none}html.no-local-storage .local-storage{display:none}canvas{border:1px solid white}#wrap-content{display:none}.noscript{text-align:center;color:red;font-weight:bold}#faq dt{margin:2em 0 1em 0}#faq p{margin:1em}#force-coloration{text-decoration:underline}#expiration-tag{float:right;margin:1em;background:grey;color:white;font-size:.8em;padding:0 1ex;opacity:.5;filter:alpha(opacity=50);font-weight:bold;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box}
|
||||
.brand{font-size:38px!important;padding:0 55px 3px!important;text-shadow:0 1px 0 rgba(255,255,255,.1),0 0 30px rgba(255,255,255,.125);-webkit-transition:all .2s linear;-moz-transition:all .2s linear;-o-transition:all .2s linear;-ms-transition:all .2s linear;transition:all .2s linear}.brand span{font-size:48px;line-height:0}.brand em{display:inline;color:#d40202;font-size:27px}.about{line-height:13px;font-style:italic;text-align:right;padding-top:9px;margin-bottom:0!important}.center{text-align:center}.about span{font-size:10px}body{padding-top:60px;padding-bottom:40px}.sidebar-nav{padding:9px 0}select{width:135px}label{display:inline;margin-left:18px;font-style:italic;font-size:11px;color:#888}ul,ol{padding:0;margin:0}li{margin-left:-9px}p{margin:0 0 20px}.grey{color:#999}.nav-list{padding-right:0!important;font-size:12px}blockquote{width:630px;float:left}h4 p{float:left;font-size:80px;text-shadow:1px 3px 1px #DDD,0 0 4px #333;-webkit-transition:all .2s linear;-o-transition:all .2s linear;-ms-transition:all .2s linear;-moz-transition:all .2s linear;transition:all .2s linear;margin-right:7px;margin-top:3px}h4#pixels-total{position:relative;width:166px;float:right;margin:8px 0 0 0;padding:0 0 0 54px;font-size:1.1em;line-height:1.4;font-weight:normal;color:#777;-webkit-border-top-right-radius:6px;-webkit-border-top-left-radius:20px;-moz-border-top-right-radius:6px;-moz-border-top-left-radius:20px;border-top-right-radius:6px;border-top-left-radius:20px}.greetings{clear:both;margin:0 auto;text-align:center;margin-top:40px}.alert .title{display:block}.btn-group{float:left}html.file-upload p.file-upload{float:left;margin:22px 0 0 21px;display:none}html.file-upload p.file-upload{display:inherit}html.no-file-upload p.file-upload{display:none}input.btn-upload{position:relative;left:-6px;width:100px;z-index:1;margin-top:-13px}input.hide-upload{position:relative;left:-110px;-moz-opacity:0;filter:alpha(opacity=0);opacity:0;z-index:2;width:100px;margin-top:-20px;cursor:pointer;cursor:hand;height:49px}#paste-content{background-color:white;padding:1em}#paste-content.linenums{padding-left:0}.submit-form{display:none}.paste-option{float:right}a#clip-button.hover{cursor:pointer;text-decoration:underline}li.L0,li.L1,li.L2,li.L3,li.L4,li.L5,li.L6,li.L7,li.L8,li.L9{list-style-type:decimal;background:inherit}.prettyprint.linenums{-webkit-box-shadow:inset 40px 0 0 #fbfbfc,inset 41px 0 0 #ececf0;-moz-box-shadow:inset 40px 0 0 #fbfbfc,inset 41px 0 0 #ececf0;box-shadow:inset 40px 0 0 #fbfbfc,inset 41px 0 0 #ececf0}ol.linenums{margin:0 0 0 55px}ol.linenums li{color:#bebec5;line-height:18px;text-shadow:0 1px 0 #fff}.prettyprint{padding:8px;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{font-family:Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,monospace,serif;line-height:21px;font-size:12px}.kwd{color:#66F}.pun,.opn,.clo{color:#0A0}.lit{color:#933}.com{color:#C0C}form{padding-bottom:3em!important;padding-right:17px}form textarea{overflow-y:auto;min-height:250px}button.btn,input[type="submit"].btn{margin-left:5px}.well{padding-bottom:40px;padding-right:17px}.legal{margin:0 auto;width:300px;text-align:center;margin-top:30px}.btn{margin-left:5px}.btn-primary,.btn-danger{position:relative;top:-4px}#alert-template{display:none}.progress{display:none}.progress .bar{width:25%;text-indent:10px;text-align:left}.lnk-option canvas{vertical-align:middle;margin-right:10px}.previous-pastes .item{margin-top:5px;vertical-align:middle;line-height:24px;padding-left:1em}li.item{margin-left:-13px;margin-right:-5px}.previous-pastes canvas{display:block;float:left;margin-right:5px}html.local-storage .no-local-storage{display:none}html.no-local-storage .local-storage{display:none}canvas{border:1px solid white}#wrap-content{display:none}.noscript{text-align:center;color:red;font-weight:bold}#faq dt{margin:2em 0 1em 0}#faq p{margin:1em}#force-coloration{text-decoration:underline}#expiration-tag{float:right;margin:1em;background:grey;color:white;font-size:.8em;padding:0 1ex;opacity:.5;filter:alpha(opacity=50);font-weight:bold;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box}#content.hover{background-color:#eee}
|
||||
@@ -1,13 +1,16 @@
|
||||
/*global sjcl:true, jQuery:true, $:true, lzw:true, zerobin:true, ZeroClipboard:true, vizhash:true, prettyPrint:true, confirm:true */
|
||||
;(function(){
|
||||
"use strict";
|
||||
;
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
/* Start random number generator seeding ASAP */
|
||||
sjcl.random.startCollectors();
|
||||
/* Ensure jquery use cache for ajax requests */
|
||||
$.ajaxSetup({ cache: true });
|
||||
/* Start random number generator seeding ASAP */
|
||||
sjcl.random.startCollectors();
|
||||
/* Ensure jquery use cache for ajax requests */
|
||||
$.ajaxSetup({
|
||||
cache: true
|
||||
});
|
||||
|
||||
/** Create a function that create inline callbacks.
|
||||
/** Create a function that create inline callbacks.
|
||||
We use it to create callbacks for onliners with static arguments
|
||||
E.G:
|
||||
$('stuff').hide(function()(console.log(1, 2, 3)))
|
||||
@@ -16,47 +19,63 @@ $.ajaxSetup({ cache: true });
|
||||
|
||||
$('stuff').hide(mkcb(console.log, 1, 2, 3))
|
||||
*/
|
||||
function mkcb(func){
|
||||
function mkcb(func) {
|
||||
var args = arguments;
|
||||
return function(){
|
||||
return function () {
|
||||
return func.apply(func, Array.prototype.slice.call(args, 1));
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***************************
|
||||
**** 0bin utilities ***
|
||||
****************************/
|
||||
/***************************
|
||||
**** 0bin utilities ***
|
||||
***************************/
|
||||
|
||||
|
||||
window.zerobin = {
|
||||
window.zerobin = {
|
||||
/** Base64 + compress + encrypt, with callbacks before each operation,
|
||||
and all of them are executed in a timed continuation to give
|
||||
a change to the UI to respond.
|
||||
*/
|
||||
version: '0.1.1',
|
||||
encrypt: function(key, content, toBase64Callback,
|
||||
encrypt: function (key, content, toBase64Callback,
|
||||
compressCallback, encryptCallback, doneCallback) {
|
||||
|
||||
setTimeout (function(){
|
||||
setTimeout(function () {
|
||||
|
||||
content = sjcl.codec.utf8String.toBits(content);
|
||||
if (toBase64Callback) {toBase64Callback();}
|
||||
if (toBase64Callback) {
|
||||
toBase64Callback();
|
||||
}
|
||||
|
||||
setTimeout(function(){
|
||||
setTimeout(function () {
|
||||
|
||||
content = sjcl.codec.base64.fromBits(content);
|
||||
if (compressCallback) {compressCallback();}
|
||||
if (compressCallback) {
|
||||
compressCallback();
|
||||
}
|
||||
|
||||
setTimeout(function(){
|
||||
setTimeout(function () {
|
||||
|
||||
content = lzw.compress(content);
|
||||
if (encryptCallback) {encryptCallback();}
|
||||
// content = lzw.compress(content); // Create a bug with JPG
|
||||
if (encryptCallback) {
|
||||
encryptCallback();
|
||||
}
|
||||
|
||||
setTimeout(function(){
|
||||
setTimeout(function () {
|
||||
try {
|
||||
content = sjcl.encrypt(key, content);
|
||||
if (doneCallback) {doneCallback(content);}
|
||||
} catch (e) {
|
||||
$('input, textarea, select, button').prop('disabled', false);
|
||||
zerobin.progressBar('form.well .progress').container.hide();
|
||||
|
||||
zerobin.message('error', 'Paste could not be encrypted. Aborting.',
|
||||
'Error');
|
||||
}
|
||||
if (doneCallback) {
|
||||
doneCallback(content);
|
||||
}
|
||||
}, 250);
|
||||
|
||||
}, 250);
|
||||
@@ -74,39 +93,40 @@ window.zerobin = {
|
||||
useful, this code is starting be difficult to read. If anyone read this
|
||||
and got a suggestion, by all means, speak your mind.
|
||||
*/
|
||||
decrypt: function(key, content, errorCallback, uncompressCallback,
|
||||
decrypt: function (key, content, errorCallback, uncompressCallback,
|
||||
fromBase64Callback, toStringCallback, doneCallback) {
|
||||
|
||||
/* Decrypt */
|
||||
setTimeout(function(){
|
||||
|
||||
setTimeout(function () {
|
||||
try {
|
||||
|
||||
content = sjcl.decrypt(key, content);
|
||||
if (uncompressCallback) {uncompressCallback();}
|
||||
if (uncompressCallback) {
|
||||
uncompressCallback();
|
||||
}
|
||||
|
||||
/* Decompress */
|
||||
setTimeout(function(){
|
||||
|
||||
setTimeout(function () {
|
||||
try {
|
||||
|
||||
content = lzw.decompress(content);
|
||||
if (fromBase64Callback) {fromBase64Callback();}
|
||||
if (fromBase64Callback) {
|
||||
fromBase64Callback();
|
||||
}
|
||||
|
||||
/* From base 64 to bits */
|
||||
setTimeout(function(){
|
||||
|
||||
setTimeout(function () {
|
||||
try {
|
||||
|
||||
content = sjcl.codec.base64.toBits(content);
|
||||
if (toStringCallback) {toStringCallback();}
|
||||
if (toStringCallback) {
|
||||
toStringCallback();
|
||||
}
|
||||
|
||||
/* From bits to string */
|
||||
setTimeout(function(){
|
||||
|
||||
setTimeout(function () {
|
||||
try {
|
||||
content = sjcl.codec.utf8String.fromBits(content);
|
||||
if (doneCallback) {doneCallback(content);}
|
||||
if (doneCallback) {
|
||||
doneCallback(content);
|
||||
}
|
||||
} catch (err) {
|
||||
errorCallback(err);
|
||||
}
|
||||
@@ -134,39 +154,44 @@ window.zerobin = {
|
||||
|
||||
/** Create a random base64 string long enought to be suitable as
|
||||
an encryption key */
|
||||
makeKey: function() {
|
||||
makeKey: function () {
|
||||
return sjcl.codec.base64.fromBits(sjcl.random.randomWords(8, 0), 0);
|
||||
},
|
||||
|
||||
getFormatedDate: function(date){
|
||||
getFormatedDate: function (date) {
|
||||
date = date || new Date();
|
||||
return ((date.getMonth() +1 ) + '-' +
|
||||
date.getDate() + '-' + date.getFullYear());
|
||||
return ((date.getMonth() + 1) + '-' + date.getDate() + '-' + date.getFullYear());
|
||||
},
|
||||
|
||||
getFormatedTime: function(date){
|
||||
getFormatedTime: function (date) {
|
||||
date = date || new Date();
|
||||
var h = date.getHours(),
|
||||
m = date.getMinutes(),
|
||||
s = date.getSeconds();
|
||||
if (h < 10) {h = "0" + h;}
|
||||
if (m < 10) {m = "0" + m;}
|
||||
if (s < 10) {s = "0" + s;}
|
||||
if (h < 10) {
|
||||
h = "0" + h;
|
||||
}
|
||||
if (m < 10) {
|
||||
m = "0" + m;
|
||||
}
|
||||
if (s < 10) {
|
||||
s = "0" + s;
|
||||
}
|
||||
return h + ":" + m + ":" + s;
|
||||
},
|
||||
|
||||
numOrdA: function(a, b){
|
||||
return (a-b);
|
||||
numOrdA: function (a, b) {
|
||||
return (a - b);
|
||||
},
|
||||
|
||||
/** Return a reverse sorted list of all the keys in local storage that
|
||||
are prefixed with with the passed version (default being this lib
|
||||
version) */
|
||||
getLocalStorageKeys: function(){
|
||||
getLocalStorageKeys: function () {
|
||||
var version = 'zerobinV0.1';
|
||||
var keys = [];
|
||||
for (var key in localStorage){
|
||||
if (key.indexOf(version) !== -1){
|
||||
for (var key in localStorage) {
|
||||
if (key.indexOf(version) !== -1) {
|
||||
keys.push(key);
|
||||
}
|
||||
}
|
||||
@@ -177,30 +202,39 @@ window.zerobin = {
|
||||
|
||||
/** Get a tinyurl using JSONP */
|
||||
getTinyURL: function(longURL, success) {
|
||||
var api = 'http://is.gd/create.php?format=json&url=';
|
||||
$.getJSON(api + encodeURIComponent(longURL) + '&callback=?', function(data){
|
||||
success(data.shorturl);
|
||||
$.ajax({
|
||||
url: 'https://www.googleapis.com/urlshortener/v1/url',
|
||||
type: 'POST',
|
||||
contentType: 'application/json',
|
||||
data: JSON.stringify({
|
||||
"longUrl": longURL
|
||||
}),
|
||||
processData: false,
|
||||
dataType: 'json'
|
||||
}).done(function(data){
|
||||
console.log(data);
|
||||
success(data.id);
|
||||
});
|
||||
},
|
||||
|
||||
/** Check for browser support of the named featured. Store the result
|
||||
and add a class to the html tag with the result */
|
||||
support: {
|
||||
localStorage: (function(){
|
||||
var val = !!(localStorage);
|
||||
localStorage: (function () {
|
||||
var val = !! (localStorage);
|
||||
$('html').addClass((val ? '' : 'no-') + 'local-storage');
|
||||
return val;
|
||||
})(),
|
||||
|
||||
history: (function(){
|
||||
var val = !!(window.history && history.pushState);
|
||||
history: (function () {
|
||||
var val = !! (window.history && history.pushState);
|
||||
$('html').addClass((val ? '' : 'no-') + 'history');
|
||||
return val;
|
||||
})(),
|
||||
|
||||
fileUpload: (function(){
|
||||
fileUpload: (function () {
|
||||
var w = window;
|
||||
var val = !!(w.File && w.FileReader && w.FileList && w.Blob);
|
||||
var val = !! (w.File && w.FileReader && w.FileList && w.Blob);
|
||||
$('html').addClass((val ? '' : 'no-') + 'file-upload');
|
||||
return val;
|
||||
})()
|
||||
@@ -208,11 +242,10 @@ window.zerobin = {
|
||||
|
||||
/** Store the paste of a URL in local storate, with a storage format
|
||||
version prefix and the paste date as the key */
|
||||
storePaste: function(url, date){
|
||||
storePaste: function (url, date) {
|
||||
|
||||
date = date || new Date();
|
||||
date = (date.getFullYear() + '-' + (date.getMonth() + 1) + '-' +
|
||||
date.getDate() + ' ' + zerobin.getFormatedTime(date));
|
||||
date = (date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate() + ' ' + zerobin.getFormatedTime(date));
|
||||
|
||||
var keys = zerobin.getLocalStorageKeys();
|
||||
|
||||
@@ -227,22 +260,25 @@ window.zerobin = {
|
||||
If the paste is from today, date format should be "at hh:ss",
|
||||
else it should be "the mm-dd-yyy"
|
||||
*/
|
||||
getPreviousPastes: function(){
|
||||
getPreviousPastes: function () {
|
||||
var pastes = [],
|
||||
keys = zerobin.getLocalStorageKeys(),
|
||||
today = zerobin.getFormatedDate();
|
||||
|
||||
$.each(keys, function(i, key){
|
||||
$.each(keys, function (i, key) {
|
||||
var pasteDateTime = key.replace(/^[^#]+#/, '');
|
||||
var displayDate = pasteDateTime.match(/^(\d+)-(\d+)-(\d+)\s/);
|
||||
displayDate = displayDate[2] + '-' + displayDate[3] + '-' + displayDate[1];
|
||||
var prefix = 'the ';
|
||||
if (displayDate === today){
|
||||
if (displayDate === today) {
|
||||
displayDate = pasteDateTime.split(' ')[1];
|
||||
prefix = 'at ';
|
||||
}
|
||||
pastes.push({displayDate: displayDate, prefix: prefix,
|
||||
link: localStorage.getItem(key)});
|
||||
pastes.push({
|
||||
displayDate: displayDate,
|
||||
prefix: prefix,
|
||||
link: localStorage.getItem(key)
|
||||
});
|
||||
});
|
||||
|
||||
return pastes;
|
||||
@@ -254,12 +290,12 @@ window.zerobin = {
|
||||
This function use a closure to store a <div> parent for the <a>
|
||||
because IE requires the link be processed by it's HTML parser
|
||||
for the URL to be parsed. */
|
||||
parseUrl: (function(){
|
||||
parseUrl: (function () {
|
||||
|
||||
var div = document.createElement('div');
|
||||
div.innerHTML = "<a></a>";
|
||||
|
||||
return function(url){
|
||||
return function (url) {
|
||||
div.firstChild.href = url;
|
||||
div.innerHTML = div.innerHTML;
|
||||
return div.firstChild;
|
||||
@@ -267,27 +303,27 @@ window.zerobin = {
|
||||
|
||||
})(),
|
||||
|
||||
getPasteId: function(url){
|
||||
getPasteId: function (url) {
|
||||
var loc = url ? zerobin.parseUrl(url) : window.location;
|
||||
return loc.pathname.replace(/\/|paste/g, '');
|
||||
},
|
||||
|
||||
getPasteKey: function(url){
|
||||
getPasteKey: function (url) {
|
||||
var loc = url ? zerobin.parseUrl(url) : window.location;
|
||||
return loc.hash.replace('#', '').replace(/(\?|&).*$/, '');
|
||||
},
|
||||
|
||||
/** Return the paste content stripted from any code coloration */
|
||||
getPasteContent: function(){
|
||||
var copy = '' ;
|
||||
$("#paste-content li").each(function(index) {
|
||||
getPasteContent: function () {
|
||||
var copy = '';
|
||||
$("#paste-content li").each(function (index) {
|
||||
copy = copy + $(this).text().replace(/[\u00a0]+/g, ' ') + '\n';
|
||||
});
|
||||
return copy;
|
||||
},
|
||||
|
||||
/** Return an approximate estimate the number of bytes in a text */
|
||||
count: function(text, options) {
|
||||
count: function (text, options) {
|
||||
// Set option defaults
|
||||
var crlf = /(\r?\n|\r)/g;
|
||||
var whitespace = /(\r?\n|\r|\s+)/g;
|
||||
@@ -301,32 +337,42 @@ window.zerobin = {
|
||||
return length + nonAscii + Math.max(0, options.lineBreaks * (lineBreaks - 1));
|
||||
},
|
||||
/** Create a message, style it and insert it in the alert box */
|
||||
message: function(type, message, title, flush, callback) {
|
||||
message: function (type, message, title, flush, callback) {
|
||||
$(window).scrollTop(0);
|
||||
|
||||
if (flush) {$('.alert-'+type).remove();}
|
||||
if (flush) {
|
||||
$('.alert-' + type).remove();
|
||||
}
|
||||
|
||||
var $message = $('#alert-template').clone().attr('id', null)
|
||||
.addClass('alert alert-' + type);
|
||||
$('.message', $message).html(message);
|
||||
|
||||
if (title) {$('.title', $message).html(title);}
|
||||
else {$('.title', $message).remove();}
|
||||
if (title) {
|
||||
$('.title', $message).html(title);
|
||||
} else {
|
||||
$('.title', $message).remove();
|
||||
}
|
||||
|
||||
$message.prependTo($('#main')).show('fadeUp', callback);
|
||||
},
|
||||
|
||||
/** Return a progress bar object */
|
||||
progressBar: function(selector){
|
||||
progressBar: function (selector) {
|
||||
var $container = $(selector);
|
||||
var bar = {container: $container, elem: $container.find('.bar')};
|
||||
bar.set = function(text, rate){bar.elem.text(text).css('width', rate);};
|
||||
var bar = {
|
||||
container: $container,
|
||||
elem: $container.find('.bar')
|
||||
};
|
||||
bar.set = function (text, rate) {
|
||||
bar.elem.text(text).css('width', rate);
|
||||
};
|
||||
return bar;
|
||||
},
|
||||
|
||||
/** Return an integer ranking the probability this text is any kind of
|
||||
source code. */
|
||||
isCode: function(text){
|
||||
isCode: function (text) {
|
||||
|
||||
var code_chars = /[A-Z]{3}[A-Z]+|\.[a-z]|[=:<>{}\[\]$_'"&]| {2}|\t/g;
|
||||
var comments = /(:?\/\*|<!--)(:?.|\n)*?(:?\*\/|-->)|(\/\/|#)(.*?)\n/g;
|
||||
@@ -335,7 +381,7 @@ window.zerobin = {
|
||||
var total = 0;
|
||||
var size = 0;
|
||||
var m = text.match(comments);
|
||||
if (m){
|
||||
if (m) {
|
||||
total += text.match(comments).length;
|
||||
}
|
||||
text = text.replace(comments, '');
|
||||
@@ -351,42 +397,103 @@ window.zerobin = {
|
||||
}
|
||||
|
||||
return total * 1000 / size;
|
||||
},
|
||||
|
||||
// prevent defaults
|
||||
ignoreDrag: function (e) {
|
||||
e.originalEvent.stopPropagation();
|
||||
e.originalEvent.preventDefault();
|
||||
},
|
||||
|
||||
// Handle Drop
|
||||
handleDrop: function (e) {
|
||||
e.originalEvent.preventDefault();
|
||||
zerobin.upload(e.originalEvent.dataTransfer.files);
|
||||
$("#content").removeClass('hover');
|
||||
},
|
||||
|
||||
handleDragOver: function (e) {
|
||||
zerobin.ignoreDrag(e);
|
||||
$(this).addClass('hover');
|
||||
},
|
||||
|
||||
handleDragLeave: function (e) {
|
||||
$(this).removeClass('hover');
|
||||
},
|
||||
|
||||
upload: function (files) {
|
||||
var current_file = files[0];
|
||||
var reader = new FileReader();
|
||||
if (current_file.type.indexOf('image') == 0) {
|
||||
reader.onload = function (event) {
|
||||
var image = new Image();
|
||||
image.src = event.target.result;
|
||||
|
||||
image.onload = function() {
|
||||
var maxWidth = 1024,
|
||||
maxHeight = 1024,
|
||||
imageWidth = image.width,
|
||||
imageHeight = image.height;
|
||||
|
||||
|
||||
if (imageWidth > imageHeight) {
|
||||
if (imageWidth > maxWidth) {
|
||||
imageHeight *= maxWidth / imageWidth;
|
||||
imageWidth = maxWidth;
|
||||
}
|
||||
};
|
||||
}
|
||||
else {
|
||||
if (imageHeight > maxHeight) {
|
||||
imageWidth *= maxHeight / imageHeight;
|
||||
imageHeight = maxHeight;
|
||||
}
|
||||
}
|
||||
|
||||
var canvas = document.createElement('canvas');
|
||||
canvas.width = imageWidth;
|
||||
canvas.height = imageHeight;
|
||||
image.width = imageWidth;
|
||||
image.height = imageHeight;
|
||||
var ctx = canvas.getContext("2d");
|
||||
ctx.drawImage(this, 0, 0, imageWidth, imageHeight);
|
||||
|
||||
var paste = canvas.toDataURL(current_file.type);
|
||||
$('#content').val(paste).trigger('change');
|
||||
$('#content').hide();
|
||||
$(image).css('max-width', '742px');
|
||||
$('#content').after(image);
|
||||
}
|
||||
}
|
||||
reader.readAsDataURL(current_file);
|
||||
} else {
|
||||
reader.onload = function (event) {
|
||||
$('#content').val(event.target.result).trigger('change');
|
||||
};
|
||||
reader.readAsText(current_file);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/***************************
|
||||
**** On document ready ***
|
||||
****************************/
|
||||
/***************************
|
||||
**** On document ready ***
|
||||
****************************/
|
||||
|
||||
|
||||
$(function(){
|
||||
$(function () {
|
||||
|
||||
/**
|
||||
/**
|
||||
On the create paste page:
|
||||
On click on the send button, compress and encrypt data before
|
||||
posting it using ajax. Then redirect to the address of the
|
||||
newly created paste, adding the key in the hash.
|
||||
*/
|
||||
$('.btn-primary').live("click", function(e){
|
||||
$('.btn-primary').live("click", function (e) {
|
||||
|
||||
e.preventDefault();
|
||||
var paste = $('textarea').val();
|
||||
|
||||
var sizebytes = zerobin.count($('#content').val());
|
||||
var oversized = sizebytes > zerobin.max_size;
|
||||
var readableFsize = Math.round(sizebytes / 1024);
|
||||
var readableMaxsize = Math.round(zerobin.max_size / 1024);
|
||||
|
||||
if (oversized){
|
||||
zerobin.message('error',
|
||||
('Your file is <strong class="file-size">' + readableFsize +
|
||||
'</strong>KB. You have reached the maximum size limit of ' +
|
||||
readableMaxsize + 'KB.'),
|
||||
'Warning!', true);
|
||||
}
|
||||
|
||||
if (!oversized && paste.trim()) {
|
||||
if (paste.trim()) {
|
||||
|
||||
var $form = $('input, textarea, select, button').prop('disabled', true);
|
||||
|
||||
@@ -411,23 +518,38 @@ $('.btn-primary').live("click", function(e){
|
||||
mkcb(bar.set, 'Encrypting...', '85%'),
|
||||
|
||||
/* This block deal with sending the data, redirection or error handling */
|
||||
function(content){
|
||||
function (content) {
|
||||
|
||||
bar.set('Sending...', '95%');
|
||||
var data = {content: content, expiration: expiration};
|
||||
var data = {
|
||||
content: content,
|
||||
expiration: expiration
|
||||
};
|
||||
var sizebytes = zerobin.count(JSON.stringify(data));
|
||||
var oversized = sizebytes > zerobin.max_size; // 100kb - the others header information
|
||||
var readableFsize = Math.round(sizebytes / 1024);
|
||||
var readableMaxsize = Math.round(zerobin.max_size / 1024);
|
||||
|
||||
if (oversized) {
|
||||
bar.container.hide();
|
||||
$form.prop('disabled', false);
|
||||
zerobin.message('error', ('The encrypted file was <strong class="file-size">' + readableFsize +
|
||||
'</strong>KB. You have reached the maximum size limit of ' + readableMaxsize + 'KB.'),
|
||||
'Warning!', true);
|
||||
return;
|
||||
}
|
||||
|
||||
$.post('/paste/create', data)
|
||||
.error(function(error) {
|
||||
.error(function (error) {
|
||||
$form.prop('disabled', false);
|
||||
bar.container.hide();
|
||||
zerobin.message(
|
||||
'error',
|
||||
'Paste could not be saved. Please try again later.',
|
||||
'Error'
|
||||
);
|
||||
'Error');
|
||||
|
||||
})
|
||||
.success(function(data) {
|
||||
.success(function (data) {
|
||||
bar.set('Redirecting to new paste...', '100%');
|
||||
|
||||
if (data.status === 'error') {
|
||||
@@ -436,14 +558,13 @@ $('.btn-primary').live("click", function(e){
|
||||
bar.container.hide();
|
||||
} else {
|
||||
var paste_url = '/paste/' + data.paste + '#' + key;
|
||||
if (zerobin.support.localStorage){
|
||||
if (zerobin.support.localStorage) {
|
||||
zerobin.storePaste(paste_url);
|
||||
}
|
||||
window.location = (paste_url);
|
||||
}
|
||||
});
|
||||
}
|
||||
);
|
||||
});
|
||||
} catch (err) {
|
||||
$form.prop('disabled', false);
|
||||
bar.container.hide();
|
||||
@@ -451,30 +572,29 @@ $('.btn-primary').live("click", function(e){
|
||||
'Error');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
/**
|
||||
/**
|
||||
DECRYPTION:
|
||||
On the display paste page, decrypt and decompress the paste content,
|
||||
add syntax coloration then setup the copy to clipboard button.
|
||||
Also calculate and set the paste visual hash.
|
||||
*/
|
||||
var content = $('#paste-content').text().trim();
|
||||
var key = zerobin.getPasteKey();
|
||||
var error = false;
|
||||
var content = $('#paste-content').text().trim();
|
||||
var key = zerobin.getPasteKey();
|
||||
var error = false;
|
||||
|
||||
if (content && key) {
|
||||
if (content && key) {
|
||||
|
||||
/* Load the lib for visual canvas, create one from the paste id and
|
||||
insert it */
|
||||
$.getScript("/static/js/vizhash.min.js").done(function(script, textStatus) {
|
||||
$.getScript("/static/js/vizhash.min.js").done(function (script, textStatus) {
|
||||
if (vizhash.supportCanvas) {
|
||||
var vhash = vizhash.canvasHash(zerobin.getPasteId(), 24, 24);
|
||||
$('<a class="vhash" href="#"></a>').click(function(e){
|
||||
$('<a class="vhash" href="#"></a>').click(function (e) {
|
||||
e.preventDefault();
|
||||
if(confirm("This picture is unique to your paste so you can identify" +
|
||||
" it quickly. \n\n Do you want to know more about this?")){
|
||||
if (confirm("This picture is unique to your paste so you can identify" +
|
||||
" it quickly. \n\n Do you want to know more about this?")) {
|
||||
window.open("http://is.gd/IJaMRG", "_blank");
|
||||
}
|
||||
}).prependTo('.lnk-option').append(vhash.canvas);
|
||||
@@ -490,7 +610,7 @@ if (content && key) {
|
||||
zerobin.decrypt(key, content,
|
||||
|
||||
/* On error*/
|
||||
function(){
|
||||
function () {
|
||||
bar.container.hide();
|
||||
zerobin.message('error', 'Could not decrypt data (Wrong key ?)', 'Error');
|
||||
},
|
||||
@@ -501,15 +621,33 @@ if (content && key) {
|
||||
mkcb(bar.set, 'From bits to string...', '85%'),
|
||||
|
||||
/* When done */
|
||||
function(content){
|
||||
function (content) {
|
||||
|
||||
/* Decrypted content goes back to initial container*/
|
||||
$('#paste-content').text(content);
|
||||
|
||||
if (content.indexOf('data:image') == 0) {
|
||||
// Display Image
|
||||
$('#paste-content').hide();
|
||||
var img = $('<img/>');
|
||||
$(img).attr('src', content);
|
||||
$(img).css('max-width', '742px');
|
||||
$('#paste-content').after(img);
|
||||
|
||||
// Display Download button
|
||||
$('.btn-clone').hide();
|
||||
|
||||
var button = $('<a/>').attr('href', content);
|
||||
$(button).attr('download', '0bin_' + document.location.pathname.split('/').pop());
|
||||
$(button).addClass('btn');
|
||||
$(button).html('<i class="icon-download"></i> Download');
|
||||
$('.btn-clone').after(button);
|
||||
|
||||
}
|
||||
bar.set('Code coloration...', '95%');
|
||||
|
||||
/* Add a continuation to let the UI redraw */
|
||||
setTimeout(function(){
|
||||
setTimeout(function () {
|
||||
|
||||
/* Setup flash clipboard button */
|
||||
ZeroClipboard.setMoviePath('/static/js/ZeroClipboard.swf');
|
||||
@@ -517,13 +655,15 @@ if (content && key) {
|
||||
var clip = new ZeroClipboard.Client();
|
||||
|
||||
// Callback to reposition the clibpboad flash animation overlay
|
||||
var reposition = function(){clip.reposition();};
|
||||
var reposition = function () {
|
||||
clip.reposition();
|
||||
};
|
||||
|
||||
clip.addEventListener('mouseup', function(){
|
||||
clip.addEventListener('mouseup', function () {
|
||||
$('#clip-button').text('Copying paste...');
|
||||
clip.setText(zerobin.getPasteContent());
|
||||
});
|
||||
clip.addEventListener('complete', function(){
|
||||
clip.addEventListener('complete', function () {
|
||||
$('#clip-button').text('Copy to clipboard');
|
||||
zerobin.message('info', 'The paste is now in your clipboard', '',
|
||||
true, reposition);
|
||||
@@ -534,39 +674,40 @@ if (content && key) {
|
||||
|
||||
|
||||
/* Setup link to get the paste short url*/
|
||||
$('#short-url').click(function(e) {
|
||||
$('#short-url').click(function (e) {
|
||||
e.preventDefault();
|
||||
$('#short-url').text('Loading short url...');
|
||||
zerobin.getTinyURL(window.location.toString(), function(tinyurl){
|
||||
zerobin.getTinyURL(window.location.toString(), function (tinyurl) {
|
||||
clip.setText(tinyurl);
|
||||
$('#copy-success').hide();
|
||||
zerobin.message('success',
|
||||
'<a href="' + tinyurl + '">' + tinyurl + '</a>',
|
||||
'Short url', true, reposition
|
||||
);
|
||||
'Short url', true, reposition);
|
||||
$('#short-url').text('Get short url');
|
||||
});
|
||||
});
|
||||
|
||||
/* Remap the message close handler to include the clipboard
|
||||
flash reposition */
|
||||
$(".close").die().live('click', function(e){
|
||||
$(".close").die().live('click', function (e) {
|
||||
e.preventDefault();
|
||||
$(this).parent().fadeOut(reposition);
|
||||
});
|
||||
|
||||
/** Syntaxic coloration */
|
||||
|
||||
if (zerobin.isCode(content) > 100){
|
||||
if (zerobin.isCode(content) > 100) {
|
||||
$('#paste-content').addClass('linenums');
|
||||
prettyPrint();
|
||||
} else {
|
||||
if (content.indexOf('data:image') != 0) {
|
||||
zerobin.message('info',
|
||||
"The paste did not seem to be code, so it " +
|
||||
"was not colorized. " +
|
||||
"<a id='force-coloration' href='#'>Force coloration</a>",
|
||||
'', false, reposition);
|
||||
}
|
||||
}
|
||||
|
||||
/* Class to switch to paste content style with coloration done */
|
||||
$('#paste-content').addClass('done');
|
||||
@@ -580,48 +721,46 @@ if (content && key) {
|
||||
|
||||
}, 250);
|
||||
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
} /* End of "DECRYPTION" */
|
||||
} /* End of "DECRYPTION" */
|
||||
|
||||
/* Synchronize expiration select boxes value */
|
||||
$('.paste-option select').live('change', function(){
|
||||
/* Synchronize expiration select boxes value */
|
||||
$('.paste-option select').live('change', function () {
|
||||
$('.paste-option select').val($(this).val());
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
/* Resize Textarea according to content */
|
||||
$('#content').elastic();
|
||||
/* Resize Textarea according to content */
|
||||
$('#content').elastic();
|
||||
|
||||
|
||||
/* Display bottom paste option buttons when needed */
|
||||
$('#content').live('keyup change', function(){
|
||||
if($('#content').height() < 400 ){
|
||||
/* Display bottom paste option buttons when needed */
|
||||
$('#content').live('keyup change', function () {
|
||||
if ($('#content').height() < 400) {
|
||||
$('.paste-option.down').remove();
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
|
||||
if ($('.paste-option').length === 1) {
|
||||
$('.paste-option').clone().addClass('down').appendTo('form.well');
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
/* Display previous pastes */
|
||||
if (zerobin.support.localStorage){
|
||||
/* Display previous pastes */
|
||||
if (zerobin.support.localStorage) {
|
||||
|
||||
var $container = $('.previous-pastes'),
|
||||
pastes = zerobin.getPreviousPastes();
|
||||
|
||||
if (pastes.length){
|
||||
if (pastes.length) {
|
||||
|
||||
$.getScript("/static/js/vizhash.min.js").done(function(script, textStatus) {
|
||||
$.getScript("/static/js/vizhash.min.js").done(function (script, textStatus) {
|
||||
|
||||
$container.find('.item').remove();
|
||||
$.each(zerobin.getPreviousPastes(), function(i, paste){
|
||||
$.each(zerobin.getPreviousPastes(), function (i, paste) {
|
||||
|
||||
var $li = $('<li class="item"></li>').appendTo($container);
|
||||
var $link = $('<a></a>').attr('href', paste.link)
|
||||
@@ -636,9 +775,9 @@ if (zerobin.support.localStorage){
|
||||
|
||||
// hightlite the current link and make sure clicking the link
|
||||
// does redirect to the page
|
||||
if (paste.link.replace(/#[^#]+/, '') === window.location.pathname){
|
||||
if (paste.link.replace(/#[^#]+/, '') === window.location.pathname) {
|
||||
$li.addClass('active');
|
||||
$link.click(function(){
|
||||
$link.click(function () {
|
||||
window.location = $link.attr('href');
|
||||
window.location.reload();
|
||||
});
|
||||
@@ -650,34 +789,27 @@ if (zerobin.support.localStorage){
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Event handler for "clone paste" button */
|
||||
$('.btn-clone').click(function(e){
|
||||
/* Event handler for "clone paste" button */
|
||||
$('.btn-clone').click(function (e) {
|
||||
e.preventDefault();
|
||||
$('.submit-form').show();
|
||||
$('.paste-form').hide();
|
||||
$('#content').val(zerobin.getPasteContent()).trigger('change');
|
||||
});
|
||||
});
|
||||
|
||||
$('.clone .btn-danger').click(function(e){
|
||||
$('.clone .btn-danger').click(function (e) {
|
||||
e.preventDefault();
|
||||
$('.submit-form').hide();
|
||||
$('.paste-form').show();
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
/* Upload file using HTML5 File API */
|
||||
if (zerobin.support.fileUpload) {
|
||||
|
||||
var upload = function(files) {
|
||||
var reader = new FileReader();
|
||||
reader.onload = function(event) {
|
||||
$('#content').val(event.target.result).trigger('change');
|
||||
};
|
||||
reader.readAsText(files[0]);
|
||||
};
|
||||
/* Upload file using HTML5 File API */
|
||||
if (zerobin.support.fileUpload) {
|
||||
|
||||
var $buttonOverlay = $('#file-upload');
|
||||
var $button = $('.btn-upload');
|
||||
@@ -685,9 +817,10 @@ if (zerobin.support.fileUpload) {
|
||||
try {
|
||||
$button.val('Uploading...');
|
||||
$button.prop('disabled', true);
|
||||
$buttonOverlay.change(function(){upload(this.files);});
|
||||
}
|
||||
catch (e) {
|
||||
$buttonOverlay.change(function () {
|
||||
zerobin.upload(this.files);
|
||||
});
|
||||
} catch (e) {
|
||||
zerobin.message('error', 'Could no upload the file', 'Error');
|
||||
$button.val('Upload File');
|
||||
$button.prop('disabled', false);
|
||||
@@ -696,60 +829,70 @@ if (zerobin.support.fileUpload) {
|
||||
$button.prop('disabled', false);
|
||||
$button.val('Upload File');
|
||||
$buttonOverlay.mouseover(mkcb($(this).css, 'cursor', 'pointer'));
|
||||
}
|
||||
|
||||
/* Alerts */
|
||||
// Implements drag & drop upload
|
||||
$('#content').bind('drop', zerobin.handleDrop);
|
||||
$('#content').bind('dragover', zerobin.handleDragOver);
|
||||
$('#content').bind('dragleave', zerobin.handleDragLeave);
|
||||
|
||||
$(".close").live('click', function(e){
|
||||
|
||||
}
|
||||
|
||||
/* Alerts */
|
||||
|
||||
$(".close").live('click', function (e) {
|
||||
e.preventDefault();
|
||||
$(this).parent().fadeOut();
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
/* Parse obfuscaded emails and make them usable */
|
||||
$('.email-link').each(function(i, elem){
|
||||
/* Parse obfuscaded emails and make them usable */
|
||||
$('.email-link').each(function (i, elem) {
|
||||
var $obfuscatedEmail = $(this);
|
||||
var address = $obfuscatedEmail.attr('title').replace('__AT__', '@');
|
||||
var text = $obfuscatedEmail.text().replace('__AT__', '@');
|
||||
var $plainTextEmail = $('<a href="mailto:' + address + '">'+ text +'</a>');
|
||||
var $plainTextEmail = $('<a href="mailto:' + address + '">' + text + '</a>');
|
||||
$obfuscatedEmail.replaceWith($plainTextEmail);
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
/* Show the page using javascript. Non js enabled browser will see an
|
||||
/* Show the page using javascript. Non js enabled browser will see an
|
||||
error message */
|
||||
$('#wrap-content').each(function(i, elem){
|
||||
$('#wrap-content').each(function (i, elem) {
|
||||
$(elem).show();
|
||||
});
|
||||
});
|
||||
|
||||
/* Remove expired pasted from history */
|
||||
if (zerobin.support.history && zerobin.paste_not_found){
|
||||
/* Remove expired pasted from history */
|
||||
if (zerobin.support.history && zerobin.paste_not_found) {
|
||||
var paste_id = zerobin.getPasteId();
|
||||
var keys = zerobin.getLocalStorageKeys();
|
||||
$.each(keys, function(i, key){
|
||||
if (localStorage[key].indexOf(paste_id) !== -1){
|
||||
$.each(keys, function (i, key) {
|
||||
if (localStorage[key].indexOf(paste_id) !== -1) {
|
||||
localStorage.removeItem(key);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Force text coloration when clickin on link */
|
||||
$("#force-coloration").live("click", function(e) {
|
||||
/* Force text coloration when clickin on link */
|
||||
$("#force-coloration").live("click", function (e) {
|
||||
e.preventDefault();
|
||||
$('#paste-content').addClass('linenums');
|
||||
$(this).die(e).text('Applying coloration');
|
||||
prettyPrint();
|
||||
$(this).remove();
|
||||
});
|
||||
});
|
||||
|
||||
/* Send the paste by email */
|
||||
var emailLink = 'mailto:friend@example.com?body=' + window.location;
|
||||
$('#email-link').attr('href', emailLink);
|
||||
/* Send the paste by email */
|
||||
$('#email-link').click(function() {
|
||||
zerobin.getTinyURL(window.location.toString(), function(tinyurl) {
|
||||
window.open('mailto:friend@example.com?body=' + tinyurl);
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
|
||||
}); /* End of "document ready" jquery callback */
|
||||
}); /* End of "document ready" jquery callback */
|
||||
|
||||
})(); /* End of self executing function */
|
||||
|
||||
2
zerobin/static/js/main.min.js
vendored
2
zerobin/static/js/main.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -132,7 +132,7 @@
|
||||
%if settings.DISPLAY_COUNTER:
|
||||
<h4 id="pixels-total" >
|
||||
<p>ø</p>
|
||||
<strong>{{ pastes_count }}</strong> </br>pastes øbinned
|
||||
<strong>{{ pastes_count }}</strong> <br/>pastes øbinned
|
||||
</h4>
|
||||
%end
|
||||
|
||||
|
||||
@@ -72,14 +72,14 @@
|
||||
<button class="btn btn-danger">Cancel clone</button>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<div>
|
||||
<div class="progress progress-striped active">
|
||||
<div class="bar"></div>
|
||||
</div>
|
||||
<textarea rows="10" style="width:100%;"
|
||||
class="input-xlarge"
|
||||
id="content" name="content"></textarea>
|
||||
</p>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user