middleman-citation 0.0.1 → 0.3.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: f55657e35c57b39ea3cf99d18502348145e533fc
4
- data.tar.gz: de38334ee3122e3becfae88985479d610d016b57
3
+ metadata.gz: df3100f95e3b00a8dde2c4e7d4268cf900624e78
4
+ data.tar.gz: 5334dfdb4123806ec377c7adb1c08b0b48ca12e7
5
5
  SHA512:
6
- metadata.gz: 0748e82b0a09b4dd9378beb55fb924bc5b142b76260dab2ed53230ea13541399fb41a6961f57255d6824343e554bee272a198dcc9bb06bdf1f8b916dee456e1e
7
- data.tar.gz: 72347790ff25cbecd205dc9eadddd17d6bf8fbab77585a9b5a7b2afd60c1a688a07b46d4b5b27eae2986f61adb65edc1d2c1c6f212220de1b4f9f5dead80c548
6
+ metadata.gz: de796752aab080082f670edde6de3eb85e6a14317e95311db17d448eef37af2d44f909cd40239f51b407264b7d00efbcf472ca61bdeda6c0d941b8a13bc0891b
7
+ data.tar.gz: cb4c6890411c2a8181818738fde1ec18c308ed2ee7ff57a67e0b2ab91c5472fa5241e9593dc0549a749fe6a7349d6e0ba1a503b943b1f80404c1bbb71412bc24
data/.gitignore CHANGED
@@ -1,2 +1,4 @@
1
1
  .ruby-version
2
2
  pkg
3
+ doc
4
+ .yardoc
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.yardopts ADDED
@@ -0,0 +1 @@
1
+ lib/**/*.rb
data/Gemfile CHANGED
@@ -1,5 +1,20 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in multimarkdown.gemspec
3
+ # Specify your gem's dependencies in middleman-citation.gemspec
4
4
  gemspec
5
5
 
6
+ group :development do
7
+ gem 'rake'
8
+ gem 'rdoc'
9
+ gem 'yard'
10
+ gem 'guard'
11
+ gem 'pry'
12
+ end
13
+
14
+ group :test do
15
+ gem 'cucumber'
16
+ gem 'aruba'
17
+ gem 'rspec'
18
+ gem 'rspec-html-matchers'
19
+ gem 'guard-rspec'
20
+ end
data/Gemfile.lock CHANGED
@@ -1,86 +1,171 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- middleman-citation (0.0.1)
4
+ middleman-citation (0.0.2.2)
5
5
  bibtex-ruby
6
- citeproc-ruby (~> 0.0.6)
6
+ citeproc-ruby
7
+ csl-styles
7
8
  middleman-core (~> 3)
8
9
 
9
10
  GEM
10
11
  remote: https://rubygems.org/
11
12
  specs:
12
- activesupport (4.1.5)
13
- i18n (~> 0.6, >= 0.6.9)
13
+ activesupport (4.2.4)
14
+ i18n (~> 0.7)
14
15
  json (~> 1.7, >= 1.7.7)
15
16
  minitest (~> 5.1)
16
- thread_safe (~> 0.1)
17
+ thread_safe (~> 0.3, >= 0.3.4)
17
18
  tzinfo (~> 1.1)
18
- bibtex-ruby (4.0.3)
19
+ aruba (0.10.0)
20
+ childprocess (~> 0.5.6)
21
+ contracts (~> 0.9)
22
+ cucumber (>= 1.3.19)
23
+ ffi (~> 1.9.10)
24
+ rspec-expectations (>= 2.99)
25
+ thor (~> 0.19)
26
+ bibtex-ruby (4.0.14)
19
27
  latex-decode (~> 0.0)
20
- celluloid (0.15.2)
21
- timers (~> 1.1.0)
22
- citeproc-ruby (0.0.6)
23
- logging (~> 1.5)
24
- nokogiri (~> 1.5)
28
+ builder (3.2.2)
29
+ capybara (2.4.4)
30
+ mime-types (>= 1.16)
31
+ nokogiri (>= 1.3.3)
32
+ rack (>= 1.0.0)
33
+ rack-test (>= 0.5.4)
34
+ xpath (~> 2.0)
35
+ childprocess (0.5.7)
36
+ ffi (~> 1.0, >= 1.0.11)
37
+ citeproc (1.0.1)
38
+ namae (~> 0.8)
39
+ citeproc-ruby (1.0.4)
40
+ citeproc (~> 1.0)
41
+ csl (~> 1.2)
42
+ coderay (1.1.0)
43
+ contracts (0.12.0)
44
+ csl (1.2.3)
45
+ namae (~> 0.7)
46
+ csl-styles (1.0.1.4)
47
+ csl (~> 1.0)
48
+ cucumber (2.1.0)
49
+ builder (>= 2.1.2)
50
+ cucumber-core (~> 1.3.0)
51
+ diff-lcs (>= 1.1.3)
52
+ gherkin3 (~> 3.1.0)
53
+ multi_json (>= 1.7.5, < 2.0)
54
+ multi_test (>= 0.1.2)
55
+ cucumber-core (1.3.0)
56
+ gherkin3 (~> 3.1.0)
57
+ diff-lcs (1.2.5)
25
58
  erubis (2.7.0)
