scripture_lookup 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/bin/scripture ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'scripture_lookup'
4
+
5
+ # Use the default provider.
6
+ provider = ScriptureLookup.new
7
+
8
+ translation = ARGV[1]
9
+ translation ||= :NASB
10
+ puts provider.lookup(ARGV[0], translation)
@@ -0,0 +1,48 @@
1
+ require 'metainspector'
2
+ require_relative 'response'
3
+ require_relative 'parsers/bible_gateway_scrape_parser'
4
+
5
+ module ScriptureLookup
6
+ class BibleGatewayScraper
7
+ attr_accessor :options
8
+
9
+ def initialize(opts = {})
10
+ @options = default_options.merge(opts)
11
+ end
12
+
13
+ def default_options
14
+ {response_class: Response,
15
+ parser: BibleGatewayScrapeParser}
16
+ end
17
+
18
+ def lookup reference, version
19
+ url = "http://www.biblegateway.com/passage/?search=#{reference}&version=#{version.to_s}"
20
+ doc = get_doc(url)
21
+
22
+ generate_response doc
23
+
24
+ rescue ScriptureLookup::Error
25
+ raise
26
+ rescue => error
27
+ raise ScriptureLookup::Error
28
+ end
29
+
30
+ private
31
+
32
+ ##
33
+ # BibleGatewayScraper#get_doc deals with the fetching of HTML content from Bible Gateway.
34
+ def get_doc(url)
35
+ page = MetaInspector.new(url)
36
+ doc = page.document
37
+
38
+ raise page.errors[0] if !page.ok?
39
+
40
+ doc
41
+ end
42
+
43
+ def generate_response doc
44
+ parser = options[:parser].new
45
+ options[:response_class].new(parser.parse(doc))
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,10 @@
1
+ module ScriptureLookup
2
+ class Error < StandardError
3
+ attr_reader :original
4
+
5
+ def initialize(message=nil, original=$!)
6
+ super message || original && original.message
7
+ @original = original
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,46 @@
1
+ require 'loofah'
2
+
3
+ module ScriptureLookup
4
+ # Encapsulate the messy parsing of raw BibleGateway.com HTML into
5
+ # a structure of hashes and arrays expected by Response.
6
+ class BibleGatewayScrapeParser
7
+ def parse(doc)
8
+ # scrub out footnotes and cross references.
9
+ frag = Loofah.fragment(doc)
10
+ kill_sup = Loofah::Scrubber.new { |node| node.remove if (node.name == "sup") or node["class"] == "chapternum" }
11
+ frag.scrub!(kill_sup)
12
+
13
+ {translation: translation(frag),
14
+ content: content(frag)}
15
+ end
16
+
17
+ private
18
+
19
+ def translation(doc)
20
+ path = './/div[contains(@class, "heading")]/p'
21
+ doc.xpath(path).text
22
+ end
23
+
24
+ def content(doc)
25
+ path = './/div[contains(@class, "passage")]//span[contains(@class, "text")]'
26
+ passages = doc.xpath(path)
27
+
28
+ passages.each_with_object({}) do |passage, hsh|
29
+ reference = passage["class"].split.last #ex. "Col-1-9"
30
+ hsh[reference] = {} unless hsh.has_key? reference
31
+ add_passage_text(hsh[reference], passage)
32
+ end
33
+ end
34
+
35
+ def add_passage_text(hsh, passage)
36
+ if passage.parent.name == "h3"
37
+ hsh[:title] = passage.text
38
+ elsif passage.parent.name == "h4"
39
+ hsh[:subtitle] = passage.text
40
+ else
41
+ hsh[:verse] = [] unless hsh.has_key? :verse
42
+ hsh[:verse] << passage.text
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,54 @@
1
+ module ScriptureLookup
2
+
3
+ # Response encapsulates the response from any of the various
4
+ # scripture providers.
5
+ #
6
+ # Response.response_data is expected to be a well formatted hash of
7
+ # scripture. Current hash structure contains the following.
8
+ # * [:translation] - The name of the translation coming back from the
9
+ # provider, such as "English Standard Version (ESV)".
10
+ # * [:content] - A hash of scripture, where each key is reference, such
11
+ # as "Col-1-9" or "Ps-23-2".
12
+ # * [:content][<ref>][:title] - Either nil or a string containing a
13
+ # title for that verse.
14
+ # * [:content][<ref>][:subtitle] - Either nil or a string containing
15
+ # a subtitle for that verse.
16
+ # * [:content][<ref>][:verse] - An array of strings containing the scripture
17
+ # for that verse. This allows us to maintain
18
+ # linebreaks between each portion of the verse
19
+ # if desired (often Psalms and other poetic
20
+ # sections of Scripture place linebreaks in the midst
21
+ # of each verse).
22
+ class Response
23
+ attr_reader :response_data
24
+
25
+ def initialize(response_data)
26
+ @response_data = response_data
27
+ end
28
+
29
+ def verses
30
+ response_data[:content].values.inject([]) do |res, verse|
31
+ res + verse[:verse]
32
+ end
33
+
34
+ rescue ScriptureLookup::Error
35
+ raise
36
+ rescue => error
37
+ raise ScriptureLookup::Error
38
+ end
39
+
40
+ # Default implementation of to_s simply returns the text for each
41
+ # verse as a single paragraph (no line breaks).
42
+ def to_s
43
+ response_data[:content].values.inject("") do |res, verse|
44
+ res += " " unless res.empty?
45
+ res + verse[:verse].join(" ")
46
+ end
47
+
48
+ rescue ScriptureLookup::Error
49
+ raise
50
+ rescue => error
51
+ raise ScriptureLookup::Error
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,14 @@
1
+ module ScriptureLookup
2
+ extend self
3
+
4
+ require_relative 'scripture_lookup/errors/error'
5
+ require_relative 'scripture_lookup/bible_gateway_scraper'
6
+
7
+ # Sugar method to be able to quickly create a provider.
8
+ #
9
+ # BibleGatewayScraper is the default provider as it can return scripture
10
+ # from the most translations.
11
+ def new
12
+ BibleGatewayScraper.new
13
+ end
14
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: scripture_lookup
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Warren Wright
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-10-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: metainspector
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: loofah
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: A gem to assist in pulling back and querying scripture.
63
+ email: warren@thewrightangle.com
64
+ executables:
65
+ - scripture
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - lib/scripture_lookup.rb
70
+ - lib/scripture_lookup/bible_gateway_scraper.rb
71
+ - lib/scripture_lookup/response.rb
72
+ - lib/scripture_lookup/parsers/bible_gateway_scrape_parser.rb
73
+ - lib/scripture_lookup/errors/error.rb
74
+ - bin/scripture
75
+ homepage: http://thewrightangle.com
76
+ licenses: []
77
+ post_install_message:
78
+ rdoc_options: []
79
+ require_paths:
80
+ - lib
81
+ required_ruby_version: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ! '>='
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ requirements: []
94
+ rubyforge_project:
95
+ rubygems_version: 1.8.24
96
+ signing_key:
97
+ specification_version: 3
98
+ summary: Pull back verses from popular Bible sites easily.
99
+ test_files: []