jekyll-timeago 0.8.2 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e3e837b2ed5dcbda0f670f70fff6b3fb452cfcbd
4
- data.tar.gz: 2ee469fdc89b8ff0d59523e8194b4ae9e442b0fc
3
+ metadata.gz: 9d4b2b6bddb90157fb80c3c7fecd1154856803d8
4
+ data.tar.gz: 430dbea158d988267bc00b3ea9c5c5708e030355
5
5
  SHA512:
6
- metadata.gz: 79a66d9cd557b7e65812ece1a6f05a6aba977bb8ec1eda548ddce07686b86fe428da0c66d2fa83caba844355d70bcc165fda5a82d17e612b941e65502b4cf94a
7
- data.tar.gz: e1e6cd96779c0a83dc23e00c4b10b5260e8578ed73ae891e5d2446f23d672abf2e3feb1ce783142347df1444c3fe2d01ed1b1a93c651926b71621a2294c90e94
6
+ metadata.gz: fb56e09b24cbf51da1efab5f62d55f95149093e9d2e5efddd30906db6be23a6e69c7062d715eb0e21a43a6a1dc9972815827594d2f46f231c68690a53f13955f
7
+ data.tar.gz: 144e8ca11755ec40da5ac4ce3e2dfd83a071fe569247f0c3fca6a0153dead5cdda6c0c5f5bfc56fccda6f46d2979242f50bdbf79afedfc75e5601c81ddf9cfce
data/.gitignore CHANGED
@@ -2,4 +2,5 @@ pkg
2
2
  .rvmrc
3
3
  Gemfile.lock
4
4
  spec/_site
5
- .rpsec
5
+ .rpsec
6
+ *.gemfile.lock
data/.travis.yml CHANGED
@@ -1,5 +1,21 @@
1
1
  language: ruby
2
+
3
+ cache: bundler
4
+
5
+ sudo: false
6
+
2
7
  rvm:
8
+ - 2.2
3
9
  - 2.1
4
10
  - 2.0
5
11
  - 1.9.3
