diff --git a/.gitignore b/.gitignore index 63cb1f2..1c07d37 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ /oslo.config-1.1.0.tar.gz /oslo.config-1.2.0a2.tar.gz /oslo.config-1.2.0a3.tar.gz +/oslo.config-1.2.1.tar.gz diff --git a/0001-add-usr-share-project-dist.conf-to-the-default-confi.patch b/0001-add-usr-share-project-dist.conf-to-the-default-confi.patch index 4836c5d..06b22f8 100644 --- a/0001-add-usr-share-project-dist.conf-to-the-default-confi.patch +++ b/0001-add-usr-share-project-dist.conf-to-the-default-confi.patch @@ -1,4 +1,4 @@ -From d8754a26b5dc4ed622a6f71da21f9f8d9bff3246 Mon Sep 17 00:00:00 2001 +From e67c68fe9bcc3db355d46a7ca3347fe4826becc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= Date: Mon, 11 Feb 2013 17:32:55 +0000 Subject: [PATCH] add /usr/share/$project/*-dist.conf to the default config set @@ -25,10 +25,10 @@ take precedence over any of the --config-file settings above. 1 file changed, 4 insertions(+) diff --git a/oslo/config/cfg.py b/oslo/config/cfg.py -index bf8613a..7cd1257 100644 +index 4354886..4b3e25d 100644 --- a/oslo/config/cfg.py +++ b/oslo/config/cfg.py -@@ -463,6 +463,10 @@ def find_config_files(project=None, prog=None, extension='.conf'): +@@ -471,6 +471,10 @@ def find_config_files(project=None, prog=None, extension='.conf'): config_files = [] if project: diff --git a/0002-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch b/0002-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch new file mode 100644 index 0000000..1e3cd28 --- /dev/null +++ b/0002-Revert-Use-oslo.sphinx-and-remove-local-copy-of-doc-.patch @@ -0,0 +1,1347 @@ +From 8f207e5ddf44ad0f0d9ef999da14546a385fd1ee Mon Sep 17 00:00:00 2001 +From: Alan Pevec +Date: Fri, 11 Oct 2013 15:30:29 +0200 +Subject: [PATCH] Revert "Use oslo.sphinx and remove local copy of doc theme" + +This reverts commit 2b14d7314e4a760a282688174cfbf2edeb31c402. + +Conflicts: + test-requirements.txt +--- + doc/source/_templates/.placeholder | 0 + doc/source/_theme/layout.html | 83 ++++++++ + doc/source/_theme/theme.conf | 4 + + doc/source/conf.py | 8 +- + doc/source/static/basic.css | 416 +++++++++++++++++++++++++++++++++++++ + doc/source/static/default.css | 230 ++++++++++++++++++++ + doc/source/static/jquery.tweet.js | 154 ++++++++++++++ + doc/source/static/nature.css | 245 ++++++++++++++++++++++ + doc/source/static/tweaks.css | 94 +++++++++ + test-requirements.txt | 3 +- + 10 files changed, 1231 insertions(+), 6 deletions(-) + create mode 100644 doc/source/_templates/.placeholder + create mode 100644 doc/source/_theme/layout.html + create mode 100644 doc/source/_theme/theme.conf + create mode 100644 doc/source/static/basic.css + create mode 100644 doc/source/static/default.css + create mode 100644 doc/source/static/jquery.tweet.js + create mode 100644 doc/source/static/nature.css + create mode 100644 doc/source/static/tweaks.css + +diff --git a/doc/source/_templates/.placeholder b/doc/source/_templates/.placeholder +new file mode 100644 +index 0000000..e69de29 +diff --git a/doc/source/_theme/layout.html b/doc/source/_theme/layout.html +new file mode 100644 +index 0000000..750b782 +--- /dev/null ++++ b/doc/source/_theme/layout.html +@@ -0,0 +1,83 @@ ++{% extends "basic/layout.html" %} ++{% set css_files = css_files + ['_static/tweaks.css'] %} ++{% set script_files = script_files + ['_static/jquery.tweet.js'] %} ++ ++{%- macro sidebar() %} ++ {%- if not embedded %}{% if not theme_nosidebar|tobool %} ++
++
++ {%- block sidebarlogo %} ++ {%- if logo %} ++ ++ {%- endif %} ++ {%- endblock %} ++ {%- block sidebartoc %} ++ {%- if display_toc %} ++

{{ _('Table Of Contents') }}

++ {{ toc }} ++ {%- endif %} ++ {%- endblock %} ++ {%- block sidebarrel %} ++ {%- if prev %} ++

{{ _('Previous topic') }}

++

{{ prev.title }}

++ {%- endif %} ++ {%- if next %} ++

{{ _('Next topic') }}

++

{{ next.title }}

++ {%- endif %} ++ {%- endblock %} ++ {%- block sidebarsourcelink %} ++ {%- if show_source and has_source and sourcename %} ++

{{ _('This Page') }}

++ ++ {%- endif %} ++ {%- endblock %} ++ {%- if customsidebar %} ++ {% include customsidebar %} ++ {%- endif %} ++ {%- block sidebarsearch %} ++ {%- if pagename != "search" %} ++ ++ ++ {%- endif %} ++ {%- endblock %} ++
++
++ {%- endif %}{% endif %} ++{%- endmacro %} ++ ++{% block relbar1 %}{% endblock relbar1 %} ++ ++{% block header %} ++ ++{% endblock %} +\ No newline at end of file +diff --git a/doc/source/_theme/theme.conf b/doc/source/_theme/theme.conf +new file mode 100644 +index 0000000..1cc4004 +--- /dev/null ++++ b/doc/source/_theme/theme.conf +@@ -0,0 +1,4 @@ ++[theme] ++inherit = basic ++stylesheet = nature.css ++pygments_style = tango +diff --git a/doc/source/conf.py b/doc/source/conf.py +index 30cef32..fc13a1d 100644 +--- a/doc/source/conf.py ++++ b/doc/source/conf.py +@@ -8,14 +8,14 @@ sys.path.insert(0, os.path.abspath('../..')) + + # Add any Sphinx extension module names here, as strings. They can be + # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +-extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'oslo.sphinx'] ++extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx'] + + # autodoc generation is a bit aggressive and a nuisance when doing heavy + # text edit cycles. + # execute "export SPHINX_DEBUG=1" in your terminal to disable + + # Add any paths that contain templates here, relative to this directory. +-# templates_path = [] ++templates_path = ['_templates'] + + # The suffix of source filenames. + source_suffix = '.rst' +@@ -41,8 +41,8 @@ pygments_style = 'sphinx' + + # The theme to use for HTML and HTML Help pages. Major themes that come with + # Sphinx are currently 'default' and 'sphinxdoc'. +-# html_theme_path = ["."] +-# html_theme = '_theme' ++html_theme_path = ["."] ++html_theme = '_theme' + html_static_path = ['static'] + + # Output file base name for HTML help builder. +diff --git a/doc/source/static/basic.css b/doc/source/static/basic.css +new file mode 100644 +index 0000000..d909ce3 +--- /dev/null ++++ b/doc/source/static/basic.css +@@ -0,0 +1,416 @@ ++/** ++ * Sphinx stylesheet -- basic theme ++ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++ */ ++ ++/* -- main layout ----------------------------------------------------------- */ ++ ++div.clearer { ++ clear: both; ++} ++ ++/* -- relbar ---------------------------------------------------------------- */ ++ ++div.related { ++ width: 100%; ++ font-size: 90%; ++} ++ ++div.related h3 { ++ display: none; ++} ++ ++div.related ul { ++ margin: 0; ++ padding: 0 0 0 10px; ++ list-style: none; ++} ++ ++div.related li { ++ display: inline; ++} ++ ++div.related li.right { ++ float: right; ++ margin-right: 5px; ++} ++ ++/* -- sidebar --------------------------------------------------------------- */ ++ ++div.sphinxsidebarwrapper { ++ padding: 10px 5px 0 10px; ++} ++ ++div.sphinxsidebar { ++ float: left; ++ width: 230px; ++ margin-left: -100%; ++ font-size: 90%; ++} ++ ++div.sphinxsidebar ul { ++ list-style: none; ++} ++ ++div.sphinxsidebar ul ul, ++div.sphinxsidebar ul.want-points { ++ margin-left: 20px; ++ list-style: square; ++} ++ ++div.sphinxsidebar ul ul { ++ margin-top: 0; ++ margin-bottom: 0; ++} ++ ++div.sphinxsidebar form { ++ margin-top: 10px; ++} ++ ++div.sphinxsidebar input { ++ border: 1px solid #98dbcc; ++ font-family: sans-serif; ++ font-size: 1em; ++} ++ ++img { ++ border: 0; ++} ++ ++/* -- search page ----------------------------------------------------------- */ ++ ++ul.search { ++ margin: 10px 0 0 20px; ++ padding: 0; ++} ++ ++ul.search li { ++ padding: 5px 0 5px 20px; ++ background-image: url(file.png); ++ background-repeat: no-repeat; ++ background-position: 0 7px; ++} ++ ++ul.search li a { ++ font-weight: bold; ++} ++ ++ul.search li div.context { ++ color: #888; ++ margin: 2px 0 0 30px; ++ text-align: left; ++} ++ ++ul.keywordmatches li.goodmatch a { ++ font-weight: bold; ++} ++ ++/* -- index page ------------------------------------------------------------ */ ++ ++table.contentstable { ++ width: 90%; ++} ++ ++table.contentstable p.biglink { ++ line-height: 150%; ++} ++ ++a.biglink { ++ font-size: 1.3em; ++} ++ ++span.linkdescr { ++ font-style: italic; ++ padding-top: 5px; ++ font-size: 90%; ++} ++ ++/* -- general index --------------------------------------------------------- */ ++ ++table.indextable td { ++ text-align: left; ++ vertical-align: top; ++} ++ ++table.indextable dl, table.indextable dd { ++ margin-top: 0; ++ margin-bottom: 0; ++} ++ ++table.indextable tr.pcap { ++ height: 10px; ++} ++ ++table.indextable tr.cap { ++ margin-top: 10px; ++ background-color: #f2f2f2; ++} ++ ++img.toggler { ++ margin-right: 3px; ++ margin-top: 3px; ++ cursor: pointer; ++} ++ ++/* -- general body styles --------------------------------------------------- */ ++ ++a.headerlink { ++ visibility: hidden; ++} ++ ++h1:hover > a.headerlink, ++h2:hover > a.headerlink, ++h3:hover > a.headerlink, ++h4:hover > a.headerlink, ++h5:hover > a.headerlink, ++h6:hover > a.headerlink, ++dt:hover > a.headerlink { ++ visibility: visible; ++} ++ ++div.body p.caption { ++ text-align: inherit; ++} ++ ++div.body td { ++ text-align: left; ++} ++ ++.field-list ul { ++ padding-left: 1em; ++} ++ ++.first { ++} ++ ++p.rubric { ++ margin-top: 30px; ++ font-weight: bold; ++} ++ ++/* -- sidebars -------------------------------------------------------------- */ ++ ++div.sidebar { ++ margin: 0 0 0.5em 1em; ++ border: 1px solid #ddb; ++ padding: 7px 7px 0 7px; ++ background-color: #ffe; ++ width: 40%; ++ float: right; ++} ++ ++p.sidebar-title { ++ font-weight: bold; ++} ++ ++/* -- topics ---------------------------------------------------------------- */ ++ ++div.topic { ++ border: 1px solid #ccc; ++ padding: 7px 7px 0 7px; ++ margin: 10px 0 10px 0; ++} ++ ++p.topic-title { ++ font-size: 1.1em; ++ font-weight: bold; ++ margin-top: 10px; ++} ++ ++/* -- admonitions ----------------------------------------------------------- */ ++ ++div.admonition { ++ margin-top: 10px; ++ margin-bottom: 10px; ++ padding: 7px; ++} ++ ++div.admonition dt { ++ font-weight: bold; ++} ++ ++div.admonition dl { ++ margin-bottom: 0; ++} ++ ++p.admonition-title { ++ margin: 0px 10px 5px 0px; ++ font-weight: bold; ++} ++ ++div.body p.centered { ++ text-align: center; ++ margin-top: 25px; ++} ++ ++/* -- tables ---------------------------------------------------------------- */ ++ ++table.docutils { ++ border: 0; ++ border-collapse: collapse; ++} ++ ++table.docutils td, table.docutils th { ++ padding: 1px 8px 1px 0; ++ border-top: 0; ++ border-left: 0; ++ border-right: 0; ++ border-bottom: 1px solid #aaa; ++} ++ ++table.field-list td, table.field-list th { ++ border: 0 !important; ++} ++ ++table.footnote td, table.footnote th { ++ border: 0 !important; ++} ++ ++th { ++ text-align: left; ++ padding-right: 5px; ++} ++ ++/* -- other body styles ----------------------------------------------------- */ ++ ++dl { ++ margin-bottom: 15px; ++} ++ ++dd p { ++ margin-top: 0px; ++} ++ ++dd ul, dd table { ++ margin-bottom: 10px; ++} ++ ++dd { ++ margin-top: 3px; ++ margin-bottom: 10px; ++ margin-left: 30px; ++} ++ ++dt:target, .highlight { ++ background-color: #fbe54e; ++} ++ ++dl.glossary dt { ++ font-weight: bold; ++ font-size: 1.1em; ++} ++ ++.field-list ul { ++ margin: 0; ++ padding-left: 1em; ++} ++ ++.field-list p { ++ margin: 0; ++} ++ ++.refcount { ++ color: #060; ++} ++ ++.optional { ++ font-size: 1.3em; ++} ++ ++.versionmodified { ++ font-style: italic; ++} ++ ++.system-message { ++ background-color: #fda; ++ padding: 5px; ++ border: 3px solid red; ++} ++ ++.footnote:target { ++ background-color: #ffa ++} ++ ++.line-block { ++ display: block; ++ margin-top: 1em; ++ margin-bottom: 1em; ++} ++ ++.line-block .line-block { ++ margin-top: 0; ++ margin-bottom: 0; ++ margin-left: 1.5em; ++} ++ ++/* -- code displays --------------------------------------------------------- */ ++ ++pre { ++ overflow: auto; ++} ++ ++td.linenos pre { ++ padding: 5px 0px; ++ border: 0; ++ background-color: transparent; ++ color: #aaa; ++} ++ ++table.highlighttable { ++ margin-left: 0.5em; ++} ++ ++table.highlighttable td { ++ padding: 0 0.5em 0 0.5em; ++} ++ ++tt.descname { ++ background-color: transparent; ++ font-weight: bold; ++ font-size: 1.2em; ++} ++ ++tt.descclassname { ++ background-color: transparent; ++} ++ ++tt.xref, a tt { ++ background-color: transparent; ++ font-weight: bold; ++} ++ ++h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { ++ background-color: transparent; ++} ++ ++/* -- math display ---------------------------------------------------------- */ ++ ++img.math { ++ vertical-align: middle; ++} ++ ++div.body div.math p { ++ text-align: center; ++} ++ ++span.eqno { ++ float: right; ++} ++ ++/* -- printout stylesheet --------------------------------------------------- */ ++ ++@media print { ++ div.document, ++ div.documentwrapper, ++ div.bodywrapper { ++ margin: 0 !important; ++ width: 100%; ++ } ++ ++ div.sphinxsidebar, ++ div.related, ++ div.footer, ++ #top-link { ++ display: none; ++ } ++} +diff --git a/doc/source/static/default.css b/doc/source/static/default.css +new file mode 100644 +index 0000000..c8091ec +--- /dev/null ++++ b/doc/source/static/default.css +@@ -0,0 +1,230 @@ ++/** ++ * Sphinx stylesheet -- default theme ++ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++ */ ++ ++@import url("basic.css"); ++ ++/* -- page layout ----------------------------------------------------------- */ ++ ++body { ++ font-family: sans-serif; ++ font-size: 100%; ++ background-color: #11303d; ++ color: #000; ++ margin: 0; ++ padding: 0; ++} ++ ++div.document { ++ background-color: #1c4e63; ++} ++ ++div.documentwrapper { ++ float: left; ++ width: 100%; ++} ++ ++div.bodywrapper { ++ margin: 0 0 0 230px; ++} ++ ++div.body { ++ background-color: #ffffff; ++ color: #000000; ++ padding: 0 20px 30px 20px; ++} ++ ++div.footer { ++ color: #ffffff; ++ width: 100%; ++ padding: 9px 0 9px 0; ++ text-align: center; ++ font-size: 75%; ++} ++ ++div.footer a { ++ color: #ffffff; ++ text-decoration: underline; ++} ++ ++div.related { ++ background-color: #133f52; ++ line-height: 30px; ++ color: #ffffff; ++} ++ ++div.related a { ++ color: #ffffff; ++} ++ ++div.sphinxsidebar { ++} ++ ++div.sphinxsidebar h3 { ++ font-family: 'Trebuchet MS', sans-serif; ++ color: #ffffff; ++ font-size: 1.4em; ++ font-weight: normal; ++ margin: 0; ++ padding: 0; ++} ++ ++div.sphinxsidebar h3 a { ++ color: #ffffff; ++} ++ ++div.sphinxsidebar h4 { ++ font-family: 'Trebuchet MS', sans-serif; ++ color: #ffffff; ++ font-size: 1.3em; ++ font-weight: normal; ++ margin: 5px 0 0 0; ++ padding: 0; ++} ++ ++div.sphinxsidebar p { ++ color: #ffffff; ++} ++ ++div.sphinxsidebar p.topless { ++ margin: 5px 10px 10px 10px; ++} ++ ++div.sphinxsidebar ul { ++ margin: 10px; ++ padding: 0; ++ color: #ffffff; ++} ++ ++div.sphinxsidebar a { ++ color: #98dbcc; ++} ++ ++div.sphinxsidebar input { ++ border: 1px solid #98dbcc; ++ font-family: sans-serif; ++ font-size: 1em; ++} ++ ++/* -- body styles ----------------------------------------------------------- */ ++ ++a { ++ color: #355f7c; ++ text-decoration: none; ++} ++ ++a:hover { ++ text-decoration: underline; ++} ++ ++div.body p, div.body dd, div.body li { ++ text-align: left; ++ line-height: 130%; ++} ++ ++div.body h1, ++div.body h2, ++div.body h3, ++div.body h4, ++div.body h5, ++div.body h6 { ++ font-family: 'Trebuchet MS', sans-serif; ++ background-color: #f2f2f2; ++ font-weight: normal; ++ color: #20435c; ++ border-bottom: 1px solid #ccc; ++ margin: 20px -20px 10px -20px; ++ padding: 3px 0 3px 10px; ++} ++ ++div.body h1 { margin-top: 0; font-size: 200%; } ++div.body h2 { font-size: 160%; } ++div.body h3 { font-size: 140%; } ++div.body h4 { font-size: 120%; } ++div.body h5 { font-size: 110%; } ++div.body h6 { font-size: 100%; } ++ ++a.headerlink { ++ color: #c60f0f; ++ font-size: 0.8em; ++ padding: 0 4px 0 4px; ++ text-decoration: none; ++} ++ ++a.headerlink:hover { ++ background-color: #c60f0f; ++ color: white; ++} ++ ++div.body p, div.body dd, div.body li { ++ text-align: left; ++ line-height: 130%; ++} ++ ++div.admonition p.admonition-title + p { ++ display: inline; ++} ++ ++div.admonition p { ++ margin-bottom: 5px; ++} ++ ++div.admonition pre { ++ margin-bottom: 5px; ++} ++ ++div.admonition ul, div.admonition ol { ++ margin-bottom: 5px; ++} ++ ++div.note { ++ background-color: #eee; ++ border: 1px solid #ccc; ++} ++ ++div.seealso { ++ background-color: #ffc; ++ border: 1px solid #ff6; ++} ++ ++div.topic { ++ background-color: #eee; ++} ++ ++div.warning { ++ background-color: #ffe4e4; ++ border: 1px solid #f66; ++} ++ ++p.admonition-title { ++ display: inline; ++} ++ ++p.admonition-title:after { ++ content: ":"; ++} ++ ++pre { ++ padding: 5px; ++ background-color: #eeffcc; ++ color: #333333; ++ line-height: 120%; ++ border: 1px solid #ac9; ++ border-left: none; ++ border-right: none; ++} ++ ++tt { ++ background-color: #ecf0f3; ++ padding: 0 1px 0 1px; ++ font-size: 0.95em; ++} ++ ++.warning tt { ++ background: #efc2c2; ++} ++ ++.note tt { ++ background: #d6d6d6; ++} +diff --git a/doc/source/static/jquery.tweet.js b/doc/source/static/jquery.tweet.js +new file mode 100644 +index 0000000..79bf0bd +--- /dev/null ++++ b/doc/source/static/jquery.tweet.js +@@ -0,0 +1,154 @@ ++(function($) { ++ ++ $.fn.tweet = function(o){ ++ var s = { ++ username: ["seaofclouds"], // [string] required, unless you want to display our tweets. :) it can be an array, just do ["username1","username2","etc"] ++ list: null, //[string] optional name of list belonging to username ++ avatar_size: null, // [integer] height and width of avatar if displayed (48px max) ++ count: 3, // [integer] how many tweets to display? ++ intro_text: null, // [string] do you want text BEFORE your your tweets? ++ outro_text: null, // [string] do you want text AFTER your tweets? ++ join_text: null, // [string] optional text in between date and tweet, try setting to "auto" ++ auto_join_text_default: "i said,", // [string] auto text for non verb: "i said" bullocks ++ auto_join_text_ed: "i", // [string] auto text for past tense: "i" surfed ++ auto_join_text_ing: "i am", // [string] auto tense for present tense: "i was" surfing ++ auto_join_text_reply: "i replied to", // [string] auto tense for replies: "i replied to" @someone "with" ++ auto_join_text_url: "i was looking at", // [string] auto tense for urls: "i was looking at" http:... ++ loading_text: null, // [string] optional loading text, displayed while tweets load ++ query: null // [string] optional search query ++ }; ++ ++ if(o) $.extend(s, o); ++ ++ $.fn.extend({ ++ linkUrl: function() { ++ var returning = []; ++ var regexp = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi; ++ this.each(function() { ++ returning.push(this.replace(regexp,"$1")); ++ }); ++ return $(returning); ++ }, ++ linkUser: function() { ++ var returning = []; ++ var regexp = /[\@]+([A-Za-z0-9-_]+)/gi; ++ this.each(function() { ++ returning.push(this.replace(regexp,"@$1")); ++ }); ++ return $(returning); ++ }, ++ linkHash: function() { ++ var returning = []; ++ var regexp = / [\#]+([A-Za-z0-9-_]+)/gi; ++ this.each(function() { ++ returning.push(this.replace(regexp, ' #$1')); ++ }); ++ return $(returning); ++ }, ++ capAwesome: function() { ++ var returning = []; ++ this.each(function() { ++ returning.push(this.replace(/\b(awesome)\b/gi, '$1')); ++ }); ++ return $(returning); ++ }, ++ capEpic: function() { ++ var returning = []; ++ this.each(function() { ++ returning.push(this.replace(/\b(epic)\b/gi, '$1')); ++ }); ++ return $(returning); ++ }, ++ makeHeart: function() { ++ var returning = []; ++ this.each(function() { ++ returning.push(this.replace(/(<)+[3]/gi, "")); ++ }); ++ return $(returning); ++ } ++ }); ++ ++ function relative_time(time_value) { ++ var parsed_date = Date.parse(time_value); ++ var relative_to = (arguments.length > 1) ? arguments[1] : new Date(); ++ var delta = parseInt((relative_to.getTime() - parsed_date) / 1000); ++ var pluralize = function (singular, n) { ++ return '' + n + ' ' + singular + (n == 1 ? '' : 's'); ++ }; ++ if(delta < 60) { ++ return 'less than a minute ago'; ++ } else if(delta < (45*60)) { ++ return 'about ' + pluralize("minute", parseInt(delta / 60)) + ' ago'; ++ } else if(delta < (24*60*60)) { ++ return 'about ' + pluralize("hour", parseInt(delta / 3600)) + ' ago'; ++ } else { ++ return 'about ' + pluralize("day", parseInt(delta / 86400)) + ' ago'; ++ } ++ } ++ ++ function build_url() { ++ var proto = ('https:' == document.location.protocol ? 'https:' : 'http:'); ++ if (s.list) { ++ return proto+"//api.twitter.com/1/"+s.username[0]+"/lists/"+s.list+"/statuses.json?per_page="+s.count+"&callback=?"; ++ } else if (s.query == null && s.username.length == 1) { ++ return proto+'//twitter.com/status/user_timeline/'+s.username[0]+'.json?count='+s.count+'&callback=?'; ++ } else { ++ var query = (s.query || 'from:'+s.username.join('%20OR%20from:')); ++ return proto+'//search.twitter.com/search.json?&q='+query+'&rpp='+s.count+'&callback=?'; ++ } ++ } ++ ++ return this.each(function(){ ++ var list = $('