later_dude 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -2,6 +2,7 @@
2
2
  ----------
3
3
  - Make LaterDude Rails 3-compatible
4
4
  - Include Rails 2 compatibility layer
5
+ - Fix broken gem release (0.3.1)
5
6
 
6
7
  2009/11/18
7
8
  ----------
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 Clemens Kofler
1
+ Copyright (c) 2009, 2010 Clemens Kofler
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README CHANGED
@@ -16,12 +16,20 @@ You can use LaterDude either as a gem (preferred) or as a Rails plugin.
16
16
 
17
17
  To use the gem version, put the following gem requirement in your environment.rb:
18
18
 
19
- config.gem "later_dude", :source => 'http://gemcutter.org'
19
+ config.gem 'later_dude', :source => 'http://gemcutter.org'
20
+
21
+ Or with Rails 3, add the gem requirement to your Gemfile:
22
+
23
+ gem 'later_dude', '>= 0.3.1' # 0.3.0 was broken!
20
24
 
21
25
  To install it as a plugin, fire up your terminal, go to your Rails app and type:
22
26
 
23
27
  $ ruby script/plugin install git://github.com/clemens/later_dude.git
24
28
 
29
+ To use the CalendarHelper, put this in a controller:
30
+
31
+ helper LaterDude::CalendarHelper
32
+
25
33
  Examples
26
34
  ========
27
35
 
@@ -139,4 +147,4 @@ Bugs & Feedback
139
147
 
140
148
  You can send me feedback, bug reports and patches via "GitHub":http://github.com/clemens.
141
149
 
