wiser_date 0.1.3 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NGE0MThiYjFiMzE2MWNlY2M4NzdmZGEzZTdjZmJlNThiMDUxZDM4MA==
4
+ MDY2OWUyNzY1OTRlYTYxNWU1ZGE1MjMxN2ZkOGJiODNmOWU0ZjA4OQ==
5
5
  data.tar.gz: !binary |-
6
- NDJjMWFkMDk2M2M3NDRlMmU1ZTVjNzUwNWY2ZTI1OTUyYWUwNmU0Yg==
6
+ M2U1ZGVjMjU2MmMzMDY4YmFjZWRkOWZlNWVhZWEwODc0YTg3NWIxNg==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- Y2MxMDZjNGYyNzU3YzdjNDc1YWQ3YzlmNDljOTFiZjczMDNhODFmYTkxMzNm
10
- NGJjMWYwYjEzY2FlMmU3NDk2MWJiOTk0NzJhYzkwMDQxNDIyZTQ4MGY5NjUw
11
- ODc5MTFkYThhZmQ2ZWI3OWZkMGQ4MGE0NWMyNmVmMDFjZDMzNzg=
9
+ MGNkNjY1ZmVlMGY3ZWYyMGVlNWMwNjcwOWY3YmI5N2M2M2Y0M2FmODQ0MThh
10
+ MGQ5Yjc5YjQ2NzUzNjMyOGVhMzk0NmQ2ODhkZDNkMGRiY2I3NzI4MjIxNWNj
11
+ NGM4NzJlNmJlOWRkN2VkYTdhMDNiNDhlYmQ5ZTM5NDJkZTZiNTk=
12
12
  data.tar.gz: !binary |-
