PageRenderTime 39ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/dist/bitbucket-widget.js

https://bitbucket.org/aahmed/bitbucket-widget
JavaScript | 106 lines | 88 code | 12 blank | 6 comment | 12 complexity | 8231ae43790a2e10c8f11d593c981b4b MD5 | raw file
  1. /*! bitbucket-widget - v0.0.1 - 2012-11-18
  2. * Copyright (c) 2012 Adam Ahmed; Licensed MIT */
  3. (function($, global) {
  4. $.fn.bitbucketRepo = function(options) {
  5. this.each(function() {
  6. makeBitbucketWidget.call(this, options);
  7. });
  8. return this;
  9. };
  10. /* Set this false if you don't want widgets initialized on ready. */
  11. $.fn.bitbucketRepo.loadOnDocumentReady = true;
  12. $(document).ready(function() {
  13. // allow loadOnDocumentReady to be set even if we've been lazy loaded
  14. // and document ready has already run.
  15. (global.setImmediate || global.setTimeout)(function() {
  16. if (!$.fn.bitbucketRepo.loadOnDocumentReady) {
  17. return;
  18. }
  19. $('.bitbucket-widget').bitbucketRepo();
  20. });
  21. });
  22. function makeBitbucketWidget(options) {
  23. var $el = $(this).addClass('bitbucket-widget');
  24. if ($el.data('bitbucket-repo-inited')) {
  25. return;
  26. }
  27. $el.data('bitbucket-repo-inited', true);
  28. var data = options && options.author && options.repo ?
  29. options.author + '/' + options.repo :
  30. $el.attr('data-repo');
  31. if (!data) {
  32. throw new Error("Either a data-repo attribute or author and repo options are required.");
  33. }
  34. var dataSplit = data.split('/');
  35. if (dataSplit.length !== 2) {
  36. throw new Error("data-repo attribute must be in 'username/repository' format.");
  37. }
  38. var author = dataSplit[0];
  39. var repo = dataSplit[1];
  40. $el.html(
  41. '<div class="repo-header">' +
  42. '<div class="repo-stats"></div>' +
  43. '<span class="repo-name"><a href=""></a> / <a href=""></a></span>' +
  44. ' <span class="repo-last-update"></span>' +
  45. '</div>' +
  46. '<div class="repo-body"></div>');
  47. var $header = $(':first-child', $el);
  48. $header.children('.repo-name')
  49. .children(':first-child')
  50. .attr('href', 'http://www.bitbucket.org/' + author)
  51. .text(author)
  52. .end()
  53. .children().eq(1)
  54. .attr('href', 'http://www.bitbucket.org/' + data)
  55. .text(repo);
  56. $.ajax({
  57. 'dataType' : 'jsonp',
  58. //url : '/bb/repos/' + repo
  59. url : 'https://api.bitbucket.org/1.0/repositories/' + data
  60. }).done(function(repoData) {
  61. var $lastUpdated = $header.children('.repo-last-update');
  62. $lastUpdated.text(repoData.last_updated ?
  63. 'Last updated on ' + repoData.last_updated :
  64. 'Never updated');
  65. if (repoData.logo) {
  66. $('<img class="repo-logo" src="' + repoData.logo + '" />').insertBefore($lastUpdated);
  67. }
  68. var forks = repoData.forks_count || 0;
  69. var followers = repoData.followers_count || 0;
  70. function pluralize(num, s, p) { return num === 1 ? s : p; }
  71. $header.children('.repo-stats').html(
  72. '<div class="repo-forks" title="Has ' +
  73. forks + pluralize(forks, ' fork.', ' forks.') + '">' + forks +
  74. '</div>' +
  75. '<div class="repo-followers" title="Has ' +
  76. followers + pluralize(followers, ' follower.', ' followers.') + '">' + followers +
  77. '</div>');
  78. var body = '';
  79. if (repoData.website) {
  80. body += '<a class="repo-website" href="' + repoData.website + '">' + repoData.website + '</a>';
  81. }
  82. if (repoData.description) {
  83. body += '<div class="repo-description">' +
  84. repoData.description.replace(/\n/g, '<br/>') + '</div>';
  85. }
  86. $el.children('.repo-body').html(body);
  87. $el.trigger('repo-retrieved');
  88. }).fail(function() {
  89. var guessedUrl = 'http://bitbucket.org/' + data;
  90. $el.children('.repo-body').html('<div class="error">There was error getting this repository\'s info. ' +
  91. 'Try visiting <a href="' + guessedUrl + '">' + guessedUrl + '</a></div>');
  92. });
  93. }
  94. }(jQuery, this)); // Node not supported. this != global