wiser_date 0.1.3 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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