26
- ffi (1.9.3)
27
- hooks (0.4.0)
28
- uber (~> 0.0.4)
29
- i18n (0.6.11)
30
- json (1.8.1)
31
- latex-decode (0.1.1)
59
+ ffi (1.9.10)
60
+ formatador (0.2.5)
61
+ gherkin3 (3.1.2)
62
+ guard (2.13.0)
63
+ formatador (>= 0.2.4)
64
+ listen (>= 2.7, <= 4.0)
65
+ lumberjack (~> 1.0)
66
+ nenv (~> 0.1)
67
+ notiffany (~> 0.0)
68
+ pry (>= 0.9.12)
69
+ shellany (~> 0.0)
70
+ thor (>= 0.18.1)
71
+ guard-rspec (4.3.1)
72
+ guard (~> 2.1)
73
+ rspec (>= 2.14, < 4.0)
74
+ hooks (0.4.1)
75
+ uber (~> 0.0.14)
76
+ i18n (0.7.0)
77
+ json (1.8.3)
78
+ latex-decode (0.2.2)
32
79
  unicode (~> 0.4)
33
- listen (2.7.9)
34
- celluloid (>= 0.15.2)
80
+ listen (3.0.3)
35
81
  rb-fsevent (>= 0.9.3)
36
82
  rb-inotify (>= 0.9)
37
- little-plugger (1.1.3)
38
- logging (1.8.2)
39
- little-plugger (>= 1.1.3)
40
- multi_json (>= 1.8.4)
41
- middleman-core (3.3.5)
42
- activesupport (~> 4.1.0)
83
+ lumberjack (1.0.9)
84
+ method_source (0.8.2)
85
+ middleman-core (3.4.0)
86
+ activesupport (~> 4.1)
43
87
  bundler (~> 1.1)
88
+ capybara (~> 2.4.4)
44
89
  erubis
45
90
  hooks (~> 0.3)
46
- i18n (~> 0.6.9)
47
- listen (>= 2.7.9, < 3.0)
91
+ i18n (~> 0.7.0)
92
+ listen (~> 3.0.3)
48
93
  padrino-helpers (~> 0.12.3)
49
94
  rack (>= 1.4.5, < 2.0)
50
- rack-test (~> 0.6.2)
51
95
  thor (>= 0.15.2, < 2.0)
52
96
  tilt (~> 1.4.1, < 2.0)
53
- mini_portile (0.6.0)
54
- minitest (5.4.0)
55
- multi_json (1.10.1)
56
- nokogiri (1.6.3.1)
57
- mini_portile (= 0.6.0)
58
- padrino-helpers (0.12.3)
97
+ mime-types (2.6.1)
98
+ mini_portile (0.6.2)
99
+ minitest (5.8.0)
100
+ multi_json (1.11.2)
101
+ multi_test (0.1.2)
102
+ namae (0.9.2)
103
+ nenv (0.2.0)
104
+ nokogiri (1.6.6.2)
105
+ mini_portile (~> 0.6.0)
106
+ notiffany (0.0.8)
107
+ nenv (~> 0.1)
108
+ shellany (~> 0.0)
109
+ padrino-helpers (0.12.5)
59
110
  i18n (~> 0.6, >= 0.6.7)
60
- padrino-support (= 0.12.3)
111
+ padrino-support (= 0.12.5)
61
112
  tilt (~> 1.4.1)
62
- padrino-support (0.12.3)
113
+ padrino-support (0.12.5)
63
114
  activesupport (>= 3.1)
64
- rack (1.5.2)
65
- rack-test (0.6.2)
115
+ pry (0.10.3)
116
+ coderay (~> 1.1.0)
117
+ method_source (~> 0.8.1)
118
+ slop (~> 3.4)
119
+ rack (1.6.4)
120
+ rack-test (0.6.3)
66
121
  rack (>= 1.0)
67
122
  rake (10.3.2)
68
- rb-fsevent (0.9.4)
123
+ rb-fsevent (0.9.6)
69
124
  rb-inotify (0.9.5)
70
125
  ffi (>= 0.5.0)
