jekyll-timeago 0.3.1 → 0.4.0

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.
data/README.md CHANGED
@@ -1,22 +1,28 @@
1
1
  Jekyll-Timeago
2
2
  ==============
3
- Custom and simple implementation of `timeago` date filter. Futures supported.
3
+ Custom and simple implementation of `timeago` date filter. Futures and personalization are also supported.
4
4
 
5
5
  In fact, `jekyll-timeago` is an extension of [Liquid](https://github.com/Shopify/liquid) filters, so you can use it in all your Liquid templates.
6
6
 
7
+
7
8
  ## Installation
8
- Add this gem to your Gemfile and run bundle:
9
+ Add this gem to your `Gemfile` and run `bundle`:
10
+
9
11
  ```
10
12
  gem 'jekyll-timeago'
11
13
  ```
12
- To enable the extension add the following statement to a file in your plugin directory (_plugins/ext.rb):
13
- ```
14
+
15
+ To use this filter, just add the following to the top of another plugin (found under `_plugins/`):
16
+
17
+ ```ruby
14
18
  require 'jekyll/timeago'
15
19
  ```
16
- You can copy this [file](https://github.com/markets/jekyll-timeago/blob/master/lib/jekyll/timeago.rb) directly in your plugin directory (_plugins/) as well :)
20
+
21
+ Alternatively, you can simply copy [this file](https://github.com/markets/jekyll-timeago/blob/master/lib/jekyll/timeago.rb) directly into your `_plugins/` directory! :)
22
+
17
23
 
18
24
  ## Usage
19
- ```
25
+ ```html
20
26
  <span>{{ page.date | timeago }}</span>
21
27
  <h2>{{ page.title }}</h2>
22
28
 
@@ -25,23 +31,42 @@ You can copy this [file](https://github.com/markets/jekyll-timeago/blob/master/l
25
31
  </div>
26
32
  ```
27
33
 
28
- ## Output samples
34
+ ### Customization
35
+ You can personalize the level of detail (from 1 up to 4, 2 by default) passing a parameter:
36
+ ```html
37
+ <span>{{ page.date | timeago: 4 }}</span>
29
38
  ```
39
+
40
+ ## Output Examples
41
+ Default behavior:
42
+ ```ruby
30
43
  > timeago(Date.today)
31
44
  => "today"
32
45
  > timeago(Date.today - 1.day)
33
46
  => "yesterday"
34
47
  > timeago(Date.today - 10.days)
35
- => "1 week ago"
48
+ => "1 week and 3 days ago"
36
49
  > timeago(Date.today - 100.days)
37
- => "3 months ago"
38
- > timeago(Date.today - 400.days)
39
- => "1 year ago"
50
+ => "3 months and 1 week ago"
51
+ > timeago(Date.today - 500.days)
52
+ => "1 year ago and 4 months ago"
40
53
  > timeago(Date.today + 1.days)
41
54
  => "tomorrow"
42
- > timeago(Date.today + 10.days)
55
+ > timeago(Date.today + 7.days)
43
56
  => "in 1 week"
44
57
  ```
45
58
 
59
+ Change level of detail to get higher or lower granularity:
60
+ ```ruby
61
+ > timeago(Date.today - 500.days) # default
62
+ => "1 year ago and 4 months ago"
63
+ > timeago(Date.today - 500.days, 3)
64
+ => "1 year and 4 months and 1 week ago"
65
+ > timeago(Date.today - 500.days, 4)
66
+ => "1 year and 4 months and 1 week and 4 days ago"
67
+ > timeago(Date.today - 500.days, 1)
68
+ => "1 year ago"
69
+ ```
70
+
46
71
  ## License
47
- Copyright (c) 2013 Marc Anguera. Unscoped Associations is released under the [MIT](http://opensource.org/licenses/MIT) License.
72
+ Copyright (c) 2013 Marc Anguera. Unscoped Associations is released under the [MIT](http://opensource.org/licenses/MIT) License.
@@ -20,5 +20,4 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
- spec.add_dependency "activesupport"
24
23
  end
@@ -1,60 +1,88 @@
1
1
  require "jekyll/timeago/version"
2
- require "active_support/inflector"
3
2
 
4
3
  module Jekyll
5
4
  module Timeago
6
5
 
7
- DAYS_IN = {
6
+ DAYS_PER = {
8
7
  :days => 1,
9
8
  :weeks => 7,
10
9
  :months => 31,
11
10
  :years => 365,
12
11
  }
13
12
 
14
- def timeago(input)
15
- time_ago_to_now(input)
13
+ # Max level of detail
14
+ # years > months > weeks > days
15
+ # 1 year and 7 months and 2 weeks and 6 days
16
+ MAX_DEPTH_LEVEL = 4
17
+
18
+ # Default level of detail
19
+ # 1 month and 5 days, 3 weeks and 2 days, 2 years and 6 months
20
+ DEFAULT_DEPTH_LEVEL = 2
21
+
22
+ def timeago(input, depth = DEFAULT_DEPTH_LEVEL)
23
+ unless depth_allowed?(depth)
24
+ raise "Invalid depth level: #{depth.inspect}"
25
+ end
26
+
27
+ unless input.is_a?(Date) || input.is_a?(Time)
28
+ raise "Invalid input type: #{input.inspect}"
29
+ end
30
+
31
+ days_passed = (Date.today - Date.parse(input.to_s)).to_i
32
+ time_ago_to_now(days_passed, depth)
16
33
  end
17
34
 
18
35
  private
19
36
 
20
- def time_ago_to_now(date)
21
- unless date.is_a?(Date) || date.is_a?(Time)
22
- raise "Invalid input: #{date.inspect}"
23
- end
37
+ def time_ago_to_now(days_passed, depth)
38
+ return "today" if days_passed == 0
39
+ return "yesterday" if days_passed == 1
40
+ return "tomorrow" if days_passed == -1
24
41
 
25
- days_passed = (Date.today - Date.parse(date.to_s)).to_i
42
+ future = days_passed < 0
43
+ slots = build_time_ago_slots(days_passed, depth)
26
44
 
27
- case days_passed.abs
28
- when 0 .. 7
29
- time_ago_to_s(days_passed, :days)
30
- when 8 .. 31
31
- time_ago_to_s(days_passed, :weeks)
32
- when 32 .. 365
33
- time_ago_to_s(days_passed, :months)
45
+ if future
46
+ "in #{slots.join(' and ')}"
34
47
  else
35
- time_ago_to_s(days_passed, :years)
48
+ "#{slots.join(' and ')} ago"
36
49
  end
37
50
  end
38
51
 
39
- def time_ago_to_s(days_passed, grouped_by)
40
- return "today" if days_passed == 0
41
- return "yesterday" if days_passed == 1
42
- return "tomorrow" if days_passed == -1
52
+ # Builds time ranges: ['1 month', '5 days']
53
+ def build_time_ago_slots(days_passed, depth, current_slots = [])
54
+ return current_slots if depth == 0 || days_passed == 0
43
55
 
44
- future = days_passed < 0
45
- computed_range = days_passed.abs / Jekyll::Timeago::DAYS_IN[grouped_by]
46
- grouped_by = if computed_range == 1
47
- ActiveSupport::Inflector.singularize(grouped_by.to_s)
56
+ time_range = days_to_time_range(days_passed)
57
+ days = DAYS_PER[time_range]
58
+ num_elems = days_passed.abs / days
59
+ range_type = if num_elems == 1
60
+ time_range.to_s[0...-1] # singularize
48
61
  else
49
- grouped_by.to_s
62
+ time_range.to_s
50
63
  end
51
64
 
52
- if future
53
- "in #{computed_range} #{grouped_by}"
65
+ current_slots << "#{num_elems} #{range_type}"
66
+ pending_days = days_passed - (num_elems*days)
67
+ build_time_ago_slots(pending_days, depth - 1, current_slots)
68
+ end
69
+
70
+ def days_to_time_range(days_passed)
71
+ case days_passed.abs
72
+ when 0...7
73
+ :days
74
+ when 7...31
75
+ :weeks
76
+ when 31...365
77
+ :months
54
78
  else
55
- "#{computed_range} #{grouped_by} ago"
79
+ :years
56
80
  end
57
81
  end
82
+
83
+ def depth_allowed?(depth)
84
+ (1..MAX_DEPTH_LEVEL).include?(depth)
85
+ end
58
86
  end
59
87
  end
60
88
 
@@ -1,5 +1,5 @@
1
1
  module Jekyll
2
2
  module Timeago
3
- VERSION = "0.3.1"
3
+ VERSION = "0.4.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-timeago
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-07-03 00:00:00.000000000 Z
12
+ date: 2013-09-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -43,22 +43,6 @@ dependencies:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
- - !ruby/object:Gem::Dependency
47
- name: activesupport
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ! '>='
52
- - !ruby/object:Gem::Version
53
- version: '0'
54
- type: :runtime
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ! '>='
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
46
  description: Custom timeago filter for Jekyll (Liquid filter)
63
47
  email:
64
48
  - srmarc.ai@gmail.com
@@ -88,7 +72,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
88
72
  version: '0'
89
73
  segments:
90
74
  - 0
91
- hash: -598090419
75
+ hash: 284869011
92
76
  required_rubygems_version: !ruby/object:Gem::Requirement
93
77
  none: false
94
78
  requirements:
@@ -97,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
81
  version: '0'
98
82
  segments:
99
83
  - 0
100
- hash: -598090419
84
+ hash: 284869011
101
85
  requirements: []
102
86
  rubyforge_project:
103
87
  rubygems_version: 1.8.24