13
- NDc4MTk3NTNhYjRlMmRmNTU3Mzg4YzljMTI5NzRiY2Q3ZGI5YWI3MmJjYWMz
14
- MWE5Y2ZiYmEwYmI1ODczMjY2OGM0ZmZjMzM4ZWZkMDIyOTAxZTBhODk5N2Ey
15
- YWE5YTVlYzM3MWE2MGEwN2RmZmExMTc4Zjg5YjBhZjVkOWQ3ZDI=
13
+ ODYxNDNlMDAzNmViMmRiOTZiY2IwZWJiNTYyMDg5ZDMyMjdlOWEwZjJjZDdk
14
+ MGExZjNlZjQ0YzNmZGUyNWRlYTMzMDE1ZDBhYjI2ZDUzZTY0OTk0MzJjMzI4
15
+ ZGQ3YmIzYzBlYWYxMjEyOGE3ODU3MmI1YjgxODlkYzg4YWE4NmY=
data/README.rdoc CHANGED
@@ -7,11 +7,10 @@ WiserDate is a date formatting plugin written by Kenneth John Balgos (https://gi
7
7
 
8
8
  gem "wiser_date"
9
9
 
10
-
11
10
 
12
11
  == Dependency
13
12
 
14
- The Rails application should have jQuery to make the real-time feature work.
13
+ Rails >=3.1 and jQuery >=1.7 to make the real-time feature work.
15
14
 
16
15
 
17
16
  == Using the javascripts - Not Yet Available
@@ -95,6 +94,14 @@ You can customize the behavior of the date display by using the following option
95
94
  # Sample display after the day: Yesterday 12:21pm
96
95
  # Sample display after 2 days: Sept 10, 12:21pm
97
96
 
97
+ * *custom_class* - adds custom classes to the containter span of the date [default: nil]
98
+
99
+ <%= wiser_date @user.last_login_at, :custom_class => "date_tooltip" %>
100
+
101
+ * *time_now* - accepts complete timestamp as the basis of time distances [default: nil]
102
+
103
+ <%= wiser_date @user.last_login_at, :time_now => "2012-09-10 12:21:16 +0000" %>
104
+
98
105
 
99
106
  == Thanks
100
107
  Thanks to me for writing an awesome real-time date display plugin :p
@@ -1,6 +1,8 @@
1
1
  require "wiser_date/view_helpers"
2
-
3
2
  module WiserDate
3
+ class Engine < ::Rails::Engine
4
+ end
5
+
4
6
  class Railtie < Rails::Railtie
5
7
  initializer "wiser_date.view_helpers" do |app|
6
8
  ActionView::Base.send :include, ViewHelpers
@@ -2,7 +2,6 @@ require 'date'
2
2
 
3
3
  module WiserDate
4
4
  module ViewHelpers
5
-
6
5
  include ActionView::Helpers::JavaScriptHelper
7
6
  include ActionView::Helpers::TagHelper
8
7
  include ActionView::Helpers::DateHelper
@@ -10,7 +9,7 @@ module WiserDate
10
9
 
11
10
  def wiser_date(timestamp, options = {})
12
11
  # Options
13
- date_format = options.has_key?(:date_format) ? options[:date_format] : "%b %d, %Y"
12
+ date_format = options.has_key?(:date_format) ? options[:date_format] : "%B %d, %Y"
14
13
  time_format = options.has_key?(:time_format) ? options[:time_format] : "%l:%M%P"
15
14
  humanize = options.has_key?(:humanize) ? options[:humanize] : true
16
15
  time_first = options.has_key?(:time_first) ? options[:time_first] : false
@@ -18,6 +17,8 @@ module WiserDate
18
17
  capitalize = options.has_key?(:capitalize) ? options[:capitalize] : true
19
18
  custom_class = options.has_key?(:custom_class) ? options[:custom_class] : nil
20
19
  time_now = options.has_key?(:time_now) ? options[:time_now].to_datetime : Time.now
20
+ real_time = options.has_key?(:real_time) ? options[:real_time] : true
21
+ interval = options.has_key?(:interval) ? options[:interval] : 20
21
22
 
22
23
  # Formats
23
24
  flat_format = "%Y%m%d%H%M%S"
@@ -31,47 +32,75 @@ module WiserDate
31
32
  # Humanize Display
32
33
  if humanize
33
34
  time_diff_in_seconds = (time_now - timestamp.to_time).ceil
35
+ time_diff_in_hours = (time_diff_in_seconds / (60*60))
34
36
  time_diff_in_days = (time_diff_in_seconds / (60*60*24))
35
- if time_diff_in_seconds <= 30 && time_diff_in_seconds >= 0
37
+ if time_diff_in_seconds < 60 && time_diff_in_seconds >= 0
36
38
  custom_timestamp = "just now"
37
39
  elsif time_now.to_date - 1.day == timestamp.to_date
38
40
  date_value = "yesterday"
39
41
  time_value = timestamp.strftime(time_format)
40
- custom_timestamp = time_first ? "#{time_value} #{date_value}" : "#{date_value} #{time_value}"
41
- elsif time_diff_in_days <= 1.0 && time_diff_in_days >= 0
42
- custom_timestamp = "#{distance_of_time_in_words(Time.now, timestamp.to_time)} ago"
43
- elsif hide_same_year && time_now.year == timestamp.year
44
- custom_timestamp = custom_timestamp.gsub(", #{time_now.year.to_s}", '')
42
+ custom_timestamp = time_first ? "#{time_value} #{date_value}" : "#{date_value} at #{time_value}"
43
+ elsif time_diff_in_days < 0
44
+ if time_diff_in_days > -2
45
+ date_value = "tomorrow"
46
+ time_value = timestamp.strftime(time_format)
47
+ custom_timestamp = time_first ? "#{time_value} #{date_value}" : "#{date_value} at #{time_value}"
48
+ elsif time_diff_in_days > -7
49
+ date_value = "on " + timestamp.strftime('%A')
50
+ time_value = timestamp.strftime(time_format)
51
+ custom_timestamp = time_first ? "#{time_value} #{date_value}" : "#{date_value} at #{time_value}"
52
+ end
53
+ elsif time_diff_in_days < 1
54
+ if time_now.to_date == timestamp.to_date && time_diff_in_hours >= 8
55
+ date_value = "today"
56
+ time_value = timestamp.strftime(time_format)
57
+ custom_timestamp = time_first ? "#{time_value} #{date_value}" : "#{date_value} at #{time_value}"
58
+ else
59
+ custom_timestamp = "#{distance_of_time_in_words(Time.now, timestamp.to_time)} ago"
60
+ end
61
+ elsif time_diff_in_days < 7
62
+ date_value = "last " + timestamp.strftime('%A')
63
+ time_value = timestamp.strftime(time_format)
64
+ custom_timestamp = time_first ? "#{time_value} #{date_value}" : "#{date_value} at #{time_value}"
45
65
  end
46
66
  end
47
-
67
+
68
+ # Hide Same Year
69
+ if hide_same_year && time_now.year == timestamp.year
70
+ custom_timestamp = custom_timestamp.gsub(", #{time_now.year.to_s} ", ' at')
71
+ end
48
72
  # Capitalize
49
73
  if capitalize
50
- custom_timestamp = custom_timestamp.to_s.capitalize
74
+ custom_timestamp[0] = custom_timestamp[0].upcase
51
75
  end
52
76
 
77
+ classes = ["wiser_date"]
78
+ classes << custom_class if custom_class.present?
79
+ classes << "time_first" if time_first
80
+ classes << "hide_same_year" if hide_same_year
81
+ classes << "humanize" if humanize
82
+ classes << "capitalize" if capitalize
83
+ classes << "real_time" if real_time
84
+ classes = classes.join(' ')
53
85
 
54
86
  uniq_id = Digest::SHA1.hexdigest([Time.now, rand].join)
55
87
  html = content_tag(:span, custom_timestamp,
56
88
  "id" => uniq_id,
57
- "class" => "wiser_date #{custom_class if custom_class.present?}",
89
+ "class" => classes,
58
90
  "data-plain-timestamp" => plain_timestamp,
59
- "data-custom-timestamp" => custom_timestamp,
60
- "data-new-custom-timestamp" => custom_timestamp
91
+ "data-date-format" => date_format,
92
+ "data-time-format" => time_format
61
93
  )
62
-
94
+
63
95
  meta_vars = []
64
96
  meta_vars << "data-value=\"#"+uniq_id+"\""
65
97
  meta_vars << "data-custom-format=\""+custom_format+"\""
66
- meta_vars << "data-date-format=\""+date_format+"\""
67
- meta_vars << "data-time-format=\""+time_format+"\""
68
- meta_vars << "data-humanize=\""+humanize.to_s+"\""
69
- meta_vars << "data-hide-same-year=\""+hide_same_year.to_s+"\""
70
- meta_vars << "data-time-first=\""+time_first.to_s+"\""
71
- meta_vars << "data-capitalize=\""+capitalize.to_s+"\""
98
+ meta_vars << "data-server-datetime=\""+time_now.strftime(plain_format)+"\""
99
+ meta_vars << "data-server-datetime=\""+time_now.strftime(plain_format)+"\""
100
+ meta_vars << "data-interval=\""+interval.to_s+"\""
72
101
  meta_vars << "id=\"wiser_date\""
73
-
74
- html += javascript_tag("jQuery(document).ready(function(){if(jQuery('body meta#wiser_date').size() == 0){$('body').prepend('<meta "+meta_vars.join(' ')+" />')}else{$('meta#wiser_date').attr('data-value',$('meta#wiser_date').attr('data-value')+', #"+uniq_id+"')}});")
102
+
103
+ html += javascript_tag("jQuery(document).ready(function(){if(jQuery('body meta#wiser_date').size() == 0){$('body').prepend('<meta "+meta_vars.join(' ')+" />')}else{$('meta#wiser_date').attr('data-value',$('meta#wiser_date').attr('data-value')+', #"+uniq_id+"')}; updateWiserDate(\""+uniq_id+"\");});")
75
104
  html.html_safe
76
105
  end
77
106
  end
@@ -0,0 +1,215 @@
1
+ function updateWiserDate(id) {
2
+ if($('meta#wiser_date').attr('data-real-time-started') != "true"){
3
+ update_interval = parseInt($('meta#wiser_date').attr('data-interval')) * 1000;
4
+ setInterval(function() {
5
+ update_timer(update_interval)
6
+ span_ids = $('meta#wiser_date').attr('data-value');
7
+ $(span_ids).each(function(){
8
+ if($(this).hasClass('real_time'))
9
+ updateDate($(this));
10
+ })
11
+ },update_interval);
12
+ }
13
+ $('meta#wiser_date').attr('data-real-time-started','true');
14
+ }
15
+
16
+ function updateDate(el){
17
+ el.text(prettyDate(el));
18
+ }
19
+
20
+ function prettyDate(element){
21
+ datetime = element.attr('data-plain-timestamp')
22
+ date_format = element.attr('data-date-format')
23
+ time_format = element.attr('data-time-format')
24
+
25
+ hide_same_year = element.hasClass('hide_same_year')
26
+ capitalize = element.hasClass('capitalize')
27
+ humanize = element.hasClass('humanize')
28
+ time_first = element.hasClass('time_first')
29
+
30
+ server_datetime = $('meta#wiser_date').attr('data-server-datetime')
31
+ var time_now = new Date((server_datetime || "").replace(/-/g,"/").replace(/[TZ]/g," "));
32
+ var timestamp = new Date((datetime || "").replace(/-/g,"/").replace(/[TZ]/g," "));
33
+ var time_diff_in_seconds = ((time_now.getTime() - timestamp.getTime()) / 1000);
34
+ var time_diff_in_hours = Math.floor(time_diff_in_seconds / 3600);
35
+ var time_diff_in_days = Math.floor(time_diff_in_seconds / 86400);
36
+
37
+ date_yesterday = time_now;
38
+ date_yesterday.setDate(time_now.getDate() - 1);
39
+
40
+ flat_format = "%Y%m%d%H%M%S"
41
+ plain_date_format = "%Y-%m-%d"
42
+ plain_format = "%Y-%m-%d %H:%M:%S"
43
+
44
+ if(time_first){
45
+ regular_date_display = custom_format(timestamp, time_format + " " + date_format);
46
+ }else{
47
+ regular_date_display = custom_format(timestamp, date_format + " " + time_format);
48
+ }
49
+
50
+ if(isNaN(time_diff_in_days)){
51
+ custom_timestamp = datetime;
52
+ }else if(humanize){
53
+ if(time_diff_in_seconds < 60 && time_diff_in_seconds >= 0){
54
+ custom_timestamp = "just now"
55
+ }else if(custom_format(date_yesterday, plain_date_format) == custom_format(timestamp, plain_date_format)){
56
+ date_value = "yesterday"
57
+ time_value = custom_format(timestamp, time_format)
58
+ if(time_first){
59
+ custom_timestamp = time_value + " " + date_value;
60
+ }else{
61
+ custom_timestamp = date_value + " at " + time_value;
62
+ }
63
+ }else if(time_diff_in_days < 0){
64
+ if(time_diff_in_days > -2){
65
+ date_value = "tomorrow"
66
+ time_value = custom_format(timestamp, time_format)
67
+ if(time_first){
68
+ custom_timestamp = time_value + " " + date_value;
69
+ }else{
70
+ custom_timestamp = date_value + " at " + time_value;
71
+ }
72
+ }else if(time_diff_in_days > -7){
73
+ date_value = "on " + custom_format(timestamp, "%A")
74
+ time_value = custom_format(timestamp, time_format)
75
+ if(time_first){
76
+ custom_timestamp = time_value + " " + date_value;
77
+ }else{
78
+ custom_timestamp = date_value + " at " + time_value;
79
+ }
80
+ }else{
81
+ custom_timestamp = regular_date_display
82
+ }
83
+ }else if(time_diff_in_days < 1){
84
+ if(time_diff_in_hours >= 8){
85
+ date_value = "today"
86
+ time_value = custom_format(timestamp, time_format)
87
+ if(time_first){
88
+ custom_timestamp = time_value + " " + date_value;
89
+ }else{
90
+ custom_timestamp = date_value + " at " + time_value;
91
+ }
92
+ }else{
93
+ custom_timestamp = humanize_format(time_diff_in_seconds, time_diff_in_days);
94
+ }
95
+ }else if(time_diff_in_days < 7){
96
+ date_value = "last " + custom_format(timestamp, "%A")
97
+ time_value = custom_format(timestamp, time_format)
98
+ if(time_first){
99
+ custom_timestamp = time_value + " " + date_value;
100
+ }else{
101
+ custom_timestamp = date_value + " at " + time_value;
102
+ }
103
+ }else{
104
+ element.removeClass('real_time')
105
+ custom_timestamp = regular_date_display
106
+ }
107
+ }else{
108
+ custom_timestamp = regular_date_display
109
+ }
110
+
111
+ if(hide_same_year){
112
+ custom_timestamp = custom_timestamp.replace(", "+time_now.getFullYear(), ' at')
113
+ }
114
+ if(capitalize){
115
+ custom_timestamp = custom_timestamp[0].toUpperCase() + custom_timestamp.slice(1);
116
+ }
117
+
118
+ return custom_timestamp; // + " - ["+time_diff_in_seconds.toString()+":"+time_diff_in_days+"]";
119
+ }
120
+
121
+ function update_timer(interval){
122
+ if(!interval){interval = 1000;}
123
+ current_datetime = $('meta#wiser_date').attr('data-server-datetime');
124
+ current_datetime = new Date((current_datetime || "").replace(/-/g,"/").replace(/[TZ]/g," "));
125
+ current_datetime.setTime(current_datetime.getTime() + interval);
126
+ current_datetime = custom_format(current_datetime, "%Y-%m-%d %H:%M:%S");
127
+ $('meta#wiser_date').attr('data-server-datetime', current_datetime);
128
+ $('#real_time').text('The actual server time is ' + current_datetime);
129
+ }
130
+
131
+ function humanize_format(sec_diff, day_diff){
132
+ return day_diff == 0 && (
133
+ sec_diff < 60 && "just now" ||
134
+ sec_diff < 120 && "1 minute ago" ||
135
+ sec_diff < 3600 && Math.floor( sec_diff / 60 ) + " minutes ago" ||
136
+ sec_diff < 7200 && "about 1 hour ago" ||
137
+ sec_diff < 86400 && "about " + Math.floor( sec_diff / 3600 ) + " hours ago") ||
138
+ day_diff == 1 && "Yesterday" ||
139
+ day_diff < 7 && day_diff + " days ago" ||
140
+ day_diff < 31 && Math.ceil( day_diff / 7 ) + " week ago";
141
+ }
142
+
143
+ function custom_format(timestamp, format){
144
+ func = new DateFmt();
145
+ datetime = format;
146
+ datetime = datetime.replace("%Y", func.format(timestamp,"%Y"));
147
+ datetime = datetime.replace("%m", func.format(timestamp,"%m"));
148
+ datetime = datetime.replace("%d", func.format(timestamp,"%d"));
149
+ datetime = datetime.replace("%b", func.format(timestamp,"%b"));
150
+ datetime = datetime.replace("%B", func.format(timestamp,"%B"));
151
+ datetime = datetime.replace("%H", func.format(timestamp,"%H"));
152
+ datetime = datetime.replace("%M", func.format(timestamp,"%M"));
153
+ datetime = datetime.replace("%S", func.format(timestamp,"%S"));
154
+ datetime = datetime.replace("%A", func.format(timestamp,"%A"));
155
+ datetime = datetime.replace("%a", func.format(timestamp,"%a"));
156
+ if(timestamp.getHours() > 12){
157
+ datetime = datetime.replace("%l", lead_zero(timestamp.getHours() - 12, " "));
158
+ datetime = datetime.replace("%P", "pm");
159
+ datetime = datetime.replace("%p", "PM");
160
+ }else{
161
+ datetime = datetime.replace("%l", lead_zero(timestamp.getHours(), " "));
162
+ datetime = datetime.replace("%P", "am");
163
+ datetime = datetime.replace("%p", "AM");
164
+ }
165
+ return datetime;
166
+ }
167
+
168
+ function lead_zero(val, extra){
169
+ str_val = parseInt(val);
170
+ if(!extra){extra = "0";}
171
+ if(str_val < 10){
172
+ return extra + str_val;
173
+ }else{
174
+ return str_val;
175
+ }
176
+ }
177
+
178
+ function DateFmt() {
179
+ this.dateMarkers = {
180
+ d:['getDate',function(v) { return ("0"+v).substr(-2,2)}],
181
+ m:['getMonth',function(v) { return ("0"+(v+1)).substr(-2,2)}],
182
+ b:['getMonth',function(v) {
183
+ var mthNames = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
184
+ return mthNames[v];
185
+ }],
186
+ B:['getMonth',function(v) {
187
+ var mthNames = ["January","February","March","April","May","June","July","August","September","October","Novovember","December"];
188
+ return mthNames[v];
189
+ }],
190
+ a:['getDay',function(v) {
191
+ var dayNames = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
192
+ return dayNames[v];
193
+ }],
194
+ A:['getDay',function(v) {
195
+ var dayNames = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
196
+ return dayNames[v];
197
+ }],
198
+ Y:['getFullYear'],
199
+ H:['getHours',function(v) { return ("0"+v).substr(-2,2)}],
200
+ M:['getMinutes',function(v) { return ("0"+v).substr(-2,2)}],
201
+ S:['getSeconds',function(v) { return ("0"+v).substr(-2,2)}],
202
+ i:['toISOString',null]
203
+ };
204
+
205
+ this.format = function(date, fmt) {
206
+ var dateMarkers = this.dateMarkers
207
+ var dateTxt = fmt.replace(/%(.)/g, function(m, p){
208
+ var rv = date[(dateMarkers[p])[0]]()
209
+ if ( dateMarkers[p][1] != null ) rv = dateMarkers[p][1](rv)
210
+ return rv
211
+ });
212
+
213
+ return dateTxt
214
+ }
215
+ }
metadata CHANGED
@@ -1,21 +1,36 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wiser_date
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenneth John Balgos
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2012-05-25 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2012-05-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '3.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '3.1'
13
27
  description: Display dates in the coolest format.
14
28
  email: kennethjohnbalgos@gmail.com
15
29
  executables: []
16
30
  extensions: []
17
31
  extra_rdoc_files: []
18
32
  files:
33
+ - vendor/assets/javascripts/jquery.wiser_date.js
19
34
  - lib/wiser_date/view_helpers.rb
20
35
  - lib/wiser_date/railtie.rb
21
36
  - lib/wiser_date.rb