root / cloudcms / static / cloudcms / js / twitter / jquery.twitter.js @ c1468bcc
History | View | Annotate | Download (7.4 kB)
1 | c1468bcc | Kostas Papadimitriou | /*
|
---|---|---|---|
2 | c1468bcc | Kostas Papadimitriou | * Twitter Search Plugin jquery.twitter.js
|
3 | c1468bcc | Kostas Papadimitriou | * http://code.bocoup.com/jquery-twitter-plugin/
|
4 | c1468bcc | Kostas Papadimitriou | *
|
5 | c1468bcc | Kostas Papadimitriou | * Copyright (c) 2010 Bocoup, LLC
|
6 | c1468bcc | Kostas Papadimitriou | * Authors: Boaz Sender, Rick Waldron, Nick Cammarata
|
7 | c1468bcc | Kostas Papadimitriou | * Dual licensed under the MIT and GPL licenses.
|
8 | c1468bcc | Kostas Papadimitriou | * http://code.bocoup.com/license/
|
9 | c1468bcc | Kostas Papadimitriou | *
|
10 | c1468bcc | Kostas Papadimitriou | */
|
11 | c1468bcc | Kostas Papadimitriou | var linkify = linkify || function() {}; |
12 | c1468bcc | Kostas Papadimitriou | ;(function($, linkify) { |
13 | c1468bcc | Kostas Papadimitriou | |
14 | c1468bcc | Kostas Papadimitriou | var
|
15 | c1468bcc | Kostas Papadimitriou | mention = function( str ) { |
16 | c1468bcc | Kostas Papadimitriou | return str.replace("/[@]+[A-Za-z0-9-_]+/ig", function( username ) { |
17 | c1468bcc | Kostas Papadimitriou | return username.link("http://twitter.com/"+ username.replace("@","") ); |
18 | c1468bcc | Kostas Papadimitriou | }); |
19 | c1468bcc | Kostas Papadimitriou | }, |
20 | c1468bcc | Kostas Papadimitriou | hashtags = function( str ) { |
21 | c1468bcc | Kostas Papadimitriou | return str.replace("/[#]+[A-Za-z0-9-_]+/ig", function( tag ) { |
22 | c1468bcc | Kostas Papadimitriou | return tag.link("http://search.twitter.com/search?q="+tag.replace("#","%23")); |
23 | c1468bcc | Kostas Papadimitriou | }); |
24 | c1468bcc | Kostas Papadimitriou | }; |
25 | c1468bcc | Kostas Papadimitriou | |
26 | c1468bcc | Kostas Papadimitriou | $.twitter = function (options, callback) { |
27 | c1468bcc | Kostas Papadimitriou | // Fail if the options arg is not set
|
28 | c1468bcc | Kostas Papadimitriou | if ( !options ) {
|
29 | c1468bcc | Kostas Papadimitriou | return false; |
30 | c1468bcc | Kostas Papadimitriou | } |
31 | c1468bcc | Kostas Papadimitriou | |
32 | c1468bcc | Kostas Papadimitriou | // Set a temporary default query object
|
33 | c1468bcc | Kostas Papadimitriou | var query,
|
34 | c1468bcc | Kostas Papadimitriou | // Set up a string to be used later in the case that exclusions have been set
|
35 | c1468bcc | Kostas Papadimitriou | exclusionsStr = "",
|
36 | c1468bcc | Kostas Papadimitriou | // Set up a regex to be used later in the case that exclusions have been set
|
37 | c1468bcc | Kostas Papadimitriou | exclusionsExp = new RegExp(false); |
38 | c1468bcc | Kostas Papadimitriou | |
39 | c1468bcc | Kostas Papadimitriou | // If options is a string use it as standalone query
|
40 | c1468bcc | Kostas Papadimitriou | if ( typeof options === "string" ) { |
41 | c1468bcc | Kostas Papadimitriou | query = $.extend({}, $.twitter.opts, { |
42 | c1468bcc | Kostas Papadimitriou | q: options
|
43 | c1468bcc | Kostas Papadimitriou | }); |
44 | c1468bcc | Kostas Papadimitriou | // Else prepare the options object to be serialized
|
45 | c1468bcc | Kostas Papadimitriou | } else {
|
46 | c1468bcc | Kostas Papadimitriou | // If a limit is set, add it to the query object
|
47 | c1468bcc | Kostas Papadimitriou | options.rpp = options.limit ? options.limit : options.rpp; |
48 | c1468bcc | Kostas Papadimitriou | |
49 | c1468bcc | Kostas Papadimitriou | // If no limit is set, make the limit the rpp
|
50 | c1468bcc | Kostas Papadimitriou | options.limit = options.limit ? options.limit : options.rpp; |
51 | c1468bcc | Kostas Papadimitriou | |
52 | c1468bcc | Kostas Papadimitriou | // If there are exlusions, turn them into a regex string
|
53 | c1468bcc | Kostas Papadimitriou | exclusionsStr = options.exclusions ? options.exclusions.replace(" ", "|") : false; |
54 | c1468bcc | Kostas Papadimitriou | |
55 | c1468bcc | Kostas Papadimitriou | // If there are exlusions, turn the regex string we just made into a RegExp
|
56 | c1468bcc | Kostas Papadimitriou | exclusionsExp = exclusionsStr ? new RegExp( exclusionsStr ) : false; |
57 | c1468bcc | Kostas Papadimitriou | |
58 | c1468bcc | Kostas Papadimitriou | // Make a new object that is a merger of the options passed in with the default $.twitter.opts object
|
59 | c1468bcc | Kostas Papadimitriou | // and assign it to the query variable
|
60 | c1468bcc | Kostas Papadimitriou | query = $.extend({}, $.twitter.opts, options); |
61 | c1468bcc | Kostas Papadimitriou | |
62 | c1468bcc | Kostas Papadimitriou | // If there are exclusions, or replies or retweets are set to false, multiply the results to ask for from twitter by ten
|
63 | c1468bcc | Kostas Papadimitriou | // We need to do this so that we have some meat to work with if the exclusions are common
|
64 | c1468bcc | Kostas Papadimitriou | query.rpp = query.exclusions || !query.replies || !query.retweets ? (query.rpp * 10) : query.rpp;
|
65 | c1468bcc | Kostas Papadimitriou | |
66 | c1468bcc | Kostas Papadimitriou | } |
67 | c1468bcc | Kostas Papadimitriou | |
68 | c1468bcc | Kostas Papadimitriou | |
69 | c1468bcc | Kostas Papadimitriou | // Call Twitter JSONP
|
70 | c1468bcc | Kostas Papadimitriou | $.getJSON("http://search.twitter.com/search.json?callback=?", query, function(tweets){ |
71 | c1468bcc | Kostas Papadimitriou | callback(tweets, query, exclusionsExp); |
72 | c1468bcc | Kostas Papadimitriou | }); |
73 | c1468bcc | Kostas Papadimitriou | }; |
74 | c1468bcc | Kostas Papadimitriou | |
75 | c1468bcc | Kostas Papadimitriou | $.fn.twitter = function( options ) { |
76 | c1468bcc | Kostas Papadimitriou | // Fail gracefully if the options arg is not set
|
77 | c1468bcc | Kostas Papadimitriou | // return the jQuery obj so that chaining does not break
|
78 | c1468bcc | Kostas Papadimitriou | if ( !options ) {
|
79 | c1468bcc | Kostas Papadimitriou | return this; |
80 | c1468bcc | Kostas Papadimitriou | } |
81 | c1468bcc | Kostas Papadimitriou | |
82 | c1468bcc | Kostas Papadimitriou | // Begin to iterate over the jQuery collection that the method was called on
|
83 | c1468bcc | Kostas Papadimitriou | return this.each(function () { |
84 | c1468bcc | Kostas Papadimitriou | // Cache `this`
|
85 | c1468bcc | Kostas Papadimitriou | var $this = $(this); |
86 | c1468bcc | Kostas Papadimitriou | |
87 | c1468bcc | Kostas Papadimitriou | $.twitter(options, function( tweets, query, exclusionsExp ) { |
88 | c1468bcc | Kostas Papadimitriou | //Create and cache a new UL
|
89 | c1468bcc | Kostas Papadimitriou | var $tweets = $("<ul>"), |
90 | c1468bcc | Kostas Papadimitriou | // Create a counter variable to count up how many tweets we have rendered
|
91 | c1468bcc | Kostas Papadimitriou | // unfortunately we have to do this, because exclusions, retweet booleans and replies booleans
|
92 | c1468bcc | Kostas Papadimitriou | // are not supported by the Twitter Search API
|
93 | c1468bcc | Kostas Papadimitriou | limitInt = 0,
|
94 | c1468bcc | Kostas Papadimitriou | i; |
95 | c1468bcc | Kostas Papadimitriou | |
96 | c1468bcc | Kostas Papadimitriou | // If there are results to work with
|
97 | c1468bcc | Kostas Papadimitriou | if ( tweets.results && tweets.results.length ) {
|
98 | c1468bcc | Kostas Papadimitriou | |
99 | c1468bcc | Kostas Papadimitriou | // Iterate over returned tweets
|
100 | c1468bcc | Kostas Papadimitriou | for ( i in tweets.results ) { |
101 | c1468bcc | Kostas Papadimitriou | |
102 | c1468bcc | Kostas Papadimitriou | // Cache tweet content
|
103 | c1468bcc | Kostas Papadimitriou | var tweet = tweets.results[i],
|
104 | c1468bcc | Kostas Papadimitriou | // Set a variable to determine weather replies are set to false, and if so, weather the tweet starts with a reply
|
105 | c1468bcc | Kostas Papadimitriou | allowReply = !query.replies && tweet.to_user_id ? false : true, |
106 | c1468bcc | Kostas Papadimitriou | // Set a variable to determine weather retweets are set to false, and if so, weather the tweet starts with a retweet
|
107 | c1468bcc | Kostas Papadimitriou | allowRetweet = !query.retweets && tweet.text.slice(0,2) === "RT" ? false : true; |
108 | c1468bcc | Kostas Papadimitriou | |
109 | c1468bcc | Kostas Papadimitriou | // Only proceed if allow reply is false
|
110 | c1468bcc | Kostas Papadimitriou | if ( !allowReply ) {
|
111 | c1468bcc | Kostas Papadimitriou | continue;
|
112 | c1468bcc | Kostas Papadimitriou | } |
113 | c1468bcc | Kostas Papadimitriou | |
114 | c1468bcc | Kostas Papadimitriou | // Only proceed if allow retweet is false
|
115 | c1468bcc | Kostas Papadimitriou | if ( !allowRetweet ) {
|
116 | c1468bcc | Kostas Papadimitriou | continue;
|
117 | c1468bcc | Kostas Papadimitriou | } |
118 | c1468bcc | Kostas Papadimitriou | |
119 | c1468bcc | Kostas Papadimitriou | // If exlusions set and none of the exlusions is found in the tweet then add it to the DOM
|
120 | c1468bcc | Kostas Papadimitriou | if ( exclusionsExp && exclusionsExp.test(tweet.text) ) {
|
121 | c1468bcc | Kostas Papadimitriou | continue;
|
122 | c1468bcc | Kostas Papadimitriou | } |
123 | c1468bcc | Kostas Papadimitriou | |
124 | c1468bcc | Kostas Papadimitriou | // Create and cache new LI
|
125 | c1468bcc | Kostas Papadimitriou | var $tweet = $("<li/>", { |
126 | c1468bcc | Kostas Papadimitriou | "class": "tweet" |
127 | c1468bcc | Kostas Papadimitriou | }); |
128 | c1468bcc | Kostas Papadimitriou | |
129 | c1468bcc | Kostas Papadimitriou | // Make the avatar, and append it to the $tweet
|
130 | c1468bcc | Kostas Papadimitriou | if ( query.avatar === true ) { |
131 | c1468bcc | Kostas Papadimitriou | $tweet.append($("<a/>", { |
132 | c1468bcc | Kostas Papadimitriou | href: "http://twitter.com/" + tweet.from_user, |
133 | c1468bcc | Kostas Papadimitriou | html: "<img src='" + tweet.profile_image_url + "'/>" |
134 | c1468bcc | Kostas Papadimitriou | })); |
135 | c1468bcc | Kostas Papadimitriou | } |
136 | c1468bcc | Kostas Papadimitriou | |
137 | c1468bcc | Kostas Papadimitriou | // Make the tweet text, and append it to the $tweet, then to the parent
|
138 | c1468bcc | Kostas Papadimitriou | $tweet.append($("<span>", { |
139 | c1468bcc | Kostas Papadimitriou | "class": "content", |
140 | c1468bcc | Kostas Papadimitriou | html: "<a href='http://twitter.com/" + tweet.from_user + "'>@" + tweet.from_user + "</a>: " + mention(hashtags(linkify(tweet.text))) |
141 | c1468bcc | Kostas Papadimitriou | })) |
142 | c1468bcc | Kostas Papadimitriou | // Append tweet to the $tweets ul
|
143 | c1468bcc | Kostas Papadimitriou | .appendTo($tweets);
|
144 | c1468bcc | Kostas Papadimitriou | |
145 | c1468bcc | Kostas Papadimitriou | // Count up our counter variable
|
146 | c1468bcc | Kostas Papadimitriou | limitInt++; |
147 | c1468bcc | Kostas Papadimitriou | |
148 | c1468bcc | Kostas Papadimitriou | // If the counter is equal to the limit, stop rendering tweets
|
149 | c1468bcc | Kostas Papadimitriou | if ( limitInt === query.limit ) {
|
150 | c1468bcc | Kostas Papadimitriou | break;
|
151 | c1468bcc | Kostas Papadimitriou | } |
152 | c1468bcc | Kostas Papadimitriou | } |
153 | c1468bcc | Kostas Papadimitriou | |
154 | c1468bcc | Kostas Papadimitriou | // Inject the $tweets into the DOM
|
155 | c1468bcc | Kostas Papadimitriou | $this.html($tweets); |
156 | c1468bcc | Kostas Papadimitriou | |
157 | c1468bcc | Kostas Papadimitriou | // Else there are no results to work with
|
158 | c1468bcc | Kostas Papadimitriou | } else {
|
159 | c1468bcc | Kostas Papadimitriou | // Update the DOM to reflect that no results were found
|
160 | c1468bcc | Kostas Papadimitriou | $this.html($("<h3/>", { |
161 | c1468bcc | Kostas Papadimitriou | "class": "twitter-notFound", |
162 | c1468bcc | Kostas Papadimitriou | text: query.notFoundText
|
163 | c1468bcc | Kostas Papadimitriou | })); |
164 | c1468bcc | Kostas Papadimitriou | } |
165 | c1468bcc | Kostas Papadimitriou | }); |
166 | c1468bcc | Kostas Papadimitriou | }); |
167 | c1468bcc | Kostas Papadimitriou | }; |
168 | c1468bcc | Kostas Papadimitriou | |
169 | c1468bcc | Kostas Papadimitriou | $.twitter.opts = {
|
170 | c1468bcc | Kostas Papadimitriou | // Number of tweets to get
|
171 | c1468bcc | Kostas Papadimitriou | // not in twitter search api, maps to and supersedes rpp (results per page)
|
172 | c1468bcc | Kostas Papadimitriou | limit: 7, |
173 | c1468bcc | Kostas Papadimitriou | // Space delimited list of strings to exclude (eg: "_ s gr @b")
|
174 | c1468bcc | Kostas Papadimitriou | // not in twitter search api, done in plugin
|
175 | c1468bcc | Kostas Papadimitriou | exclusions: "", |
176 | c1468bcc | Kostas Papadimitriou | // Text to display if no results are found
|
177 | c1468bcc | Kostas Papadimitriou | // not in twitter search api, done in plugin
|
178 | c1468bcc | Kostas Papadimitriou | notFoundText: "No results found on twitter", |
179 | c1468bcc | Kostas Papadimitriou | // Include replies?
|
180 | c1468bcc | Kostas Papadimitriou | // not in twitter search api, done in plugin
|
181 | c1468bcc | Kostas Papadimitriou | replies: true, |
182 | c1468bcc | Kostas Papadimitriou | // Include replies?
|
183 | c1468bcc | Kostas Papadimitriou | // not in twitter search api, done in plugin
|
184 | c1468bcc | Kostas Papadimitriou | retweets: true, |
185 | c1468bcc | Kostas Papadimitriou | // All of these words
|
186 | c1468bcc | Kostas Papadimitriou | ands: "", |
187 | c1468bcc | Kostas Papadimitriou | // This exact phrase
|
188 | c1468bcc | Kostas Papadimitriou | phrase: "", |
189 | c1468bcc | Kostas Papadimitriou | // Any of these words
|
190 | c1468bcc | Kostas Papadimitriou | ors : "", |
191 | c1468bcc | Kostas Papadimitriou | // None of these words
|
192 | c1468bcc | Kostas Papadimitriou | nots: "", |
193 | c1468bcc | Kostas Papadimitriou | // This hashtag
|
194 | c1468bcc | Kostas Papadimitriou | tag : "", |
195 | c1468bcc | Kostas Papadimitriou | // Written in language
|
196 | c1468bcc | Kostas Papadimitriou | lang: "", |
197 | c1468bcc | Kostas Papadimitriou | // From this person
|
198 | c1468bcc | Kostas Papadimitriou | from: "", |
199 | c1468bcc | Kostas Papadimitriou | // To this person
|
200 | c1468bcc | Kostas Papadimitriou | to: "", |
201 | c1468bcc | Kostas Papadimitriou | // Referencing this person
|
202 | c1468bcc | Kostas Papadimitriou | ref: "", |
203 | c1468bcc | Kostas Papadimitriou | // Near this place
|
204 | c1468bcc | Kostas Papadimitriou | near: "", |
205 | c1468bcc | Kostas Papadimitriou | // Within this distance
|
206 | c1468bcc | Kostas Papadimitriou | within: "", |
207 | c1468bcc | Kostas Papadimitriou | // Distance unit (miles or kilometers)
|
208 | c1468bcc | Kostas Papadimitriou | units: "", |
209 | c1468bcc | Kostas Papadimitriou | // Since this date
|
210 | c1468bcc | Kostas Papadimitriou | since: "", |
211 | c1468bcc | Kostas Papadimitriou | // Until this date
|
212 | c1468bcc | Kostas Papadimitriou | until: "", |
213 | c1468bcc | Kostas Papadimitriou | // Attitude: "?" or :)" or ":)"
|
214 | c1468bcc | Kostas Papadimitriou | tude: "", |
215 | c1468bcc | Kostas Papadimitriou | // Containing: "links"
|
216 | c1468bcc | Kostas Papadimitriou | filter: "", |
217 | c1468bcc | Kostas Papadimitriou | // Include retweet?: "retweets"
|
218 | c1468bcc | Kostas Papadimitriou | include: "", |
219 | c1468bcc | Kostas Papadimitriou | // Results per page
|
220 | c1468bcc | Kostas Papadimitriou | rpp: 5, |
221 | c1468bcc | Kostas Papadimitriou | // Default query
|
222 | c1468bcc | Kostas Papadimitriou | q: "", |
223 | c1468bcc | Kostas Papadimitriou | // Add an avatar image of the user
|
224 | c1468bcc | Kostas Papadimitriou | avatar: true |
225 | c1468bcc | Kostas Papadimitriou | }; |
226 | c1468bcc | Kostas Papadimitriou | }(jQuery, linkify)); |