caboodle 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +21 -0
- data/Rakefile +64 -0
- data/VERSION +1 -0
- data/bin/caboodle +14 -0
- data/lib/.yardoc/checksums +2 -0
- data/lib/.yardoc/objects/Pago/App.dat +0 -0
- data/lib/.yardoc/objects/Pago/MenuItems.dat +0 -0
- data/lib/.yardoc/objects/Pago/Plugin/is_a_pago_plugin_c.dat +0 -0
- data/lib/.yardoc/objects/Pago/Plugin/load_all_c.dat +0 -0
- data/lib/.yardoc/objects/Pago/Plugin/menu_c.dat +0 -0
- data/lib/.yardoc/objects/Pago/Plugin/use_all_c.dat +0 -0
- data/lib/.yardoc/objects/Pago/Plugin.dat +0 -0
- data/lib/.yardoc/objects/Pago/Plugins.dat +0 -0
- data/lib/.yardoc/objects/Pago/Site.dat +0 -0
- data/lib/.yardoc/objects/Pago.dat +0 -0
- data/lib/.yardoc/objects/root.dat +0 -0
- data/lib/.yardoc/proxy_types +2 -0
- data/lib/caboodle/app/.gems +1 -0
- data/lib/caboodle/app/config/site.yml +4 -0
- data/lib/caboodle/app/config.ru +2 -0
- data/lib/caboodle/app/public/favicon.ico +0 -0
- data/lib/caboodle/app/public/images/favicon.ico +0 -0
- data/lib/caboodle/app/public/images/grid.png +0 -0
- data/lib/caboodle/app/public/js/application.js +0 -0
- data/lib/caboodle/app/public/stylesheets/ie.css +1 -0
- data/lib/caboodle/app/public/stylesheets/print.css +122 -0
- data/lib/caboodle/app/public/stylesheets/screen.css +196 -0
- data/lib/caboodle/app/stylesheets/_base.scss +49 -0
- data/lib/caboodle/app/stylesheets/_defaults.scss +257 -0
- data/lib/caboodle/app/stylesheets/ie.scss +10 -0
- data/lib/caboodle/app/stylesheets/print.scss +33 -0
- data/lib/caboodle/app/stylesheets/screen.scss +292 -0
- data/lib/caboodle/app/views/layout.haml +66 -0
- data/lib/caboodle/app.rb +35 -0
- data/lib/caboodle/command.rb +38 -0
- data/lib/caboodle/config.rb +12 -0
- data/lib/caboodle/kit.rb +148 -0
- data/lib/caboodle/kits/flickr/flickr.rb +65 -0
- data/lib/caboodle/kits/flickr/galleria.noconflict.min.js +18 -0
- data/lib/caboodle/kits/flickr/views/photography.haml +108 -0
- data/lib/caboodle/kits/github/github.rb +44 -0
- data/lib/caboodle/kits/github/views/_repo.haml +7 -0
- data/lib/caboodle/kits/github/views/github.haml +11 -0
- data/lib/caboodle/kits/identity/identity.rb +18 -0
- data/lib/caboodle/kits/identity/views/me.haml +22 -0
- data/lib/caboodle/kits/lazyload/lazyload.rb +6 -0
- data/lib/caboodle/kits/lazyload/public/jquery.lazyload.mini.js +12 -0
- data/lib/caboodle/kits/lazyload/public/lazyload.js +3 -0
- data/lib/caboodle/kits/linkedin/linkedin.rb +33 -0
- data/lib/caboodle/kits/linkedin/views/cv.haml +6 -0
- data/lib/caboodle/kits/onepage/card.html +220 -0
- data/lib/caboodle/kits/onepage/onepage.rb +16 -0
- data/lib/caboodle/kits/onepage/views/contact.haml +2 -0
- data/lib/caboodle/kits/page/page.rb +69 -0
- data/lib/caboodle/kits/page/views/page.haml +2 -0
- data/lib/caboodle/kits/portfolio/portfolio.rb +14 -0
- data/lib/caboodle/kits/portfolio/views/portfolio.haml +29 -0
- data/lib/caboodle/kits/posterous/posterous.rb +163 -0
- data/lib/caboodle/kits/posterous/views/_post.haml +29 -0
- data/lib/caboodle/kits/posterous/views/post.haml +14 -0
- data/lib/caboodle/kits/posterous/views/posts.haml +21 -0
- data/lib/caboodle/kits/soundcloud/soundcloud.rb +31 -0
- data/lib/caboodle/kits/soundcloud/views/soundcloud.haml +17 -0
- data/lib/caboodle/kits/twitter/public/images/ajax-loader.gif +0 -0
- data/lib/caboodle/kits/twitter/public/images/link.png +0 -0
- data/lib/caboodle/kits/twitter/twitter.rb +16 -0
- data/lib/caboodle/kits/twitter/views/twitter.haml +101 -0
- data/lib/caboodle/kits/typekit/public/typekit.js +1 -0
- data/lib/caboodle/kits/typekit/typekit.rb +10 -0
- data/lib/caboodle/scrape.rb +9 -0
- data/lib/caboodle.rb +3 -0
- data/test/helper.rb +10 -0
- data/test/test_caboodle.rb +7 -0
- metadata +348 -0
@@ -0,0 +1,38 @@
|
|
1
|
+
gem 'heroku'
|
2
|
+
require 'heroku'
|
3
|
+
require 'heroku/command'
|
4
|
+
|
5
|
+
module Caboodle
|
6
|
+
module Command
|
7
|
+
class << self
|
8
|
+
def run(command, args, retries=0)
|
9
|
+
case command
|
10
|
+
when "create"
|
11
|
+
puts `mkdir #{args.first}`
|
12
|
+
puts `cd #{args.first} && cp -r #{File.expand_path(File.join(File.dirname(__FILE__), 'app'))}/* .`
|
13
|
+
puts `cd #{args.first} && cp #{File.expand_path(File.join(File.dirname(__FILE__), 'app'))}/.gems .`
|
14
|
+
puts `cd #{args.first} && git init`
|
15
|
+
puts `cd #{args.first} && git add .`
|
16
|
+
puts `bundle install`
|
17
|
+
puts `cd #{args.first} && git commit -m"initial setup"`
|
18
|
+
puts `cd #{args.first} && heroku create #{args.first}`
|
19
|
+
puts `cd #{args.first} && git push heroku master`
|
20
|
+
|
21
|
+
when /kit:add/
|
22
|
+
unless Caboodle::Site.kits.include?(args.first.capitalize)
|
23
|
+
Caboodle::Kit.load_kit args.first.capitalize
|
24
|
+
Caboodle::Kit.dump_config
|
25
|
+
puts `git add .`
|
26
|
+
puts `git commit -m"kit:add #{args}" -a`
|
27
|
+
puts `git push heroku master`
|
28
|
+
end
|
29
|
+
when "deploy"
|
30
|
+
puts `git commit -m"deploy" -a`
|
31
|
+
puts `git push heroku master`
|
32
|
+
else
|
33
|
+
Heroku::Command.run(command,args,retries)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Caboodle
|
2
|
+
MenuItems = []
|
3
|
+
Defaults = Hashie::Mash.new()
|
4
|
+
Site = Defaults.clone
|
5
|
+
RequiredSettings = Hashie::Mash.new()
|
6
|
+
Kits = []
|
7
|
+
Javascripts = []
|
8
|
+
Stylesheets = []
|
9
|
+
Site.required_settings = []
|
10
|
+
Site.kits = [] unless Site.kits
|
11
|
+
Defaults.merge!(Hashie::Mash.new(YAML.load_file(File.join( File.join(File.dirname(__FILE__), 'defaults.yml')))))
|
12
|
+
end
|
data/lib/caboodle/kit.rb
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
module Caboodle
|
2
|
+
|
3
|
+
class Kit < Sinatra::Base
|
4
|
+
#register Sinatra::Compass
|
5
|
+
|
6
|
+
set :app_file, __FILE__
|
7
|
+
set :logging, true
|
8
|
+
set :root, File.expand_path(File.join(File.dirname(__FILE__),"app"))
|
9
|
+
set :public, Proc.new { File.join(root, "public") }
|
10
|
+
set :haml, {:format => :html5 }
|
11
|
+
|
12
|
+
template :layout do
|
13
|
+
@@template ||= File.open(File.join(File.dirname(__FILE__),"app","views","layout.haml")).read
|
14
|
+
puts @@template.inspect
|
15
|
+
@@template
|
16
|
+
end
|
17
|
+
|
18
|
+
class << self
|
19
|
+
def is_a_caboodle_kit
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
def load_config p
|
24
|
+
loaded = YAML.load_file(p)
|
25
|
+
Hashie::Mash.new(loaded).each{ |k,v|
|
26
|
+
v.strip! if v.class == String
|
27
|
+
Caboodle::Site[k.to_s] = v } rescue puts "Warning! Skipping #{p}"
|
28
|
+
Caboodle::Site.kits.uniq!
|
29
|
+
end
|
30
|
+
|
31
|
+
def dump_config
|
32
|
+
p = File.expand_path(File.join(Caboodle::App.root,"site.yml"))
|
33
|
+
d = Caboodle::Site.clone
|
34
|
+
e = d.to_hash
|
35
|
+
e.delete("required_settings")
|
36
|
+
File.open(p, 'w') {|f| f.write(YAML::dump(e))}
|
37
|
+
end
|
38
|
+
|
39
|
+
def setup
|
40
|
+
require_all
|
41
|
+
use_all
|
42
|
+
end
|
43
|
+
|
44
|
+
def load_kit name
|
45
|
+
unless name.blank?
|
46
|
+
puts "Load kit #{name}"
|
47
|
+
kit_name = name.to_s.split("::").last || name
|
48
|
+
kit_name = kit_name.downcase
|
49
|
+
orig = Caboodle.constants
|
50
|
+
require "caboodle/kits/#{kit_name}/#{kit_name}" rescue puts "No such kit: #{kit_name}"
|
51
|
+
added = Caboodle.constants - orig
|
52
|
+
added.each do |d|
|
53
|
+
c = Caboodle.const_get(d)
|
54
|
+
if c.respond_to?(:is_a_caboodle_kit)
|
55
|
+
c.register
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
Caboodle::Kits
|
60
|
+
end
|
61
|
+
|
62
|
+
def register
|
63
|
+
required_settings.each do |r|
|
64
|
+
unless Caboodle::Site[r]
|
65
|
+
puts "Please set a value for #{r}:"
|
66
|
+
v = STDIN.gets
|
67
|
+
Caboodle::Site[r] = v
|
68
|
+
Caboodle::Kit.dump_config
|
69
|
+
end
|
70
|
+
end
|
71
|
+
Caboodle::Kits << self
|
72
|
+
end
|
73
|
+
|
74
|
+
def require_all
|
75
|
+
if(Caboodle::Site.kits)
|
76
|
+
Caboodle::Site.kits.each do |k|
|
77
|
+
puts "Load Kit: #{k}"
|
78
|
+
load_kit k
|
79
|
+
end
|
80
|
+
else
|
81
|
+
puts "Kits not registered"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def use_all
|
86
|
+
Caboodle::Kits.each do |p|
|
87
|
+
p.start
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def menu display, link
|
92
|
+
Caboodle::MenuItems << {:display=>display, :link=>link}
|
93
|
+
end
|
94
|
+
|
95
|
+
def required keys
|
96
|
+
if keys.class == Array
|
97
|
+
keys.each do |k|
|
98
|
+
self.required_settings << k
|
99
|
+
end
|
100
|
+
else
|
101
|
+
self.required_settings << keys
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def stylesheets array_of_css_files
|
106
|
+
array_of_css_files.each do |a|
|
107
|
+
Caboodle::Stylesheets << a
|
108
|
+
end
|
109
|
+
Caboodle::Stylesheets.uniq!
|
110
|
+
end
|
111
|
+
|
112
|
+
def javascripts array_of_js_files
|
113
|
+
array_of_js_files.each do |a|
|
114
|
+
Caboodle::Javascripts << a
|
115
|
+
end
|
116
|
+
Caboodle::Javascripts.uniq!
|
117
|
+
end
|
118
|
+
|
119
|
+
def defaults hash
|
120
|
+
if hash.class == Hash
|
121
|
+
hash.each {|k,v| Site[k] = v }
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def required_settings
|
126
|
+
r = RequiredSettings[self.ancestors.first.to_s.split("::").last] ||= [:title, :description, :logo_url, :author]
|
127
|
+
RequiredSettings[self.ancestors.first.to_s.split("::").last]
|
128
|
+
end
|
129
|
+
|
130
|
+
def start
|
131
|
+
errors = []
|
132
|
+
self.required_settings.each do |s|
|
133
|
+
if Site[s].blank?
|
134
|
+
errors << " :#{s} has not been set"
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
if errors.empty?
|
139
|
+
Caboodle::App.use self
|
140
|
+
else
|
141
|
+
STDERR.puts " "
|
142
|
+
STDERR.puts "Warning - #{self.ancestors.first} is disabled because:"
|
143
|
+
STDERR.puts errors.join("\n")
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Caboodle
|
2
|
+
|
3
|
+
class FlickrAPI < Weary::Base
|
4
|
+
|
5
|
+
def initialize(opts={})
|
6
|
+
self.defaults = {:api_key => Site.flickr_api_key}
|
7
|
+
end
|
8
|
+
|
9
|
+
declare "photosets" do |r|
|
10
|
+
r.url = "http://api.flickr.com/services/rest/?method=flickr.photosets.getList&api_key=#{Site.flickr_api_key}&user_id=#{Site.flickr_user_id}"
|
11
|
+
r.via = :get
|
12
|
+
end
|
13
|
+
|
14
|
+
declare "photoset" do |r|
|
15
|
+
r.url = "http://api.flickr.com/services/rest/"
|
16
|
+
r.with = [:api_key, :photoset_id]
|
17
|
+
r.requires = [:api_key, :photoset_id,:method]
|
18
|
+
r.via = :get
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.photoset_info(id)
|
22
|
+
Caboodle.mash(new.photoset({:photoset_id=>id,:method=>"flickr.photosets.getInfo"})).rsp.photoset
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.photoset_photos(id)
|
26
|
+
Caboodle.mash(new.photoset({:photoset_id=>id,:method=>"flickr.photosets.getPhotos"})).rsp.photoset.photo
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.photosets
|
30
|
+
Caboodle.mash(new.photosets).rsp.photosets.photoset
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
class Flickr < Caboodle::Kit
|
36
|
+
|
37
|
+
set :views, File.join(File.dirname(__FILE__), "views")
|
38
|
+
|
39
|
+
def home
|
40
|
+
@photosets = FlickrAPI.photosets rescue []
|
41
|
+
@title = "Photography"
|
42
|
+
haml :photography
|
43
|
+
end
|
44
|
+
|
45
|
+
get "/photography" do
|
46
|
+
home
|
47
|
+
end
|
48
|
+
|
49
|
+
get "/photography/:set_id" do |set_id|
|
50
|
+
@photosets = FlickrAPI.photosets rescue []
|
51
|
+
@set_id = set_id
|
52
|
+
@photoset = Caboodle::FlickrAPI.photoset_info(@set_id) rescue nil
|
53
|
+
@title = "Photography: #{@photoset.title if @photoset.respond_to?(:title)}"
|
54
|
+
haml :photography
|
55
|
+
end
|
56
|
+
|
57
|
+
get "/galleria.js" do
|
58
|
+
send_file File.join(File.dirname(__FILE__),"galleria.noconflict.min.js")
|
59
|
+
end
|
60
|
+
|
61
|
+
required [:flickr_username, :flickr_user_id, :flickr_api_key]
|
62
|
+
|
63
|
+
menu "Photography", "/photography"
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
$j=jQuery.noConflict();$j(function(){var $$;$$=$j.fn.galleria=function($options){if(!$$.hasCSS()){return false;}
|
2
|
+
$j.historyInit($$.onPageLoad);var $defaults={insert:'.galleria_container',history:true,clickNext:true,onImage:function(image,caption,thumb){},onThumb:function(thumb){}};var $opts=$j.extend($defaults,$options);for(var i in $opts){if(i){$j.galleria[i]=$opts[i];}}
|
3
|
+
var _insert=($j($opts.insert).is($opts.insert))?$j($opts.insert):jQuery(document.createElement('div')).insertBefore(this);var _div=$j(document.createElement('div')).addClass('galleria_wrapper');var _span=$j(document.createElement('span')).addClass('caption');_insert.addClass('galleria_container').append(_div).append(_span);return this.each(function(){$j(this).addClass('galleria');$j(this).children('li').each(function(i){var _container=$j(this);var _o=$j.meta?$j.extend({},$opts,_container.data()):$opts;_o.clickNext=$j(this).is(':only-child')?false:_o.clickNext;var _a=$j(this).find('a').is('a')?$j(this).find('a'):false;var _img=$j(this).children('img').css('display','none');var _src=_a?_a.attr('href'):_img.attr('src');var _title=_a?_a.attr('title'):_img.attr('title');var _loader=new Image();if(_o.history&&(window.location.hash&&window.location.hash.replace(/\#/,'')==_src)){_container.siblings('.active').removeClass('active');_container.addClass('active');}
|
4
|
+
$j(_loader).load(function(){$j(this).attr('alt',_img.attr('alt'));var _thumb=_a?_a.find('img').addClass('thumb noscale').css('display','none'):_img.clone(true).addClass('thumb').css('display','none');if(_a){_a.replaceWith(_thumb);}
|
5
|
+
if(!_thumb.hasClass('noscale')){var w=Math.ceil(_img.width()/_img.height()*_container.height());var h=Math.ceil(_img.height()/_img.width()*_container.width());if(w<h){_thumb.css({height:'auto',width:_container.width(),marginTop:-(h-_container.height())/2});}else{_thumb.css({width:'auto',height:_container.height(),marginLeft:-(w-_container.width())/2});}}else{window.setTimeout(function(){_thumb.css({marginLeft:-(_thumb.width()-_container.width())/2,marginTop:-(_thumb.height()-_container.height())/2});},1);}
|
6
|
+
_thumb.attr('rel',_src);_thumb.attr('title',_title);_thumb.click(function(){$j.galleria.activate(_src);});_thumb.hover(function(){$j(this).addClass('hover');},function(){$j(this).removeClass('hover');});_container.hover(function(){_container.addClass('hover');},function(){_container.removeClass('hover');});_container.prepend(_thumb);_thumb.css('display','block');_o.onThumb(jQuery(_thumb));if(_container.hasClass('active')){$j.galleria.activate(_src);}
|
7
|
+
_img.remove();}).error(function(){_container.html('<span class="error" style="color:red">Error loading image: '+_src+'</span>');}).attr('src',_src);});});};$$.nextSelector=function(selector){return $j(selector).is(':last-child')?$j(selector).siblings(':first-child'):$j(selector).next();};$$.previousSelector=function(selector){return $j(selector).is(':first-child')?$j(selector).siblings(':last-child'):$j(selector).prev();};$$.hasCSS=function(){$j('body').append($j(document.createElement('div')).attr('id','css_test').css({width:'1px',height:'1px',display:'none'}));var _v=($j('#css_test').width()!=1)?false:true;$j('#css_test').remove();return _v;};$$.onPageLoad=function(_src){var _wrapper=$j('.galleria_wrapper');var _thumb=$j('.galleria img[rel="'+_src+'"]');if(_src){if($j.galleria.history){window.location=window.location.href.replace(/\#.*/,'')+'#'+_src;}
|
8
|
+
_thumb.parents('li').siblings('.active').removeClass('active');_thumb.parents('li').addClass('active');var _img=$j(new Image()).attr('src',_src).addClass('replaced');_wrapper.empty().append(_img);_wrapper.siblings('.caption').text(_thumb.attr('title'));$j.galleria.onImage(_img,_wrapper.siblings('.caption'),_thumb);if($j.galleria.clickNext){_img.css('cursor','pointer').click(function(){$j.galleria.next();});}}else{_wrapper.siblings().andSelf().empty();$j('.galleria li.active').removeClass('active');}
|
9
|
+
$j.galleria.current=_src;};$j.extend({galleria:{current:'',onImage:function(){},activate:function(_src){if($j.galleria.history){$j.historyLoad(_src);}else{$$.onPageLoad(_src);}},next:function(){var _next=$j($$.nextSelector($j('.galleria img[rel="'+$j.galleria.current+'"]').parents('li'))).find('img').attr('rel');$j.galleria.activate(_next);},prev:function(){var _prev=$j($$.previousSelector($j('.galleria img[rel="'+$j.galleria.current+'"]').parents('li'))).find('img').attr('rel');$j.galleria.activate(_prev);}}});});jQuery.extend({historyCurrentHash:undefined,historyCallback:undefined,historyInit:function(callback){jQuery.historyCallback=callback;var current_hash=location.hash;jQuery.historyCurrentHash=current_hash;if(jQuery.browser.msie){if(jQuery.historyCurrentHash===''){jQuery.historyCurrentHash='#';}
|
10
|
+
$j("body").prepend('<iframe id="jQuery_history" style="display: none;"></iframe>');var ihistory=$j("#jQuery_history")[0];var iframe=ihistory.contentWindow.document;iframe.open();iframe.close();iframe.location.hash=current_hash;}
|
11
|
+
else if($j.browser.safari){jQuery.historyBackStack=[];jQuery.historyBackStack.length=history.length;jQuery.historyForwardStack=[];jQuery.isFirst=true;}
|
12
|
+
jQuery.historyCallback(current_hash.replace(/^#/,''));setInterval(jQuery.historyCheck,100);},historyAddHistory:function(hash){jQuery.historyBackStack.push(hash);jQuery.historyForwardStack.length=0;this.isFirst=true;},historyCheck:function(){if(jQuery.browser.msie){var ihistory=$j("#jQuery_history")[0];var iframe=ihistory.contentDocument||ihistory.contentWindow.document;var current_hash=iframe.location.hash;if(current_hash!=jQuery.historyCurrentHash){location.hash=current_hash;jQuery.historyCurrentHash=current_hash;jQuery.historyCallback(current_hash.replace(/^#/,''));}}else if($j.browser.safari){if(!jQuery.dontCheck){var historyDelta=history.length-jQuery.historyBackStack.length;if(historyDelta){jQuery.isFirst=false;var i;if(historyDelta<0){for(i=0;i<Math.abs(historyDelta);i++){jQuery.historyForwardStack.unshift(jQuery.historyBackStack.pop());}}else{for(i=0;i<historyDelta;i++){jQuery.historyBackStack.push(jQuery.historyForwardStack.shift());}}
|
13
|
+
var cachedHash=jQuery.historyBackStack[jQuery.historyBackStack.length-1];if(cachedHash!==undefined){jQuery.historyCurrentHash=location.hash;jQuery.historyCallback(cachedHash);}}else if(jQuery.historyBackStack[jQuery.historyBackStack.length-1]===undefined&&!jQuery.isFirst){if(document.URL.indexOf('#')>=0){jQuery.historyCallback(document.URL.split('#')[1]);}else{current_hash=location.hash;jQuery.historyCallback('');}
|
14
|
+
jQuery.isFirst=true;}}}else{current_hash=location.hash;if(current_hash!=jQuery.historyCurrentHash){jQuery.historyCurrentHash=current_hash;jQuery.historyCallback(current_hash.replace(/^#/,''));}}},historyLoad:function(hash){var newhash;if(jQuery.browser.safari){newhash=hash;}
|
15
|
+
else{newhash='#'+hash;location.hash=newhash;}
|
16
|
+
jQuery.historyCurrentHash=newhash;if(jQuery.browser.msie){var ihistory=$j("#jQuery_history")[0];var iframe=ihistory.contentWindow.document;iframe.open();iframe.close();iframe.location.hash=newhash;jQuery.historyCallback(hash);}
|
17
|
+
else if(jQuery.browser.safari){jQuery.dontCheck=true;this.historyAddHistory(hash);var fn=function(){jQuery.dontCheck=false;};window.setTimeout(fn,200);jQuery.historyCallback(hash);location.hash=newhash;}
|
18
|
+
else{jQuery.historyCallback(hash);}}});
|
@@ -0,0 +1,108 @@
|
|
1
|
+
- if defined?(@photoset) && @photoset.nil?
|
2
|
+
.page
|
3
|
+
%h3
|
4
|
+
Sorry - there was a problem communicating with Flickr
|
5
|
+
- else
|
6
|
+
|
7
|
+
%script{:charset => "utf-8", :src => "/galleria.js", :type => "text/javascript"}
|
8
|
+
|
9
|
+
:javascript
|
10
|
+
jQuery(document).ready(function(){
|
11
|
+
|
12
|
+
var ifo = {
|
13
|
+
Api : '#{Caboodle::Site.flickr_api_key}', //flickr api
|
14
|
+
Set : '#{@set_id}', //photo set
|
15
|
+
fLink : 'http://www.flickr.com/photos/#{Caboodle::Site.flickr_username}/',
|
16
|
+
Cant : 24
|
17
|
+
};
|
18
|
+
|
19
|
+
var json_url = 'http://api.flickr.com/services/rest/?format=json&jsoncallback=?&api_key='+ifo.Api+'&method=flickr.photosets.getPhotos&photoset_id='+ifo.Set+'&per_page='+ifo.Cant;
|
20
|
+
jQuery.getJSON(json_url, function(Data){
|
21
|
+
if (Data.stat == "ok"){
|
22
|
+
console.log(Data);
|
23
|
+
for (var i=0; i<Data.photoset.photo.length; i++){
|
24
|
+
var photo = Data.photoset.photo[i];
|
25
|
+
var Thum = 'http://farm'+photo['farm']+'.static.flickr.com/'+photo['server']+'/'+photo['id']+'_'+photo['secret']+'_'+'s.jpg';
|
26
|
+
var Full = 'http://farm'+photo['farm']+'.static.flickr.com/'+photo['server']+'/'+photo['id']+'_'+photo['secret']+'.jpg';
|
27
|
+
var thumb_class = '';
|
28
|
+
if(i == 0)
|
29
|
+
{
|
30
|
+
thumb_class = 'active';
|
31
|
+
}
|
32
|
+
|
33
|
+
jQuery('.gallery ul').append('<li class="'+thumb_class+'"><a href="'+Full+'"><img src="'+Thum+'" alt="'+photo['title']+'" /></a></li>');
|
34
|
+
|
35
|
+
};
|
36
|
+
}
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
jQuery('.gallery ul').addClass('gallery_list'); // adds new class name to maintain degradability
|
41
|
+
|
42
|
+
jQuery('ul.gallery_list').galleria({
|
43
|
+
preload: 3,
|
44
|
+
transition: 'fade',
|
45
|
+
history : true, // activates the history object for bookmarking, back-button etc.
|
46
|
+
clickNext : true, // helper for making the image clickable
|
47
|
+
insert : '#main_image', // the containing selector for our main image
|
48
|
+
onImage : function(image,caption,thumb) { // let's add some image effects for demonstration purposes
|
49
|
+
// fade in the image & caption
|
50
|
+
//image.css('display','none').fadeIn(1000);
|
51
|
+
caption.css('display','none').fadeIn(1000);
|
52
|
+
|
53
|
+
// fetch the thumbnail container
|
54
|
+
var _li = thumb.parents('li');
|
55
|
+
|
56
|
+
// fade out inactive thumbnail
|
57
|
+
_li.siblings().children('img.selected').fadeTo(500,0.3);
|
58
|
+
|
59
|
+
// fade in active thumbnail
|
60
|
+
thumb.fadeTo('fast',1).addClass('selected');
|
61
|
+
|
62
|
+
// add a title for the clickable image
|
63
|
+
image.attr('title','Next image >>');
|
64
|
+
},
|
65
|
+
onThumb : function(thumb) { // thumbnail effects goes here
|
66
|
+
|
67
|
+
// fetch the thumbnail container
|
68
|
+
var _li = thumb.parents('li');
|
69
|
+
|
70
|
+
// if thumbnail is active, fade all the way.
|
71
|
+
var _fadeTo = _li.is('.active') ? '1' : '0.3';
|
72
|
+
|
73
|
+
// fade in the thumbnail when finished loading
|
74
|
+
thumb.css({display:'none',opacity:_fadeTo}).fadeIn(1500);
|
75
|
+
|
76
|
+
// hover effects
|
77
|
+
thumb.hover(
|
78
|
+
function() { thumb.fadeTo('fast',1); },
|
79
|
+
function() { _li.not('.active').children('img').fadeTo('fast',0.3); } // don't fade out if the parent is active
|
80
|
+
)
|
81
|
+
}
|
82
|
+
});
|
83
|
+
});
|
84
|
+
});
|
85
|
+
|
86
|
+
%section.subsection
|
87
|
+
|
88
|
+
%aside.submenu
|
89
|
+
%ul
|
90
|
+
- @photosets.each do |photoset|
|
91
|
+
%li
|
92
|
+
%a{:href=>"/photography/#{photoset.id}"}= photoset.title
|
93
|
+
|
94
|
+
%section.subpage
|
95
|
+
- if @set_id
|
96
|
+
#galleria_gallery
|
97
|
+
#main_image
|
98
|
+
#gallery.gallery
|
99
|
+
%ul
|
100
|
+
%p.nav
|
101
|
+
#gallery_description
|
102
|
+
= @photoset.description
|
103
|
+
- else
|
104
|
+
%h3
|
105
|
+
Choose a gallery »
|
106
|
+
|
107
|
+
|
108
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Caboodle
|
4
|
+
class Github < Caboodle::Kit
|
5
|
+
|
6
|
+
set :views, File.join(File.dirname(__FILE__), "views")
|
7
|
+
set :public, File.join(File.dirname(__FILE__), "public")
|
8
|
+
|
9
|
+
get "/code" do
|
10
|
+
@title = "Code"
|
11
|
+
@repos = GithubAPI.repositories
|
12
|
+
|
13
|
+
@repos.sort!{|a, b| a.watchers <=> b.watchers}.reverse!
|
14
|
+
@my_repos = @repos.clone
|
15
|
+
@my_repos.delete_if{|a| a.fork }
|
16
|
+
|
17
|
+
@forked_repos = @repos.clone
|
18
|
+
@forked_repos.delete_if{|a| !a.fork }
|
19
|
+
|
20
|
+
haml :github
|
21
|
+
end
|
22
|
+
|
23
|
+
menu "Code", "/code"
|
24
|
+
|
25
|
+
required [:github_username]
|
26
|
+
|
27
|
+
defaults []
|
28
|
+
end
|
29
|
+
|
30
|
+
class GithubAPI < Weary::Base
|
31
|
+
|
32
|
+
declare "repositories" do |r|
|
33
|
+
r.url = "http://github.com/api/v2/json/repos/show/#{Caboodle::Site.github_username}"
|
34
|
+
r.via = :get
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.repositories
|
38
|
+
a = Hashie::Mash.new(GithubAPI.new.repositories.perform_sleepily.parse).repositories
|
39
|
+
puts a.inspect
|
40
|
+
a
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
#github.page
|
2
|
+
%h3
|
3
|
+
My projects
|
4
|
+
%dl.repositories.me
|
5
|
+
- @my_repos.each do |repo|
|
6
|
+
= haml :_repo, :locals=>{:repo=>repo}, :layout=>false
|
7
|
+
%h3
|
8
|
+
Forked projects
|
9
|
+
%dl.repositories.forked
|
10
|
+
- @forked_repos.each do |repo|
|
11
|
+
= haml :_repo, :locals=>{:repo=>repo}, :layout=>false
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Caboodle
|
2
|
+
|
3
|
+
class Identity
|
4
|
+
|
5
|
+
end
|
6
|
+
|
7
|
+
class IdentityApp < Caboodle::Kit
|
8
|
+
|
9
|
+
set :views, File.join(File.dirname(__FILE__), "views")
|
10
|
+
|
11
|
+
get "/me" do
|
12
|
+
@title = "About me"
|
13
|
+
haml :me, :locals=>{:identity=>Identity.new()}, :layout=>true
|
14
|
+
end
|
15
|
+
|
16
|
+
menu "Me", "/me"
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
.page
|
2
|
+
%p
|
3
|
+
Some info about me
|
4
|
+
|
5
|
+
/ %p
|
6
|
+
/ = "#{identity.first_name} is #{identity.descriptor}, currently working as #{identity.main_job} in #{identity.city_of_work}."
|
7
|
+
/
|
8
|
+
/ %p
|
9
|
+
/ In the past #{identity.first_name} #{identity.past_identities.first}. And before that #{identity.him_or_her} #{identity.past_identities[1]}.
|
10
|
+
/
|
11
|
+
/ %p
|
12
|
+
/ Three things you might find interesting about #{identity.him_or_her}:
|
13
|
+
/
|
14
|
+
/ %ul#things_of_interest
|
15
|
+
/ - identity.things_of_interest[0..2].each do |orly|
|
16
|
+
/ %li.orly
|
17
|
+
/ = orly
|
18
|
+
/
|
19
|
+
/ %p
|
20
|
+
/ = "In #{identity.his_or_hers} spare time #{identity.he_or_she}"
|
21
|
+
/ = succeed(".") do
|
22
|
+
/ = identity.spare_time_activities[0..4].join(",")
|
@@ -0,0 +1,12 @@
|
|
1
|
+
|
2
|
+
(function($){$.fn.lazyload=function(options){var settings={threshold:0,failurelimit:0,event:"scroll",effect:"show",container:window};if(options){$.extend(settings,options);}
|
3
|
+
var elements=this;if("scroll"==settings.event){$(settings.container).bind("scroll",function(event){var counter=0;elements.each(function(){if($.abovethetop(this,settings)||$.leftofbegin(this,settings)){}else if(!$.belowthefold(this,settings)&&!$.rightoffold(this,settings)){$(this).trigger("appear");}else{if(counter++>settings.failurelimit){return false;}}});var temp=$.grep(elements,function(element){return!element.loaded;});elements=$(temp);});}
|
4
|
+
this.each(function(){var self=this;if(undefined==$(self).attr("original")){$(self).attr("original",$(self).attr("src"));}
|
5
|
+
if("scroll"!=settings.event||undefined==$(self).attr("src")||settings.placeholder==$(self).attr("src")||($.abovethetop(self,settings)||$.leftofbegin(self,settings)||$.belowthefold(self,settings)||$.rightoffold(self,settings))){if(settings.placeholder){$(self).attr("src",settings.placeholder);}else{$(self).removeAttr("src");}
|
6
|
+
self.loaded=false;}else{self.loaded=true;}
|
7
|
+
$(self).one("appear",function(){if(!this.loaded){$("<img />").bind("load",function(){$(self).hide().attr("src",$(self).attr("original"))
|
8
|
+
[settings.effect](settings.effectspeed);self.loaded=true;}).attr("src",$(self).attr("original"));};});if("scroll"!=settings.event){$(self).bind(settings.event,function(event){if(!self.loaded){$(self).trigger("appear");}});}});$(settings.container).trigger(settings.event);return this;};$.belowthefold=function(element,settings){if(settings.container===undefined||settings.container===window){var fold=$(window).height()+$(window).scrollTop();}else{var fold=$(settings.container).offset().top+$(settings.container).height();}
|
9
|
+
return fold<=$(element).offset().top-settings.threshold;};$.rightoffold=function(element,settings){if(settings.container===undefined||settings.container===window){var fold=$(window).width()+$(window).scrollLeft();}else{var fold=$(settings.container).offset().left+$(settings.container).width();}
|
10
|
+
return fold<=$(element).offset().left-settings.threshold;};$.abovethetop=function(element,settings){if(settings.container===undefined||settings.container===window){var fold=$(window).scrollTop();}else{var fold=$(settings.container).offset().top;}
|
11
|
+
return fold>=$(element).offset().top+settings.threshold+$(element).height();};$.leftofbegin=function(element,settings){if(settings.container===undefined||settings.container===window){var fold=$(window).scrollLeft();}else{var fold=$(settings.container).offset().left;}
|
12
|
+
return fold>=$(element).offset().left+settings.threshold+$(element).width();};$.extend($.expr[':'],{"below-the-fold":"$.belowthefold(a, {threshold : 0, container: window})","above-the-fold":"!$.belowthefold(a, {threshold : 0, container: window})","right-of-fold":"$.rightoffold(a, {threshold : 0, container: window})","left-of-fold":"!$.rightoffold(a, {threshold : 0, container: window})"});})(jQuery);
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Caboodle
|
2
|
+
|
3
|
+
class LinkedinAPI < Weary::Base
|
4
|
+
attr_accessor :data
|
5
|
+
attr_accessor :full
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@full = Caboodle.scrape(Caboodle::Site.linkedin_profile_url)
|
9
|
+
@full.css('.showhide-link').each{|a| @full.delete(a)}
|
10
|
+
@full = @full.css("#main").to_html.gsub("#{Caboodle::Site.linkedin_full_name}’s ","")
|
11
|
+
end
|
12
|
+
def method_missing(method_name)
|
13
|
+
@data.send(method_name.to_sym)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Linkedin < Caboodle::Kit
|
18
|
+
|
19
|
+
set :views, File.join(File.dirname(__FILE__), "views")
|
20
|
+
|
21
|
+
get "/cv" do
|
22
|
+
@title = "Curriculum Vitae"
|
23
|
+
|
24
|
+
@linkedin = LinkedinAPI.new #rescue nil
|
25
|
+
#@linkedin.inspect
|
26
|
+
haml :cv
|
27
|
+
end
|
28
|
+
|
29
|
+
menu "CV", "/cv"
|
30
|
+
|
31
|
+
required [:linkedin_full_name, :linkedin_profile_url]
|
32
|
+
end
|
33
|
+
end
|