PageRenderTime 36ms CodeModel.GetById 7ms RepoModel.GetById 0ms app.codeStats 0ms

/share/spice/hacker_news/spice.js

http://github.com/duckduckgo/zeroclickinfo-spice
JavaScript | 208 lines | 160 code | 39 blank | 9 comment | 23 complexity | 25d16aab8360539d00684ffd2e25ceb3 MD5 | raw file
Possible License(s): Apache-2.0
  1. //Global Vars
  2. var HN_Global = {};
  3. HN_Global.result = '';
  4. HN_Global.discussions = [];
  5. HN_Global.submissions = [];
  6. HN_Global.user_url = '<a href="http://news.ycombinator.com/user?id=';
  7. HN_Global.item_url = '<a href="http://news.ycombinator.com/item?id=';
  8. function ddg_spice_hacker_news(res) {
  9. var snippet = [];
  10. var terms = res["request"]["q"];
  11. var limit = (res["request"]["limit"] < res["hits"]) ? res["request"]["limit"] : res["hits"];
  12. //At least 1 result
  13. if (res["hits"] > 0) {
  14. HN_Global.discussions = getDiscussions(res,limit);
  15. HN_Global.submissions = getSubmissions(res,limit);
  16. //Display first 3 stories results
  17. //and search for Top Comments and 3 more stories to display
  18. snippet[0] = '';
  19. snippet[1] = '';
  20. snippet[2] = '';
  21. var c0 = 0;
  22. var c1 = 0;
  23. var c2 = 0;
  24. var i = 0;
  25. //Get top stories
  26. while (i < HN_Global.submissions.length) {
  27. HN_Global.result = HN_Global.submissions[i];
  28. if (c0 < 3) {
  29. snippet[0] += submission(HN_Global.submissions, i);
  30. c0++;
  31. }
  32. if (c0 === 3 && c2 < 3 && i > 2) {
  33. snippet[2] += submission(HN_Global.submissions, i);
  34. c2++;
  35. }
  36. if (c0 === 3 && c2 === 3) break;
  37. i++;
  38. }
  39. while (i < HN_Global.discussions.length) {
  40. HN_Global.result = HN_Global.discussions[i];
  41. if (c1 < 3) {
  42. snippet[1] += discussion(HN_Global.submissions, i);
  43. c1++;
  44. }
  45. if (c1 === 3) break;
  46. i++;
  47. }
  48. //Check in case only comments returned
  49. if (c0 === 0){
  50. i = 0;
  51. while (i < limit) {
  52. HN_Global.result = res["results"][i]["item"];
  53. snippet[0] = (HN_Global.result["type"] === "submission") ? submission(res, i) : discussion(res, i);
  54. if (c0 === 3) break;
  55. c0++;
  56. }
  57. }
  58. //Populate items array
  59. items = [];
  60. for (var i = 0; i < 3; i++) {
  61. if (snippet[i]) {
  62. items[i] = [];
  63. switch(i){
  64. case 0:
  65. items[i]['a'] = snippet[0];
  66. items[i]['u'] = 'http://www.hnsearch.com/search#request/all&q=' + encodeURIComponent(res["request"]["q"]);
  67. break;
  68. case 1:
  69. items[i]['a'] = '</br>' + snippet[1];
  70. items[i]['u'] = 'http://www.hnsearch.com/search#request/comments&q=' + encodeURIComponent(res["request"]["q"]);
  71. items[i]['t'] = 'Top Comments';
  72. break;
  73. case 2:
  74. items[i]['a'] = '</br>' + snippet[2];
  75. items[i]['u'] = 'http://www.hnsearch.com/search#request/submissions&q=' + encodeURIComponent(res["request"]["q"]);
  76. items[i]['t'] = 'Other Stories';
  77. break;
  78. }
  79. items[i]['h'] = 'Hacker News' + ' (' + terms + ')';
  80. items[i]['s'] = 'HNSearch';
  81. items[i]['f'] = 1;
  82. }
  83. }
  84. nra(items);
  85. }
  86. }
  87. function discussion (res, i) {
  88. var text = shorten(HN_Global.result["text"], 200);
  89. var div = d.createElement('div');
  90. var div2 = d.createElement('div');
  91. var title = shorten(HN_Global.result["discussion"]["title"]);
  92. //first line (points, who, link, parent, discussion)
  93. var out = text
  94. + ' &nbsp;[by&nbsp;' + HN_Global.user_url + HN_Global.result["username"] + '">'+ HN_Global.result["username"] + '</a>]'
  95. + ' &nbsp;[' + HN_Global.item_url + HN_Global.result["parent_id"] + '">parent</a>] &nbsp;'
  96. + HN_Global.item_url + HN_Global.result["discussion"]["id"] + '">' + title + '</a>'
  97. + '<br />';
  98. div2.innerHTML = out;
  99. YAHOO.util.Dom.setStyle(div2, "padding-bottom", '3px'); //Padding for visual separation
  100. YAHOO.util.Dom.setStyle(div2, "padding-top", '3px');
  101. div.appendChild(div2);
  102. return div.innerHTML;
  103. }
  104. function submission (res, i) {
  105. var domain, url;
  106. var points = (HN_Global.result["points"] === 1) ? HN_Global.result["points"] + ' point' : HN_Global.result["points"] + ' points'
  107. var div = d.createElement('div');
  108. var div2 = d.createElement('div');
  109. //Check for no external link (ie. Ask HN:)
  110. if (HN_Global.result["domain"] === null && HN_Global.result["url"] === null) {
  111. domain = 'news.ycombinator.com';
  112. url = 'http://news.ycombinator.com/item?id=' + HN_Global.result["id"];
  113. } else {
  114. domain = HN_Global.result["domain"];
  115. url = HN_Global.result["url"];
  116. }
  117. var title = shorten(HN_Global.result["title"]);
  118. //first line (title, domain, points, comments)
  119. var out = '<a href="' + url + '">' + title + '</a> &nbsp;'
  120. + '[' + HN_Global.item_url + HN_Global.result["id"] +'">' + HN_Global.result["num_comments"] +' comments</a>] &nbsp;'
  121. + '(' + domain + ', ' + points + ')'
  122. + '<br />';
  123. div2.innerHTML = out;
  124. YAHOO.util.Dom.setStyle(div2, "padding-bottom", '3px'); //Padding for visual separation
  125. YAHOO.util.Dom.setStyle(div2, "padding-top", '3px');
  126. div.appendChild(div2);
  127. return div.innerHTML;
  128. //return out;
  129. }
  130. function shorten (string, length) {
  131. if (length === undefined){
  132. length = 40;
  133. }
  134. if (string.length > length){
  135. return string.slice(0,length) + '...';
  136. } else {
  137. return string;
  138. }
  139. }
  140. function getDiscussions (res, limit) {
  141. var i = 0;
  142. temp = [];
  143. while (i < limit){
  144. HN_Global.result = res["results"][i]["item"];
  145. if (HN_Global.result["type"] === 'comment') temp.push(HN_Global.result);
  146. i++;
  147. }
  148. return temp;
  149. }
  150. function getSubmissions(res,limit) {
  151. var i = 0;
  152. temp = [];
  153. while (i < limit){
  154. HN_Global.result = res["results"][i]["item"];
  155. if (HN_Global.result["type"] === 'submission') temp.push(HN_Global.result);
  156. i++;
  157. }
  158. return temp;
  159. }