126
+ rdoc (4.2.0)
127
+ json (~> 1.4)
128
+ rspec (3.3.0)
129
+ rspec-core (~> 3.3.0)
130
+ rspec-expectations (~> 3.3.0)
131
+ rspec-mocks (~> 3.3.0)
132
+ rspec-core (3.3.2)
133
+ rspec-support (~> 3.3.0)
134
+ rspec-expectations (3.3.1)
135
+ diff-lcs (>= 1.2.0, < 2.0)
136
+ rspec-support (~> 3.3.0)
137
+ rspec-html-matchers (0.7.0)
138
+ nokogiri (~> 1)
139
+ rspec (~> 3)
140
+ rspec-mocks (3.3.2)
141
+ diff-lcs (>= 1.2.0, < 2.0)
142
+ rspec-support (~> 3.3.0)
143
+ rspec-support (3.3.0)
144
+ shellany (0.0.1)
145
+ slop (3.6.0)
71
146
  thor (0.19.1)
72
- thread_safe (0.3.4)
147
+ thread_safe (0.3.5)
73
148
  tilt (1.4.1)
74
- timers (1.1.0)
75
149
  tzinfo (1.2.2)
76
150
  thread_safe (~> 0.1)
77
- uber (0.0.8)
78
- unicode (0.4.4.1)
151
+ uber (0.0.15)
152
+ unicode (0.4.4.2)
153
+ xpath (2.0.0)
154
+ nokogiri (~> 1.3)
155
+ yard (0.8.7.6)
79
156
 
80
157
  PLATFORMS
81
158
  ruby
82
159
 
83
160
  DEPENDENCIES
84
- bundler (~> 1.3)
161
+ aruba
162
+ cucumber
163
+ guard
164
+ guard-rspec
85
165
  middleman-citation!
166
+ pry
86
167
  rake
168
+ rdoc
169
+ rspec
170
+ rspec-html-matchers
171
+ yard
data/Guardfile ADDED
@@ -0,0 +1,12 @@
1
+
2
+ guard 'rspec' do
3
+ # watch /lib/ files
4
+ watch(%r{^lib/(.+).rb$}) do |m|
5
+ system %{rake spec}
6
+ end
7
+
8
+ # watch /spec/ files
9
+ watch(%r{^spec/(.+).rb$}) do |m|
10
+ system %{rake spec}
11
+ end
12
+ end
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Middleman-citation
2
2
 
