File size: 3,047 Bytes
5fae594
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
// get a bunch of twitter streams
var stuff_to_search_for = 
  [ 'nodejs', 'nodejitsu', 'hadoop', 'couchdb', 'nosql', 'birds', 'dinosaurs'
  , 'fun', 'dscape', 'clown', 'joyent', 'nyc', 'usa', 'portugal'];

// npm install request fast-list clarinet
var request        = require('request');
var fs             = require('fs');
var clarinet       = require('../clarinet');
var p              = 1;
var buffer         = [];
var tweets         = ['['];
var parse_stream   = clarinet.createStream();
var stacklevel     = 0;
var objlevel       = 0;
var found_results  = false;
var notfirst       = false;
var stop_searching = false;
var previous       = '';
var i            = 0;
var on_array     = false;
var array_vals   = [];

function uri (pop) {
  var term;
  if(pop) i++;
  if(stuff_to_search_for[i]) {
    term = stuff_to_search_for[i];
    return 'http://search.twitter.com/search.json?q=' + term +
           '&rpp=100&page=';
  }
  else
    return null;
}

parse_stream.on('openarray', function() {
  previous = '[';
  if(found_results) {
    if(stacklevel !== 0) { buffer.push('['); on_array = true; }
    stacklevel++;
  }
});

parse_stream.on('closearray', function() {
  if(found_results) {
    stacklevel--;
    if(stacklevel === 0) {
      tweets.push(buffer.join(''));
      buffer = [];
      found_results = false;
      if(previous === '[')  // [] means no more results
        stop_searching = true;
    } else {
      buffer.push(array_vals.join(','));
      array_vals = [];
      on_array = false;
      buffer.push(']'); 
    }
  }
  previous = ']';
});

parse_stream.on('openobject', function(name) {
  previous = '{';
  if(found_results) {
    if(objlevel === 0 && notfirst) { buffer.push(','); }
    if(name!=='result_type') { buffer.push('\n'); }
    buffer.push('{"' + name + '": ');
    notfirst = true;
    objlevel++;
  }
});

parse_stream.on('key', function(name) {
  previous = ':';
  if(found_results) {
    buffer.push(', "' + name + '": ');
  }
  if(name==='results' && !found_results) { 
    found_results = true; 
  }
});

parse_stream.on('closeobject', function() {
  previous = '}';
  if(found_results) {
    objlevel--;
    buffer.push('}');
  }
});

parse_stream.on('end', function() {
  previous = '!';
  if(tweets.length === 0) stop_searching = true;
  console.log(tweets.join(''));
});

parse_stream.on('ready', function () {
  var r_uri;
  if(stop_searching) {
    r_uri = uri(true);
    if(r_uri === null) {
      console.log(']');
      return;
    } else { 
      p = 1; 
      stop_searching = false;
    }
  }
  r_uri = r_uri || uri();
  tweets = [];
  
  if(r_uri!==null) {
    request.get(r_uri+p)
      .pipe(parse_stream);
    p++;
  }
});

parse_stream.on('value', function(value) {
  if(found_results) {
    var bla;
    if(typeof value === 'string' || value === null)
      bla = JSON.stringify(value);
    else bla = value;
    if (on_array) array_vals.push(bla); 
    else { buffer.push(bla); }
  }
});

var s_uri = uri();
if(s_uri!==null)
  request.get(uri()+p)
    .pipe(parse_stream);
p++;