Commit 489fe5118141d34aea2bab0f71bbb7e54e56cac8
- Diff rendering mode:
- inline
- side by side
coefficient.rb
(3 / 2)
|   | |||
| 52 | 52 | # XXX: + also breaks it | |
| 53 | 53 | ||
| 54 | 54 | # maybe laconica-0.7.3/lib/util.php:common_replace_urls_callback() ? | |
| 55 | new.gsub!(/(https?:\/\/[a-zA-Z0-9\/._%-+?#]+)/, '<a href=" | ||
| 55 | new.gsub!(/(https?:\/\/([a-zA-Z0-9_%\-+?#\/]|\.(?!\z|\W))+)/, '<a href=" | ||
| 56 | 56 | new.gsub!(/@([0-9a-zA-Z_]+)/, '@<a href="http://twitter.com/\1">\1</a>') | |
| 57 | |||
| 58 | 57 | return new | |
| 59 | 58 | end | |
| 60 | 59 | ||
| … | … | ||
| 65 | 65 | # XXX: != results in = being a link | |
| 66 | 66 | ||
| 67 | 67 | # don't turn eg ' into a link. | |
| 68 | |||
| 69 | # turns #whatever: into #<link>whatever:</link> | ||
| 68 | 70 | ||
| 69 | 71 | # hashtag regexp in laconica is /(?:^|\s)#([A-Za-z0-9_\-\.]{1,64})/ | |
| 70 | 72 | new.gsub!(/#((?!39;)\S+)/, '#<a href="http://identi.ca/tag/\1">\1</a>') |
public/custom.js
(38 / 7)
|   | |||
| 1 | function new_entries() { | ||
| 2 | var total_entries = $(".entry").size(); | ||
| 3 | var old_entries = $(".old").size(); | ||
| 4 | var new_entries = total_entries - old_entries; | ||
| 5 | return [total_entries, new_entries]; | ||
| 6 | } | ||
| 7 | |||
| 8 | function scroll_to() { | ||
| 9 | results = new_entries(); | ||
| 10 | n = results[1]; | ||
| 11 | |||
| 12 | if (typeof scroll_to.counter == 'undefined') { | ||
| 13 | scroll_to.counter = n - 1 | ||
| 14 | // alert("setting counter to " + n); | ||
| 15 | } | ||
| 16 | |||
| 17 | if (scroll_to.counter >= -1) { | ||
| 18 | // alert("scrolling to " + scroll_to.counter); | ||
| 19 | $.scrollTo(".entry:eq(" + scroll_to.counter + ")", 250); | ||
| 20 | scroll_to.counter = scroll_to.counter - 1; | ||
| 21 | } | ||
| 22 | } | ||
| 23 | |||
| 1 | 24 | function reply(origin, reply_to_user, reply_to_id) { | |
| 2 | 25 | // alert(origin + " " + reply_to_user + " " + reply_to_id); | |
| 3 | 26 | update_destination(origin); | |
| … | … | ||
| 71 | 71 | return this.animate({opacity: 'toggle'}, speed, easing, callback); | |
| 72 | 72 | } | |
| 73 | 73 | ||
| 74 | $(window).bind('keypress', function (e) { | ||
| 75 | if (e.which == 103) { | ||
| 76 | scroll_to(); | ||
| 77 | } | ||
| 78 | }); | ||
| 79 | |||
| 74 | 80 | $('.domw_reply_to').openDOMWindow( | |
| 75 | 81 | { | |
| 76 | 82 | height:250, | |
| … | … | ||
| 144 | 144 | ||
| 145 | 145 | $(window).load( | |
| 146 | 146 | function () { | |
| 147 | var total_entries = $(".entry").size(); | ||
| 148 | var old_entries = $(".old").size(); | ||
| 149 | var new_entries = total_entries - old_entries; | ||
| 150 | $("#num_of_entries").html( new_entries + " / " + | ||
| 151 | total_entries + " new<br/>" ); | ||
| 147 | res = new_entries() | ||
| 148 | $("#num_of_entries").html( res[1] + " / " + | ||
| 149 | res[0] + " new<br/>" ); | ||
| 152 | 150 | }); | |
| 153 | 151 | ||
| 154 | 152 | $("#update_link").click( | |
| … | … | ||
| 165 | 165 | update_destination("identica"); | |
| 166 | 166 | update_in_reply_to(""); | |
| 167 | 167 | clear_textentry(); | |
| 168 | $(".post").fadeToggle("fast"); | ||
| 169 | // $("#post_textarea").focus(); | ||
| 168 | if ( $(".post").is(":visible") ) { | ||
| 169 | $(".post").fadeToggle("fast"); | ||
| 170 | } else { | ||
| 171 | $(".post").fadeToggle("fast") | ||
| 172 | $("#post_textarea").focus(); | ||
| 173 | } | ||
| 170 | 174 | }); | |
| 171 | 175 | }); | |
| 172 | 176 |
public/jquery.scrollTo.js
(215 / 0)
|   | |||
| 1 | /** | ||
| 2 | * jQuery.ScrollTo | ||
| 3 | * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com | ||
| 4 | * Dual licensed under MIT and GPL. | ||
| 5 | * Date: 5/25/2009 | ||
| 6 | * | ||
| 7 | * @projectDescription Easy element scrolling using jQuery. | ||
| 8 | * http://flesler.blogspot.com/2007/10/jqueryscrollto.html | ||
| 9 | * Works with jQuery +1.2.6. Tested on FF 2/3, IE 6/7/8, Opera 9.5/6, Safari 3, Chrome 1 on WinXP. | ||
| 10 | * | ||
| 11 | * @author Ariel Flesler | ||
| 12 | * @version 1.4.2 | ||
| 13 | * | ||
| 14 | * @id jQuery.scrollTo | ||
| 15 | * @id jQuery.fn.scrollTo | ||
| 16 | * @param {String, Number, DOMElement, jQuery, Object} target Where to scroll the matched elements. | ||
| 17 | * The different options for target are: | ||
| 18 | * - A number position (will be applied to all axes). | ||
| 19 | * - A string position ('44', '100px', '+=90', etc ) will be applied to all axes | ||
| 20 | * - A jQuery/DOM element ( logically, child of the element to scroll ) | ||
| 21 | * - A string selector, that will be relative to the element to scroll ( 'li:eq(2)', etc ) | ||
| 22 | * - A hash { top:x, left:y }, x and y can be any kind of number/string like above. | ||
| 23 | * - A percentage of the container's dimension/s, for example: 50% to go to the middle. | ||
| 24 | * - The string 'max' for go-to-end. | ||
| 25 | * @param {Number} duration The OVERALL length of the animation, this argument can be the settings object instead. | ||
| 26 | * @param {Object,Function} settings Optional set of settings or the onAfter callback. | ||
| 27 | * @option {String} axis Which axis must be scrolled, use 'x', 'y', 'xy' or 'yx'. | ||
| 28 | * @option {Number} duration The OVERALL length of the animation. | ||
| 29 | * @option {String} easing The easing method for the animation. | ||
| 30 | * @option {Boolean} margin If true, the margin of the target element will be deducted from the final position. | ||
| 31 | * @option {Object, Number} offset Add/deduct from the end position. One number for both axes or { top:x, left:y }. | ||
| 32 | * @option {Object, Number} over Add/deduct the height/width multiplied by 'over', can be { top:x, left:y } when using both axes. | ||
| 33 | * @option {Boolean} queue If true, and both axis are given, the 2nd axis will only be animated after the first one ends. | ||
| 34 | * @option {Function} onAfter Function to be called after the scrolling ends. | ||
| 35 | * @option {Function} onAfterFirst If queuing is activated, this function will be called after the first scrolling ends. | ||
| 36 | * @return {jQuery} Returns the same jQuery object, for chaining. | ||
| 37 | * | ||
| 38 | * @desc Scroll to a fixed position | ||
| 39 | * @example $('div').scrollTo( 340 ); | ||
| 40 | * | ||
| 41 | * @desc Scroll relatively to the actual position | ||
| 42 | * @example $('div').scrollTo( '+=340px', { axis:'y' } ); | ||
| 43 | * | ||
| 44 | * @dec Scroll using a selector (relative to the scrolled element) | ||
| 45 | * @example $('div').scrollTo( 'p.paragraph:eq(2)', 500, { easing:'swing', queue:true, axis:'xy' } ); | ||
| 46 | * | ||
| 47 | * @ Scroll to a DOM element (same for jQuery object) | ||
| 48 | * @example var second_child = document.getElementById('container').firstChild.nextSibling; | ||
| 49 | * $('#container').scrollTo( second_child, { duration:500, axis:'x', onAfter:function(){ | ||
| 50 | * alert('scrolled!!'); | ||
| 51 | * }}); | ||
| 52 | * | ||
| 53 | * @desc Scroll on both axes, to different values | ||
| 54 | * @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } ); | ||
| 55 | */ | ||
| 56 | ;(function( $ ){ | ||
| 57 | |||
| 58 | var $scrollTo = $.scrollTo = function( target, duration, settings ){ | ||
| 59 | $(window).scrollTo( target, duration, settings ); | ||
| 60 | }; | ||
| 61 | |||
| 62 | $scrollTo.defaults = { | ||
| 63 | axis:'xy', | ||
| 64 | duration: parseFloat($.fn.jquery) >= 1.3 ? 0 : 1 | ||
| 65 | }; | ||
| 66 | |||
| 67 | // Returns the element that needs to be animated to scroll the window. | ||
| 68 | // Kept for backwards compatibility (specially for localScroll & serialScroll) | ||
| 69 | $scrollTo.window = function( scope ){ | ||
| 70 | return $(window)._scrollable(); | ||
| 71 | }; | ||
| 72 | |||
| 73 | // Hack, hack, hack :) | ||
| 74 | // Returns the real elements to scroll (supports window/iframes, documents and regular nodes) | ||
| 75 | $.fn._scrollable = function(){ | ||
| 76 | return this.map(function(){ | ||
| 77 | var elem = this, | ||
| 78 | isWin = !elem.nodeName || $.inArray( elem.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) != -1; | ||
| 79 | |||
| 80 | if( !isWin ) | ||
| 81 | return elem; | ||
| 82 | |||
| 83 | var doc = (elem.contentWindow || elem).document || elem.ownerDocument || elem; | ||
| 84 | |||
| 85 | return $.browser.safari || doc.compatMode == 'BackCompat' ? | ||
| 86 | doc.body : | ||
| 87 | doc.documentElement; | ||
| 88 | }); | ||
| 89 | }; | ||
| 90 | |||
| 91 | $.fn.scrollTo = function( target, duration, settings ){ | ||
| 92 | if( typeof duration == 'object' ){ | ||
| 93 | settings = duration; | ||
| 94 | duration = 0; | ||
| 95 | } | ||
| 96 | if( typeof settings == 'function' ) | ||
| 97 | settings = { onAfter:settings }; | ||
| 98 | |||
| 99 | if( target == 'max' ) | ||
| 100 | target = 9e9; | ||
| 101 | |||
| 102 | settings = $.extend( {}, $scrollTo.defaults, settings ); | ||
| 103 | // Speed is still recognized for backwards compatibility | ||
| 104 | duration = duration || settings.speed || settings.duration; | ||
| 105 | // Make sure the settings are given right | ||
| 106 | settings.queue = settings.queue && settings.axis.length > 1; | ||
| 107 | |||
| 108 | if( settings.queue ) | ||
| 109 | // Let's keep the overall duration | ||
| 110 | duration /= 2; | ||
| 111 | settings.offset = both( settings.offset ); | ||
| 112 | settings.over = both( settings.over ); | ||
| 113 | |||
| 114 | return this._scrollable().each(function(){ | ||
| 115 | var elem = this, | ||
| 116 | $elem = $(elem), | ||
| 117 | targ = target, toff, attr = {}, | ||
| 118 | win = $elem.is('html,body'); | ||
| 119 | |||
| 120 | switch( typeof targ ){ | ||
| 121 | // A number will pass the regex | ||
| 122 | case 'number': | ||
| 123 | case 'string': | ||
| 124 | if( /^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(targ) ){ | ||
| 125 | targ = both( targ ); | ||
| 126 | // We are done | ||
| 127 | break; | ||
| 128 | } | ||
| 129 | // Relative selector, no break! | ||
| 130 | targ = $(targ,this); | ||
| 131 | case 'object': | ||
| 132 | // DOMElement / jQuery | ||
| 133 | if( targ.is || targ.style ) | ||
| 134 | // Get the real position of the target | ||
| 135 | toff = (targ = $(targ)).offset(); | ||
| 136 | } | ||
| 137 | $.each( settings.axis.split(''), function( i, axis ){ | ||
| 138 | var Pos = axis == 'x' ? 'Left' : 'Top', | ||
| 139 | pos = Pos.toLowerCase(), | ||
| 140 | key = 'scroll' + Pos, | ||
| 141 | old = elem[key], | ||
| 142 | max = $scrollTo.max(elem, axis); | ||
| 143 | |||
| 144 | if( toff ){// jQuery / DOMElement | ||
| 145 | attr[key] = toff[pos] + ( win ? 0 : old - $elem.offset()[pos] ); | ||
| 146 | |||
| 147 | // If it's a dom element, reduce the margin | ||
| 148 | if( settings.margin ){ | ||
| 149 | attr[key] -= parseInt(targ.css('margin'+Pos)) || 0; | ||
| 150 | attr[key] -= parseInt(targ.css('border'+Pos+'Width')) || 0; | ||
| 151 | } | ||
| 152 | |||
| 153 | attr[key] += settings.offset[pos] || 0; | ||
| 154 | |||
| 155 | if( settings.over[pos] ) | ||
| 156 | // Scroll to a fraction of its width/height | ||
| 157 | attr[key] += targ[axis=='x'?'width':'height']() * settings.over[pos]; | ||
| 158 | }else{ | ||
| 159 | var val = targ[pos]; | ||
| 160 | // Handle percentage values | ||
| 161 | attr[key] = val.slice && val.slice(-1) == '%' ? | ||
| 162 | parseFloat(val) / 100 * max | ||
| 163 | : val; | ||
| 164 | } | ||
| 165 | |||
| 166 | // Number or 'number' | ||
| 167 | if( /^\d+$/.test(attr[key]) ) | ||
| 168 | // Check the limits | ||
| 169 | attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max ); | ||
| 170 | |||
| 171 | // Queueing axes | ||
| 172 | if( !i && settings.queue ){ | ||
| 173 | // Don't waste time animating, if there's no need. | ||
| 174 | if( old != attr[key] ) | ||
| 175 | // Intermediate animation | ||
| 176 | animate( settings.onAfterFirst ); | ||
| 177 | // Don't animate this axis again in the next iteration. | ||
| 178 | delete attr[key]; | ||
| 179 | } | ||
| 180 | }); | ||
| 181 | |||
| 182 | animate( settings.onAfter ); | ||
| 183 | |||
| 184 | function animate( callback ){ | ||
| 185 | $elem.animate( attr, duration, settings.easing, callback && function(){ | ||
| 186 | callback.call(this, target, settings); | ||
| 187 | }); | ||
| 188 | }; | ||
| 189 | |||
| 190 | }).end(); | ||
| 191 | }; | ||
| 192 | |||
| 193 | // Max scrolling position, works on quirks mode | ||
| 194 | // It only fails (not too badly) on IE, quirks mode. | ||
| 195 | $scrollTo.max = function( elem, axis ){ | ||
| 196 | var Dim = axis == 'x' ? 'Width' : 'Height', | ||
| 197 | scroll = 'scroll'+Dim; | ||
| 198 | |||
| 199 | if( !$(elem).is('html,body') ) | ||
| 200 | return elem[scroll] - $(elem)[Dim.toLowerCase()](); | ||
| 201 | |||
| 202 | var size = 'client' + Dim, | ||
| 203 | html = elem.ownerDocument.documentElement, | ||
| 204 | body = elem.ownerDocument.body; | ||
| 205 | |||
| 206 | return Math.max( html[scroll], body[scroll] ) | ||
| 207 | - Math.min( html[size] , body[size] ); | ||
| 208 | |||
| 209 | }; | ||
| 210 | |||
| 211 | function both( val ){ | ||
| 212 | return typeof val == 'object' ? val : { top:val, left:val }; | ||
| 213 | }; | ||
| 214 | |||
| 215 | })( jQuery ); |
public/main.css
(1 / 1)
|   | |||
| 60 | 60 | .text { | |
| 61 | 61 | vertical-align: middle; | |
| 62 | 62 | text-align: left; | |
| 63 | text-overflow: ellipsis; | ||
| 63 | /* text-overflow: ellipsis; */ | ||
| 64 | 64 | overflow: hidden; | |
| 65 | 65 | width: 629px; /* the parent div is like 630px, so give us 1px margin */ | |
| 66 | 66 | } |
tests/unit.rb
(29 / 8)
|   | |||
| 4 | 4 | ||
| 5 | 5 | class UnitTests < Test::Unit::TestCase | |
| 6 | 6 | context "correctly parse urls" do | |
| 7 | setup do | ||
| 8 | end | ||
| 9 | |||
| 10 | 7 | should "correctly parse basic URLs with no slash on the end" do | |
| 11 | assert_equal "<a href=\"http://www.google.com\">http://www.google.com</a>", linkify("http://www.google.com") | ||
| 8 | assert_equal | ||
| 9 | "<a href=\"http://www.google.com\">http://www.google.com</a>", | ||
| 10 | linkify("http://www.google.com") | ||
| 12 | 11 | end | |
| 13 | 12 | ||
| 14 | 13 | should "correctly parse URLs with a slash on the end" do | |
| 15 | assert_equal "<a href=\"http://www.google.com/\">http://www.google.com/</a>", linkify("http://www.google.com/") | ||
| 14 | assert_equal | ||
| 15 | "<a href=\"http://www.google.com/\">http://www.google.com/</a>", | ||
| 16 | linkify("http://www.google.com/") | ||
| 16 | 17 | end | |
| 17 | 18 | ||
| 18 | 19 | should "correctly parse https urls" do | |
| 19 | assert_equal "<a href=\"https://www.google.com/\">https://www.google.com/</a>", linkify("https://www.google.com/") | ||
| 20 | assert_equal | ||
| 21 | "<a href=\"https://www.google.com/\">https://www.google.com/</a>", | ||
| 22 | linkify("https://www.google.com/") | ||
| 20 | 23 | end | |
| 21 | 24 | ||
| 22 | 25 | should "correctly parse urls with pages after a slash" do | |
| 23 | assert_equal "<a href=\"https://www.google.com/link.html\">https://www.google.com/link.html</a>", linkify("https://www.google.com/link.html") | ||
| 26 | assert_equal | ||
| 27 | "<a href=\"https://www.google.com/link.html\">https://www.google.com/link.html</a>", | ||
| 28 | linkify("https://www.google.com/link.html") | ||
| 24 | 29 | end | |
| 25 | 30 | ||
| 26 | 31 | should "correctly parse urls with pages with ? in the url" do | |
| … | … | ||
| 33 | 33 | end | |
| 34 | 34 | ||
| 35 | 35 | should "correctly parse urls ending with a '.'" do | |
| 36 | assert_equal "<a href=\"https://www.google.com/\">https://www.google.com/</a>", linkify("https://www.google.com/.") | ||
| 36 | assert_equal "blah blah <a href=\"https://www.google.com/\">https://www.google.com/</a>. Blah", linkify("blah blah https://www.google.com/. Blah") | ||
| 37 | 37 | end | |
| 38 | 38 | ||
| 39 | should "correctly parse urls ending with a '.' at the end of a string" do | ||
| 40 | assert_equal "blah blah <a href=\"https://www.google.com/\">https://www.google.com/</a>.", linkify("blah blah https://www.google.com/.") | ||
| 41 | end | ||
| 42 | |||
| 39 | 43 | should "correctly parse urls containing #." do | |
| 40 | 44 | assert_equal "<a href=\"https://www.google.com/#anchor\">https://www.google.com/#anchor</a>", linkify("https://www.google.com/#anchor") | |
| 41 | 45 | end | |
| 42 | 46 | ||
| 43 | 47 | should "correctly parse urls containing +." do | |
| 44 | 48 | assert_equal "<a href=\"https://www.google.com/+stuff\">https://www.google.com/+stuff</a>", linkify("https://www.google.com/+stuff") | |
| 49 | end | ||
| 50 | |||
| 51 | should "correctly parse urls containing -" do | ||
| 52 | assert_equal "<a href=\"http://www.hypebot.com/hypebot/2009/06/walmart-shutting-down-drm-download-servers.html\">http://www.hypebot.com/hypebot/2009/06/walmart-shutting-down-drm-download-servers.html</a>", linkify("http://www.hypebot.com/hypebot/2009/06/walmart-shutting-down-drm-download-servers.html") | ||
| 53 | end | ||
| 54 | |||
| 55 | should "correctly parse urls ending with ':'" do | ||
| 56 | assert_equal "some stuff <a href=\"http://google.com/whatever\">http://google.com/whatever</a>: stuff", linkify("some stuff http://google.com/whatever: stuff") | ||
| 57 | end | ||
| 58 | |||
| 59 | should "correctly parse urls ending with ':' at the end of the string" do | ||
| 60 | assert_equal "some stuff <a href=\"http://google.com/whatever\">http://google.com/whatever</a>:", linkify("some stuff http://google.com/whatever:") | ||
| 45 | 61 | end | |
| 46 | 62 | ||
| 47 | 63 | end |
views/timeline.html.erb
(1 / 0)
|   | |||
| 8 | 8 | <script type="text/javascript" src="jquery.js"></script> | |
| 9 | 9 | <script type="text/javascript" src="jquery.DOMWindow.js"></script> | |
| 10 | 10 | <script type="text/javascript" src="jquery.form.js"></script> | |
| 11 | <script type="text/javascript" src="jquery.scrollTo.js"></script> | ||
| 11 | 12 | <script type="text/javascript" src="custom.js"></script> | |
| 12 | 13 | ||
| 13 | 14 | <title>coefficient.</title> |

