mirror of
https://github.com/viq/NewsBlur.git
synced 2025-09-18 21:43:31 +00:00
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:
parent
dbf664ebb5
commit
567840ffff
14 changed files with 599 additions and 287 deletions
|
@ -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'),
|
||||
)
|
||||
|
|
|
@ -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,
|
||||
}
|
|
@ -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
|
|
@ -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):
|
||||
|
|
|
@ -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
228
media/css/modals.css
Normal 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;
|
||||
}
|
|
@ -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
29
media/css/reset.css
Normal 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;
|
||||
}
|
|
@ -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;
|
||||
};
|
10
media/js/newsblur/generate_bookmarklet.js
Normal file
10
media/js/newsblur/generate_bookmarklet.js
Normal 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;
|
||||
};
|
|
@ -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;
|
||||
}
|
||||
|
|
19
settings.py
19
settings.py
|
@ -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
|
||||
|
|
163
templates/api/bookmarklet_subscribe.js
Normal file
163
templates/api/bookmarklet_subscribe.js
Normal 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();
|
||||
|
||||
})();
|
30
utils/templatetags/bookmarklet_includes.py
Normal file
30
utils/templatetags/bookmarklet_includes.py
Normal 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)
|
||||
|
Loading…
Add table
Reference in a new issue