Bookmarklet now shows a modal where you can select which folder to add the site. Includes JS and CSS, uncompressed, on host page.

This commit is contained in:
Samuel Clay 2011-01-21 20:29:19 -05:00
parent dbf664ebb5
commit 567840ffff
14 changed files with 599 additions and 287 deletions

View file

@ -2,5 +2,6 @@ from django.conf.urls.defaults import *
from apps.api import views
urlpatterns = patterns('',
url(r'^add_site_load_script/(?P<token>\w+)', views.add_site_load_script, name='api-add-site-load-script'),
url(r'^add_site/(?P<token>\w+)', views.add_site, name='api-add-site'),
)

View file

@ -1,7 +1,42 @@
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.template import RequestContext
from apps.profile.models import Profile
from apps.reader.models import UserSubscription, UserSubscriptionFolders
from utils import json_functions as json
from utils.user_functions import ajax_login_required
def add_site_load_script(request, token):
code = 0
try:
profile = Profile.objects.get(secret_token=token)
usf = UserSubscriptionFolders.objects.get(
user=profile.user
)
except Profile.DoesNotExist:
code = -1
except UserSubscriptionFolders.DoesNotExist:
code = -1
return render_to_response('api/bookmarklet_subscribe.js', {
'code': code,
'token': token,
'folders': usf.folders,
}, context_instance=RequestContext(request))
@json.json_view
def add_site(request, token):
print token
return HttpResponse(token, mimetype='application/javascript')
code = 0
try:
profile = Profile.objects.get(secret_token=token)
code, message, us = UserSubscription.add_subscription(
user=profile.user,
feed_address=request.REQUEST['url']
)
except Profile.DoesNotExist:
code = -1
return {
'code': code,
'message': message,
'usersub': us,
}

View file