3
+ [ ![Codeship Status for gabysbrain/middleman-citation](https://codeship.com/projects/cd5fdc40-6601-0133-2d2b-5adfc3e4cb23/status?branch=master)](https://codeship.com/projects/113648)
4
+
3
5
  This is an extension for the [Middleman](http://middlemanapp.com/) static
4
6
  site generator that adds functions you can use in your templates for
5
7
  formating citations from BibTeX.
@@ -21,16 +23,16 @@ Or install it yourself as:
21
23
 
22
24
  $ gem install middleman-citation
23
25
 
24
-
25
26
  ## Configuration
26
27
 
27
28
  In your `config.rb` file for your site add:
28
29
 
29
30
  require 'middleman-citation'
30
31
 
31
- activate :citation do |options|
32
- options.bibtex = "/Users/tom/Dropbox/Research/all.bib" # full path to a bibtex file
33
- options.style = "ieee" # or whatever style you want from citeproc-styles
32
+ activate :citation do |opts|
33
+ opts.bibtex = '/path/to/your.bib' # path to a bibtex file
34
+ opts.style = 'ieee' # style from citeproc-styles
35
+ opts.format = 'html' # output format
34
36
  end
35
37
 
36
38
  ## Usage
@@ -38,14 +40,39 @@ In your `config.rb` file for your site add:
38
40
  This adds the following helper methods you can use in your Middleman
39
41
  templates.
40
42
 
43
+ * `citations_search(search_term, author)`: Search the BibTeX file for all
44
+ citations matching a search term (such as `'@article'`) and by the given
45
+ author. The `author` argument can be ommitted to match all authors and
46
+ a `search_term` of `nil` will match all items in the bibliography.
47
+
48
+ * `citation(key)`: Given a BibTeX citation key as returned from
49
+ `citations_search`, return a formatted string the citation according to
50
+ how the `style` and `format` options were set.
51
+
52
+ For extra control on the output, one can use:
53
+
54
+ * `citation_entry(key)`: Return the unformatted entry (a hash)
55
+ corresponding to the BibTeX citation key.
41
56
 
57
+ * `citation_formatted(entry)`: Format an unformatted entry.
42
58
 
43
- * `cite_full(key)`: given the BibTeX citation key return a formatted string
44
- for the citation according to how the `style` option is set.
45
- * `find_pubs(search_key, author)`: Search the BibTeX file for all citations
46
- of a certain type for a # certain author.
47
- Returns a list of citation keys you can send
48
- to `cite_full`.
59
+ In fact the `citation` method is implemented using these:
60
+
61
+ def citation(key)
62
+ entry = citation_entry(key)
63
+ citation_formatted(entry)
64
+ end
65
+
66
+ The point is that one can interrogate the unformatted entry to
67
+ add extra formatting: The following code adds a DOI link if the
68
+ entry matching the `key` has a `URL` field containing the DOI.
69
+
70
+ entry = citation_entry(key)
71
+ entry_html = citation_formatted(entry)
72
+ if doi_url = entry.fetch('URL', false) then
73
+ doi_link = "(%s)" % link_to('doi', doi_url)
74
+ end
75
+ [entry_html, doi_link].compact.join(' ')
49
76
 
50
77
  ## Contributing
51
78
 
data/Rakefile CHANGED
@@ -1 +1,20 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'cucumber/rake/task'
5
+ Cucumber::Rake::Task.new(:cucumber, 'Run features that should pass') do |t|
6
+ t.cucumber_opts = "--color --tags ~@wip --strict"
7
+ end
8
+
9
+ require 'rspec/core/rake_task'
10
+ desc "Run RSpec"
11
+ RSpec::Core::RakeTask.new do |spec|
12
+ spec.pattern = 'spec/**/*_spec.rb'
13
+ spec.rspec_opts = ['--color', '--format documentation']
14
+ end
15
+
16
+ require 'rake/clean'
17
+
18
+ task test: ['spec', 'cucumber']
19
+
20
+ task default: :test
@@ -0,0 +1,4 @@
1
+ PROJECT_ROOT_PATH = File.dirname(File.dirname(File.dirname(__FILE__)))
2
+ require 'middleman-core'
3
+ require 'middleman-core/step_definitions'
4
+ require File.join(PROJECT_ROOT_PATH, 'lib', 'middleman-citation')
data/fixtures/test.bib ADDED
@@ -0,0 +1,93 @@
1
+ @article{Turkay:2011a,
2
+ Author = {Turkay, Cagatay and J. Parulek and N. Reuter and Hauser, Helwig},
3
+ Date-Added = {2015-11-04 09:50:16 +0000},
4
+ Date-Modified = {2015-11-04 09:50:48 +0000},
5
+ Doi = {10.1111/j.1467-8659.2011.01920.x},
6
+ Journal = {Computer Graphics Forum},
7
+ Month = {jun},
8
+ Number = {3},
9
+ Pages = {711--720},
10
+ Publisher = {Wiley-Blackwell},
11
+ Title = {Interactive Visual Analysis of Temporal Cluster Structures},
12
+ Url = {http://dx.doi.org/10.1111/j.1467-8659.2011.01920.x},
13
+ Volume = {30},
14
+ Year = 2011,
15
+ Bdsk-Url-1 = {http://dx.doi.org/10.1111/j.1467-8659.2011.01920.x}}
16
+
17
+ @article{Correa:2013,
18
+ Author = {Carlos D. Correa and Peter Lindstrom},
19
+ Date-Added = {2015-11-02 14:06:07 +0000},
20
+ Date-Modified = {2015-11-02 14:06:07 +0000},
21
+ Doi = {10.1615/int.j.uncertaintyquantification.2012003959},
22
+ Journal = {Int. J. {UncertaintyQuantification}},
23
+ Number = {3},
24
+ Pages = {187--201},
25
+ Publisher = {Begell House},
26
+ Title = {{THE} {MUTUAL} {INFORMATION} {DIAGRAM} {FOR} {UNCERTAINTY} {VISUALIZATION}},
27
+ Url = {http://dx.doi.org/10.1615/int.j.uncertaintyquantification.2012003959},
28
+ Volume = {3},
29
+ Year = 2013,
30
+ Bdsk-Url-1 = {http://dx.doi.org/10.1615/int.j.uncertaintyquantification.2012003959}}
31
+
32
+ @article{Beck:2016,
33
+ Author = {Fabian Beck and Sebastian Koch and Daniel Weiskopf},
34
+ Date-Added = {2015-11-02 11:01:01 +0000},
35
+ Date-Modified = {2015-11-02 11:01:01 +0000},
36
+ Doi = {10.1109/tvcg.2015.2467757},
37
+ Journal = {{IEEE} Trans. Visual. Comput. Graphics},
38
+ Month = {jan},
39
+ Number = {1},
40
+ Pages = {180--189},
41
+ Publisher = {Institute of Electrical {\\&} Electronics Engineers ({IEEE})},
42
+ Title = {Visual Analysis and Dissemination of Scientific Literature Collections with {SurVis}},
43
+ Url = {http://dx.doi.org/10.1109/tvcg.2015.2467757},
44
+ Volume = {22},
45
+ Year = 2016,
46
+ Bdsk-Url-1 = {http://dx.doi.org/10.1109/tvcg.2015.2467757}}
47
+
48
+ @article{Lehmann:2016,
49
+ Author = {Dirk J. Lehmann and Holger Theisel},
50
+ Date-Added = {2015-11-02 10:47:37 +0000},
51
+ Date-Modified = {2015-11-02 10:47:37 +0000},
52
+ Doi = {10.1109/tvcg.2015.2467132},
53
+ Journal = {{IEEE} Trans. Visual. Comput. Graphics},
54
+ Month = {jan},
55
+ Number = {1},
56
+ Pages = {609--618},
57
+ Publisher = {Institute of Electrical {\\&} Electronics Engineers ({IEEE})},
58
+ Title = {Optimal Sets of Projections of High-Dimensional Data},
59
+ Url = {http://dx.doi.org/10.1109/tvcg.2015.2467132},
60
+ Volume = {22},
61
+ Year = 2016,
62
+ Bdsk-Url-1 = {http://dx.doi.org/10.1109/tvcg.2015.2467132}}
63
+
64
+ @article{Rubio-Sanchez:2016,
65
+ Author = {Manuel Rubio-Sanchez and Laura Raya and Francisco Diaz and Alberto Sanchez},
66
+ Date-Added = {2015-11-02 10:47:09 +0000},
67
+ Date-Modified = {2015-11-02 10:47:09 +0000},
68
+ Doi = {10.1109/tvcg.2015.2467324},
69
+ Journal = {{IEEE} Trans. Visual. Comput. Graphics},
70
+ Month = {jan},
71
+ Number = {1},
72
+ Pages = {619--628},
73
+ Publisher = {Institute of Electrical {\\&} Electronics Engineers ({IEEE})},
74
+ Title = {A comparative study between {RadViz} and Star Coordinates},
75
+ Url = {http://dx.doi.org/10.1109/tvcg.2015.2467324},
76
+ Volume = {22},
77
+ Year = 2016,
78
+ Bdsk-Url-1 = {http://dx.doi.org/10.1109/tvcg.2015.2467324}}
79
+
80
+ @article{Torsney-Weir:2011,
81
+ Author = {Torsney-Weir, Thomas and Saad, Ahmed and M{\"o}ller, Torsten and Weber, Britta and Hege, Hans-Christian and Verbavatz, Jean-Marc and Bergner, Steven},
82
+ Date-Added = {2012-12-23 15:54:34 +0000},
83
+ Date-Modified = {2013-04-07 20:00:22 +0000},
84
+ Journal = {IEEE Transactions on Visualization and Computer Graphics},
85
+ Keywords = {Visualization, High-D, Image Segmentation, Multi-objective},
86
+ Month = nov # {\slash } # dec,
87
+ Number = {12},
88
+ Pages = {1892--1901},
89
+ Rating = {0},
90
+ Title = {Tuner: Principled Parameter Finding for Image Segmentation Algorithms Using Visual Response Surface Exploration},
91
+ Volume = {17},
92
+ Year = {2011}}
93
+
@@ -1,20 +1,21 @@
1
1
  require "middleman-citation/version"
2
+ require "middleman-citation/citations"
2
3
  require "middleman-core"
3
4
  require "bibtex"
4
- require "citeproc"
5
5
 
6
6
  module Middleman
7
+
7
8
  class CitationExtension < Middleman::Extension
8
- option :bibtex, "", "The path to the bibtex file to use"
9
- option :style, "chicago-author-date", "The citation style to use"
10
-
9
+
10
+ option :bibtex, nil, 'Path to the bibtex file'
11
+ option :style, 'chicago-author-date', 'Citation style'
12
+ option :format, 'html', 'Citation format'
13
+
11
14
  def initialize(app, options_hash={}, &block)
12
15
  super
13
-
14
- @@bibtex = BibTeX.open(options.bibtex)
15
- # for some reason the options function is the one from
16
- # middleman-deploy in the helper methods below...
17
- @@cite_style = options.style
16
+ app.set(:bibtex, BibTeX.open(options.bibtex, :filter => 'latex'))
17
+ app.set(:cite_style, options.style)
18
+ app.set(:cite_format, options.format)
18
19
  end
19
20
 
20
21
  helpers do
@@ -23,26 +24,52 @@ module Middleman
23
24
  # Params:
24
25
  # +key+:: bibtex key located in the BibTeX file defined in the config
25
26
  def cite_full(key)
26
- # need to convert latex special characters, like {\"o} to unicode
27
- @@bibtex[key].convert_latex
28
- CiteProc.process(@@bibtex[key].to_citeproc, :style => @@cite_style)
27
+ Citations::cite_full(key, @@bibtex, @@cite_style)
29
28
  end
30
-
31
- # Search the BibTeX file for all citations of a certain type for a
32
- # certain author. Returns a list of citation keys you can send to
33
- # +cite_full+.
29
+
30
+ # Given a BibTeX citation return a block containing the citation
31
+ # that we can embed in a webpage inline
34
32
  # Params:
35
- # +search_key+:: filter keys for the BibTeX file, e.g. @book, @article,
36
- # etc.
37
- # +author+:: The full author name to search for
38
- def find_pubs(search_key, author)
39
- bib_name = BibTeX::Name.parse(author)
40
- results = @@bibtex.query(search_key) do |e|
41
- e.respond_to?(:author) and e.author and e.author.include? bib_name
33
+ # +key+:: bibtex key located in the BibTeX file defined in the config
34
+ def cite_inline(key)
35
+ Citations::cite_inline(key, @@bibtex, @@cite_style)
36
+ end
37
+
38
+ def citations_search(search_key, author = nil)
39
+ entries_matching_key = bibtex.query(search_key)
40
+ entries =
41
+ if author then
42
+ search_by_author(entries_matching_key, author)
43
+ else
44
+ entries_matching_key
45
+ end
46
+ entries.sort { |x, y| y.year.to_i <=> x.year.to_i }.map(&:key)
47
+ end
48
+
49
+ def citation_entry(key)
50
+ bibtex[key].convert_latex.to_citeproc
51
+ end
52
+
53
+ def citation_formatted(entry)
54
+ CiteProc.process(entry, :style => cite_style, :format => cite_format)
55
+ end
56
+
57
+ def citation(key)
58
+ entry = citation_entry(key)
59
+ citation_formatted(entry)
60
+ end
61
+
62
+ private
63
+
64
+ def search_by_author(entries, author)
65
+ bib_author = BibTeX::Name.parse(author)
66
+ entries.select do |e|
67
+ e.respond_to?(:author) &&
68
+ e.author &&
69
+ e.author.include?(bib_author)
42
70
  end
43
- results.sort! {|x,y| y.year.to_i-x.year.to_i}
44
- results.map {|x| x.key}
45
71
  end
72
+
46
73
  end
47
74
  end
48
75
  end
@@ -0,0 +1,33 @@
1
+
2
+ require "bibtex"
3
+ require "citeproc"
4
+ require "csl/styles"
5
+
6
+ module Citations
7
+ class InvalidKeyError < StandardError
8
+ end
9
+
10
+ class InvalidStyleError < StandardError
11
+ end
12
+
13
+ def self.cite_full(key, bib, style, format='text')
14
+ cp = CiteProc::Processor.new style: style, format: format
15
+ cp.import bib.to_citeproc
16
+ # need to convert latex special characters, like {\"o} to unicode
17
+ #bib[key].convert_latex
18
+ #puts bib[key]
19
+ #CiteProc.process(bib[key].to_citeproc, :style => style)
20
+ begin
21
+ cp.render(:bibliography, id: key).join("\n")
22
+ rescue TypeError => e
23
+ raise InvalidKeyError, "citation key '#{key}' not found"
24
+ rescue CSL::ParseError => e
25
+ raise InvalidStyleError, "citation style '#{style}' not found"
26
+ end
27
+ end
28
+
29
+ def self.cite_inline(key, bib, style)
30
+ "&nbsp;<span class='inline-citation'><span class='citation'>#{cite_full(key, bib, style,'html')}</span></span>"
31
+ end
32
+
33
+ end
@@ -1,7 +1,7 @@
1
1
 
2
2
  module Middleman
3
3
  module Citation
4
- VERSION = "0.0.1"
4
+ VERSION = "0.3.0"
5
5
  end
6
6
  end
7
7
 
@@ -0,0 +1 @@
1
+ require 'middleman-citation'
@@ -22,9 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.require_paths = ["lib"]
23
23
 
24
24
  spec.add_runtime_dependency "bibtex-ruby"
25
- spec.add_runtime_dependency "citeproc-ruby", ["~> 0.0.6"]
25
+ spec.add_runtime_dependency "citeproc-ruby"
26
+ spec.add_runtime_dependency "csl-styles"
26
27
  spec.add_runtime_dependency "middleman-core", ["~> 3"]
27
-
28
- spec.add_development_dependency "bundler", "~> 1.3"
29
- spec.add_development_dependency "rake"
30
28
  end
data/spec/cite_spec.rb ADDED
@@ -0,0 +1,47 @@
1
+ require 'middleman-citation/citations'
2
+
3
+ RSpec.describe Citations, "citations" do
4
+ require 'bibtex'
5
+ bib = BibTeX.open('fixtures/test.bib', :filter => :latex)
6
+
7
+ turkay_chi = "Turkay, Cagatay, J. Parulek, N. Reuter, and Helwig Hauser. 2011. “Interactive Visual Analysis of Temporal Cluster Structures.” Computer Graphics Forum 30 (3). Wiley-Blackwell: 711–20. doi:10.1111/j.1467-8659.2011.01920.x. http://dx.doi.org/10.1111/j.1467-8659.2011.01920.x."
8
+ turkay_ieee = "C. Turkay, J. Parulek, N. Reuter, and H. Hauser, “Interactive Visual Analysis of Temporal Cluster Structures,” Computer Graphics Forum, vol. 30, no. 3, pp. 711–720, Jun. 2011."
9
+ tw_chi = "Torsney-Weir, Thomas, Ahmed Saad, Torsten Möller, Britta Weber, Hans-Christian Hege, Jean-Marc Verbavatz, and Steven Bergner. 2011. “Tuner: Principled Parameter Finding for Image Segmentation Algorithms Using Visual Response Surface Exploration.” IEEE Transactions on Visualization and Computer Graphics 17 (12): 1892–1901."
10
+
11
+ context "long-form citation" do
12
+ it "gives a nice error for a bad style" do
13
+ expect {Citations::cite_full('Turkay:2011a', bib, 'crazyformat')}.to \
14
+ raise_error(Citations::InvalidStyleError, /crazyformat/)
15
+ end
16
+
17
+ it "gives a nice error for a bad key" do
18
+ expect {Citations::cite_full('notthere', bib, 'chicago-author-date')}.to \
19
+ raise_error(Citations::InvalidKeyError, /notthere/)
20
+ end
21
+
22
+ it "generates a proper chicago-style citation" do
23
+ full_cite = Citations::cite_full('Turkay:2011a', bib, 'chicago-author-date')
24
+ expect(full_cite).to eq(turkay_chi)
25
+ end
26
+
27
+ it "generates a proper ieee-style citation" do
28
+ full_cite = Citations::cite_full('Turkay:2011a', bib, 'ieee')
29
+ expect(full_cite).to eq(turkay_ieee)
30
+ end
31
+
32
+ it "properly handles accented characters" do
33
+ full_cite = Citations::cite_full('Torsney-Weir:2011', bib, 'chicago-author-date')
34
+ expect(full_cite).to eq(tw_chi)
35
+ end
36
+ end
37
+
38
+ context "short-form inline citation" do
39
+ it "generates a proper chicago-style citation" do
40
+ inline_cite = Citations::cite_inline('Turkay:2011a', bib, 'chicago-author-date')
41
+ expect(inline_cite).to have_tag("span", :with => {:class => 'inline-citation'}) do
42
+ with_tag('span', :text => turkay_chi, :with => {:class => 'citation'})
43
+ end
44
+ end
45
+ end
46
+ end
47
+
@@ -0,0 +1,100 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # The generated `.rspec` file contains `--require spec_helper` which will cause
4
+ # this file to always be loaded, without a need to explicitly require it in any
5
+ # files.
6
+ #
7
+ # Given that it is always loaded, you are encouraged to keep this file as
8
+ # light-weight as possible. Requiring heavyweight dependencies from this file
9
+ # will add to the boot time of your test suite on EVERY test run, even for an
10
+ # individual file that may not need all of that loaded. Instead, consider making
11
+ # a separate helper file that requires the additional dependencies and performs
12
+ # the additional setup, and require it from the spec files that actually need
13
+ # it.
14
+ #
15
+ # The `.rspec` file also contains a few flags that are not defaults but that
16
+ # users commonly want.
17
+ #
18
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
19
+ RSpec.configure do |config|
20
+ # rspec-expectations config goes here. You can use an alternate
21
+ # assertion/expectation library such as wrong or the stdlib/minitest
22
+ # assertions if you prefer.
23
+ config.expect_with :rspec do |expectations|
24
+ # This option will default to `true` in RSpec 4. It makes the `description`
25
+ # and `failure_message` of custom matchers include text for helper methods
26
+ # defined using `chain`, e.g.:
27
+ # be_bigger_than(2).and_smaller_than(4).description
28
+ # # => "be bigger than 2 and smaller than 4"
29
+ # ...rather than:
30
+ # # => "be bigger than 2"
31
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
32
+ end
33
+
34
+ # rspec-html-matchers
35
+ require 'rspec-html-matchers'
36
+ config.include RSpecHtmlMatchers
37
+
38
+ # rspec-mocks config goes here. You can use an alternate test double
39
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
40
+ config.mock_with :rspec do |mocks|
41
+ # Prevents you from mocking or stubbing a method that does not exist on
42
+ # a real object. This is generally recommended, and will default to
43
+ # `true` in RSpec 4.
44
+ mocks.verify_partial_doubles = true
45
+ end
46
+
47
+ # The settings below are suggested to provide a good initial experience
48
+ # with RSpec, but feel free to customize to your heart's content.
49
+ =begin
50
+ # These two settings work together to allow you to limit a spec run
51
+ # to individual examples or groups you care about by tagging them with
52
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
53
+ # get run.
54
+ config.filter_run :focus
55
+ config.run_all_when_everything_filtered = true
56
+
57
+ # Allows RSpec to persist some state between runs in order to support
58
+ # the `--only-failures` and `--next-failure` CLI options. We recommend
59
+ # you configure your source control system to ignore this file.
60
+ config.example_status_persistence_file_path = "spec/examples.txt"
61
+
62
+ # Limits the available syntax to the non-monkey patched syntax that is
63
+ # recommended. For more details, see:
64
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
65
+ # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
66
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
67
+ config.disable_monkey_patching!
68
+
69
+ # This setting enables warnings. It's recommended, but in some cases may
70
+ # be too noisy due to issues in dependencies.
71
+ config.warnings = true
72
+
73
+ # Many RSpec users commonly either run the entire suite or an individual
74
+ # file, and it's useful to allow more verbose output when running an
75
+ # individual spec file.
76
+ if config.files_to_run.one?
77
+ # Use the documentation formatter for detailed output,
78
+ # unless a formatter has already been configured
79
+ # (e.g. via a command-line flag).
80
+ config.default_formatter = 'doc'
81
+ end
82
+
83
+ # Print the 10 slowest examples and example groups at the
84
+ # end of the spec run, to help surface which specs are running
85
+ # particularly slow.
86
+ config.profile_examples = 10
87
+
88
+ # Run specs in random order to surface order dependencies. If you find an
89
+ # order dependency and want to debug it, you can fix the order by providing
90
+ # the seed, which is printed after each run.
91
+ # --seed 1234
92
+ config.order = :random
93
+
94
+ # Seed global randomization in this process using the `--seed` CLI option.
95
+ # Setting this allows you to use `--seed` to deterministically reproduce
96
+ # test failures related to randomization by passing the same `--seed` value
97
+ # as the one that triggered the failure.
98
+ Kernel.srand config.seed
99
+ =end
100
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: middleman-citation
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Torsney-Weir
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-22 00:00:00.000000000 Z
11
+ date: 2015-11-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bibtex-ruby
@@ -28,58 +28,44 @@ dependencies:
28
28
  name: citeproc-ruby
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - '>='
32
32
  - !ruby/object:Gem::Version
33
- version: 0.0.6
33
+ version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - '>='
39
39
  - !ruby/object:Gem::Version
40
- version: 0.0.6
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: middleman-core
42
+ name: csl-styles
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - '>='
46
46
  - !ruby/object:Gem::Version
47
- version: '3'
47
+ version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - '>='
53
53
  - !ruby/object:Gem::Version
54
- version: '3'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: bundler
56
+ name: middleman-core
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: '1.3'
62
- type: :development
61
+ version: '3'
62
+ type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
- version: '1.3'
69
- - !ruby/object:Gem::Dependency
70
- name: rake
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - '>='
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - '>='
81
- - !ruby/object:Gem::Version
82
- version: '0'
68
+ version: '3'
83
69
  description: |2
84
70
  A middleman extension that gives helpers for
85
71
  creating citations using citeproc
@@ -90,14 +76,23 @@ extensions: []
90
76
  extra_rdoc_files: []
91
77
  files:
92
78
  - .gitignore
79
+ - .rspec
80
+ - .yardopts
93
81
  - Gemfile
94
82
  - Gemfile.lock
83
+ - Guardfile
95
84
  - LICENSE
96
85
  - README.md
97
86
  - Rakefile
87
+ - features/support/env.rb
88
+ - fixtures/test.bib
98
89
  - lib/middleman-citation.rb
90
+ - lib/middleman-citation/citations.rb
99
91
  - lib/middleman-citation/version.rb
92
+ - lib/middleman_extension.rb
100
93
  - middleman-citation.gemspec
94
+ - spec/cite_spec.rb
95
+ - spec/spec_helper.rb
101
96
  homepage: https://github.com/gabysbrain/middleman-citation
102
97
  licenses:
103
98
  - MIT
@@ -122,4 +117,8 @@ rubygems_version: 2.0.3
122
117
  signing_key:
123
118
  specification_version: 4
124
119
  summary: Middleman extension for citeproc
125
- test_files: []
120
+ test_files:
121
+ - features/support/env.rb
122
+ - spec/cite_spec.rb
123
+ - spec/spec_helper.rb
124
+ has_rdoc: