jekyll-scholar 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
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