scripref 0.2.0 → 0.3.0
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.
- checksums.yaml +7 -0
- data/CHANGELOG +8 -0
- data/LICENSE +1 -1
- data/README.md +10 -0
- data/Rakefile +2 -6
- data/lib/scripref/const_reader.rb +36 -0
- data/lib/scripref/english.rb +9 -5
- data/lib/scripref/formatter.rb +63 -0
- data/lib/scripref/german.rb +27 -3
- data/lib/scripref/parser.rb +32 -7
- data/lib/scripref/processor.rb +1 -1
- data/lib/scripref.rb +7 -3
- data/regtest/parser.rb +16 -0
- data/test/test_english.rb +21 -12
- data/test/test_formatter.rb +60 -0
- data/test/test_german.rb +21 -12
- data/test/test_helper.rb +31 -0
- data/test/test_parser.rb +46 -34
- data/test/test_processor.rb +1 -1
- metadata +54 -32
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3ca4f679be693441ac7736e45aa665afd11c9b51
|
4
|
+
data.tar.gz: 003e3c4548aa4157f7f337d62baefce20f12b7b1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 509cbf4f5d0cd161ace9424f359c34cbe714aaceead2650ee6034a9af3ba67c9ddde0edc3aa30c950fcfd4a56aa9c50b4728a00f7a1ff638b1dc105f5025faf9
|
7
|
+
data.tar.gz: 5cebfb96816bc6c76fcf4872bdb8e436c8a3442a80a5da61b5969fc666159fbd5b4a620f6fae9b33c13da475e6cffbdb9b0b25d34533cf5cd8055bfa4945bb17
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
0.3.0
|
2
|
+
Set unspecified chapter or verse values to nil instead to 1 or :max.
|
3
|
+
Example: parser.parse("Ruth 2") => [#<struct Scripref::Passage text="Ruth 2", b1=8, c1=2, v1=nil, b2=8, c2=2, v2=nil>]
|
4
|
+
Handle special case of books with only one chapter.
|
5
|
+
Allow addons for verses (e.g. Ruth 2:8a).
|
6
|
+
Parsing of book ranges is now possible.
|
7
|
+
Adding a formatter with minimal functionality.
|
8
|
+
|
1
9
|
0.2.0
|
2
10
|
Improve doc and refactoring ref_sep -> pass_sep.
|
3
11
|
|
data/LICENSE
CHANGED
data/README.md
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
Scripref - A Library for parsing scripture references in real texts
|
2
|
+
===================================================================
|
3
|
+
|
4
|
+
The goal is the possibility to parse even complex scripture references in any text.
|
5
|
+
|
6
|
+
|
7
|
+
License
|
8
|
+
-------
|
9
|
+
|
10
|
+
MIT style license, see file LICENSE.
|
data/Rakefile
CHANGED
@@ -43,4 +43,40 @@ module ConstReader
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
# Define a getter and a setter method for one or more constant values.
|
47
|
+
# The value of the constant itself is not changed, instead
|
48
|
+
# a corresponding instance variable is used.
|
49
|
+
#
|
50
|
+
# Example:
|
51
|
+
# module M
|
52
|
+
# A = :ma
|
53
|
+
# extend ConstReader
|
54
|
+
# const_accessor :A
|
55
|
+
# end
|
56
|
+
# class C
|
57
|
+
# include M
|
58
|
+
# end
|
59
|
+
# c1 = C.new
|
60
|
+
# c1.a # => :ma
|
61
|
+
# c1.a = :ca
|
62
|
+
# c1.a # => :ca
|
63
|
+
# c2 = C.new
|
64
|
+
# c2.a # => :ma
|
65
|
+
def const_accessor *consts
|
66
|
+
consts.flatten.each do |c|
|
67
|
+
class_exec(c.to_s, c.to_s.downcase) do |c_name, m_name|
|
68
|
+
define_method m_name do
|
69
|
+
ivar = '@' << m_name
|
70
|
+
if instance_variable_defined? ivar
|
71
|
+
return instance_variable_get(ivar)
|
72
|
+
else
|
73
|
+
val = self.singleton_class.const_get c_name
|
74
|
+
instance_variable_set ivar, val
|
75
|
+
return val
|
76
|
+
end
|
77
|
+
end
|
78
|
+
attr_writer m_name
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
46
82
|
end
|
data/lib/scripref/english.rb
CHANGED
@@ -29,12 +29,21 @@ module Scripref
|
|
29
29
|
# Regular expression to match a book.
|
30
30
|
BOOK_RE = Regexp.new(BOOKS_RES.map {|re| '(^' << re.to_s << ')' }.join('|'))
|
31
31
|
|
32
|
+
# Separator between chapter and verse.
|
33
|
+
CV_SEPARATOR = ':'
|
34
|
+
|
32
35
|
# Regular expression to match a separator between chapter and verse.
|
33
36
|
CV_SEP_RE = /:\s*/o
|
34
37
|
|
38
|
+
# Separator between a range.
|
39
|
+
HYPHEN_SEPARATOR = '-'
|
40
|
+
|
35
41
|
# Regular expression to match a hyphen.
|
36
42
|
HYPHEN_RE = /\s*-\s*/o
|
37
43
|
|
44
|
+
# Separator between passages.
|
45
|
+
PASS_SEPARATOR = '; '
|
46
|
+
|
38
47
|
# Regular expression to match a separator between passages.
|
39
48
|
PASS_SEP_RE = /;\s*/o
|
40
49
|
|
@@ -49,11 +58,6 @@ module Scripref
|
|
49
58
|
# Regular expression to parse a reference
|
50
59
|
REFERENCE_RE = /#{pass}(;\s*#{pass})*/o
|
51
60
|
|
52
|
-
# Define instance methods for the mixin.
|
53
|
-
|
54
|
-
extend ConstReader
|
55
|
-
const_reader constants
|
56
|
-
|
57
61
|
end
|
58
62
|
|
59
63
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# - encoding: utf-8 -
|
2
|
+
|
3
|
+
module Scripref
|
4
|
+
|
5
|
+
class Formatter
|
6
|
+
|
7
|
+
# @param mods one or more modules to include
|
8
|
+
def initialize *mods
|
9
|
+
@mods = mods
|
10
|
+
mods.each do |m|
|
11
|
+
m.class_eval do
|
12
|
+
extend ConstReader
|
13
|
+
const_accessor constants
|
14
|
+
end
|
15
|
+
extend m
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Formats a reference (array of passages) with full
|
20
|
+
# book names (i.e. Hebrews 3:8)
|
21
|
+
def fullref *reference
|
22
|
+
last_b = last_c = last_v = nil
|
23
|
+
pass_texts = reference.flatten.map do |pass|
|
24
|
+
s = ''
|
25
|
+
unless last_b == pass.b1
|
26
|
+
s << book_names[pass.b1 - 1]
|
27
|
+
last_b = pass.b1
|
28
|
+
end
|
29
|
+
unless last_c == pass.c1
|
30
|
+
s << ' ' << pass.c1.to_s
|
31
|
+
last_c = pass.c1
|
32
|
+
end
|
33
|
+
unless last_v == pass.v1
|
34
|
+
s << cv_separator << pass.v1.to_s
|
35
|
+
last_v = pass.v1
|
36
|
+
end
|
37
|
+
# second part
|
38
|
+
a2 = []
|
39
|
+
unless last_v == pass.v2
|
40
|
+
a2 << pass.v2.to_s
|
41
|
+
last_v = pass.v2
|
42
|
+
end
|
43
|
+
unless last_c == pass.c2
|
44
|
+
a2 << cv_separator
|
45
|
+
a2 << pass.c2.to_s
|
46
|
+
last_c = pass.c2
|
47
|
+
end
|
48
|
+
unless last_b == pass.b2
|
49
|
+
a2 << ' ' << book_names[pass.b2 - 1]
|
50
|
+
last_b = pass.b2
|
51
|
+
end
|
52
|
+
if ! a2.empty?
|
53
|
+
s << hyphen_separator
|
54
|
+
s << a2.reverse.join('')
|
55
|
+
end
|
56
|
+
s
|
57
|
+
end
|
58
|
+
pass_texts.join(pass_separator)
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
data/lib/scripref/german.rb
CHANGED
@@ -26,12 +26,21 @@ module Scripref
|
|
26
26
|
# Regular expression to match a book.
|
27
27
|
BOOK_RE = Regexp.new(BOOKS_RES.map {|re| '(^' << re.to_s << ')' }.join('|'))
|
28
28
|
|
29
|
+
# Separator between chapter and verse.
|
30
|
+
CV_SEPARATOR = ','
|
31
|
+
|
29
32
|
# Regular expression to match a separator between chapter and verse.
|
30
33
|
CV_SEP_RE = /,\s*/o
|
31
34
|
|
35
|
+
# Separator between a range.
|
36
|
+
HYPHEN_SEPARATOR = '-'
|
37
|
+
|
32
38
|
# Regular expression to match a hyphen.
|
33
39
|
HYPHEN_RE = /\s*-\s*/o
|
34
40
|
|
41
|
+
# Separator between passages.
|
42
|
+
PASS_SEPARATOR = '; '
|
43
|
+
|
35
44
|
# Regular expression to match a separator between passages.
|
36
45
|
PASS_SEP_RE = /;\s*/o
|
37
46
|
|
@@ -46,10 +55,25 @@ module Scripref
|
|
46
55
|
# Regular expression to parse a reference
|
47
56
|
REFERENCE_RE = /#{pass}(;\s*#{pass})*/o
|
48
57
|
|
49
|
-
#
|
58
|
+
# try to parse first book
|
59
|
+
def b1
|
60
|
+
s = scan(book_re) or return nil
|
61
|
+
@text << s
|
62
|
+
@b1 = @b2 = book2num(s)
|
63
|
+
|
64
|
+
if book_has_only_one_chapter?(@b1)
|
65
|
+
@c1 = @c2 = 1
|
66
|
+
epsilon or (hyphen and b2) or v1 or nil
|
67
|
+
else
|
68
|
+
@c1 = @v1 = nil
|
69
|
+
@c2 = @v2 = nil
|
70
|
+
epsilon or (hyphen and b2) or c1 or nil
|
71
|
+
end
|
72
|
+
end
|
50
73
|
|
51
|
-
|
52
|
-
|
74
|
+
def book_has_only_one_chapter? book
|
75
|
+
[31, 63, 64, 65].include?(book)
|
76
|
+
end
|
53
77
|
|
54
78
|
end
|
55
79
|
|
data/lib/scripref/parser.rb
CHANGED
@@ -7,10 +7,14 @@ module Scripref
|
|
7
7
|
|
8
8
|
NUMBER_RE = /\d+\s*/
|
9
9
|
|
10
|
-
# @param mods
|
10
|
+
# @param mods one or more modules to include
|
11
11
|
def initialize *mods
|
12
12
|
@mods = mods
|
13
13
|
mods.each do |m|
|
14
|
+
m.class_eval do
|
15
|
+
extend ConstReader
|
16
|
+
const_reader constants
|
17
|
+
end
|
14
18
|
extend m
|
15
19
|
end
|
16
20
|
end
|
@@ -34,10 +38,10 @@ module Scripref
|
|
34
38
|
s = scan(book_re) or return nil
|
35
39
|
@text << s
|
36
40
|
@b1 = @b2 = book2num(s)
|
37
|
-
@c1 = @v1 =
|
38
|
-
@c2 = @v2 =
|
41
|
+
@c1 = @v1 = nil
|
42
|
+
@c2 = @v2 = nil
|
39
43
|
|
40
|
-
epsilon or c1 or nil
|
44
|
+
epsilon or (hyphen and b2) or c1 or nil
|
41
45
|
end
|
42
46
|
|
43
47
|
# try parse first chapter
|
@@ -49,7 +53,7 @@ module Scripref
|
|
49
53
|
if cv_sep
|
50
54
|
v1 or nil
|
51
55
|
elsif hyphen
|
52
|
-
c2 or nil
|
56
|
+
b2 or c2 or nil
|
53
57
|
elsif pass_sep
|
54
58
|
b1 or c1
|
55
59
|
else
|
@@ -67,15 +71,18 @@ module Scripref
|
|
67
71
|
case addon
|
68
72
|
when :f, :ff
|
69
73
|
@v2 = addon
|
74
|
+
when :a, :b, :c
|
75
|
+
@a1 = addon
|
70
76
|
end
|
71
77
|
end
|
72
78
|
|
73
79
|
if hyphen
|
80
|
+
b2 or (
|
74
81
|
if check(Regexp.new(NUMBER_RE.source + cv_sep_re.source))
|
75
82
|
c2
|
76
83
|
else
|
77
84
|
v2 or nil
|
78
|
-
end
|
85
|
+
end)
|
79
86
|
elsif pass_sep
|
80
87
|
b1 or c1
|
81
88
|
elsif verse_sep
|
@@ -85,6 +92,16 @@ module Scripref
|
|
85
92
|
end
|
86
93
|
end
|
87
94
|
|
95
|
+
# try to parse second book
|
96
|
+
def b2
|
97
|
+
s = scan(book_re) or return nil
|
98
|
+
@text << s
|
99
|
+
@b2 = book2num(s)
|
100
|
+
@c2 = @v2 = nil
|
101
|
+
|
102
|
+
epsilon or c2 or nil
|
103
|
+
end
|
104
|
+
|
88
105
|
# try to parse second chapter
|
89
106
|
def c2
|
90
107
|
s = scan(NUMBER_RE) or return nil
|
@@ -104,6 +121,13 @@ module Scripref
|
|
104
121
|
@text << s
|
105
122
|
@v2 = s.to_i
|
106
123
|
|
124
|
+
if addon = verse_addon
|
125
|
+
case addon
|
126
|
+
when :a, :b, :c
|
127
|
+
@a2 = addon
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
107
131
|
if verse_sep
|
108
132
|
v1
|
109
133
|
elsif pass_sep
|
@@ -175,8 +199,9 @@ module Scripref
|
|
175
199
|
end
|
176
200
|
|
177
201
|
def push_passage
|
178
|
-
@result << Passage.new(@text, @b1, @c1, @v1, @b2, @c2, @v2)
|
202
|
+
@result << Passage.new(@text, @b1, @c1, @v1, @b2, @c2, @v2, a1: @a1, a2: @a2)
|
179
203
|
@text = ''
|
204
|
+
@a1 = @a2 = nil
|
180
205
|
end
|
181
206
|
|
182
207
|
def book2num str
|
data/lib/scripref/processor.rb
CHANGED
@@ -11,7 +11,7 @@ module Scripref
|
|
11
11
|
attr_accessor :text
|
12
12
|
|
13
13
|
# @param text text to parse
|
14
|
-
# @param mods
|
14
|
+
# @param mods one or more modules to include in processor and parser
|
15
15
|
def initialize text=nil, *mods
|
16
16
|
@text = text
|
17
17
|
@mods = mods
|
data/lib/scripref.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
1
|
# - encoding: utf-8 -
|
2
2
|
require 'scripref/parser'
|
3
3
|
require 'scripref/processor'
|
4
|
+
require 'scripref/formatter'
|
4
5
|
require 'scripref/english'
|
5
6
|
require 'scripref/german'
|
6
7
|
|
7
8
|
module Scripref
|
8
9
|
|
9
|
-
VERSION = '0.
|
10
|
+
VERSION = '0.3.0'
|
10
11
|
|
11
|
-
Passage = Struct.new(:text, :b1, :c1, :v1, :b2, :c2, :v2)
|
12
|
+
Passage = Struct.new(:text, :b1, :c1, :v1, :b2, :c2, :v2, :a1, :a2) do
|
13
|
+
|
14
|
+
def initialize text, b1, c1, v1, b2, c2, v2, opts={}
|
15
|
+
super text, b1, c1, v1, b2, c2, v2, opts[:a1], opts[:a2]
|
16
|
+
end
|
12
17
|
|
13
|
-
class Passage
|
14
18
|
alias to_s text
|
15
19
|
end
|
16
20
|
|
data/regtest/parser.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'regtest'
|
2
|
+
require 'scripref'
|
3
|
+
|
4
|
+
include Regtest
|
5
|
+
include Scripref
|
6
|
+
|
7
|
+
$parser = Parser.new(German)
|
8
|
+
|
9
|
+
def s text
|
10
|
+
sample text do
|
11
|
+
res = $parser.parse(text)
|
12
|
+
res.map {|r| r.respond_to?(:to_h) ? r.to_h : r}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
s 'Ruth 2,1a-11.15a; 3,7b.9-12b; Markus 4; 5,3a.18b-21a'
|
data/test/test_english.rb
CHANGED
@@ -1,24 +1,26 @@
|
|
1
1
|
# - encoding: utf-8 -
|
2
2
|
require 'test/unit'
|
3
|
+
require 'test_helper'
|
3
4
|
require 'scripref/english'
|
4
5
|
|
5
6
|
class TestEnglish < Test::Unit::TestCase
|
6
7
|
|
8
|
+
include Test::Helper
|
7
9
|
include Scripref::English
|
8
10
|
|
9
11
|
def test_book_re
|
10
|
-
assert_match 'Genesis'
|
11
|
-
assert_match 'Exodus'
|
12
|
-
assert_match 'Matthew'
|
13
|
-
assert_match '2 Timothy'
|
14
|
-
assert_not_match '2 2 Timothy'
|
15
|
-
assert_match 'Revelation'
|
16
|
-
assert_not_match 'something'
|
17
|
-
assert_match 'Gen'
|
18
|
-
assert_match 'Ex'
|
19
|
-
assert_match 'Mat'
|
20
|
-
assert_match '2 Tim'
|
21
|
-
assert_match 'Rev'
|
12
|
+
assert_match book_re, 'Genesis'
|
13
|
+
assert_match book_re, 'Exodus'
|
14
|
+
assert_match book_re, 'Matthew'
|
15
|
+
assert_match book_re, '2 Timothy'
|
16
|
+
assert_not_match book_re, '2 2 Timothy'
|
17
|
+
assert_match book_re, 'Revelation'
|
18
|
+
assert_not_match book_re, 'something'
|
19
|
+
assert_match book_re, 'Gen'
|
20
|
+
assert_match book_re, 'Ex'
|
21
|
+
assert_match book_re, 'Mat'
|
22
|
+
assert_match book_re, '2 Tim'
|
23
|
+
assert_match book_re, 'Rev'
|
22
24
|
end
|
23
25
|
|
24
26
|
def test_book2num
|
@@ -40,4 +42,11 @@ class TestEnglish < Test::Unit::TestCase
|
|
40
42
|
assert_equal num, @parser.parse(str).first.b1
|
41
43
|
end
|
42
44
|
|
45
|
+
def test_book_with_only_one_chapter
|
46
|
+
@parser ||= Scripref::Parser.new(Scripref::English)
|
47
|
+
text = 'Obad 1:3'
|
48
|
+
ast = [pass(text, 31, 1, 3, 31, 1, 3)]
|
49
|
+
assert_parsed_ast_for_text ast, text
|
50
|
+
end
|
51
|
+
|
43
52
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# - encoding: utf-8 -
|
2
|
+
require 'test/unit'
|
3
|
+
require 'test_helper'
|
4
|
+
require 'scripref'
|
5
|
+
require 'scripref/english'
|
6
|
+
require 'scripref/formatter'
|
7
|
+
require 'scripref/german'
|
8
|
+
require 'scripref/parser'
|
9
|
+
|
10
|
+
class TestFormatter < Test::Unit::TestCase
|
11
|
+
|
12
|
+
include Test::Helper
|
13
|
+
|
14
|
+
def setup
|
15
|
+
@parser = Scripref::Parser.new(Scripref::German)
|
16
|
+
@german_formatter = Scripref::Formatter.new(Scripref::German)
|
17
|
+
@english_formatter = Scripref::Formatter.new(Scripref::English)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_one_verse
|
21
|
+
@german = 'Römer 6,23'
|
22
|
+
@english = 'Romans 6:23'
|
23
|
+
check_formatting
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_simple_passage
|
27
|
+
@german = 'Römer 8,1-10'
|
28
|
+
@english = 'Romans 8:1-10'
|
29
|
+
check_formatting
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_passage_with_chapter_change
|
33
|
+
@german = 'Römer 1,1-5,11'
|
34
|
+
@english = 'Romans 1:1-5:11'
|
35
|
+
check_formatting
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_passage_with_book_change
|
39
|
+
@german = '1. Korinther 1,1-2. Korinther 13,13'
|
40
|
+
@english = '1 Corinthians 1:1-2 Corinthians 13:13'
|
41
|
+
check_formatting
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_changed_hyphen_separator
|
45
|
+
@german = '1. Korinther 1,1 - 2. Korinther 13,13'
|
46
|
+
@english = '1 Corinthians 1:1 - 2 Corinthians 13:13'
|
47
|
+
@german_formatter.hyphen_separator = ' - '
|
48
|
+
@english_formatter.hyphen_separator = ' - '
|
49
|
+
check_formatting
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def check_formatting
|
55
|
+
ast = @parser.parse(@german)
|
56
|
+
assert_equal @german, @german_formatter.fullref(ast)
|
57
|
+
assert_equal @english, @english_formatter.fullref(ast)
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
data/test/test_german.rb
CHANGED
@@ -1,24 +1,26 @@
|
|
1
1
|
# - encoding: utf-8 -
|
2
2
|
require 'test/unit'
|
3
|
+
require 'test_helper'
|
3
4
|
require 'scripref/german'
|
4
5
|
|
5
6
|
class TestGerman < Test::Unit::TestCase
|
6
7
|
|
8
|
+
include Test::Helper
|
7
9
|
include Scripref::German
|
8
10
|
|
9
11
|
def test_book_re
|
10
|
-
assert_match '1. Mose'
|
11
|
-
assert_match '2. Mose'
|
12
|
-
assert_match 'Matthäus'
|
13
|
-
assert_match '2. Timotheus'
|
14
|
-
assert_not_match '2. 2. Timotheus'
|
15
|
-
assert_match 'Offenbarung'
|
16
|
-
assert_not_match 'something'
|
17
|
-
assert_match '1. Mo'
|
18
|
-
assert_match '2.Mo'
|
19
|
-
assert_match 'Mat'
|
20
|
-
assert_match '2. Tim'
|
21
|
-
assert_match 'Off'
|
12
|
+
assert_match book_re, '1. Mose'
|
13
|
+
assert_match book_re, '2. Mose'
|
14
|
+
assert_match book_re, 'Matthäus'
|
15
|
+
assert_match book_re, '2. Timotheus'
|
16
|
+
assert_not_match book_re, '2. 2. Timotheus'
|
17
|
+
assert_match book_re, 'Offenbarung'
|
18
|
+
assert_not_match book_re, 'something'
|
19
|
+
assert_match book_re, '1. Mo'
|
20
|
+
assert_match book_re, '2.Mo'
|
21
|
+
assert_match book_re, 'Mat'
|
22
|
+
assert_match book_re, '2. Tim'
|
23
|
+
assert_match book_re, 'Off'
|
22
24
|
end
|
23
25
|
|
24
26
|
def test_book2num
|
@@ -37,4 +39,11 @@ class TestGerman < Test::Unit::TestCase
|
|
37
39
|
assert_equal num, @parser.parse(str).first.b1
|
38
40
|
end
|
39
41
|
|
42
|
+
def test_book_with_only_one_chapter
|
43
|
+
@parser ||= Scripref::Parser.new(Scripref::German)
|
44
|
+
text = 'Obad 3'
|
45
|
+
ast = [pass(text, 31, 1, 3, 31, 1, 3)]
|
46
|
+
assert_parsed_ast_for_text ast, text
|
47
|
+
end
|
48
|
+
|
40
49
|
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
module Test::Helper
|
2
|
+
|
3
|
+
def pass *args
|
4
|
+
Scripref::Passage.new(*args)
|
5
|
+
end
|
6
|
+
|
7
|
+
def assert_equal_passage expected, actual
|
8
|
+
assert_equal expected.text, actual.text, 'Parsed text'
|
9
|
+
assert_equal expected.b1, actual.b1, 'First book'
|
10
|
+
assert_equal expected.c1, actual.c1, 'First chapter'
|
11
|
+
assert_equal expected.v1, actual.v1, 'First verse'
|
12
|
+
assert_equal expected.b2, actual.b2, 'Second book'
|
13
|
+
assert_equal expected.c2, actual.c2, 'Second chapter'
|
14
|
+
assert_equal expected.v2, actual.v2, 'Second verse'
|
15
|
+
assert_equal expected.a1, actual.a1, 'First addon'
|
16
|
+
assert_equal expected.a2, actual.a2, 'Second addon'
|
17
|
+
end
|
18
|
+
|
19
|
+
def assert_parsed_ast_for_text expected_ast, text
|
20
|
+
res = @parser.parse(text)
|
21
|
+
assert_equal expected_ast.size, res.size, 'Array size of AST'
|
22
|
+
expected_ast.zip(res) do |expected_elem, actual_elem|
|
23
|
+
if !expected_elem.kind_of?(String)
|
24
|
+
assert_equal_passage expected_elem, actual_elem
|
25
|
+
else
|
26
|
+
assert_equal expected_elem, actual_elem
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/test/test_parser.rb
CHANGED
@@ -1,21 +1,24 @@
|
|
1
1
|
# - encoding: utf-8 -
|
2
2
|
require 'test/unit'
|
3
|
+
require 'test_helper'
|
3
4
|
require 'scripref'
|
4
5
|
|
5
6
|
class TestParser < Test::Unit::TestCase
|
6
7
|
|
8
|
+
include Test::Helper
|
9
|
+
|
7
10
|
def setup
|
8
11
|
@parser = Scripref::Parser.new(Scripref::German)
|
9
12
|
end
|
10
13
|
|
11
14
|
def test_only_book
|
12
15
|
text = 'Ruth'
|
13
|
-
assert_parsed_ast_for_text [pass(text, 8,
|
16
|
+
assert_parsed_ast_for_text [pass(text, 8, nil, nil, 8, nil, nil)], text
|
14
17
|
end
|
15
18
|
|
16
19
|
def test_book_and_chapter
|
17
20
|
text = 'Ruth 2'
|
18
|
-
assert_parsed_ast_for_text [pass(text, 8, 2,
|
21
|
+
assert_parsed_ast_for_text [pass(text, 8, 2, nil, 8, 2, nil)], text
|
19
22
|
end
|
20
23
|
|
21
24
|
def test_book_chapter_and_verse
|
@@ -35,7 +38,22 @@ class TestParser < Test::Unit::TestCase
|
|
35
38
|
|
36
39
|
def test_chapter_range
|
37
40
|
text = 'Ruth 2-3'
|
38
|
-
assert_parsed_ast_for_text [pass(text, 8, 2,
|
41
|
+
assert_parsed_ast_for_text [pass(text, 8, 2, nil, 8, 3, nil)], text
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_book_range
|
45
|
+
text = '1. Mose - Offenbarung'
|
46
|
+
assert_parsed_ast_for_text [pass(text, 1, nil, nil, 66, nil, nil)], text
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_book_chapter_range
|
50
|
+
text = '1. Mose 1 - Offenbarung 22'
|
51
|
+
assert_parsed_ast_for_text [pass(text, 1, 1, nil, 66, 22, nil)], text
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_book_chapter_verse_range
|
55
|
+
text = '1. Mose 1,1-Offenbarung 22,21'
|
56
|
+
assert_parsed_ast_for_text [pass(text, 1, 1, 1, 66, 22, 21)], text
|
39
57
|
end
|
40
58
|
|
41
59
|
def test_one_following_verse
|
@@ -48,6 +66,28 @@ class TestParser < Test::Unit::TestCase
|
|
48
66
|
assert_parsed_ast_for_text [pass(text, 8, 2, 5, 8, 2, :ff)], text
|
49
67
|
end
|
50
68
|
|
69
|
+
def test_first_addon
|
70
|
+
text = 'Ruth 2,5a'
|
71
|
+
assert_parsed_ast_for_text [pass(text, 8, 2, 5, 8, 2, 5, a1: :a)], text
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_second_addon
|
75
|
+
text = 'Ruth 2,5-7a'
|
76
|
+
assert_parsed_ast_for_text [pass(text, 8, 2, 5, 8, 2, 7, a2: :a)], text
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_both_addons
|
80
|
+
text = 'Ruth 2,5b-7a'
|
81
|
+
assert_parsed_ast_for_text [pass(text, 8, 2, 5, 8, 2, 7, a1: :b, a2: :a)], text
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_reset_addons
|
85
|
+
@parser.parse 'Ruth 2,5b-7a'
|
86
|
+
text = 'Ruth'
|
87
|
+
assert_parsed_ast_for_text [pass(text, 8, nil, nil, 8, nil, nil)], text
|
88
|
+
end
|
89
|
+
|
90
|
+
|
51
91
|
######################################################################
|
52
92
|
# more than one reference
|
53
93
|
######################################################################
|
@@ -67,13 +107,13 @@ class TestParser < Test::Unit::TestCase
|
|
67
107
|
def test_two_chapters_same_book
|
68
108
|
text = 'Ruth 2; 5'
|
69
109
|
t1, t2 = text.split('; ')
|
70
|
-
assert_parsed_ast_for_text [pass(t1, 8, 2,
|
110
|
+
assert_parsed_ast_for_text [pass(t1, 8, 2, nil, 8, 2, nil), '; ', pass(t2, 8, 5, nil, 8, 5, nil)], text
|
71
111
|
end
|
72
112
|
|
73
113
|
def test_two_chapters_different_book
|
74
114
|
text = 'Ruth 2; Markus 4'
|
75
115
|
t1, t2 = text.split('; ')
|
76
|
-
assert_parsed_ast_for_text [pass(t1, 8, 2,
|
116
|
+
assert_parsed_ast_for_text [pass(t1, 8, 2, nil, 8, 2, nil), '; ', pass(t2, 41, 4, nil, 41, 4, nil)], text
|
77
117
|
end
|
78
118
|
|
79
119
|
def test_two_verses
|
@@ -128,39 +168,11 @@ class TestParser < Test::Unit::TestCase
|
|
128
168
|
pass(t2, 8, 2, 15, 8, 2, 15), '; ',
|
129
169
|
pass(t3, 8, 3, 7, 8, 3, 7), '.',
|
130
170
|
pass(t4, 8, 3, 9, 8, 3, 12), '; ',
|
131
|
-
pass(t5, 41, 4,
|
171
|
+
pass(t5, 41, 4, nil, 41, 4, nil), '; ',
|
132
172
|
pass(t6, 41, 5, 3, 41, 5, 3), '.',
|
133
173
|
pass(t7, 41, 5, 18, 41, 5, 21)
|
134
174
|
]
|
135
175
|
assert_parsed_ast_for_text ast, text
|
136
176
|
end
|
137
177
|
|
138
|
-
protected
|
139
|
-
|
140
|
-
def pass *args
|
141
|
-
Scripref::Passage.new(*args)
|
142
|
-
end
|
143
|
-
|
144
|
-
def assert_equal_passage expected, actual
|
145
|
-
assert_equal expected.text, actual.text, 'Parsed text'
|
146
|
-
assert_equal expected.b1, actual.b1, 'First book'
|
147
|
-
assert_equal expected.c1, actual.c1, 'First chapter'
|
148
|
-
assert_equal expected.v1, actual.v1, 'First verse'
|
149
|
-
assert_equal expected.b2, actual.b2, 'Second book'
|
150
|
-
assert_equal expected.c2, actual.c2, 'Second chapter'
|
151
|
-
assert_equal expected.v2, actual.v2, 'Second verse'
|
152
|
-
end
|
153
|
-
|
154
|
-
def assert_parsed_ast_for_text expected_ast, text
|
155
|
-
res = @parser.parse(text)
|
156
|
-
assert_equal expected_ast.size, res.size, 'Array size of AST'
|
157
|
-
expected_ast.zip(res) do |expected_elem, actual_elem|
|
158
|
-
if !expected_elem.kind_of?(String)
|
159
|
-
assert_equal_passage expected_elem, actual_elem
|
160
|
-
else
|
161
|
-
assert_equal expected_elem, actual_elem
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
178
|
end
|
data/test/test_processor.rb
CHANGED
@@ -7,7 +7,7 @@ class TestProcessor < Test::Unit::TestCase
|
|
7
7
|
def setup
|
8
8
|
@text = 'Some text Mt 1,1 and Mr 2 and so on ...'
|
9
9
|
@mt = [Scripref::Passage.new('Mt 1,1 ', 40, 1, 1, 40, 1, 1)]
|
10
|
-
@mr = [Scripref::Passage.new('Mr 2 ', 41, 2,
|
10
|
+
@mr = [Scripref::Passage.new('Mr 2 ', 41, 2, nil, 41, 2, nil)]
|
11
11
|
@processor = Scripref::Processor.new(@text, Scripref::German)
|
12
12
|
@chunks = ['Some text ', @mt, 'and ', @mr, 'and so on ...']
|
13
13
|
end
|
metadata
CHANGED
@@ -1,66 +1,88 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: scripref
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 0.2.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
6
5
|
platform: ruby
|
7
|
-
authors:
|
6
|
+
authors:
|
8
7
|
- Jan Friedrich
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
date: 2015-03-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rim
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.4'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.4'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: regtest
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.4'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.4'
|
41
|
+
description: ''
|
17
42
|
email:
|
18
43
|
executables: []
|
19
|
-
|
20
44
|
extensions: []
|
21
|
-
|
22
45
|
extra_rdoc_files: []
|
23
|
-
|
24
|
-
files:
|
46
|
+
files:
|
25
47
|
- CHANGELOG
|
26
48
|
- LICENSE
|
49
|
+
- README.md
|
27
50
|
- Rakefile
|
51
|
+
- lib/scripref.rb
|
28
52
|
- lib/scripref/const_reader.rb
|
29
53
|
- lib/scripref/english.rb
|
54
|
+
- lib/scripref/formatter.rb
|
30
55
|
- lib/scripref/german.rb
|
31
56
|
- lib/scripref/parser.rb
|
32
57
|
- lib/scripref/processor.rb
|
33
|
-
-
|
58
|
+
- regtest/parser.rb
|
34
59
|
- test/test_english.rb
|
60
|
+
- test/test_formatter.rb
|
35
61
|
- test/test_german.rb
|
62
|
+
- test/test_helper.rb
|
36
63
|
- test/test_parser.rb
|
37
64
|
- test/test_processor.rb
|
38
65
|
homepage: http://gitorious.org/scripref
|
39
66
|
licenses: []
|
40
|
-
|
67
|
+
metadata: {}
|
41
68
|
post_install_message:
|
42
69
|
rdoc_options: []
|
43
|
-
|
44
|
-
require_paths:
|
70
|
+
require_paths:
|
45
71
|
- lib
|
46
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
-
|
48
|
-
requirements:
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
49
74
|
- - ">="
|
50
|
-
- !ruby/object:Gem::Version
|
51
|
-
version:
|
52
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
-
|
54
|
-
requirements:
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
55
79
|
- - ">="
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
version:
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
58
82
|
requirements: []
|
59
|
-
|
60
83
|
rubyforge_project:
|
61
|
-
rubygems_version:
|
84
|
+
rubygems_version: 2.4.5
|
62
85
|
signing_key:
|
63
|
-
specification_version:
|
86
|
+
specification_version: 4
|
64
87
|
summary: Library for parsing scripture references in real texts.
|
65
88
|
test_files: []
|
66
|
-
|