hard_citer 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NjdkYWJkMTc2YzNhYjQxZjFkM2UxMTNkNmU3ZDAwNmE2MDBlYWFlYQ==
5
+ data.tar.gz: !binary |-
6
+ OTM4NjgzNWM5MWI3NjI1NmNjNzg2YjZkN2FjNzYwYmIzNjdlZTBjNQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ZmMzMTYzOGJkZDllMDdjMTNjYTUyMzQ3NjA5M2U0OTNlMDAwNjIzZjEwNTUz
10
+ NzY3YmMwYTAwY2JjM2Y4YzA5NTViZGQ5NmVkZjNhNmZiMDllMzljNjVmMDY5
11
+ OTIxZWQ3OWU3YjFjZTgzNTE5MzM2NDE3ZjJhYjc5NDg4MDU0ZTQ=
12
+ data.tar.gz: !binary |-
13
+ YjM5ZTQwNTNhYWUyZTI1MDExZTY5ZWFjN2M2NDE5ZWI5OTNlZGM2MDExYzMw
14
+ YjFmOTIwNjZmZmQ5ZDFhYTQwMWRjZWE3NzgzNDg4YmFkODg4Zjg1YThhYzIx
15
+ ZTRjMDZhOWJhZThiNmQ1NTY5MDVhNjJkODg2MmI3MThiNGJmMzY=
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
- # Hard Citer
1
+ # Hard Citer[![Gem Version](https://badge.fury.io/rb/hard_citer.png)](http://badge.fury.io/rb/hard_citer)[![Coverage Status](https://coveralls.io/repos/mcordell/hard_citer/badge.png?branch=master)](https://coveralls.io/r/mcordell/hard_citer?branch=master)
2
+
2
3
  Hard Citer is a solution for outputting HTML bibliographies. When used in conjuction with a "cite while you write" tool, it can make writing and editing well-cited html eaiser. Using a in-text cited HTML document and a bibtex library, it can output a properly formatted bibliography. The default configuration is geared towards usage with Papers' [magic citations][1]. Papers does not provide an easy way to perform magic citations and produce a nicely formatted bibliography for HTML, from an HTML document source.
3
4
 
4
5
  For the best bang for your buck, use one of the text editors listed [here][2]
@@ -12,7 +13,13 @@ use Hard Citer.
12
13
 
13
14
  ##Usage
14
15
 
15
- Require the module where you plan on using HardCiter. Initialize a new Citer object by pointing it at the bib file you exported from Papers:
16
+ Install the hard_citer gem and require it.
17
+
18
+ ```Ruby
19
+ require 'hard_citer'
20
+ ```
21
+
22
+ Initialize a new Citer object by pointing it at the bib file you exported from Papers:
16
23
 
17
24
  ```Ruby
18
25
  require File.expand_path("../lib/hard_citer", __FILE__)
@@ -39,3 +46,17 @@ citer.csl = File.expand_path("../examples/plos.csl")
39
46
  ```
40
47
 
41
48
 