142
- Copyright (c) 2009 Clemens Kofler <clemens@railway.at>, released under the MIT license.
150
+ Copyright (c) 2009, 2010 Clemens Kofler <clemens@railway.at>, released under the MIT license.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.3.1
data/lib/later_dude.rb CHANGED
@@ -1,204 +1,3 @@
1
- require 'rails2_compat'
2
-
3
- module LaterDude
4
- module CalendarHelper
5
- def calendar_for(year, month, options={}, &block)
6
- Calendar.new(year, month, options, &block).to_html
7
- end
8
- end
9
-
10
- # TODO: Maybe make output prettier?
11
- class Calendar
12
- include ActionView::Helpers::CaptureHelper
13
- include ActionView::Helpers::TagHelper
14
- include ActionView::Helpers::UrlHelper
15
-
16
- attr_accessor :output_buffer
17
-
18
- def initialize(year, month, options={}, &block)
19
- @year, @month = year, month
20
- @options = options.symbolize_keys.reverse_merge(self.class.default_calendar_options)
21
-
22
- # next_month and previous_month take precedence over next_and_previous_month
23
- @options[:next_month] ||= @options[:next_and_previous_month]
24
- @options[:previous_month] ||= @options[:next_and_previous_month]
25
-
26
- @days = Date.civil(@year, @month, 1)..Date.civil(@year, @month, -1)
27
- @block = block
28
- end
29
-
30
- def to_html
31
- content_tag(:table, :class => "#{@options[:calendar_class]}") do
32
- content_tag(:tbody, show_days)+ content_tag(:thead, "#{show_month_names}#{show_day_names}".html_safe)
33
- end
34
- end
35
-
36
- private
37
- def show_days
38
- content_tag(:tr, "#{show_previous_month}#{show_current_month}#{show_following_month}".html_safe)
39
- end
40
-
41
- def show_previous_month
42
- return if @days.first.wday == first_day_of_week # don't display anything if the first day is the first day of a week
43
-
44
- returning "" do |output|
45
- beginning_of_week(@days.first).upto(@days.first - 1) { |d| output << show_day(d) }
46
- end.html_safe
47
- end
48
-
49
- def show_current_month
50
- returning "" do |output|
51
- @days.first.upto(@days.last) { |d| output << show_day(d) }
52
- end.html_safe
53
- end
54
-
55
- def show_following_month
56
- return if @days.last.wday == last_day_of_week # don't display anything if the last day is the last day of a week
57
-
58
- returning "" do |output|
59
- (@days.last + 1).upto(beginning_of_week(@days.last + 1.week) - 1) { |d| output << show_day(d) }
60
- end.html_safe
61
- end
62
-
63
- def show_day(day)
64
- options = { :class => "day" }
65
- options[:class] << " otherMonth" if day.month != @days.first.month
66
- options[:class] << " weekend" if Calendar.weekend?(day)
67
- options[:class] << " today" if day.today?
68
-
69
- # block is only called for current month or if :yield_surrounding_days is set to true
70
- if @block && (@options[:yield_surrounding_days] || day.month == @days.first.month)
71
- content, options_from_block = Array(@block.call(day))
72
-
73
- # passing options is optional
74
- if options_from_block.is_a?(Hash)
75
- options[:class] << " #{options_from_block.delete(:class)}" if options_from_block[:class]
76
- options.merge!(options_from_block)
77
- end
78
- else
79
- content = day.day
80
- end
81
-
82
- content = content_tag(:td, content.to_s.html_safe, options)
83
-
84
- # close table row at the end of a week and start a new one
85
- # opening and closing tag for the first and last week are included in #show_days
86
- content << "</tr><tr>".html_safe if day < @days.last && day.wday == last_day_of_week
87
- content
88
- end
89
-
90
- def beginning_of_week(day)
91
- diff = day.wday - first_day_of_week
92
- diff += 7 if first_day_of_week > day.wday # hackish ;-)
93
- day - diff
94
- end
95
-
96
- def show_month_names
97
- return if @options[:hide_month_name]
98
-
99
- content_tag(:tr, "#{previous_month}#{current_month}#{next_month}".html_safe, :class => 'month_names')
100
- end
101
-
102
- # @options[:previous_month] can either be a single value or an array containing two values. For a single value, the
103
- # value can either be a strftime compatible string or a proc.
104
- # For an array, the first value is considered to be a strftime compatible string and the second is considered to be
105
- # a proc. If the second value is not a proc then it will be ignored.
106
- def previous_month
107
- return unless @options[:previous_month]
108
-
109
- show_month(@days.first - 1.month, @options[:previous_month], :class => "previous")
110
- end
111
-
112
- # see previous_month
113
- def next_month
114
- return unless @options[:next_month]
115
-
116
- show_month(@days.first + 1.month, @options[:next_month], :class => "next")
117
- end
118
-
119
- # see previous_month and next_month
120
- def current_month
121
- colspan = @options[:previous_month] || @options[:next_month] ? 3 : 7 # span across all 7 days if previous and next month aren't shown
122
-
123
- show_month(@days.first, @options[:current_month], :colspan => colspan, :class => "current")
124
- end
125
-
126
- def show_month(month, format, options={})
127
- options[:colspan] ||= 2
128
-
129
- content_tag(:th, :colspan => options[:colspan], :class => "#{options[:class]} #{Date::MONTHNAMES[month.month].downcase}") do
130
- if format.kind_of?(Array) && format.size == 2
131
- text = I18n.localize(month, :format => format.first.to_s).html_safe
132
- format.last.respond_to?(:call) ? link_to(text, format.last.call(month)) : text
133
- else
134
- format.respond_to?(:call) ? format.call(month) : I18n.localize(month, :format => format.to_s).html_safe
135
- end
136
- end
137
- end
138
-
139
- def day_names
140
- @day_names ||= @options[:use_full_day_names] ? full_day_names : abbreviated_day_names
141
- end
142
-
143
- def full_day_names
144
- @full_day_names ||= I18n.translate(:'date.day_names')
145
- end
146
-
147
- def abbreviated_day_names
148
- @abbreviated_day_names ||= I18n.translate(:'date.abbr_day_names')
149
- end
150
-
151
- def show_day_names
152
- return if @options[:hide_day_names]
153
- content_tag(:tr, :class => 'day_names') do
154
- apply_first_day_of_week(day_names).inject('') do |output, day|
155
- output << content_tag(:th, include_day_abbreviation(day), :scope => 'col', :class => Date::DAYNAMES[day_names.index(day)].downcase)
156
- end.html_safe
157
- end
158
- end
159
-
160
- # => <abbr title="Sunday">Sun</abbr>
161
- def include_day_abbreviation(day)
162
- return day if @options[:use_full_day_names]
163
-
164
- content_tag(:abbr, day, :title => full_day_names[abbreviated_day_names.index(day)])
165
- end
166
-
167
- def apply_first_day_of_week(day_names)
168
- names = day_names.dup
169
- first_day_of_week.times { names.push(names.shift) }
170
- names
171
- end
172
-
173
- def first_day_of_week
174
- @options[:first_day_of_week]
175
- end
176
-
177
- def last_day_of_week
178
- @options[:first_day_of_week] > 0 ? @options[:first_day_of_week] - 1 : 6
179
- end
180
-
181
- class << self
182
- def weekend?(day)
183
- [0,6].include?(day.wday) # 0 = Sunday, 6 = Saturday
184
- end
185
-
186
- def default_calendar_options
187
- {
188
- :calendar_class => "calendar",
189
- :first_day_of_week => I18n.translate(:'date.first_day_of_week', :default => "0").to_i,
190
- :hide_day_names => false,
191
- :hide_month_name => false,
192
- :use_full_day_names => false,
193
- :current_month => I18n.translate(:'date.formats.calendar_header', :default => "%B"),
194
- :next_month => false,
195
- :previous_month => false,
196
- :next_and_previous_month => false,
197
- :yield_surrounding_days => false
198
- }
199
- end
200
- end
201
- end
202
- end
203
-
204
- ActionView::Base.send(:include, LaterDude::CalendarHelper)
1
+ require 'later_dude/calendar'
2
+ require 'later_dude/calendar_helper'
3
+ require 'later_dude/rails2_compat'
@@ -0,0 +1,194 @@
1
+ module LaterDude
2
+ # TODO: Maybe make output prettier?
3
+ class Calendar
4
+ include ActionView::Helpers::CaptureHelper
5
+ include ActionView::Helpers::TagHelper
6
+ include ActionView::Helpers::UrlHelper
7
+
8
+ attr_accessor :output_buffer
9
+
10
+ def initialize(year, month, options={}, &block)
11
+ @year, @month = year, month
12
+ @options = options.symbolize_keys.reverse_merge(self.class.default_calendar_options)
13
+
14
+ # next_month and previous_month take precedence over next_and_previous_month
15
+ @options[:next_month] ||= @options[:next_and_previous_month]
16
+ @options[:previous_month] ||= @options[:next_and_previous_month]
17
+
18
+ @days = Date.civil(@year, @month, 1)..Date.civil(@year, @month, -1)
19
+ @block = block
20
+ end
21
+
22
+ def to_html
23
+ content_tag(:table, :class => "#{@options[:calendar_class]}") do
24
+ content_tag(:tbody, show_days)+ content_tag(:thead, "#{show_month_names}#{show_day_names}".html_safe)
25
+ end
26
+ end
27
+
28
+ private
29
+ def show_days
30
+ content_tag(:tr, "#{show_previous_month}#{show_current_month}#{show_following_month}".html_safe)
31
+ end
32
+
33
+ def show_previous_month
34
+ return if @days.first.wday == first_day_of_week # don't display anything if the first day is the first day of a week
35
+
36
+ returning "" do |output|
37
+ beginning_of_week(@days.first).upto(@days.first - 1) { |d| output << show_day(d) }
38
+ end.html_safe
39
+ end
40
+
41
+ def show_current_month
42
+ returning "" do |output|
43
+ @days.first.upto(@days.last) { |d| output << show_day(d) }
44
+ end.html_safe
45
+ end
46
+
47
+ def show_following_month
48
+ return if @days.last.wday == last_day_of_week # don't display anything if the last day is the last day of a week
49
+
50
+ returning "" do |output|
51
+ (@days.last + 1).upto(beginning_of_week(@days.last + 1.week) - 1) { |d| output << show_day(d) }
52
+ end.html_safe
53
+ end
54
+
55
+ def show_day(day)
56
+ options = { :class => "day" }
57
+ options[:class] << " otherMonth" if day.month != @days.first.month
58
+ options[:class] << " weekend" if Calendar.weekend?(day)
59
+ options[:class] << " today" if day.today?
60
+
61
+ # block is only called for current month or if :yield_surrounding_days is set to true
62
+ if @block && (@options[:yield_surrounding_days] || day.month == @days.first.month)
63
+ content, options_from_block = Array(@block.call(day))
64
+
65
+ # passing options is optional
66
+ if options_from_block.is_a?(Hash)
67
+ options[:class] << " #{options_from_block.delete(:class)}" if options_from_block[:class]
68
+ options.merge!(options_from_block)
69
+ end
70
+ else
71
+ content = day.day
72
+ end
73
+
74
+ content = content_tag(:td, content.to_s.html_safe, options)
75
+
76
+ # close table row at the end of a week and start a new one
77
+ # opening and closing tag for the first and last week are included in #show_days
78
+ content << "</tr><tr>".html_safe if day < @days.last && day.wday == last_day_of_week
79
+ content
80
+ end
81
+
82
+ def beginning_of_week(day)
83
+ diff = day.wday - first_day_of_week
84
+ diff += 7 if first_day_of_week > day.wday # hackish ;-)
85
+ day - diff
86
+ end
87
+
88
+ def show_month_names
89
+ return if @options[:hide_month_name]
90
+
91
+ content_tag(:tr, "#{previous_month}#{current_month}#{next_month}".html_safe, :class => 'month_names')
92
+ end
93
+
94
+ # @options[:previous_month] can either be a single value or an array containing two values. For a single value, the
95
+ # value can either be a strftime compatible string or a proc.
96
+ # For an array, the first value is considered to be a strftime compatible string and the second is considered to be
97
+ # a proc. If the second value is not a proc then it will be ignored.
98
+ def previous_month
99
+ return unless @options[:previous_month]
100
+
101
+ show_month(@days.first - 1.month, @options[:previous_month], :class => "previous")
102
+ end
103
+
104
+ # see previous_month
105
+ def next_month
106
+ return unless @options[:next_month]
107
+
108
+ show_month(@days.first + 1.month, @options[:next_month], :class => "next")
109
+ end
110
+
111
+ # see previous_month and next_month
112
+ def current_month
113
+ colspan = @options[:previous_month] || @options[:next_month] ? 3 : 7 # span across all 7 days if previous and next month aren't shown
114
+
115
+ show_month(@days.first, @options[:current_month], :colspan => colspan, :class => "current")
116
+ end
117
+
118
+ def show_month(month, format, options={})
119
+ options[:colspan] ||= 2
120
+
121
+ content_tag(:th, :colspan => options[:colspan], :class => "#{options[:class]} #{Date::MONTHNAMES[month.month].downcase}") do
122
+ if format.kind_of?(Array) && format.size == 2
123
+ text = I18n.localize(month, :format => format.first.to_s).html_safe
124
+ format.last.respond_to?(:call) ? link_to(text, format.last.call(month)) : text
125
+ else
126
+ format.respond_to?(:call) ? format.call(month) : I18n.localize(month, :format => format.to_s).html_safe
127
+ end
128
+ end
129
+ end
130
+
131
+ def day_names
132
+ @day_names ||= @options[:use_full_day_names] ? full_day_names : abbreviated_day_names
133
+ end
134
+
135
+ def full_day_names
136
+ @full_day_names ||= I18n.translate(:'date.day_names')
137
+ end
138
+
139
+ def abbreviated_day_names
140
+ @abbreviated_day_names ||= I18n.translate(:'date.abbr_day_names')
141
+ end
142
+
143
+ def show_day_names
144
+ return if @options[:hide_day_names]
145
+ content_tag(:tr, :class => 'day_names') do
146
+ apply_first_day_of_week(day_names).inject('') do |output, day|
147
+ output << content_tag(:th, include_day_abbreviation(day), :scope => 'col', :class => Date::DAYNAMES[day_names.index(day)].downcase)
148
+ end.html_safe
149
+ end
150
+ end
151
+
152
+ # => <abbr title="Sunday">Sun</abbr>
153
+ def include_day_abbreviation(day)
154
+ return day if @options[:use_full_day_names]
155
+
156
+ content_tag(:abbr, day, :title => full_day_names[abbreviated_day_names.index(day)])
157
+ end
158
+
159
+ def apply_first_day_of_week(day_names)
160
+ names = day_names.dup
161
+ first_day_of_week.times { names.push(names.shift) }
162
+ names
163
+ end
164
+
165
+ def first_day_of_week
166
+ @options[:first_day_of_week]
167
+ end
168
+
169
+ def last_day_of_week
170
+ @options[:first_day_of_week] > 0 ? @options[:first_day_of_week] - 1 : 6
171
+ end
172
+
173
+ class << self
174
+ def weekend?(day)
175
+ [0,6].include?(day.wday) # 0 = Sunday, 6 = Saturday
176
+ end
177
+
178
+ def default_calendar_options
179
+ {
180
+ :calendar_class => "calendar",
181
+ :first_day_of_week => I18n.translate(:'date.first_day_of_week', :default => "0").to_i,
182
+ :hide_day_names => false,
183
+ :hide_month_name => false,
184
+ :use_full_day_names => false,
185
+ :current_month => I18n.translate(:'date.formats.calendar_header', :default => "%B"),
186
+ :next_month => false,
187
+ :previous_month => false,
188
+ :next_and_previous_month => false,
189
+ :yield_surrounding_days => false
190
+ }
191
+ end
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,7 @@
1
+ module LaterDude
2
+ module CalendarHelper
3
+ def calendar_for(year, month, options={}, &block)
4
+ Calendar.new(year, month, options, &block).to_html
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ unless ''.respond_to?(:html_safe)
2
+ class String
3
+ def html_safe
4
+ self
5
+ end
6
+ end
7
+ end
@@ -9,7 +9,7 @@ begin
9
9
  s.authors = ["Clemens Kofler"]
10
10
  s.files = FileList["CHANGELOG",
11
11
  "init.rb",
12
- "lib/later_dude.rb",
12
+ "lib/**/*.rb",
13
13
  "MIT-LICENSE",
14
14
  "Rakefile",
15
15
  "README",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: later_dude
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clemens Kofler
@@ -29,6 +29,9 @@ files:
29
29
  - VERSION
30
30
  - init.rb
31
31
  - lib/later_dude.rb
32
+ - lib/later_dude/calendar.rb
33
+ - lib/later_dude/calendar_helper.rb
34
+ - lib/later_dude/rails2_compat.rb
32
35
  - tasks/distribution.rb
33
36
  - tasks/documentation.rb
34
37
  - tasks/testing.rb