@ -9,6 +9,8 @@ from django.core.cache import cache
from apps.rss_feeds.models import Feed, MStory, DuplicateFeed
from apps.analyzer.models import MClassifierFeed, MClassifierAuthor, MClassifierTag, MClassifierTitle
from apps.analyzer.models import apply_classifier_titles, apply_classifier_feeds, apply_classifier_authors, apply_classifier_tags
from utils import urlnorm
from utils.feed_functions import fetch_address_from_page
class UserSubscription(models.Model):
"""
@ -47,7 +49,65 @@ class UserSubscription(models.Model):
self.feed = duplicate_feed[0].feed
super(UserSubscription, self).save(*args, **kwargs)
@classmethod
def add_subscription(cls, user, feed_address, folder=None):
feed = None
logging.info(" ---> [%s] ~FRAdding URL: ~SB%s (in %s)" % (user, feed_address, folder))
if feed_address:
feed_address = urlnorm.normalize(feed_address)
# See if it exists as a duplicate first
duplicate_feed = DuplicateFeed.objects.filter(duplicate_address=feed_address).order_by('pk')
if duplicate_feed:
feed = [duplicate_feed[0].feed]
else:
feed = Feed.objects.filter(feed_address=feed_address).order_by('pk')
if feed:
feed = feed[0]
else:
try:
feed = fetch_address_from_page(feed_address)
except:
code = -2
message = "This feed has been added, but something went wrong"\
" when downloading it. Maybe the server's busy."
if not feed:
code = -1
message = "That URL does not point to an RSS feed or a website that has an RSS feed."
else:
us, _ = UserSubscription.objects.get_or_create(
feed=feed,
user=user,
defaults={
'needs_unread_recalc': True,
'active': True,
}
)
code = 1
message = ""
user_sub_folders_object, created = UserSubscriptionFolders.objects.get_or_create(
user=user,
defaults={'folders': '[]'}
)
if created:
user_sub_folders = []
else:
user_sub_folders = json.decode(user_sub_folders_object.folders)
user_sub_folders = _add_object_to_folder(feed.pk, folder, user_sub_folders)
user_sub_folders_object.folders = json.encode(user_sub_folders)
user_sub_folders_object.save()
feed.setup_feed_for_premium_subscribers()
if feed.last_update < datetime.datetime.utcnow() - datetime.timedelta(days=1):
feed.update()
return code, message, us
def mark_feed_read(self):
now = datetime.datetime.utcnow()
@ -332,4 +392,17 @@ class Feature(models.Model):
class Meta:
ordering = ["-date"]
def _add_object_to_folder(obj, folder, folders):
if not folder:
folders.append(obj)
return folders
for k, v in enumerate(folders):
if isinstance(v, dict):
for f_k, f_v in v.items():
if f_k == folder:
f_v.append(obj)
folders[k][f_k] = _add_object_to_folder(obj, folder, f_v)
return folders

View file

@ -664,59 +664,8 @@ def add_url(request):
code = 0
url = request.POST['url']
folder = request.POST['folder']
feed = None
logging.info(" ---> [%s] ~FRAdding URL: ~SB%s (in %s)" % (request.user, url, folder))
if url:
url = urlnorm.normalize(url)
# See if it exists as a duplicate first
duplicate_feed = DuplicateFeed.objects.filter(duplicate_address=url).order_by('pk')
if duplicate_feed:
feed = [duplicate_feed[0].feed]
else:
feed = Feed.objects.filter(feed_address=url).order_by('pk')
if feed:
feed = feed[0]
else:
try:
feed = fetch_address_from_page(url)
except:
code = -2
message = "This feed has been added, but something went wrong"\
" when downloading it. Maybe the server's busy."
if not feed:
code = -1
message = "That URL does not point to an RSS feed or a website that has an RSS feed."
else:
us, _ = UserSubscription.objects.get_or_create(
feed=feed,
user=request.user,
defaults={
'needs_unread_recalc': True,
'active': True,
}
)
code = 1
message = ""
user_sub_folders_object, created = UserSubscriptionFolders.objects.get_or_create(user=request.user,
defaults={'folders': '[]'}
)
if created:
user_sub_folders = []
else:
user_sub_folders = json.decode(user_sub_folders_object.folders)
user_sub_folders = _add_object_to_folder(feed.pk, folder, user_sub_folders)
user_sub_folders_object.folders = json.encode(user_sub_folders)
user_sub_folders_object.save()
feed.setup_feed_for_premium_subscribers()
if feed.last_update < datetime.datetime.utcnow() - datetime.timedelta(days=1):
feed.update()
code, message, _ = UserSubscription.add_subscription(user=request.user, feed_address=url, folder=folder)
return dict(code=code, message=message)
@ -746,19 +695,6 @@ def add_folder(request):
return dict(code=code, message=message)
def _add_object_to_folder(obj, folder, folders):
if not folder:
folders.append(obj)
return folders
for k, v in enumerate(folders):
if isinstance(v, dict):
for f_k, f_v in v.items():
if f_k == folder:
f_v.append(obj)
folders[k][f_k] = _add_object_to_folder(obj, folder, f_v)
return folders
@ajax_login_required
@json.json_view
def delete_feed(request):

View file

@ -717,8 +717,11 @@ class FeedData(models.Model):
def save(self, *args, **kwargs):
if self.feed_tagline and len(self.feed_tagline) > 1024:
self.feed_tagline = self.feed_tagline[:1024]
super(FeedData, self).save(*args, **kwargs)
try:
super(FeedData, self).save(*args, **kwargs)
except (IntegrityError, OperationError):
self.delete()
class MFeedPage(mongo.Document):
feed_id = mongo.IntField(primary_key=True)

228
media/css/modals.css Normal file
View file

@ -0,0 +1,228 @@
/* ================ */
/* = Modal Dialog = */
/* ================ */
#simplemodal-overlay {
background-color: #101030;
}
#simplemodal-container {
background-color: white;
padding: 8px;
-moz-box-shadow: 8px 8px 15px #505050;
-webkit-box-shadow: 8px 8px 15px #505050;
box-shadow: 8px 8px 15px #505050;
border: 1px solid #303030;
}
/* ========== */
/* = Modals = */
/* ========== */
.NB-modal {
padding: 12px;
position: relative;
}
.NB-modal.NB-signed-out .NB-fieldset {
opacity: .3;
}
.NB-modal.NB-signed-out .NB-fieldset.NB-anonymous-ok {
opacity: 1;
}
.NB-modal .NB-modal-loading,
.NB-modal .NB-loading {
width: 16px;
height: 16px;
float: right;
background: none;
}
.NB-modal .NB-modal-loading.NB-active {
background: transparent url('../img/reader/recycle_spinner.gif') no-repeat 0 0;
}
.NB-modal .NB-loading.NB-active {
background: transparent url('../img/reader/spinner_ball.gif') no-repeat 0 0;
}
.NB-modal h2,
.NB-modal .NB-modal-title {
margin: 0;
padding: 0;
font-size: 22px;
}
.NB-modal h5,
.NB-module h5 {
margin: 0;
padding: 8px 8px 6px;
background-color: #D9DDF9;
text-shadow: 0 1px 0 #F6F6F6;
border-bottom: 1px solid #A0A0A0;
color:#505050;
font-size: 14px;
font-family: "Gill Sans", inherit;
text-transform: uppercase;
font-weight: normal;
overflow: hidden;
position: relative;
}
.NB-modal .NB-modal-field {
margin: 0;
position: relative;
clear: both;
}
.NB-modal .NB-modal-field h5 {
}
.NB-modal .NB-modal-field input[type=text] {
width: 446px;
font-size: 14px;
font-size: 14px;
padding: 2px;
margin: 0px 4px 6px;
border: 1px solid #606060;
-moz-box-shadow:2px 2px 0 #D0D0D0;
-webkit-box-shadow:2px 2px 0 #D0D0D0;
box-shadow:2px 2px 0 #D0D0D0;
}
.NB-modal .NB-modal-field input[type=checkbox] {
margin: 4px 0 0 0px;
float: left;
}
.NB-modal .NB-modal-title {
font-weight: bold;
color: #303030;
text-shadow: 1px 1px 0px #e0e0e0;
}
.NB-modal .NB-modal-subtitle {
margin:12px 0 0;
padding:8px 12px;
font-size: 14px;
position: relative;
background-color: #F6F6F6;
}
.NB-modal .NB-modal-feed-title {
display: block;
margin: 0 40px 0 23px;
text-decoration: none;
color: #272727;
overflow: hidden;
text-shadow: 0 1px 0 #EBF3FA;
}
.NB-modal .NB-modal-feed-image {
float: left;
}
.NB-modal-submit input[type=submit],
.NB-modal-submit .NB-modal-submit-button {
border: 1px solid #606060;
font-size: 12px;
padding: 4px 12px;
text-transform: uppercase;
margin: 2px 4px 2px;
border: 1px solid #606060;
-moz-box-shadow:2px 2px 0 #D0D0D0;
-webkit-box-shadow:2px 2px 0 #D0D0D0;
box-shadow:2px 2px 0 #D0D0D0;
border-radius: 4px;
-moz-border-radius: 4px;
cursor: pointer;
text-decoration: none;
}
.NB-modal-submit .NB-modal-submit-back,
.NB-modal-submit .NB-modal-submit-reset {
background-color: #d5d4dB;
color: #909090;
}
.NB-modal-submit .NB-modal-submit-close {
background-color: #d5d4dB;
color: #909090;
font-weight: bold;
}
.NB-modal-submit .NB-modal-submit-green {
background-color: #217412;
font-weight: bold;
color: #FCFCFC;
}
.NB-modal-submit .NB-modal-submit-delete {
background-color: #7E020D;
font-weight: bold;
color: #FCFCFC;
}
.NB-modal-submit .NB-disabled {
background-color: #d5d4dB;
color: #909090;
border: 1px solid #A0A0A0;
-moz-box-shadow:2px 2px 0 #E6E6E6;
-webkit-box-shadow:2px 2px 0 #E6E6E6;
box-shadow:2px 2px 0 #E6E6E6;
}
.NB-modal .NB-modal-submit {
margin: 16px 0 0 0;
font-size: 13px;
overflow: hidden;
}
.NB-modal img.feed_favicon {
margin: 0 6px 0 0;
vertical-align: middle;
}
.NB-modal .NB-fieldset {
background-color: #F0F0FF;
border-bottom: 1px solid #D0D0D9;
margin: 16px 0 0;
overflow: hidden;
}
.NB-modal .NB-fieldset-fields {
margin: 8px 0 4px 16px;
font-size: 14px;
overflow: hidden;
}
.NB-modal .NB-modal-feed-chooser-container {
float: right;
margin: 16px 0 0;
}
.NB-modal .NB-modal-feed-chooser-container .NB-modal-feed-chooser {
width: 250px;
}
/* ===================== */
/* = Bookmarklet Modal = */
/* ===================== */
.NB-bookmarklet {
font-family: 'Lucida Sans', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif;
font-size: 12px;
}
.NB-bookmarklet .NB-modal-information {
float: right;
margin-top: 10px;
text-transform: uppercase;
color: #909090;
font-size: 10px;
}
.NB-bookmarklet .NB-modal-submit-button {
float: left;
clear: both;
}

View file

@ -2108,22 +2108,6 @@ background: transparent;
}
/* ================ */
/* = Modal Dialog = */
/* ================ */
#simplemodal-overlay {
background-color: #101030;
}
#simplemodal-container {
background-color: white;
padding: 8px;
-moz-box-shadow: 8px 8px 15px #505050;
-webkit-box-shadow: 8px 8px 15px #505050;
box-shadow: 8px 8px 15px #505050;
border: 1px solid #303030;
}
/* ==================== */
/* = OPML Import Form = */
@ -2330,194 +2314,6 @@ a.NB-splash-link:hover {
margin: 0 0 0 4px;
}
/* ========== */
/* = Modals = */
/* ========== */
.NB-modal {
padding: 12px;
position: relative;
}
.NB-modal.NB-signed-out .NB-fieldset {
opacity: .3;
}
.NB-modal.NB-signed-out .NB-fieldset.NB-anonymous-ok {
opacity: 1;
}
.NB-modal .NB-modal-loading,
.NB-modal .NB-loading {
width: 16px;
height: 16px;
float: right;
background: none;
}
.NB-modal .NB-modal-loading.NB-active {
background: transparent url('../img/reader/recycle_spinner.gif') no-repeat 0 0;
}
.NB-modal .NB-loading.NB-active {
background: transparent url('../img/reader/spinner_ball.gif') no-repeat 0 0;
}
.NB-modal h2 {
margin: 0;
padding: 0;
font-size: 130%;
}
.NB-modal h5,
.NB-module h5 {
margin: 0;
padding: 8px 8px 6px;
background-color: #D9DDF9;
text-shadow: 0 1px 0 #F6F6F6;
border-bottom: 1px solid #A0A0A0;
color:#505050;
font-size: 14px;
font-family: "Gill Sans", inherit;
text-transform: uppercase;
font-weight: normal;
overflow: hidden;
position: relative;
}
.NB-modal .NB-modal-field {
margin: 0;
position: relative;
clear: both;
}
.NB-modal .NB-modal-field h5 {
}
.NB-modal .NB-modal-field input[type=text] {
width: 446px;
font-size: 14px;
font-size: 14px;
padding: 2px;
margin: 0px 4px 6px;
border: 1px solid #606060;
-moz-box-shadow:2px 2px 0 #D0D0D0;
-webkit-box-shadow:2px 2px 0 #D0D0D0;
box-shadow:2px 2px 0 #D0D0D0;
}
.NB-modal .NB-modal-field input[type=checkbox] {
margin: 4px 0 0 0px;
float: left;
}
.NB-modal .NB-modal-title {
font-weight: bold;
color: #303030;
text-shadow: 1px 1px 0px #e0e0e0;
}
.NB-modal .NB-modal-subtitle {
margin:12px 0 0;
padding:8px 12px;
font-size: 14px;
position: relative;
background-color: #F6F6F6;
}
.NB-modal .NB-modal-feed-title {
display: block;
margin: 0 40px 0 23px;
text-decoration: none;
color: #272727;
overflow: hidden;
text-shadow: 0 1px 0 #EBF3FA;
}
.NB-modal .NB-modal-feed-image {
float: left;
}
.NB-modal-submit input[type=submit],
.NB-modal-submit .NB-modal-submit-button {
border: 1px solid #606060;
font-size: 12px;
padding: 4px 12px;
text-transform: uppercase;
margin: 2px 4px 2px;
border: 1px solid #606060;
-moz-box-shadow:2px 2px 0 #D0D0D0;
-webkit-box-shadow:2px 2px 0 #D0D0D0;
box-shadow:2px 2px 0 #D0D0D0;
border-radius: 4px;
-moz-border-radius: 4px;
cursor: pointer;
text-decoration: none;
}
.NB-modal-submit .NB-modal-submit-back,
.NB-modal-submit .NB-modal-submit-reset {
background-color: #d5d4dB;
color: #909090;
}
.NB-modal-submit .NB-modal-submit-close {
background-color: #d5d4dB;
color: #909090;
font-weight: bold;
}
.NB-modal-submit .NB-modal-submit-green {
background-color: #217412;
font-weight: bold;
color: #FCFCFC;
}
.NB-modal-submit .NB-modal-submit-delete {
background-color: #7E020D;
font-weight: bold;
color: #FCFCFC;
}
.NB-modal-submit .NB-disabled {
background-color: #d5d4dB;
color: #909090;
border: 1px solid #A0A0A0;
-moz-box-shadow:2px 2px 0 #E6E6E6;
-webkit-box-shadow:2px 2px 0 #E6E6E6;
box-shadow:2px 2px 0 #E6E6E6;
}
.NB-modal .NB-modal-submit {
margin: 16px 0 0 0;
font-size: 13px;
overflow: hidden;
}
.NB-modal img.feed_favicon {
margin: 0 6px 0 0;
vertical-align: middle;
}
.NB-modal .NB-fieldset {
background-color: #F0F0FF;
border-bottom: 1px solid #D0D0D9;
margin: 16px 0 0;
overflow: hidden;
}
.NB-modal .NB-fieldset-fields {
margin: 8px 0 4px 16px;
font-size: 14px;
overflow: hidden;
}
.NB-modal .NB-modal-feed-chooser-container {
float: right;
margin: 16px 0 0;
}
.NB-modal .NB-modal-feed-chooser-container .NB-modal-feed-chooser {
width: 250px;
}
/* ============== */
/* = Classifier = */
/* ============== */

29
media/css/reset.css Normal file
View file

@ -0,0 +1,29 @@
/*------------------------------ RESET + DEFAULT STYLES ---------------------------------*/
/*
Eric Meyer's final reset.css
Source: http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/
*/
.NB-modal div, .NB-modal span,
.NB-modal a, .NB-modal img,
.NB-modal ul, .NB-modal li,
.NB-modal fieldset, .NB-modal form, .NB-modal label {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-weight: inherit;
font-style: inherit;
font-size: 100%;
font-family: inherit;
vertical-align: baseline;
}
.NB-modal :focus {
outline: 0;
}
.NB-modal {
line-height: 1;
color: black;
background: white;
}

View file

@ -1,8 +0,0 @@
NEWSBLUR.generate_bookmarklet = function() {
var $bookmarklet = $.make('a', {
className: 'NB-goodies-bookmarklet-button',
href: "javascript:function newsblur_bookmarklet() { var d=document,z=d.createElement('scr'+'ipt'),b=d.body,l=d.location; try{ if(!b) { throw(0); } z.setAttribute('src',l.protocol+'/'+'/'+'nb.local.host:8000'+'/api/add_site/'+NEWSBLUR.Globals.secret_token+'?url='+encodeURIComponent(l.href)+'&time='+(new Date().getTime())); b.appendChild(z); } catch(e) {alert('Please wait until the page has loaded.');}}newsblur_bookmarklet();void(0)"
}, 'Add to NewsBlur');
return $bookmarklet;
};

View file

@ -0,0 +1,10 @@
NEWSBLUR.generate_bookmarklet = function() {
var href = "javascript:function newsblur_bookmarklet() { var d=document,z=d.createElement('scr'+'ipt'),b=d.body,l=d.location; try{ if(!b) { throw(0); } d.title = '(Adding...) ' + d.title; z.setAttribute('src',l.protocol+'//'+'nb.local.host:8000'+'/api/add_site_load_script/"+NEWSBLUR.Globals.secret_token+"?url='+encodeURIComponent(l.href)+'&time='+(new Date().getTime())); b.appendChild(z); } catch(e) {alert('Please wait until the page has loaded.');}}newsblur_bookmarklet();void(0)";
var $bookmarklet = $.make('a', {
className: 'NB-goodies-bookmarklet-button',
href: href
}, 'Add to NewsBlur');
return $bookmarklet;
};

View file

@ -177,7 +177,6 @@ NEWSBLUR.ReaderAddFeed.prototype = {
},
select: function(e, ui) {
$add.val(ui.item.value);
NEWSBLUR.log(['select', e, ui, ui.item, ui.item.value]);
self.save_add_url();
return false;
}

View file

@ -115,7 +115,7 @@ COMPRESS_JS = {
'js/underscore.js',
'js/newsblur/assetmodel.js',
'js/newsblur/reader.js',
'js/newsblur/bookmarklet.js',
'js/newsblur/generate_bookmarklet.js',
'js/newsblur/reader_classifier.js',
'js/newsblur/reader_add_feed.js',
'js/newsblur/reader_mark_read.js',
@ -136,12 +136,22 @@ COMPRESS_JS = {
),
'output_filename': 'js/paypal-compressed-?.js',
},
'bookmarklet': {
'source_filenames': (
'js/jquery-1.4.3.js',
'js/jquery.newsblur.js',
'js/jquery.simplemodal-1.3.js',
'js/jquery.corners.js',
),
'output_filename': 'js/bookmarklet-compressed-?.js',
},
}
COMPRESS_CSS = {
'all': {
'source_filenames': (
'css/reader.css',
'css/modals.css',
'css/jquery-ui/jquery.theme.css',
'css/jquery.tipsy.css',
),
@ -153,6 +163,13 @@ COMPRESS_CSS = {
),
'output_filename': 'css/paypal-compressed-?.css',
},
'bookmarklet': {
'source_filenames': (
'css/reset.css',
'css/modals.css',
),
'output_filename': 'css/paypal-compressed-?.css',
},
}
COMPRESS_VERSION = True

View file

@ -0,0 +1,163 @@
{% load bookmarklet_includes %}
(function() {
{% include_bookmarklet_js %}
NEWSBLUR.BookmarkletCSS = "{% include_bookmarklet_css %}";
$('head').append('<style>' + NEWSBLUR.BookmarkletCSS + '</style>');
NEWSBLUR.BookmarkletModal = function(options) {
var defaults = {};
this.active = true;
this.username = '{{ user.username }}';
this.folders = {{ folders|safe }};
this.options = $.extend({}, defaults, options);
this.runner();
};
NEWSBLUR.BookmarkletModal.prototype = {
fix_title: function() {
var d = document;
d.title = d.title.replace(/\(Adding\.\.\.\)\s?/g, '');
},
close: function() {
this.active = false;
},
runner: function() {
this.fix_title();
if (this.check_if_on_newsblur()) {
var message = "Drag this button to your bookmark toolbar.";
this.alert(message);
return this.close();
}
this.make_modal();
this.open_modal();
this.$modal.bind('click', $.rescope(this.handle_click, this));
},
alert: function(message) {
alert(message);
},
check_if_on_newsblur: function() {
if (window.location.href.indexOf('newsblur.com/') != -1 ||
window.location.href.indexOf('nb.local.host:8000/') != -1) {
return true;
}
},
make_modal: function() {
var self = this;
this.$modal = $.make('div', { className: 'NB-bookmarklet NB-modal' }, [
$.make('div', { className: 'NB-modal-information' }, [
'Signed in as ',
$.make('b', { style: 'color: #505050' }, this.username)
]),
$.make('div', { className: 'NB-modal-title' }, 'Adding \"'+this.get_page_title()+'\"'),
$.make('div', { className: 'NB-bookmarklet-folder-container NB-modal-submit' }, [
$.make('label', { className: 'NB-bookmarklet-folder-label'}, 'Choose which folder to add this site to:'),
this.make_folders(),
$.make('div', { className: 'NB-modal-submit-button NB-modal-submit-green' }, 'Add this site')
])
]);
},
get_page_title: function() {
var title = document.title;
if (title.length > 20) {
title = title.substr(0, 20) + '...';
}
return title;
},
make_folders: function() {
var folders = this.folders;
var $options = $.make('select', { className: 'NB-folders'});
var $option = $.make('option', { value: '' }, "Top Level");
$options.append($option);
$options = this.make_folder_options($options, folders, '-');
return $options;
},
make_folder_options: function($options, items, depth) {
for (var i in items) {
var item = items[i];
if (typeof item == "object") {
for (var o in item) {
var folder = item[o];
var $option = $.make('option', { value: o }, depth + ' ' + o);
$options.append($option);
$options = this.make_folder_options($options, folder, depth+'-');
}
}
}
return $options;
},
open_modal: function() {
var self = this;
this.$modal.modal({
'minWidth': 600,
'maxWidth': 600,
'overlayClose': true,
'onOpen': function (dialog) {
dialog.overlay.fadeIn(200, function () {
dialog.container.fadeIn(200);
dialog.data.fadeIn(200);
});
},
'onShow': function(dialog) {
$('#simplemodal-container').corner('6px');
},
'onClose': function(dialog) {
dialog.data.hide().empty().remove();
dialog.container.hide().empty().remove();
dialog.overlay.fadeOut(200, function() {
dialog.overlay.empty().remove();
$.modal.close();
self.close();
});
$('.NB-modal-holder').empty().remove();
}
});
},
// ===========
// = Actions =
// ===========
handle_click: function(elem, e) {
var self = this;
$.targetIs(e, { tagSelector: '.NB-add-url-submit' }, function($t, $p) {
e.preventDefault();
self.save_preferences();
});
}
};
if (NEWSBLUR.bookmarklet_modal && NEWSBLUR.bookmarklet_modal.active) {
NEWSBLUR.bookmarklet_modal.fix_title();
return;
}
NEWSBLUR.bookmarklet_modal = new NEWSBLUR.BookmarkletModal();
})();

View file

@ -0,0 +1,30 @@
import os
from django.conf import settings
from django import template
register = template.Library()
@register.simple_tag
def include_bookmarklet_js():
text = []
js_files = settings.COMPRESS_JS['bookmarklet']['source_filenames']
for filename in js_files:
abs_filename = os.path.join(settings.MEDIA_ROOT, filename)
f = open(abs_filename, 'r')
text.append(f.read())
return ''.join(text)
@register.simple_tag
def include_bookmarklet_css():
text = []
css_files = settings.COMPRESS_CSS['bookmarklet']['source_filenames']
for filename in css_files:
abs_filename = os.path.join(settings.MEDIA_ROOT, filename)
f = open(abs_filename, 'r')
css = f.read()
css = css.replace('\"', '\\"').replace('\n', ' ')
text.append(css)
return ''.join(text)