49
+ ##TODO
50
+ Here is a general list of how I would like to improve this gem
51
+
52
+ 1. Command line commands in conjunction with a yml configuration file
53
+ 2. Better support for alternate CWYW tools
54
+ 3. More Tests
55
+ 4. Expand the Library function so that you can use ActiveRecords or kin for easier rails support
56
+
57
+
58
+ ##Contact
59
+
60
+ I would love to hear from anyone who would like me to improve this gem or who has comments and suggestions.
61
+
62
+ \[[Twitter](https://twitter.com/mike_cordell)\] | \[[Email](mailto:mike@mikecordell.com)\] | \[[Website](http://www.mikecordell.com)\]
data/Rakefile CHANGED
@@ -1,4 +1,5 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
3
 
4
- :default => :spec
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ task :default => :spec
data/lib/hard_citer.rb CHANGED
@@ -2,15 +2,12 @@
2
2
  require 'bibtex'
3
3
  require 'citeproc'
4
4
  require File.expand_path("../hardciter/bibliography.rb", __FILE__)
5
- require File.expand_path("../hardciter/cite_match.rb", __FILE__)
5
+ require File.expand_path("../hardciter/citation.rb", __FILE__)
6
6
  require File.expand_path("../hardciter/citer.rb", __FILE__)
7
7
  require File.expand_path("../hardciter/configuration.rb", __FILE__)
8
8
  require File.expand_path("../hardciter/document.rb", __FILE__)
9
9
  require File.expand_path("../hardciter/exceptions.rb", __FILE__)
10
10
  require File.expand_path("../hardciter/library.rb", __FILE__)
11
- require File.expand_path("../hardciter/styler.rb", __FILE__)
12
-
13
-
14
-
15
-
16
-
11
+ require File.expand_path("../hardciter/html_output.rb", __FILE__)
12
+ require File.expand_path("../hardciter/parser.rb", __FILE__)
13
+ require File.expand_path("../hardciter/intext_match.rb", __FILE__)
@@ -1,85 +1,50 @@
1
1
  module HardCiter
2
2
  class Bibliography
3
- attr_accessor :bibliography_intext, :intext_regex, :bib_out_location, :citation_locations, :citations
3
+ attr_accessor :bibliography_intext, :intext_regex, :bib_out_line, :bib_out_match,
4
+ :citation_locations, :citations, :bit_out_location
4
5
 
5
6
  def initialize
6
- @bibliography_intext = HardCiter::Configuration::BIBLIOGRAPHY_INTEXT_KEY
7
- @intext_regex = HardCiter::Configuration::INTEXT_REGEX
7
+ @bibliography_intext = HardCiter.configuration.bibliography_pattern
8
+ @intext_regex = HardCiter.configuration.intext_pattern
8
9
  @citation_locations = {}
9
10
  @citations = {}
10
11
  end
11
12
 
12
- def find_intext_citations(line)
13
- line.enum_for(:scan, @intext_regex).map do
14
- match = Regexp.last_match
15
- pos = match.begin(0)
16
- [match.to_s, pos]
17
- end
18
- end
19
-
20
- def has_bibliography_key?(line)
21
- line =~ @bibliography_intext
22
- end
23
-
24
- def mark_match_positions(citation_matches,line,index)
25
- if citation_matches.length > 1
26
- @citation_locations[index] = group_matches(citation_matches, line)
13
+ def pair_match_to_citation(intext_match,line_num)
14
+ if intext_match.type == HardCiter::BIBLIOGRAPHY_OUT_MATCH
15
+ set_bib_out(intext_match,line_num)
16
+ nil
27
17
  else
28
- @citation_locations[index] = citation_matches
18
+ get_or_create_citation(intext_match)
29
19
  end
30
20
  end
31
21
 
32
- def parse_line(line,index)
33
- @bib_out_location = index if has_bibliography_key?(line)
34
- regex_matches = find_intext_citations(line)
22
+ def set_bib_out(intext_match,line_num)
23
+ @bib_out_line = line_num
24
+ @bib_out_match = intext_match
35
25
  end
36
26
 
37
- def group_matches(matches,line)
38
- matches_grouped = []
39
- current_match = matches.shift
40
- until matches.empty?
41
- next_match = matches.shift
42
- if matches_are_paired?(current_match,next_match,line)
43
- current_match = pair_two_matches(current_match, next_match)
44
- else
45
- matches_grouped.push(current_match) if current_match
46
- current_match = next_match
47
- end
27
+ def get_or_create_citation(intext_match)
28
+ if @citations.has_key?(intext_match.cite_key)
29
+ @citations[intext_match.cite_key]
30
+ else
31
+ add_citation(intext_match)
48
32
  end
49
- matches_grouped.push(current_match) unless current_match.empty?
50
- return matches_grouped
51
33
  end
52
34
 
53
- def pair_two_matches(current_match,next_match)
54
- if current_match[0].instance_of?(Array)
55
- paired_matches = current_match + next_match
56
- else
57
- paired_matches = [current_match,next_match]
58
- end
35
+ def has_bibliography_key?(line)
36
+ line =~ @bibliography_intext
59
37
  end
60
38
 
61
- def matches_are_paired?(match_first, match_second, line)
62
- match_text, match_pos = get_match_text_and_pos(match_first)
63
- next_match_pos = match_second[1]
64
- end_of_match = match_pos + match_text.key.length
65
- while end_of_match < next_match_pos
66
- if line[end_of_match] =~ /\s/
67
- end_of_match += 1
68
- else
69
- false
70
- end
71
- end
72
- true
39
+ def add_citation(intext_match)
40
+ citation = HardCiter::Citation.new(intext_match.cite_key)
41
+ citation.bib_number = next_citation_index
42
+ @citations[citation.key] = citation
43
+ citation
73
44
  end
74
45
 
75
- def get_match_text_and_pos(match_group)
76
- if match_group[0].instance_of?(Array)
77
- #match_group has sub arrays so it needs to be unpacked
78
- last_match = match_group[match_group.size-1]
79
- else
80
- last_match = match_group
81
- end
82
- [last_match[0],last_match[1]]
46
+ def next_citation_index
47
+ @citations.length + 1
83
48
  end
84
49
  end
85
50
  end
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+ module HardCiter
3
+ class Citation
4
+ attr_accessor :bib_number, :entry, :in_cite_text, :key
5
+
6
+ def initialize(key, entry = nil, in_cite_text = nil)
7
+ @key = key
8
+ @entry = entry
9
+ @in_cite_text = in_cite_text
10
+ end
11
+ end
12
+ end
13
+
@@ -1,94 +1,101 @@
1
1
  module HardCiter
2
2
  class Citer
3
- BIBTEX_LIBRARY_REGEX = /\.bib$/
4
- attr_accessor :library, :styler, :csl, :bibliography
5
3
 
6
- #Citer
4
+ attr_accessor :library, :output, :csl, :bibliography
5
+
7
6
  def initialize(path = nil)
8
7
  initialize_library_by_path(path) if path
9
8
  @bibliography = HardCiter::Bibliography.new
10
- @styler = HardCiter::Styler.new
11
9
  @csl = HardCiter::Configuration::CSL
10
+ @output = HardCiter::HtmlOutput.new(@csl)
11
+ @parser = HardCiter::Parser.new
12
12
  end
13
13
 
14
- #Citer
15
14
  def initialize_library_by_path(path)
16
- if path =~ BIBTEX_LIBRARY_REGEX
15
+ if path =~ HardCiter.configuration.bibtex_library_regex
17
16
  @library = BibTexLibrary.new(path)
18
17
  else
19
- raise "Unknown path type"
18
+ raise "Unknown library path type"
20
19
  end
21
20
  end
22
21
 
23
- #Citer
24
22
  def cite_text(text)
25
- #validate_prerequisites
26
- doc = Document.new(text)
27
- find_all_citations(doc.text_array) #move this from bib to doc? TODO
28
- output_text = integrate_citations_into_text(doc.text_array)
29
- output_text = integrate_bibliography_into_text(output_text)
23
+ validate_prerequisites
24
+ document = Document.new(text)
25
+ intext_matches = parse_all_lines(document)
26
+ add_and_group_intext_matches(document, intext_matches)
27
+ get_entries_from_library
28
+ @output.prepare_bibliography(@bibliography)
29
+ @output.process_and_output_text(document,intext_matches)
30
30
  end
31
31
 
32
- def validate_prerequisites
33
- #TODO
34
- #check to make sure we have everything we need
32
+ def get_entries_from_library
33
+ raise "Library is not set. Cannot get entries." if @library.nil?
34
+ raise "Bibliography is not set. Cannot get entries." if @bibliography.nil?
35
+ raise "Bibliography has no citations" if @bibliography.citations.nil? || @bibliography.citations.empty?
36
+ @bibliography.citations.each do |cite_key,citation|
37
+ citation.entry = @library.get_entry(citation.key)
38
+ end
35
39
  end
36
40
 
37
- #Citer
38
- #refactor to use Document
39
- def find_all_citations(text)
40
- text.each_with_index() do |line, index|
41
- regex_matches = @bibliography.parse_line(line,index)
42
- matches = regex_matches_to_cite_matches(regex_matches) unless regex_matches.empty?
43
- @bibliography.mark_match_positions(matches,line,index) unless matches.nil?
41
+ def add_and_group_intext_matches(document,intext_matches)
42
+ intext_matches.each_with_index do |matches, index|
43
+ line = document.text_array[index]
44
+ matches.each do |match|
45
+ citation = @bibliography.pair_match_to_citation(match,index)
46
+ match.citation = citation if citation
47
+ end
48
+ group_matches!(matches,line)
44
49
  end
45
50
  end
46
51
 
47
- def regex_matches_to_cite_matches(regex_matches)
48
- regex_matches.map { |m| get_or_create_cite_match(m) }
52
+ def validate_prerequisites
53
+ if @library.nil?
54
+ raise "Library missing cannot proceed with citation"
55
+ elsif @csl.nil?
56
+ raise "No citation format found, cannot proceed with citation"
57
+ end
49
58
  end
50
59
 
51
- # Document, Bib
52
- def integrate_citations_into_text(text)
53
- output_text = text.dup
54
- @bibliography.citation_locations.each do |line_number,cite_matches|
55
- text_line = output_text[line_number]
56
- output_text[line_number] = @styler.style_line(text_line,cite_matches)
60
+ def parse_all_lines(document)
61
+ document.text_array.each_with_object([]) do |line,out|
62
+ out.push(@parser.parse_line(line))
57
63
  end
58
- output_text
59
64
  end
60
65
 
61
- #
62
- def integrate_bibliography_into_text(text)
63
- out_location = @bibliography.bib_out_location
64
- if out_location
65
- bib_text = styler.get_bibliography_lines(@bibliography, @csl)
66
- bib_end = out_location + 1
67
- after_bib_location = text[(bib_end..text.size-1)]
68
- return text[0..bib_end] + bib_text + after_bib_location
69
- else
70
- warn('No bib key found. \
71
- Bibliography not added to cited text.')
72
- return text
66
+ def group_matches!(matches, line)
67
+ temp_matches = []
68
+ current_match = matches.shift unless matches.empty?
69
+ head = current_match
70
+ until matches.empty?
71
+ next_match = matches.shift
72
+ if matches_are_paired?(current_match, next_match, line)
73
+ pair_matches(current_match,next_match)
74
+ else
75
+ temp_matches.push(head)
76
+ head = next_match
77
+ end
78
+ current_match = next_match
73
79
  end
80
+ temp_matches.each { |m| matches.push m }
81
+ matches.push(head)
74
82
  end
75
83
 
76
- def get_or_create_cite_match(regex_match)
77
- match_key, match_pos = regex_match
78
-
79
- if @bibliography.citations.has_key?(match_key)
80
- cite_match = @bibliography.citations[match_key]
81
- else
82
- cite_match = CiteMatch.new(match_key)
83
- cite_match.bib_number = @bibliography.citations.length + 1
84
- cite_match.citation = @library.get_citation(convert_match_to_cite_key(match_key))
85
- @bibliography.citations[match_key] = cite_match
84
+ private
85
+ def matches_are_paired?(match_first, match_second, line)
86
+ end_of_match = match_first.position + match_first.regex_match.length
87
+ while end_of_match < match_second.position
88
+ if line[end_of_match] =~ /\s/
89
+ end_of_match += 1
90
+ else
91
+ return false
92
+ end
93
+ end
94
+ return true
86
95
  end
87
- [cite_match, match_pos]
88
- end
89
96
 
90
- def convert_match_to_cite_key(match)
91
- match.gsub(/\{|\}/, '')
92
- end
97
+ def pair_matches(first_match, second_match)
98
+ first_match.next_in_group = second_match
99
+ end
93
100
  end
94
101
  end
@@ -1,12 +1,18 @@
1
1
  module HardCiter
2
2
  class Configuration
3
- attr_accessor :csl, :bibliography_intext, :intext_regex
3
+ attr_accessor :csl, :bibliography_pattern, :intext_pattern,
4
+ :bibtex_library_regex, :cite_key_pattern
4
5
 
5
6
  CSL = File.expand_path("../../../examples/plos.csl", __FILE__)
6
7
 
7
- BIBLIOGRAPHY_INTEXT_KEY = /\{papers2_bibliography\}/
8
+ BIBLIOGRAPHY_PATTERN = /\{papers2_bibliography\}/
9
+
10
+ INTEXT_PATTERN = /\{(\w*:\w*)\}/
11
+
12
+ CITE_KEY_PATTERN = /\w*:\w*/
13
+
14
+ BIBTEX_LIBRARY_REGEX = /\.bib$/
8
15
 
9
- INTEXT_REGEX = /\{(\w*:\w*)\}/
10
16
 
11
17
  def initialize
12
18
  self.reset
@@ -14,10 +20,11 @@ module HardCiter
14
20
 
15
21
  def reset
16
22
  @csl = CSL
17
- @bibliography_intext = BIBLIOGRAPHY_INTEXT_KEY
18
- @intext_regex = INTEXT_REGEX
23
+ @bibliography_pattern = BIBLIOGRAPHY_PATTERN
24
+ @intext_pattern = INTEXT_PATTERN
25
+ @cite_key_pattern = CITE_KEY_PATTERN
26
+ @bibtex_library_regex = BIBTEX_LIBRARY_REGEX
19
27
  end
20
-
21
28
  end
22
29
 
23
30
  class << self
@@ -0,0 +1,137 @@
1
+ # encoding: utf-8
2
+ require 'citeproc'
3
+ module HardCiter
4
+ class HtmlOutput
5
+ attr_accessor :csl, :bibliography
6
+
7
+ def initialize(csl=nil)
8
+ @csl = csl if csl
9
+ @open_tag = '<sup>['
10
+ @close_tag = ']</sup>'
11
+ @multi_separator = ','
12
+ @separator_after_last = false
13
+ end
14
+
15
+ def output_line(line,intext_matches)
16
+ intext_matches.each do |match|
17
+ line_front = line[0..match.position-1]
18
+ line_end = line[match.position+match.regex_match.length..-1]
19
+ intext_out = @open_tag + match.citation.intext_output + @close_tag
20
+ line = line_front + intext_out + line_end
21
+ end
22
+ line
23
+ end
24
+
25
+ def process_and_output_text(text,intext_matches)
26
+ text = text.text_array
27
+ raise "prepare_bibliography has not been run, cannot process text" if @bibliography.nil?
28
+ check_text_and_matches_length(text,intext_matches)
29
+ output = []
30
+ text.each_with_index do |line,index|
31
+ output+=style_line(line,intext_matches[index])
32
+ end
33
+ output
34
+ end
35
+
36
+ def check_text_and_matches_length(text,intext_matches)
37
+ if text.length != intext_matches.length
38
+ raise "Document length and intext_matches length are different, aborting."
39
+ end
40
+ end
41
+
42
+ def prepare_bibliography(bibliography)
43
+ @bibliography = ['<ol class="bibliography">']
44
+ bibliography.citations.each do |citation_key,citation|
45
+ entry = citation.entry
46
+ if entry.nil?
47
+ cite_text = citation_key
48
+ else
49
+ cite_text = CiteProc.process(entry.to_citeproc, style: @csl, format: :html)
50
+ strip_extra_brackets(cite_text)
51
+ @bibliography.push '<li><a name = "' +
52
+ "bibliography_#{citation.bib_number}\">" +
53
+ cite_text + '</a></li>'
54
+ end
55
+ end
56
+ @bibliography.push('</ol>')
57
+ end
58
+
59
+ def strip_extra_brackets(line)
60
+ line.gsub!(/\{|\}/, '')
61
+ end
62
+
63
+ def style_line(line, line_matches)
64
+ pos_offset = 0
65
+ line_matches.each do |match|
66
+ if match
67
+ if match.type == BIBLIOGRAPHY_OUT_MATCH
68
+ return @bibliography
69
+ elsif match.next_in_group.nil?
70
+ line,pos_offset = single_cite(match,line,pos_offset)
71
+ else
72
+ line,pos_offset = multi_cite(match, line, pos_offset)
73
+ end
74
+ end
75
+ end
76
+ return [line]
77
+ end
78
+
79
+ def multi_cite(match, line, pos_offset)
80
+ original_line_length = line.length
81
+ pos = match.position + pos_offset
82
+ before,after = split_at_match(pos,match.regex_match.length,line)
83
+ after = split_group_matches(match.next_in_group,after)
84
+ intexts = []
85
+ while match do
86
+ intexts.push(get_intext(match.citation))
87
+ match = match.next_in_group
88
+ end
89
+ output_line = before + wrap_intext(intexts) + after
90
+ pos_offset += (output_line.length - original_line_length)
91
+ return output_line, pos_offset
92
+ end
93
+
94
+ def split_group_matches(match,line)
95
+ while match do
96
+ match_pos = Regexp.new(match.regex_match).match(line)
97
+ if match_pos.nil?
98
+ raise "match missing?"
99
+ else
100
+ line.slice!(match_pos.begin(0)..match.regex_match.length)
101
+ end
102
+ match = match.next_in_group
103
+ end
104
+ line
105
+ end
106
+
107
+ def split_at_match(pos,match_length,line)
108
+ pos == 0 ? before = '' : before = line.slice!(0..pos - 1)
109
+ after = line.slice(match_length,line.length)
110
+ return before,after
111
+ end
112
+
113
+ def single_cite(match, line, pos_offset)
114
+ original_line_length = line.length
115
+ pos = match.position += pos_offset
116
+ before,after = split_at_match(pos,match.regex_match.length, line)
117
+ in_text_citation = wrap_intext([get_intext(match.citation)])
118
+ output_line = before + in_text_citation + after
119
+ pos_offset += (output_line.length - original_line_length)
120
+ return output_line, pos_offset
121
+ end
122
+
123
+ def get_intext(citation)
124
+ number = citation.bib_number
125
+ "<a href = \"#bibliography_#{number}\">#{number}</a>"
126
+ end
127
+
128
+ def wrap_intext(intext_citations)
129
+ output = @open_tag
130
+ intext_citations.each_with_index do |intext, index|
131
+ output += intext
132
+ output += @multi_separator unless index == intext_citations.length-1
133
+ end
134
+ output += @close_tag
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+ module HardCiter
3
+ BIBLIOGRAPHY_OUT_MATCH = 2
4
+ INTEXT_CITATION_MATCH = 1
5
+ class IntextMatch
6
+ attr_accessor :position, :type, :regex_match, :citation, :next_in_group
7
+
8
+ def initialize(position=nil, regex_match=nil, type=nil)
9
+ @position = position
10
+ @regex_match = regex_match
11
+ @type = type
12
+ end
13
+
14
+ def cite_key
15
+ match_data = HardCiter.configuration.cite_key_pattern.match(@regex_match)
16
+ match_data[0] if match_data.is_a? MatchData
17
+ end
18
+ end
19
+ end
@@ -1,36 +1,18 @@
1
1
  # encoding: utf-8
2
2
  require 'bibtex'
3
3
  module HardCiter
4
- class Library < Hash
5
-
6
- def initialize(path = nil)
7
- load_lib(path)
8
- end
9
-
10
-
11
- def load_lib(path = nil)
12
- if File.exists? path
13
- load_from_file(path)
14
- end
15
- end
16
-
17
- def get_citation()
18
- end
19
- end
20
-
21
-
22
4
  class BibTexLibrary
23
5
  attr_accessor :bibtex
24
6
 
25
- def initialize(path)
26
- load_from_file(path)
7
+ def initialize(path=nil)
8
+ load_from_file(path) if path
27
9
  end
28
10
 
29
11
  def load_from_file(path)
30
12
  @bibtex = BibTeX.open(path)
31
13
  end
32
14
 
33
- def get_citation(key)
15
+ def get_entry(key)
34
16
  @bibtex[key]
35
17
  end
36
18
 
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+ module HardCiter
3
+ class Parser
4
+ attr_accessor :bib_key_pattern, :citation_key_pattern
5
+
6
+ def initialize(bib_key_pattern=nil,citation_key_pattern=nil)
7
+ @bib_key_pattern = bib_key_pattern ? bib_key_pattern : HardCiter.configuration.bibliography_pattern
8
+ @citation_key_pattern = citation_key_pattern ? citation_key_pattern : HardCiter.configuration.intext_pattern
9
+ end
10
+
11
+ def has_bibliography_key?(line)
12
+ line =~ @bib_key_pattern
13
+ end
14
+
15
+ def create_bib_match(line)
16
+ match_data = @bib_key_pattern.match(line)
17
+ create_match(match_data, HardCiter::BIBLIOGRAPHY_OUT_MATCH)
18
+ end
19
+
20
+ def create_citation_match(match_data)
21
+ create_match(match_data, HardCiter::INTEXT_CITATION_MATCH)
22
+ end
23
+
24
+ def create_match(match_data,type)
25
+ match = HardCiter::IntextMatch.new()
26
+ match.position = match_data.begin(0)
27
+ match.type = type
28
+ match.regex_match = match_data.to_s
29
+ match
30
+ end
31
+
32
+ def find_intext_citations(line)
33
+ line.enum_for(:scan, @citation_key_pattern).map do
34
+ create_citation_match(Regexp.last_match)
35
+ end
36
+ end
37
+
38
+ def parse_line(line)
39
+ if has_bibliography_key?(line)
40
+ [create_bib_match(line)]
41
+ else
42
+ find_intext_citations(line)
43
+ end
44
+ end
45
+ end
46
+ end
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hard_citer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Michael Cordell
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-08-18 00:00:00.000000000 Z
11
+ date: 2013-10-12 00:00:00.000000000 Z
13
12
  dependencies: []
14
13
  description: ! "\nHard Citer is a solution for outputting HTML bibliographies. When
15
14
  used\nin conjuction with a \"cite while you write\" tool, it can make writing and\nediting
@@ -27,37 +26,39 @@ files:
27
26
  - LICENSE.txt
28
27
  - lib/hard_citer.rb
29
28
  - lib/hardciter/bibliography.rb
30
- - lib/hardciter/cite_match.rb
29
+ - lib/hardciter/citation.rb
31
30
  - lib/hardciter/citer.rb
32
31
  - lib/hardciter/configuration.rb
33
32
  - lib/hardciter/document.rb
34
33
  - lib/hardciter/exceptions.rb
34
+ - lib/hardciter/html_output.rb
35
+ - lib/hardciter/intext_match.rb
35
36
  - lib/hardciter/library.rb
36
- - lib/hardciter/styler.rb
37
+ - lib/hardciter/parser.rb
37
38
  - lib/scrap_methods
38
39
  homepage: https://github.com/mcordell/hard_citer
39
- licenses: []
40
+ licenses:
41
+ - MIT
42
+ metadata: {}
40
43
  post_install_message:
41
44
  rdoc_options: []
42
45
  require_paths:
43
46
  - lib
44
47
  required_ruby_version: !ruby/object:Gem::Requirement
45
- none: false
46
48
  requirements:
47
49
  - - ! '>='
48
50
  - !ruby/object:Gem::Version
49
51
  version: '0'
50
52
  required_rubygems_version: !ruby/object:Gem::Requirement
51
- none: false
52
53
  requirements:
53
54
  - - ! '>='
54
55
  - !ruby/object:Gem::Version
55
56
  version: '0'
56
57
  requirements: []
57
58
  rubyforge_project:
58
- rubygems_version: 1.8.25
59
+ rubygems_version: 2.0.7
59
60
  signing_key:
60
- specification_version: 3
61
+ specification_version: 4
61
62
  summary: A gem to help with in-text citations in HTML documents.
62
63
  test_files: []
63
64
  has_rdoc:
@@ -1,14 +0,0 @@
1
- # encoding: utf-8
2
- module HardCiter
3
- class CiteMatch
4
- attr_accessor :bib_number, :citation, :in_cite_text, :key
5
-
6
- def initialize(key, citation = nil, in_cite_text = nil)
7
- @key = key
8
- @citation = citation
9
- @in_cite_text = in_cite_text
10
- end
11
-
12
- end
13
- end
14
-
@@ -1,81 +0,0 @@
1
- # encoding: utf-8
2
- require 'citeproc'
3
- module HardCiter
4
- class Styler
5
-
6
- def initialize
7
- @open_tag = ''
8
- @close_tag = ''
9
- @multi_separator = '<sup>, </sup>'
10
- @separator_after_last = false
11
- end
12
-
13
- def get_bibliography_lines(bibliography_array, csl_style)
14
- out_lines = ['<ol class="bibliography">']
15
- bibliography_array.citations.each do |cite_key, cite_match|
16
- entry = cite_match.citation
17
- if entry.nil?
18
- cite_text = cite_key
19
- else
20
- cite_text = CiteProc.process(cite_match.citation.to_citeproc,
21
- style: csl_style, format: :html)
22
- strip_extra_papers_brackets cite_text
23
- end
24
-
25
- out_lines.push '<li><a name = "' +
26
- "bibliography_#{cite_match.bib_number}\">" +
27
- cite_text + '</a></li>'
28
- end
29
- out_lines.push '</ol>'
30
- end
31
-
32
- def strip_extra_papers_brackets(line)
33
- line.gsub!(/\{|\}/, '')
34
- end
35
-
36
- def style_line(line, citations)
37
- processed_line = ''
38
- pos_off_set = 0
39
- citations.each do |cite_match|
40
- if cite_match[0].is_a?(CiteMatch)
41
- output, offset = single_cite(cite_match[0],
42
- cite_match[1] - pos_off_set, line)
43
- pos_off_set += offset
44
-
45
- elsif cite_match[0].is_a? Array
46
- output = multi_cite(cite_match, line, pos_off_set)
47
- end
48
- if output.nil?
49
- puts "wait"
50
- end
51
- processed_line += output
52
- end
53
- processed_line += line
54
- end
55
-
56
- def multi_cite(cite_match_array, line, pos_offset)
57
- output_line = @open_tag
58
- cite_match_array.each_with_index do |cite_match, index|
59
- citation, pos = cite_match
60
- output, off_set = single_cite(citation, pos - pos_offset, line)
61
- output_line += output
62
- output_line += @multi_separator unless index == cite_match.size - 1
63
- pos_offset += off_set
64
- end
65
- output_line += @close_tag
66
-
67
- end
68
-
69
- def single_cite(citation, pos, line)
70
- key = citation.key
71
- pos == 0 ? before_cite = '' : before_cite = line.slice!(0..pos - 1)
72
- cite = line.slice!(0..key.length - 1)
73
- off_set = before_cite.length + cite.length
74
- in_text_citation = "<sup><a href = \"#bibliography_#{citation.bib_number}\
75
- \">#{citation.bib_number}</a></sup>"
76
- output_line = before_cite + in_text_citation
77
- [output_line, off_set]
78
- end
79
-
80
- end
81
- end