summaryrefslogtreecommitdiff
path: root/templates/items.html
blob: 093b211cba0ff46a402cad7222852a12601a1c50 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
<!doctype html>
<html class="no-js" lang="">
    <head>
        <title>RSS Reader</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <style type="text/css">
            body {
                font: 12px Georgia,serif;
            }

            .entries li {
                position: relative;
                list-style: none;
                border: 1px solid #999;
                margin: 0.5em 0;
            }

            .entries {
                margin: 0;
                padding: 0;
            }

            .entries a.headline {
                display: block;
                background: #ddd;
                padding: 1em;
                color: black;
                text-decoration: none;
                font-weight: bolder;
            }

            .entries .highlighted a.headline {
                background-color: #FFFF99;
            }

            .entries li > input.read {
                position: absolute;
                top: 1em;
                right: 1em;
            }

            .entries .content {
                padding: 1em;
                display: none;
            }

            h2 a.mark-all-read {
                display: inline-block;
                position: absolute;
                right: 1em;
            }
        </style>

        <script src="//code.jquery.com/jquery-2.1.1.min.js"></script>

        <script type="text/javascript">
            /**
             * Copyright (c) 2007-2014 Ariel Flesler - aflesler<a>gmail<d>com | http://flesler.blogspot.com
             * Licensed under MIT
             * @author Ariel Flesler
             * @version 1.4.12
             */
            ;(function(a){if(typeof define==='function'&&define.amd){define(['jquery'],a)}else{a(jQuery)}}(function($){var j=$.scrollTo=function(a,b,c){return $(window).scrollTo(a,b,c)};j.defaults={axis:'xy',duration:parseFloat($.fn.jquery)>=1.3?0:1,limit:true};j.window=function(a){return $(window)._scrollable()};$.fn._scrollable=function(){return this.map(function(){var a=this,isWin=!a.nodeName||$.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!isWin)return a;var b=(a.contentWindow||a).document||a.ownerDocument||a;return/webkit/i.test(navigator.userAgent)||b.compatMode=='BackCompat'?b.body:b.documentElement})};$.fn.scrollTo=function(f,g,h){if(typeof g=='object'){h=g;g=0}if(typeof h=='function')h={onAfter:h};if(f=='max')f=9e9;h=$.extend({},j.defaults,h);g=g||h.duration;h.queue=h.queue&&h.axis.length>1;if(h.queue)g/=2;h.offset=both(h.offset);h.over=both(h.over);return this._scrollable().each(function(){if(f==null)return;var d=this,$elem=$(d),targ=f,toff,attr={},win=$elem.is('html,body');switch(typeof targ){case'number':case'string':if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(targ)){targ=both(targ);break}targ=win?$(targ):$(targ,this);if(!targ.length)return;case'object':if(targ.is||targ.style)toff=(targ=$(targ)).offset()}var e=$.isFunction(h.offset)&&h.offset(d,targ)||h.offset;$.each(h.axis.split(''),function(i,a){var b=a=='x'?'Left':'Top',pos=b.toLowerCase(),key='scroll'+b,old=d[key],max=j.max(d,a);if(toff){attr[key]=toff[pos]+(win?0:old-$elem.offset()[pos]);if(h.margin){attr[key]-=parseInt(targ.css('margin'+b))||0;attr[key]-=parseInt(targ.css('border'+b+'Width'))||0}attr[key]+=e[pos]||0;if(h.over[pos])attr[key]+=targ[a=='x'?'width':'height']()*h.over[pos]}else{var c=targ[pos];attr[key]=c.slice&&c.slice(-1)=='%'?parseFloat(c)/100*max:c}if(h.limit&&/^\d+$/.test(attr[key]))attr[key]=attr[key]<=0?0:Math.min(attr[key],max);if(!i&&h.queue){if(old!=attr[key])animate(h.onAfterFirst);delete attr[key]}});animate(h.onAfter);function animate(a){$elem.animate(attr,g,h.easing,a&&function(){a.call(this,targ,h)})}}).end()};j.max=function(a,b){var c=b=='x'?'Width':'Height',scroll='scroll'+c;if(!$(a).is('html,body'))return a[scroll]-$(a)[c.toLowerCase()]();var d='client'+c,html=a.ownerDocument.documentElement,body=a.ownerDocument.body;return Math.max(html[scroll],body[scroll])-Math.min(html[d],body[d])};function both(a){return $.isFunction(a)||typeof a=='object'?a:{top:a,left:a}};return j}));
        </script>

        <script type="text/javascript">
            $(document).ready(function() {
                $("a.headline").on("click", function(event) {
                    event.preventDefault();
                    var target = $(event.target);
                    target.off("click");
                    $.ajax(target.parents("li").attr("data-url")).done(function(data) {
                        if (data.no_content) {
                            var win = window.open(data.url, "_blank");
                            if (!win) {
                                alert("Popups are blocked");
                            }
                        } else {
                            var contentArea = target.siblings("div.content");
                            contentArea.append(data.content);
                            contentArea.show();
                        }
                        target.parents("li").attr("data-target-url", data.url);
                        target.siblings("input[type=checkbox]").attr("checked", true);
                        target.siblings("input[type=checkbox]").trigger("change");
                    });
                    return false;
                });

                $("a.headline").on("mark-read", function(event) {
                    var box = $(event.target).next("input[type=checkbox]");
                    box.attr("checked", !box.is(":checked"));
                    box.trigger("change");
                });

                $(".entries li > input[type=checkbox]").on("change", function(event) {
                    var value = $(event.target).is(':checked') ? 1 : 0;
                    $.ajax($(event.target).parents("li").attr("data-url"), {
                        data: { read: value },
                        type: "POST"
                    });
                });

                $("h2 a.mark-all-read").on("click", function(event) {
                    event.preventDefault();

                    $(event.target).parents(".feed").find("a.headline").each(function(idx, box) {
                        $(box).trigger("mark-read");
                    });

                    return false;
                });

                $(document).on("keydown", function(event) {
                    var element = $(".entries .highlighted");

                    switch (event.keyCode) {
                        case 74: // J
                            element.removeClass("highlighted");

                            if (element.length == 0) {
                                $(".entries li:first-child").first().addClass("highlighted");
                            } else {
                                var next = element.next("li");
                                if (next.length != 1) {
                                    element.parents(".feed").next(".feed").find("li").first().addClass("highlighted");
                                } else {
                                    next.addClass("highlighted");
                                }
                            }

                            $.scrollTo(".highlighted", { margin: true, offset: -50 });
                        break;
                        case 75: // K
                            element.removeClass("highlighted");

                            if (element.length == 0) {
                                $(".entries li:first-child").first().addClass("highlighted");
                            } else {
                                var prev = element.prev("li");
                                if (prev.length != 1) {
                                    element.parents(".feed").prev(".feed").find("li").last().addClass("highlighted");
                                } else {
                                    prev.addClass("highlighted");
                                }
                            }

                            $.scrollTo(".highlighted", { margin: true, offset: -50 });
                        break;
                        case 79: // O
                            var target = $(element).attr("data-target-url");
                            if (target) {
                                window.open(target, "_blank");
                            } else {
                                element.find("a.headline").trigger("click");
                            }
                        break;
                        case 82: // R
                            element.find("a.headline").trigger("mark-read");
                        break;
                    }
                });
            });
        </script>
    </head>
    <body>
        <h1>RSS Entries</h1>
        {% for feed, records in items %}
        <div class="feed">
            <h2>{{ feed }} <a href="#" class="mark-all-read">Mark All Read</a></h2>
            <ul class="entries">
                {% for record in records %}
                <li data-url="{{ record.self_link }}" >
                <a class="headline" href="{{ record.url }}">{{ record.title }}</a>
                <input type="checkbox" class="read" />
                <div class="content"></div>
                </li>
                {% endfor %}
            </ul>
        </div>
        {% endfor %}
    </body>
</html>