12
+
13
+ gemfile:
14
+ - gemfiles/jekyll_v1.gemfile
15
+ - gemfiles/jekyll_v2.gemfile
16
+ - gemfiles/jekyll_v3.gemfile
17
+
18
+ matrix:
19
+ exclude:
20
+ - rvm: 1.9.3
21
+ gemfile: gemfiles/jekyll_v3.gemfile
data/Appraisals ADDED
@@ -0,0 +1,13 @@
1
+ appraise 'jekyll-v1' do
2
+ gem 'jekyll', '~> 1.5'
3
+ end
4
+
5
+ appraise 'jekyll-v2' do
6
+ gem 'jekyll', '~> 2.5'
7
+ gem 'listen', '< 3.1.0' if RUBY_VERSION <= "2.2"
8
+ end
9
+
10
+ appraise 'jekyll-v3' do
11
+ gem 'jekyll', '~> 3.0'
12
+ gem 'listen', '< 3.1.0' if RUBY_VERSION <= "2.2"
13
+ end
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2013-2014 Marc Anguera Insa
1
+ Copyright 2013-2016 Marc Anguera Insa
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.md CHANGED
@@ -2,21 +2,24 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/jekyll-timeago.svg)](http://badge.fury.io/rb/jekyll-timeago) [![Build Status](https://travis-ci.org/markets/jekyll-timeago.svg?branch=master)](https://travis-ci.org/markets/jekyll-timeago)
4
4
 
5
- Custom and simple implementation of `timeago` date filter. Main features:
5
+ > A Ruby library to compute distance of dates in words. Originally built for Jekyll, as a Liquid extension.
6
6
 
7
- * Distance of dates in words
8
- * Future time
9
- * Usage via Filter or Tag
10
- * Localization
11
- * Level of detail
7
+ Main features:
12
8
 
13
- In fact, `jekyll-timeago` is an extension of [Liquid](https://github.com/Shopify/liquid) Filters and Tags, so you can use it in other Liquid templates (like Octopress).
9
+ * Compute distance of dates in words, ie: `1 week and 2 days ago`, `5 months ago`, `in 1 year`
10
+ * Future times.
11
+ * Out of the box support for `Jekyll` (v1, v2 and v3) projects, available as a Liquid Filter and as a Liquid Tag.
12
+ * Localization (i18n).
13
+ * Level of detail.
14
+ * Available via the command line.
15
+
16
+ In fact, `jekyll-timeago` started just as an extension for [Liquid](https://github.com/Shopify/liquid) template engine, to be used in Jekyll and Octopress backed sites. But actually, you can use it easily in any Ruby project. Read more about usage outside Jekyll [in this section](#usage-outside-jekyll).
14
17
 
15
18
  ## Installation
16
19
 
17
- You have 3 options to install the plugin:
20
+ You have different options to install and plugging it into Jekyll projects:
18
21
 
19
- **Via Jekyll plugin system**
22
+ **Via Jekyll plugin system (recommended)**
20
23
 
21
24
  Install the `gem` to your system:
22
25
 
@@ -27,33 +30,27 @@ gem install jekyll-timeago
27
30
  In your `_config.yml` file, add a new array with the key gems and the values of the gem names of the plugins you’d like to use. In this case:
28
31
 
29
32
  ```
30
- gems: [jekyll-timeago]
33
+ gems:
34
+ - jekyll-timeago
31
35
  ```
32
36
 
33
37
  **Via Bundler**
34
38
 
35
- Add this gem to your `Gemfile` and run `bundle`:
36
-
37
- ```
38
- gem 'jekyll-timeago'
39
- ```
40
-
41
- Then load the plugin adding the following into some file under `_plugins/` folder:
39
+ Add this gem to your `Gemfile` and run `bundle install`:
42
40
 
43
41
  ```ruby
44
- # _plugins/ext.rb
45
- require 'rubygems'
46
- require 'bundler/setup'
47
- Bundler.require(:default)
42
+ group :jekyll_plugins do
43
+ gem 'jekyll-timeago'
44
+ end
48
45
  ```
49
46
 
50
- **Manually**
47
+ **Manually (less recommended)**
51
48
 
52
- Alternatively, you can simply copy [this file](lib/jekyll-timeago/filter.rb) and [this file](lib/jekyll-timeago/tag.rb) directly into your `_plugins/` directory!
49
+ Alternatively, you can simply copy the files under [lib/jekyll-timeago](lib/jekyll-timeago/) directly into your `_plugins/` directory. All those files will be loaded by Jekyll.
53
50
 
54
51
  ## Usage
55
52
 
56
- By default `timeago` computes distance of dates from passed date to current date (using `Date.today`). But you are able to modify this range passing a second argument in order to compute the distance of these dates in words.
53
+ By default, the `timeago` helper computes distance of dates from passed date to current date (using `Date.today`). But you are able to modify this range by passing a second argument. Examples:
57
54
 
58
55
  **Filter example**:
59
56
 
@@ -81,7 +78,9 @@ Passing a second parameter:
81
78
 
82
79
  ## Localization
83
80
 
84
- The plugin allows you to localize the strings needed to build the time ago sentences. For do this, you must add some extra keys to your `_config.yml`. You can simply copy them from [this example file](_config.yml.example) and translate it to your site's language. Sample:
81
+ This plugin allows you to localize the strings needed to build the sentences. To do this, you just need to add some extra keys in your `_config.yml`. You can simply copy them from one of the [provided examples](lib/jekyll-timeago/config/). Or even, translate it to your site's language just overriding it.
82
+
83
+ English example (default):
85
84
 
86
85
  ```
87
86
  jekyll_timeago:
@@ -104,7 +103,7 @@ jekyll_timeago:
104
103
  day: 'day'
105
104
  ```
106
105
 
107
- **NOTE** You also can use suffixes and prefixes to modify the sentences. For example, set `suffix: nil` and you'll get only the distance of dates: `1 year, 4 months and 1 week`.
106
+ **NOTE** You also can play with suffixes and prefixes to modify the sentences. For example, set `suffix: nil` and you'll get only the distance of dates: `1 year, 4 months and 1 week`.
108
107
 
109
108
  ## Level of detail (Depth)
110
109
 
@@ -115,9 +114,33 @@ You are able to change the level of detail (from 1 up to 4, 2 by default) to get
115
114
  * Depht => 3 `1 year, 4 months and 1 week ago`
116
115
  * Depht => 4 `1 year, 4 months, 1 week and 4 days ago`
117
116
 
118
- ## Output Examples
117
+ ## Usage outside Jekyll
118
+
119
+ You just need to install the gem to your application (add `gem 'jekyll-timeago'` to your Gemfile). From now on, you can use the provided method by calling:
119
120
 
120
- Run `script/console` to start a custom IRB session and play with `timeago` method:
121
+ ```ruby
122
+ Jekyll::Timeago::Core.timeago(from, to, options)
123
+ ```
124
+
125
+ Note, that you can use the `options` parameter to override the default localization or the level of detail.
126
+
127
+ Or if you have the gem installed in your system and you're not using Bundler:
128
+
129
+ ```ruby
130
+ require 'jekyll-timeago'
131
+ puts Jekyll::Timeago::Core.timeago(from, to, options)
132
+ ```
133
+
134
+ ## CLI
135
+
136
+ ```
137
+ $ jekyll-timeago 2016-1-1
138
+ 2 months and 6 days ago
139
+ ```
140
+
141
+ ### Console
142
+
143
+ Run `$ jekyll-timeago --console` to start a custom IRB session and play with the `timeago` method:
121
144
 
122
145
  ```ruby
123
146
  >> timeago(Date.today)
@@ -143,12 +166,24 @@ Run `script/console` to start a custom IRB session and play with `timeago` metho
143
166
  Play with `options`:
144
167
 
145
168
  ```ruby
146
- >> options[:yesterday] = "ayer"
169
+ >> configure "yesterday" => "ayer"
147
170
  => "ayer"
148
171
  >> timeago(Date.today - 1.day)
149
172
  => "ayer"
150
173
  ```
151
174
 
175
+ ## Development
176
+
177
+ Any kind of feedback, bug report, idea or enhancement are really appreciated.
178
+
179
+ To contribute, just fork the repo, hack on it and send a pull request. Don't forget to add specs for behaviour changes and run the test suite:
180
+
181
+ ```
182
+ bundle exec appraisal rake
183
+ ```
184
+
185
+ `Appraisal` library is used to ensure compatibility with different Jekyll versions. Check out current supported versions [here](Appraisals).
186
+
152
187
  ## License
153
188
 
154
- Copyright (c) 2013-2014 Marc Anguera. Jekyll-Timeago is released under the [MIT](LICENSE) License.
189
+ Copyright (c) 2013-2016 Marc Anguera. Jekyll-Timeago is released under the [MIT](LICENSE) License.
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative "../lib/jekyll-timeago/core"
4
+ include Jekyll::Timeago::Core
5
+
6
+ help_message = <<END
7
+ Usage:
8
+
9
+ jekyll-timeago <from_date> [to_date]
10
+
11
+ Notes:
12
+ [to_date] Optional, defaults to current date
13
+
14
+ Options:
15
+ --help, -h Print this message
16
+ --console Start an interactive session with jekyll-timeago included
17
+ END
18
+
19
+ if ARGV.empty? || ARGV.include?("--help") || ARGV.include?("-h")
20
+ puts help_message
21
+ elsif ARGV.include? "--console"
22
+ require "irb"
23
+ ARGV.clear
24
+ IRB.start
25
+ else
26
+ puts timeago *ARGV
27
+ end
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "jekyll", "~> 1.5"
6
+
7
+ gemspec :path => "../"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "jekyll", "~> 2.5"
6
+ gem "listen", "< 3.1.0"
7
+
8
+ gemspec :path => "../"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "jekyll", "~> 3.0"
6
+ gem "listen", "< 3.1.0"
7
+
8
+ gemspec :path => "../"
@@ -1,7 +1,4 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'jekyll-timeago/version'
1
+ require './lib/jekyll-timeago/version'
5
2
 
6
3
  Gem::Specification.new do |spec|
7
4
  spec.name = "jekyll-timeago"
@@ -23,4 +20,5 @@ Gem::Specification.new do |spec|
23
20
  spec.add_development_dependency "rake"
24
21
  spec.add_development_dependency "rspec"
25
22
  spec.add_development_dependency "activesupport"
23
+ spec.add_development_dependency "appraisal"
26
24
  end
@@ -0,0 +1,18 @@
1
+ jekyll_timeago:
2
+ depth: 2 # Nivel de detalle
3
+ today: 'hoy'
4
+ yesterday: 'ayer'
5
+ tomorrow: 'mañana'
6
+ and: 'y'
7
+ suffix: ''
8
+ prefix: 'hace'
9
+ suffix_future: ''
10
+ prefix_future: 'en'
11
+ years: 'años'
12
+ year: 'año'
13
+ months: 'meses'
14
+ month: 'mes'
15
+ weeks: 'semanas'
16
+ week: 'semana'
17
+ days: 'días'
18
+ day: 'día'
@@ -0,0 +1,19 @@
1
+ jekyll_timeago:
2
+ depth: 2 # niveau de détail
3
+ today: "aujourd'hui"
4
+ yesterday: "hier"
5
+ tomorrow: "demain"
6
+ and: "et"
7
+ suffix: ""
8
+ prefix: "il y a environ"
9
+ suffix_future: ""
10
+ prefix_future: "dans"
11
+ years: "années"
12
+ year: "année"
13
+ months: "mois"
14
+ month: "mois"
15
+ weeks: "semaines"
16
+ week: "semaine"
17
+ days: "jours"
18
+ day: "jour"
19
+
@@ -0,0 +1,147 @@
1
+ require 'date'
2
+
3
+ module Jekyll
4
+ module Timeago
5
+ module Core
6
+ extend self
7
+
8
+ DAYS_PER = {
9
+ :days => 1,
10
+ :weeks => 7,
11
+ :months => 30,
12
+ :years => 365
13
+ }
14
+
15
+ # Max level of detail
16
+ # years > months > weeks > days
17
+ # 1 year and 7 months and 2 weeks and 6 days
18
+ MAX_DEPTH_LEVEL = 4
19
+
20
+ # Default level of detail
21
+ # 1 month and 5 days, 3 weeks and 2 days, 2 years and 6 months
22
+ DEFAULT_DEPTH_LEVEL = 2
23
+
24
+ def timeago(from, to = Date.today, options = {})
25
+ if to.is_a?(Hash)
26
+ options = to
27
+ to = Date.today
28
+ end
29
+
30
+ @defaults = defaults unless defined?(@defaults)
31
+ @options = @defaults.merge(options)
32
+
33
+ from = validate_date!(from)
34
+ to = validate_date!(to)
35
+ depth = validate_depth!(@options["depth"])
36
+
37
+ time_ago_to_now(from, to, depth)
38
+ end
39
+
40
+ def configure(options = {})
41
+ @defaults = defaults.merge(options)
42
+ end
43
+
44
+ private
45
+
46
+ def validate_date!(date)
47
+ Date.parse(date.to_s)
48
+ end
49
+
50
+ def validate_depth!(depth)
51
+ (1..MAX_DEPTH_LEVEL).include?(depth) or raise("Invalid depth level: #{depth.inspect}")
52
+ depth
53
+ end
54
+
55
+ def defaults
56
+ {
57
+ "depth" => DEFAULT_DEPTH_LEVEL,
58
+ "today" => 'today',
59
+ "yesterday" => 'yesterday',
60
+ "tomorrow" => 'tomorrow',
61
+ "and" => 'and',
62
+ "suffix" => 'ago',
63
+ "prefix" => '',
64
+ "suffix_future" => '',
65
+ "prefix_future" => 'in',
66
+ "years" => 'years',
67
+ "year" => 'year',
68
+ "months" => 'months',
69
+ "month" => 'month',
70
+ "weeks" => 'weeks',
71
+ "week" => 'week',
72
+ "days" => 'days',
73
+ "day" => 'day'
74
+ }
75
+ end
76
+
77
+ def translate(key)
78
+ @options[key.to_s]
79
+ end
80
+ alias_method :t, :translate
81
+
82
+ # Days passed to time ago sentence
83
+ def time_ago_to_now(from, to, depth)
84
+ days_passed = (to - from).to_i
85
+
86
+ return t(:today) if days_passed == 0
87
+ return t(:yesterday) if days_passed == 1
88
+ return t(:tomorrow) if days_passed == -1
89
+
90
+ future = days_passed < 0
91
+ slots = build_time_ago_slots(days_passed.abs, depth)
92
+ sentence = to_sentence(slots)
93
+
94
+ if future
95
+ "#{t(:prefix_future)} #{sentence} #{t(:suffix_future)}".strip
96
+ else
97
+ "#{t(:prefix)} #{sentence} #{t(:suffix)}".strip
98
+ end
99
+ end
100
+
101
+ # Builds time ranges: ['1 month', '5 days']
102
+ # - days_passed: integer in absolute
103
+ # - depth: level of detail
104
+ # - current_slots: built time slots
105
+ def build_time_ago_slots(days_passed, depth, current_slots = [])
106
+ return current_slots if depth == 0 || days_passed == 0
107
+
108
+ time_range = days_to_time_range(days_passed)
109
+ days = DAYS_PER[time_range]
110
+ num_elems = (days_passed / days).to_i
111
+
112
+ range_type = if num_elems == 1
113
+ t(time_range[0...-1]) # singularize key
114
+ else
115
+ t(time_range)
116
+ end
117
+
118
+ current_slots << "#{num_elems} #{range_type}"
119
+ pending_days = days_passed - (num_elems * days)
120
+ build_time_ago_slots(pending_days, depth - 1, current_slots)
121
+ end
122
+
123
+ # Number of days to minimum period time which can be grouped
124
+ def days_to_time_range(days_passed)
125
+ case days_passed.abs
126
+ when 1..6
127
+ :days
128
+ when 7..30
129
+ :weeks
130
+ when 31..365
131
+ :months
132
+ else
133
+ :years
134
+ end
135
+ end
136
+
137
+ # Array to sentence: ['1 month', '1 week', '5 days'] => "1 month, 1 week and 5 days"
138
+ def to_sentence(slots)
139
+ if slots.length == 1
140
+ slots[0]
141
+ else
142
+ "#{slots[0...-1].join(', ')} #{t(:and)} #{slots[-1]}"
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
@@ -1,152 +1,11 @@
1
- require 'date'
2
-
3
1
  module Jekyll
4
2
  module Timeago
5
3
  module Filter
6
- extend self
7
-
8
- DAYS_PER = {
9
- :days => 1,
10
- :weeks => 7,
11
- :months => 30,
12
- :years => 365
13
- }
14
-
15
- # Max level of detail
16
- # years > months > weeks > days
17
- # 1 year and 7 months and 2 weeks and 6 days
18
- MAX_DEPTH_LEVEL = 4
19
-
20
- # Default level of detail
21
- # 1 month and 5 days, 3 weeks and 2 days, 2 years and 6 months
22
- DEFAULT_DEPTH_LEVEL = 2
23
-
24
4
  def timeago(from, to = Date.today)
25
- from = validate_date!(from)
26
- to = validate_date!(to)
27
- depth = validate_depth!(options[:depth])
28
-
29
- time_ago_to_now(from, to, depth)
30
- end
31
-
32
- def options
33
- @options ||= setup
34
- end
35
-
36
- # Restore default configuration
37
- def reset!
38
- setup
39
- end
40
-
41
- private
42
-
43
- def validate_date!(date)
44
- Date.parse(date.to_s)
45
- end
46
-
47
- def validate_depth!(depth)
48
- (1..MAX_DEPTH_LEVEL).include?(depth) or raise("Invalid depth level: #{depth.inspect}")
49
- depth
50
- end
51
-
52
- # Load settings from Jekyll configuration
53
- def jekyll_config
54
- @jekyll_config ||= Jekyll.configuration({}).fetch('jekyll_timeago', {}) rescue {}
55
- end
5
+ config = @context.registers[:site].config.fetch('jekyll_timeago', {})
56
6
 
57
- # Configure plugin options with defaults
58
- def setup
59
- @options = {
60
- :depth => jekyll_config['depth'] || DEFAULT_DEPTH_LEVEL,
61
- :today => jekyll_config['today'] || 'today',
62
- :yesterday => jekyll_config['yesterday'] || 'yesterday',
63
- :tomorrow => jekyll_config['tomorrow'] || 'tomorrow',
64
- :and => jekyll_config['and'] ||'and',
65
- :suffix => jekyll_config['suffix'] || 'ago',
66
- :prefix => jekyll_config['prefix'] || '',
67
- :suffix_future => jekyll_config['suffix_future'] || '',
68
- :prefix_future => jekyll_config['prefix_future'] || 'in',
69
- :years => jekyll_config['years'] || 'years',
70
- :year => jekyll_config['year'] || 'year',
71
- :months => jekyll_config['months'] || 'months',
72
- :month => jekyll_config['month'] || 'month',
73
- :weeks => jekyll_config['weeks'] || 'weeks',
74
- :week => jekyll_config['week'] || 'week',
75
- :days => jekyll_config['days'] || 'days',
76
- :day => jekyll_config['day'] || 'day'
77
- }
78
- end
79
-
80
- def translate(key)
81
- options[key.to_sym]
82
- end
83
- alias_method :t, :translate
84
-
85
- # Days passed to time ago sentence
86
- def time_ago_to_now(from, to, depth)
87
- days_passed = (to - from).to_i
88
-
89
- return t(:today) if days_passed == 0
90
- return t(:yesterday) if days_passed == 1
91
- return t(:tomorrow) if days_passed == -1
92
-
93
- future = days_passed < 0
94
- slots = build_time_ago_slots(days_passed.abs, depth)
95
- sentence = to_sentence(slots)
96
-
97
- if future
98
- "#{t(:prefix_future)} #{sentence} #{t(:suffix_future)}".strip
99
- else
100
- "#{t(:prefix)} #{sentence} #{t(:suffix)}".strip
101
- end
102
- end
103
-
104
- # Builds time ranges: ['1 month', '5 days']
105
- # - days_passed: integer in absolute
106
- # - depth: level of detail
107
- # - current_slots: built time slots
108
- def build_time_ago_slots(days_passed, depth, current_slots = [])
109
- return current_slots if depth == 0 || days_passed == 0
110
-
111
- time_range = days_to_time_range(days_passed)
112
- days = DAYS_PER[time_range]
113
- num_elems = (days_passed / days).to_i
114
-
115
- range_type = if num_elems == 1
116
- t(time_range[0...-1]) # singularize key
117
- else
118
- t(time_range)
119
- end
120
-
121
- current_slots << "#{num_elems} #{range_type}"
122
- pending_days = days_passed - (num_elems * days)
123
- build_time_ago_slots(pending_days, depth - 1, current_slots)
124
- end
125
-
126
- # Number of days to minimum period time which can be grouped
127
- def days_to_time_range(days_passed)
128
- case days_passed.abs
129
- when 1..6
130
- :days
131
- when 7..30
132
- :weeks
133
- when 31..365
134
- :months
135
- else
136
- :years
137
- end
138
- end
139
-
140
- # Array to sentence: ['1 month', '1 week', '5 days'] => "1 month, 1 week and 5 days"
141
- def to_sentence(slots)
142
- if slots.length == 1
143
- slots[0]
144
- else
145
- "#{slots[0...-1].join(', ')} #{t(:and)} #{slots[-1]}"
146
- end
7
+ Jekyll::Timeago::Core.timeago(from, to, config)
147
8
  end
148
9
  end
149
10
  end
150
11
  end
151
-
152
- Liquid::Template.register_filter(Jekyll::Timeago::Filter) if defined?(Liquid)
@@ -1,8 +1,6 @@
1
1
  module Jekyll
2
2
  module Timeago
3
3
  class Tag < Liquid::Tag
4
- include Jekyll::Timeago::Filter
5
-
6
4
  def initialize(tag_name, dates, tokens)
7
5
  super
8
6
  @dates = dates.strip.split(' ')
@@ -10,15 +8,14 @@ module Jekyll
10
8
 
11
9
  def render(context)
12
10
  from, to = @dates[0], @dates[1]
11
+ config = context.registers[:site].config.fetch('jekyll_timeago', {})
13
12
 
14
13
  if to
15
- timeago(from, to)
14
+ Jekyll::Timeago::Core.timeago(from, to, config)
16
15
  else
17
- timeago(from)
16
+ Jekyll::Timeago::Core.timeago(from, config)
18
17
  end
19
18
  end
20
19
  end
21
20
  end
22
21
  end
23
-
24
- Liquid::Template.register_tag('timeago', Jekyll::Timeago::Tag) if defined?(Liquid)
@@ -1,5 +1,5 @@
1
1
  module Jekyll
2
2
  module Timeago
3
- VERSION = "0.8.2"
3
+ VERSION = "0.9.0"
4
4
  end
5
5
  end
@@ -1,3 +1,10 @@
1
- require 'jekyll-timeago/filter'
2
- require 'jekyll-timeago/tag'
1
+ require 'jekyll-timeago/core'
3
2
  require 'jekyll-timeago/version'
3
+
4
+ if defined?(Liquid)
5
+ require 'jekyll-timeago/filter'
6
+ require 'jekyll-timeago/tag'
7
+
8
+ Liquid::Template.register_filter(Jekyll::Timeago::Filter)
9
+ Liquid::Template.register_tag('timeago', Jekyll::Timeago::Tag)
10
+ end
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+
3
+ describe Jekyll::Timeago do
4
+ context 'Jekyll integration' do
5
+ let(:overrides) do
6
+ {
7
+ "source" => source_dir,
8
+ "destination" => dest_dir,
9
+ "url" => "http://example.org",
10
+ }
11
+ end
12
+ let(:config) { Jekyll.configuration(overrides) }
13
+ let(:site) { Jekyll::Site.new(config) }
14
+ let(:contents) { File.read(dest_dir("index.html")) }
15
+
16
+ it 'setup from Jekyll configuration' do
17
+ expect(site.config['jekyll_timeago']).to eql(configuration_file['jekyll_timeago'])
18
+ end
19
+
20
+ it 'process successfully the site using filters and tags' do
21
+ expect { site.process }.to_not raise_error
22
+
23
+ lines = [
24
+ "<p>2 years yeah</p>",
25
+ "<p>12 months yeah</p>",
26
+ "<p>12 months yeah</p>",
27
+ "<p>2 years yeah</p>"
28
+ ]
29
+ expect(contents).to eq(lines.join("\n"))
30
+ end
31
+ end
32
+
33
+ context 'Core' do
34
+ let (:sample_date) { Date.new(2014, 7, 30) }
35
+ let (:today) { Date.today }
36
+
37
+ before do
38
+ Jekyll::Timeago::Core.configure
39
+ end
40
+
41
+ it 'does not accept invalid depth' do
42
+ expect { timeago(today, sample_date, "depth" => 5) }.to raise_error
43
+ end
44
+
45
+ it 'accepts a hash (options) as a second parameter (implicit "to")' do
46
+ expect(timeago(today, "today" => "during the day")).to eq("during the day")
47
+ end
48
+
49
+ it 'yesterday, today and tomorrow' do
50
+ expect(timeago(today - 1.day)).to eql("yesterday")
51
+ expect(timeago(today)).to eql("today")
52
+ expect(timeago(today + 1.day)).to eql("tomorrow")
53
+ end
54
+
55
+ it 'past time' do
56
+ expect(timeago(sample_date - 10.days, sample_date)).to eql('1 week and 3 days ago')
57
+ expect(timeago(sample_date - 100.days, sample_date)).to eql('3 months and 1 week ago')
58
+ expect(timeago(sample_date - 500.days, sample_date)).to eql('1 year and 4 months ago')
59
+ end
60
+
61
+ it 'future time' do
62
+ expect(timeago(sample_date + 7.days, sample_date)).to eql('in 1 week')
63
+ expect(timeago(sample_date + 1000.days, sample_date)).to eql('in 2 years and 9 months')
64
+ end
65
+
66
+ it 'allow different date formats' do
67
+ expect(timeago('2010-1-1', '2012-1-1')).to eql('2 years ago')
68
+ expect(timeago('2010/1/1', '2012/1/1')).to eql('2 years ago')
69
+ expect(timeago('Jan 2010, 1', 'Jan 2012, 1')).to eql('2 years ago')
70
+ expect(timeago('2014-10-06 20:00:00', '2014-10-07 20:00:00')).to eql('yesterday')
71
+ end
72
+
73
+ it 'allow to change defaults at global level' do
74
+ Jekyll::Timeago::Core.configure("year" => nil, "depth" => 1, "suffix" => nil)
75
+ expect(timeago(sample_date - 500.days, sample_date)).to eql('1')
76
+ end
77
+
78
+ it 'allow to change level of detail' do
79
+ expect(timeago(sample_date - 500.days, sample_date, "depth" => 1)).to eql('1 year ago')
80
+ expect(timeago(sample_date - 500.days, sample_date, "depth" => 3)).to eql('1 year, 4 months and 2 weeks ago')
81
+ expect(timeago(sample_date - 500.days, sample_date, "depth" => 4)).to eql('1 year, 4 months, 2 weeks and 1 day ago')
82
+ end
83
+
84
+ it 'allow localization' do
85
+ new_options = {
86
+ "prefix" => 'hace',
87
+ "months" => 'meses',
88
+ "and" => 'y',
89
+ "week" => 'semana',
90
+ "suffix" => nil
91
+ }
92
+
93
+ expect(timeago(sample_date - 100.days, sample_date, new_options)).to eql('hace 3 meses y 1 semana')
94
+ end
95
+ end
96
+
97
+ context 'CLI' do
98
+ it 'prints help message if called with no params or --help' do
99
+ expect(`jekyll-timeago`).to match("Usage")
100
+ expect(`jekyll-timeago --help`).to match("Usage")
101
+ end
102
+
103
+ it 'computes distance of dates' do
104
+ expect(`jekyll-timeago 2016-1-1 2016-1-5`).to match("4 days ago")
105
+ end
106
+ end
107
+ end
@@ -2,12 +2,12 @@ gems:
2
2
  - jekyll-timeago
3
3
 
4
4
  jekyll_timeago:
5
- depth: 3
5
+ depth: 1
6
6
  today: 'today'
7
7
  yesterday: 'yesterday'
8
8
  tomorrow: 'tomorrow'
9
9
  and: 'and'
10
- suffix: 'ago'
10
+ suffix: 'yeah'
11
11
  prefix: ''
12
12
  suffix_future: ''
13
13
  prefix_future: 'in'
@@ -4,5 +4,4 @@
4
4
  <p>{% timeago 2014-1-1 %}</p>
5
5
  <p>{% timeago 2014-1-1 2015-1-1 %}</p>
6
6
  <p>{{ '2014-1-1' | timeago: '2015-1-1' }}</p>
7
- <p>{{ '2014-1-1' | timeago }}</p>
8
- <p>{{ 'Aug 2014, 15' | timeago }}</p>
7
+ <p>{{ '2014-1-1' | timeago }}</p>
data/spec/spec_helper.rb CHANGED
@@ -1,8 +1,7 @@
1
1
  require 'fileutils'
2
- require 'active_support'
3
- require 'active_support/core_ext'
2
+ require 'active_support/all'
4
3
  require 'jekyll'
5
- require File.expand_path('lib/jekyll-timeago/filter')
4
+ require File.expand_path('lib/jekyll-timeago')
6
5
 
7
6
  RSpec.configure do |config|
8
7
  config.run_all_when_everything_filtered = true
@@ -26,18 +25,7 @@ RSpec.configure do |config|
26
25
  YAML.load_file(File.join(SOURCE_DIR, '_config.yml'))
27
26
  end
28
27
 
29
- def site_configuration(overrides = {})
30
- Jekyll.configuration(overrides.merge({
31
- 'source' => source_dir,
32
- 'destination' => dest_dir
33
- }))
34
- end
35
-
36
- def timeago(from, to = Date.today)
37
- Jekyll::Timeago::Filter.timeago(from, to)
38
- end
39
-
40
- def options
41
- @options ||= Jekyll::Timeago::Filter.options
28
+ def timeago(from, to = Date.today, options = {})
29
+ Jekyll::Timeago::Core.timeago(from, to, options)
42
30
  end
43
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-timeago
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.2
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - markets
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-06 00:00:00.000000000 Z
11
+ date: 2016-04-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -80,28 +80,50 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: appraisal
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  description: Custom timeago filter for Jekyll (Liquid Filter and Tag). Localization
84
98
  and futures supported.
85
99
  email:
86
100
  - srmarc.ai@gmail.com
87
- executables: []
101
+ executables:
102
+ - jekyll-timeago
88
103
  extensions: []
89
104
  extra_rdoc_files: []
90
105
  files:
91
106
  - ".gitignore"
92
107
  - ".travis.yml"
108
+ - Appraisals
93
109
  - Gemfile
94
110
  - LICENSE
95
111
  - README.md
96
112
  - Rakefile
97
- - _config.yml.example
113
+ - bin/jekyll-timeago
114
+ - gemfiles/jekyll_v1.gemfile
115
+ - gemfiles/jekyll_v2.gemfile
116
+ - gemfiles/jekyll_v3.gemfile
98
117
  - jekyll-timeago.gemspec
99
118
  - lib/jekyll-timeago.rb
119
+ - lib/jekyll-timeago/config/_config.yml.example.en
120
+ - lib/jekyll-timeago/config/_config.yml.example.es
121
+ - lib/jekyll-timeago/config/_config.yml.example.fr
122
+ - lib/jekyll-timeago/core.rb
100
123
  - lib/jekyll-timeago/filter.rb
101
124
  - lib/jekyll-timeago/tag.rb
102
125
  - lib/jekyll-timeago/version.rb
103
- - script/console
104
- - spec/jekyll_timeago_spec.rb
126
+ - spec/jekyll-timeago_spec.rb
105
127
  - spec/source/_config.yml
106
128
  - spec/source/index.html
107
129
  - spec/spec_helper.rb
@@ -125,13 +147,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
147
  version: '0'
126
148
  requirements: []
127
149
  rubyforge_project:
128
- rubygems_version: 2.2.0
150
+ rubygems_version: 2.2.2
129
151
  signing_key:
130
152
  specification_version: 4
131
153
  summary: Custom timeago filter for Jekyll (Liquid Filter and Tag). Localization and
132
154
  futures supported.
133
155
  test_files:
134
- - spec/jekyll_timeago_spec.rb
156
+ - spec/jekyll-timeago_spec.rb
135
157
  - spec/source/_config.yml
136
158
  - spec/source/index.html
137
159
  - spec/spec_helper.rb
data/script/console DELETED
@@ -1,13 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- lib = File.expand_path('../../lib', __FILE__)
4
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
-
6
- require 'jekyll-timeago/filter'
7
- include Jekyll::Timeago::Filter
8
-
9
- require 'active_support/core_ext'
10
-
11
- require 'irb'
12
- ARGV.clear
13
- IRB.start
@@ -1,82 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Jekyll::Timeago do
4
- context 'Jekyll integration' do
5
- let(:site) do
6
- Jekyll::Site.new(site_configuration)
7
- end
8
-
9
- it 'setup from Jekyll configuration' do
10
- expect(site.config['jekyll_timeago']).to eql(configuration_file['jekyll_timeago'])
11
- end
12
-
13
- it 'process successfully the site using filters and tags' do
14
- expect { site.process }.to_not raise_error
15
- end
16
- end
17
-
18
- context 'Timeago calculations' do
19
- let (:sample_date) { Date.new(2014, 7, 30) }
20
-
21
- before(:each) do
22
- Jekyll::Timeago::Filter.reset!
23
- end
24
-
25
- it 'does not accept invalid depth' do
26
- options[:depth] = 5
27
-
28
- expect { timeago(today) }.to raise_error
29
- end
30
-
31
- it 'yesterday, today and tomorrow' do
32
- today = Date.today
33
-
34
- expect(timeago(today - 1.day)).to eql(options[:yesterday])
35
- expect(timeago(today)).to eql(options[:today])
36
- expect(timeago(today + 1.day)).to eql(options[:tomorrow])
37
- end
38
-
39
- context 'past time' do
40
- it 'should process distances' do
41
- expect(timeago(sample_date - 10.days, sample_date)).to eql('1 week and 3 days ago')
42
- expect(timeago(sample_date - 100.days, sample_date)).to eql('3 months and 1 week ago')
43
- expect(timeago(sample_date - 500.days, sample_date)).to eql('1 year and 4 months ago')
44
- end
45
- end
46
-
47
- context 'future time' do
48
- it 'should process distances' do
49
- expect(timeago(sample_date + 7.days, sample_date)).to eql('in 1 week')
50
- expect(timeago(sample_date + 1000.days, sample_date)).to eql('in 2 years and 9 months')
51
- end
52
- end
53
-
54
- it 'allow different date inputs' do
55
- expect(timeago('2010-1-1', '2012-1-1')).to eql('2 years ago')
56
- expect(timeago('2010/1/1', '2012/1/1')).to eql('2 years ago')
57
- expect(timeago('Jan 2010, 1', 'Jan 2012, 1')).to eql('2 years ago')
58
- expect(timeago('2014-10-06 20:00:00', '2014-10-07 20:00:00')).to eql('yesterday')
59
- end
60
-
61
- it 'allow to change level of detail' do
62
- options[:depth] = 1
63
- expect(timeago(sample_date - 500.days, sample_date)).to eql('1 year ago')
64
-
65
- options[:depth] = 3
66
- expect(timeago(sample_date - 500.days, sample_date)).to eql('1 year, 4 months and 2 weeks ago')
67
-
68
- options[:depth] = 4
69
- expect(timeago(sample_date - 500.days, sample_date)).to eql('1 year, 4 months, 2 weeks and 1 day ago')
70
- end
71
-
72
- it 'allow localization' do
73
- options[:prefix] = 'hace'
74
- options[:months] = 'meses'
75
- options[:and] = 'y'
76
- options[:week] = 'semana'
77
- options[:suffix] = nil
78
-
79
- expect(timeago(sample_date - 100.days, sample_date)).to eql('hace 3 meses y 1 semana')
80
- end
81
- end
82
- end