jekyll-scholar 0.0.4 → 0.0.5

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
@@ -35,9 +35,11 @@ default configuration is as follows:
35
35
  source: ./_bibliography
36
36
  bibliography: references.bib
37
37
 
38
- details_dir ./bibliography
39
- details_layout bibtex.html
38
+ details_dir: bibliography
39
+ details_layout: bibtex.html
40
+ details_link: Details
40
41
 
42
+ query: "@*"
41
43
 
42
44
  You can use any style that ships with
43
45
  [CiteProc-Ruby](https://github.com/inukshuk/citeproc-ruby) by name (e.g.,
@@ -180,6 +182,25 @@ of your BibTeX entry. Here is an example of a details page layout:
180
182
  </body>
181
183
  </html>
182
184
 
185
+ When Jekyll-Scholar generates detail pages, it also adds links to each
186
+ entry's detail page to the generated bibliography. You can alter the
187
+ name of the link via the 'details_link' configuration option.
188
+
189
+
190
+ ### Bibliography Filters
191
+
192
+ By default, Jekyll-Scholar includes all entries in you main BibTeX file
193
+ when generating bibliographies. If you want to include only those entries
194
+ matching certain criteria, you can do so by adjusting the 'query'
195
+ configuration option. For example:
196
+
197
+ query: "@book" #=> includes only books
198
+ query: "@article[year>=2003]" #=> includes only articles published 2003 or later
199
+ query: "@*[url]" #=> includes all entries with a url field
200
+ query: "@*[status!=review]" #=> includes all entries whose status field is not set to 'review'
201
+
202
+ Please note that some of these queries require bibtex-ruby 2.0.7 or
203
+ later versions.
183
204
 
184
205
  Contributing
185
206
  ------------
@@ -34,4 +34,4 @@ Feature: BibTeX
34
34
  When I run jekyll
35
35
  Then the _site directory should exist
36
36
  And the "_site/bibliography/ruby.html" file should exist
37
- And I should see "<i>The Ruby Programming Language</i>" in "_site/bibliography/ruby.html"
37
+ And I should see "The Ruby Programming Language" in "_site/bibliography/ruby.html"
@@ -0,0 +1,39 @@
1
+ Feature: BibTeX
2
+ As a scholar who likes to blog
3
+ I want to apply filters to my BibTeX bibliography
4
+ In order to have control over the references that go up on my website
5
+
6
+ @tags @filters
7
+ Scenario: Filter by Year
8
+ Given I have a scholar configuration with:
9
+ | key | value |
10
+ | source | ./_bibliography |
11
+ | query | "@*[year=2009]" |
12
+ And I have a "_bibliography" directory
13
+ And I have a file "_bibliography/references.bib":
14
+ """
15
+ @book{ruby,
16
+ title = {The Ruby Programming Language},
17
+ author = {Flanagan, David and Matsumoto, Yukihiro},
18
+ year = {2008},
19
+ publisher = {O'Reilly Media}
20
+ }
21
+ @book{pickaxe,
22
+ title = {Programming Ruby 1.9: The Pragmatic Programmer's Guide},
23
+ author = {Thomas, Dave and Fowler, Chad and Hunt, Andy},
24
+ year = {2009},
25
+ edition = 3,
26
+ publisher = {Pragmatic Bookshelf}
27
+ }
28
+ """
29
+ And I have a page "scholar.html":
30
+ """
31
+ ---
32
+ ---
33
+ {% bibliography %}
34
+ """
35
+ When I run jekyll
36
+ Then the _site directory should exist
37
+ And the "_site/scholar.html" file should exist
38
+ And I should see "Programming Ruby" in "_site/scholar.html"
39
+ And I should not see "The Ruby Programming Language" in "_site/scholar.html"
@@ -54,9 +54,15 @@ Then /^the (.*) directory should exist$/ do |dir|
54
54
  end
55
55
 
56
56
  Then /^I should see "(.*)" in "(.*)"$/ do |text, file|
57
+ puts File.open(file).readlines.join
57
58
  assert_match Regexp.new(text), File.open(file).readlines.join
58
59
  end
59
60
 
61
+ Then /^I should not see "(.*)" in "(.*)"$/ do |text, file|
62
+ assert !File.open(file).readlines.join.match(Regexp.new(text))
63
+ end
64
+
65
+
60
66
  Then /^the "(.*)" file should exist$/ do |file|
61
67
  assert File.file?(file)
62
68
  end
@@ -5,33 +5,10 @@ require 'bibtex'
5
5
  require 'citeproc'
6
6
 
7
7
  require 'jekyll/scholar/version'
8
+ require 'jekyll/scholar/defaults'
9
+ require 'jekyll/scholar/utilities'
10
+
8
11
  require 'jekyll/scholar/converters/bibtex'
9
12
  require 'jekyll/scholar/tags/bibliography'
10
13
  require 'jekyll/scholar/tags/cite'
11
14
  require 'jekyll/scholar/generators/details'
12
-
13
- module Jekyll
14
- class Scholar
15
-
16
- @defaults = Hash[*%w{
17
-
18
- style apa
19
- locale en
20
-
21
- sort_by none
22
- order ascending
23
-
24
- source ./_bibliography
25
- bibliography references.bib
26
-
27
- details_dir ./bibliography
28
- details_layout bibtex.html
29
-
30
- }].freeze
31
-
32
- class << self
33
- attr_reader :defaults
34
- end
35
-
36
- end
37
- end
@@ -2,8 +2,9 @@ module Jekyll
2
2
  class Scholar
3
3
  class BibTeXConverter < Converter
4
4
  safe true
5
-
6
5
  priority :highest
6
+
7
+ attr_reader :config
7
8
 
8
9
  @pattern = (/bib(tex)?$/i).freeze
9
10
  @extension = '.html'.freeze
@@ -12,10 +13,10 @@ module Jekyll
12
13
  attr_reader :pattern, :extension
13
14
  end
14
15
 
15
- def initialize (config = {})
16
+ def initialize(config = {})
16
17
  super
17
18
  @config['scholar'] = Scholar.defaults.merge(@config['scholar'] || {})
18
- @markdown = MarkdownConverter.new config
19
+ @markdown = MarkdownConverter.new(config)
19
20
  end
20
21
 
21
22
  def matches(extension)
@@ -26,15 +27,16 @@ module Jekyll
26
27
  BibTeXConverter.extension
27
28
  end
28
29
 
29
- def convert (content)
30
- content = BibTeX.parse(content, :strict => true, :include => [:meta_content], :filter => [:latex]).map do |b|
30
+ def convert(content)
31
+ content = BibTeX.parse(content, :strict => true, :include => [:meta_content], :filter => [:latex]).map do |b|
31
32
  if b.respond_to?(:to_citeproc)
32
- CiteProc.process b.to_citeproc, :style => @config['style'],
33
- :locale => @config['locale'], :format => 'html'
33
+ CiteProc.process b.to_citeproc, :style => config['style'],
34
+ :locale => config['locale'], :format => 'html'
34
35
  else
35
36
  b.is_a?(BibTeX::MetaContent) ? b.to_s : ''
36
37
  end
37
38
  end
39
+
38
40
  @markdown.convert(content.join("\n"))
39
41
  end
40
42
 
@@ -0,0 +1,26 @@
1
+ module Jekyll
2
+ class Scholar
3
+ @defaults = Hash[*%w{
4
+
5
+ style apa
6
+ locale en
7
+
8
+ sort_by none
9
+ order ascending
10
+
11
+ source ./_bibliography
12
+ bibliography references.bib
13
+
14
+ details_dir bibliography
15
+ details_layout bibtex.html
16
+ details_link Details
17
+
18
+ query @*
19
+
20
+ }].freeze
21
+
22
+ class << self
23
+ attr_reader :defaults
24
+ end
25
+ end
26
+ end
@@ -2,15 +2,14 @@ module Jekyll
2
2
  class Scholar
3
3
 
4
4
  class Details < Page
5
-
6
- attr_reader :config
5
+ include Scholar::Utilities
7
6
 
8
7
  def initialize(site, base, dir, entry)
9
8
  @site, @base, @dir = site, base, dir
10
9
 
11
10
  @config = Scholar.defaults.merge(site.config['scholar'] || {})
12
11
 
13
- @name = [entry.key, 'html'].join('.')
12
+ @name = details_file_for(entry)
14
13
 
15
14
  process(@name)
16
15
  read_yaml(File.join(base, '_layouts'), config['details_layout'])
@@ -34,16 +33,17 @@ module Jekyll
34
33
  end
35
34
 
36
35
  class DetailsGenerator < Generator
36
+ include Scholar::Utilities
37
37
  safe true
38
38
 
39
39
  attr_reader :config
40
40
 
41
41
  def generate(site)
42
- @config = Scholar.defaults.merge(site.config['scholar'] || {})
42
+ @site, @config = site, Scholar.defaults.merge(site.config['scholar'] || {})
43
43
 
44
- if site.layouts.key?(File.basename(config['details_layout'], '.html'))
45
- bibliography.each do |entry|
46
- details = Details.new(site, site.source, config['details_dir'], entry)
44
+ if generate_details?
45
+ entries.each do |entry|
46
+ details = Details.new(site, site.source, details_path, entry)
47
47
  details.render(site.layouts, site.site_payload)
48
48
  details.write(site.dest)
49
49
 
@@ -53,17 +53,6 @@ module Jekyll
53
53
  end
54
54
  end
55
55
 
56
- private
57
-
58
- def bibliography
59
- @bibliography ||= BibTeX.open(bibliography_path, :filter => :latex)
60
- end
61
-
62
- def bibliography_path
63
- p = File.join(config['source'], config['bibliography'])
64
- p << '.bib' unless File.exists?(p)
65
- p
66
- end
67
56
  end
68
57
 
69
58
 
@@ -2,65 +2,35 @@ module Jekyll
2
2
  class Scholar
3
3
 
4
4
  class BibliographyTag < Liquid::Tag
5
+ include Scholar::Utilities
5
6
 
6
- attr_reader :file, :config
7
-
8
7
  def initialize(tag_name, arguments, tokens)
9
8
  super
10
9
 
11
10
  @config = Scholar.defaults.dup
12
- @file = arguments.strip
11
+ @bibtex_file = arguments.strip
13
12
  end
14
13
 
15
14
  def render(context)
16
- config.merge!(context.registers[:site].config['scholar'] || {})
15
+ @site = context.registers[:site]
16
+ config.merge!(site.config['scholar'] || {})
17
17
 
18
18
  references = entries.map do |e|
19
- r = CiteProc.process e.to_citeproc, :style => config['style'],
19
+ reference = CiteProc.process e.to_citeproc, :style => config['style'],
20
20
  :locale => config['locale'], :format => 'html'
21
21
 
22
- r = "<span id='#{e.key}'>#{r}</span>"
22
+ reference = "<span id='#{e.key}'>#{reference}</span>"
23
23
 
24
- if e.field?(:url)
25
- r << "<a href='#{e.url}'>URL</a>"
26
- end
27
-
28
- if e.field?(:doi)
29
- r << "<a href='#{e.doi}'>DOI</a>"
24
+ if generate_details?
25
+ reference << "<a href='#{details_link_for(e)}'>#{config['details_link']}</a>"
30
26
  end
31
-
32
- "<li>#{r}</li>"
27
+
28
+ "<li>#{reference}</li>"
33
29
  end
34
-
35
- "<ol>\n#{references.join("\n")}\n</ol>"
36
- end
37
-
38
- private
39
-
40
- def bibliography
41
- @bibliography ||= BibTeX.open(extend_path(file), :filter => :latex)
42
- end
43
-
44
- def entries
45
- b = bibliography['@*']
46
30
 
47
- unless config['sort_by'] == 'none'
48
- b.sort_by! { |e| e[config['sort_by']].to_s }
49
- b.reverse! if config['order'] =~ /^(desc|reverse)/i
50
- end
51
-
52
- b
31
+ "<ol>\n#{references.join("\n")}\n</ol>"
53
32
  end
54
33
 
55
- def extend_path(name)
56
- if name.nil? || name.empty?
57
- name = config['bibliography']
58
- end
59
-
60
- p = File.join(config['source'], name)
61
- p << '.bib' unless File.exists?(p)
62
- p
63
- end
64
34
  end
65
35
 
66
36
  end
@@ -2,7 +2,8 @@ module Jekyll
2
2
  class Scholar
3
3
 
4
4
  class CiteTag < Liquid::Tag
5
-
5
+ include Scholar::Utilities
6
+
6
7
  attr_reader :key, :pages, :config
7
8
 
8
9
  def initialize(tag_name, arguments, tokens)
@@ -15,29 +16,18 @@ module Jekyll
15
16
  def render(context)
16
17
  config.merge!(context.registers[:site].config['scholar'] || {})
17
18
 
18
- e = bibliography[key]
19
+ entry = bibliography[key]
19
20
 
20
- if e
21
- c = CiteProc.process e.to_citeproc, :style => config['style'],
21
+ if entry
22
+ c = CiteProc.process entry.to_citeproc, :style => config['style'],
22
23
  :locale => config['locale'], :format => 'html', :mode => :citation
23
24
 
24
- "<a href='##{e.key}'>#{c}</a>"
25
+ "<a href='##{entry.key}'>#{c}</a>"
25
26
  else
26
27
  "(missing reference)"
27
28
  end
28
29
  end
29
30
 
30
- private
31
-
32
- def bibliography
33
- @bibliography ||= BibTeX.open(extend_path(config['bibliography']), :filter => :latex)
34
- end
35
-
36
- def extend_path(name)
37
- p = File.join(config['source'], name)
38
- p << '.bib' unless File.exists?(p)
39
- p
40
- end
41
31
  end
42
32
 
43
33
  end
@@ -0,0 +1,67 @@
1
+ module Jekyll
2
+ class Scholar
3
+
4
+ # Utility methods used by several Scholar plugins. The methods in this
5
+ # module may depend on the presence of #config, #bibtex_file, and
6
+ # #site readers
7
+ module Utilities
8
+
9
+ attr_reader :bibtex_file, :config, :site
10
+
11
+ def bibtex_options
12
+ @bibtex_options ||= { :filter => :latex }
13
+ end
14
+
15
+ def bibtex_path
16
+ @bibtex_path ||= extend_path(bibtex_file)
17
+ end
18
+
19
+ def bibliography
20
+ @bibliography ||= BibTeX.open(bibtex_path, bibtex_options)
21
+ end
22
+
23
+ def entries
24
+ b = bibliography[config['query']]
25
+
26
+ unless config['sort_by'] == 'none'
27
+ b.sort_by! { |e| e[config['sort_by']].to_s }
28
+ b.reverse! if config['order'] =~ /^(desc|reverse)/i
29
+ end
30
+
31
+ b
32
+ end
33
+
34
+ def extend_path(name)
35
+ if name.nil? || name.empty?
36
+ name = config['bibliography']
37
+ end
38
+
39
+ p = File.join(config['source'], name)
40
+ p << '.bib' unless File.exists?(p)
41
+ p
42
+ end
43
+
44
+ def generate_details?
45
+ site.layouts.key?(File.basename(config['details_layout'], '.html'))
46
+ end
47
+
48
+ def details_file_for(entry)
49
+ name = entry.key.to_s.dup
50
+
51
+ name.gsub!(/[:\s]+/, '_')
52
+
53
+ [name, 'html'].join('.')
54
+ end
55
+
56
+ def details_link_for(entry)
57
+ [site.source, details_path, details_file_for(entry)].join('/')
58
+ end
59
+
60
+ def details_path
61
+ config['details_dir']
62
+ end
63
+
64
+ end
65
+
66
+ end
67
+ end
@@ -1,5 +1,5 @@
1
1
  module Jekyll
2
2
  class Scholar
3
- VERSION = '0.0.4'.freeze
3
+ VERSION = '0.0.5'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-scholar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-27 00:00:00.000000000 Z
12
+ date: 2012-04-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: jekyll
16
- requirement: &70309233363880 !ruby/object:Gem::Requirement
16
+ requirement: &70227972382420 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0.10'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70309233363880
24
+ version_requirements: *70227972382420
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: citeproc-ruby
27
- requirement: &70309233363360 !ruby/object:Gem::Requirement
27
+ requirement: &70227972381880 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.0.6
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70309233363360
35
+ version_requirements: *70227972381880
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bibtex-ruby
38
- requirement: &70309233362460 !ruby/object:Gem::Requirement
38
+ requirement: &70227972380880 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 2.0.5
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70309233362460
46
+ version_requirements: *70227972380880
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rake
49
- requirement: &70309233361220 !ruby/object:Gem::Requirement
49
+ requirement: &70227972379520 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0.9'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70309233361220
57
+ version_requirements: *70227972379520
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rdoc
60
- requirement: &70309233358000 !ruby/object:Gem::Requirement
60
+ requirement: &70227972376480 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '3.11'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70309233358000
68
+ version_requirements: *70227972376480
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: redgreen
71
- requirement: &70309233372520 !ruby/object:Gem::Requirement
71
+ requirement: &70227972391080 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '1.2'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70309233372520
79
+ version_requirements: *70227972391080
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: shoulda
82
- requirement: &70309233371740 !ruby/object:Gem::Requirement
82
+ requirement: &70227972390320 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '2.11'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70309233371740
90
+ version_requirements: *70227972390320
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rr
93
- requirement: &70309233371260 !ruby/object:Gem::Requirement
93
+ requirement: &70227972389840 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '1.0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70309233371260
101
+ version_requirements: *70227972389840
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: cucumber
104
- requirement: &70309233370720 !ruby/object:Gem::Requirement
104
+ requirement: &70227972389320 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - =
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '1.1'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *70309233370720
112
+ version_requirements: *70227972389320
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: RedCloth
115
- requirement: &70309233370180 !ruby/object:Gem::Requirement
115
+ requirement: &70227972388780 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ~>
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '4.2'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *70309233370180
123
+ version_requirements: *70227972388780
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: rdiscount
126
- requirement: &70309233369560 !ruby/object:Gem::Requirement
126
+ requirement: &70227972388160 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ~>
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: '1.6'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *70309233369560
134
+ version_requirements: *70227972388160
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: redcarpet
137
- requirement: &70309233368920 !ruby/object:Gem::Requirement
137
+ requirement: &70227972387500 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ~>
@@ -142,7 +142,7 @@ dependencies:
142
142
  version: '1.9'
143
143
  type: :development
144
144
  prerelease: false
145
- version_requirements: *70309233368920
145
+ version_requirements: *70227972387500
146
146
  description: A set of jekyll extensions for academic blogging.
147
147
  email: http://sylvester.keil.or.at
148
148
  executables: []
@@ -156,6 +156,7 @@ files:
156
156
  - features/bibtex.feature
157
157
  - features/citation.feature
158
158
  - features/details.feature
159
+ - features/filter.feature
159
160
  - features/sorting.feature
160
161
  - features/step_definitions/jekyll_steps.rb
161
162
  - features/step_definitions/scholar_steps.rb
@@ -163,9 +164,11 @@ files:
163
164
  - jekyll-scholar.gemspec
164
165
  - lib/jekyll/scholar.rb
165
166
  - lib/jekyll/scholar/converters/bibtex.rb
167
+ - lib/jekyll/scholar/defaults.rb
166
168
  - lib/jekyll/scholar/generators/details.rb
167
169
  - lib/jekyll/scholar/tags/bibliography.rb
168
170
  - lib/jekyll/scholar/tags/cite.rb
171
+ - lib/jekyll/scholar/utilities.rb
169
172
  - lib/jekyll/scholar/version.rb
170
173
  homepage: http://github.com/inukshuk/jekyll-scholar
171
174
  licenses: []
@@ -195,6 +198,7 @@ test_files:
195
198
  - features/bibtex.feature
196
199
  - features/citation.feature
197
200
  - features/details.feature
201
+ - features/filter.feature
198
202
  - features/sorting.feature
199
203
  - features/step_definitions/jekyll_steps.rb
200
204
  - features/step_definitions/scholar_steps.rb