Statistics
| Branch: | Tag: | Revision:

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));