epub-cfi 0.1.2 → 0.1.4
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 +4 -4
- data/.gitlab-ci.yml +16 -11
- data/ChangeLog.adoc +12 -0
- data/Rakefile +13 -7
- data/Steepfile +30 -0
- data/epub-cfi.gemspec +6 -4
- data/ext/epub-cfi/Rakefile +12 -0
- data/lib/epub/cfi/parser.rb +12 -5
- data/lib/epub/cfi/parser.y +1 -1
- data/lib/epub/cfi/version.rb +1 -1
- data/lib/epub/cfi.rb +4 -4
- data/sig/epub-cfi.rbs +125 -0
- data/sig/shims/racc.rbs +8 -0
- data/sig-private/shims/simplecov.rbs +7 -0
- data/sig-private/shims/test-unit.rbs +31 -0
- data/sig-private/test.rbs +39 -0
- data/test/helper.rb +0 -6
- data/test/test_cfi.rb +15 -2
- data/test/test_package.rb +22 -0
- metadata +18 -13
- data/appveyor.yml +0 -21
- data/lib/epub/cfi/parser.tab.rb +0 -698
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cdf83e8e0bf1372467809ca0fbacdba9359e5fb9a55bcd6381b32a3e54f54b69
|
|
4
|
+
data.tar.gz: f812252ca173657a1f36a8ea986040540e5207e5bfdb24a53607974c67b4a55f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b622f524b56193a6b49119ec8abd1ffa9d789bb8a4d5c0a653d10cf5fe6830d8f8c643a6c618cfb1a3b63f2141e644b3d2df92ae599e56cf31ad7f0bf47f494c
|
|
7
|
+
data.tar.gz: b5666e05f99b2072e8e4c47097eb87a5b3070a585b5489fb4f5be089ed3380008ed0d41ccc859cc959a7471d49db0e587f10a71b84b5ec7b4d6f34d4270eb2c5
|
data/.gitlab-ci.yml
CHANGED
|
@@ -1,24 +1,29 @@
|
|
|
1
1
|
before_script:
|
|
2
2
|
- ruby -v
|
|
3
3
|
- which ruby
|
|
4
|
-
- gem install --no-document racc rake rubygems-tasks yard test-unit test-unit-notify
|
|
4
|
+
- gem install --no-document racc rake rubygems-tasks yard test-unit test-unit-notify simplecov steep
|
|
5
5
|
|
|
6
|
-
test:
|
|
7
|
-
image: ruby:
|
|
6
|
+
test:3.0:
|
|
7
|
+
image: ruby:3.0
|
|
8
8
|
script:
|
|
9
9
|
rake test
|
|
10
10
|
|
|
11
|
-
test:
|
|
12
|
-
image: ruby:
|
|
11
|
+
test:3.1:
|
|
12
|
+
image: ruby:3.1
|
|
13
13
|
script:
|
|
14
14
|
rake test
|
|
15
15
|
|
|
16
|
-
test:2
|
|
17
|
-
image: ruby:2
|
|
16
|
+
test:3.2:
|
|
17
|
+
image: ruby:3.2
|
|
18
18
|
script:
|
|
19
|
-
rake test
|
|
19
|
+
rake test typecheck
|
|
20
20
|
|
|
21
|
-
test:
|
|
22
|
-
image: ruby:
|
|
21
|
+
test:3.3:
|
|
22
|
+
image: ruby:3.3
|
|
23
23
|
script:
|
|
24
|
-
rake test
|
|
24
|
+
rake test typecheck
|
|
25
|
+
|
|
26
|
+
test:3.4:
|
|
27
|
+
image: ruby:3.4
|
|
28
|
+
script:
|
|
29
|
+
rake test typecheck
|
data/ChangeLog.adoc
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
=== 0.1.4 / 2025-10-28
|
|
2
|
+
|
|
3
|
+
* Remove `NonEmptyArray` from signature
|
|
4
|
+
* Build parser table on installation
|
|
5
|
+
|
|
6
|
+
=== 0.1.3 / 2023-12-28
|
|
7
|
+
|
|
8
|
+
* Suppress warning on unused variable
|
|
9
|
+
* Include RBS file
|
|
10
|
+
* [BUG FIX]Include strscan
|
|
11
|
+
* Add Racc to runtime dependencies
|
|
12
|
+
|
|
1
13
|
=== 0.1.2 / 2019-05-19
|
|
2
14
|
|
|
3
15
|
* Scan CFI string on demand to reduce memory footprint
|
data/Rakefile
CHANGED
|
@@ -1,27 +1,33 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
require 'rake'
|
|
3
3
|
|
|
4
|
-
task :default =>
|
|
4
|
+
task :default => [:test, :typecheck]
|
|
5
|
+
|
|
6
|
+
TARGET = "lib/epub/cfi/parser.tab.rb"
|
|
5
7
|
|
|
6
8
|
desc "Build EPUB CFI parser"
|
|
7
|
-
file
|
|
8
|
-
sh "racc
|
|
9
|
+
file TARGET => "lib/epub/cfi/parser.y" do |task|
|
|
10
|
+
sh "racc", task.source
|
|
9
11
|
end
|
|
10
12
|
|
|
11
13
|
require "rake/clean"
|
|
12
|
-
CLOBBER.include
|
|
14
|
+
CLOBBER.include TARGET
|
|
13
15
|
|
|
14
16
|
require 'rubygems/tasks'
|
|
15
17
|
Gem::Tasks.new
|
|
16
|
-
task :build => "lib/epub/cfi/parser.tab.rb"
|
|
17
18
|
|
|
18
19
|
require 'rake/testtask'
|
|
19
20
|
Rake::TestTask.new do |test|
|
|
20
21
|
test.libs << 'test'
|
|
21
|
-
test.pattern = 'test/**/test_*.rb'
|
|
22
22
|
test.verbose = true
|
|
23
23
|
end
|
|
24
|
-
task :test =>
|
|
24
|
+
task :test => TARGET
|
|
25
25
|
|
|
26
26
|
require 'yard'
|
|
27
27
|
YARD::Rake::YardocTask.new
|
|
28
|
+
|
|
29
|
+
require "steep"
|
|
30
|
+
desc "Check type"
|
|
31
|
+
task typecheck: TARGET do
|
|
32
|
+
Steep::Drivers::Check.new(stdout: $stdout, stderr: $stderr).run
|
|
33
|
+
end
|
data/Steepfile
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# D = Steep::Diagnostic
|
|
2
|
+
#
|
|
3
|
+
target :lib do
|
|
4
|
+
signature "sig"
|
|
5
|
+
|
|
6
|
+
check "lib" # Directory name
|
|
7
|
+
# check "Gemfile" # File name
|
|
8
|
+
# check "app/models/**/*.rb" # Glob
|
|
9
|
+
ignore "lib/shims"
|
|
10
|
+
|
|
11
|
+
# library "pathname" # Standard libraries
|
|
12
|
+
# library "strong_json" # Gems
|
|
13
|
+
library "strscan"
|
|
14
|
+
|
|
15
|
+
# configure_code_diagnostics(D::Ruby.default) # `default` diagnostics setting (applies by default)
|
|
16
|
+
# configure_code_diagnostics(D::Ruby.strict) # `strict` diagnostics setting
|
|
17
|
+
# configure_code_diagnostics(D::Ruby.lenient) # `lenient` diagnostics setting
|
|
18
|
+
# configure_code_diagnostics(D::Ruby.silent) # `silent` diagnostics setting
|
|
19
|
+
# configure_code_diagnostics do |hash| # You can setup everything yourself
|
|
20
|
+
# hash[D::Ruby::NoMethod] = :information
|
|
21
|
+
# end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
target :test do
|
|
25
|
+
signature "sig", "sig-private"
|
|
26
|
+
|
|
27
|
+
check "test"
|
|
28
|
+
|
|
29
|
+
# library "pathname" # Standard libraries
|
|
30
|
+
end
|
data/epub-cfi.gemspec
CHANGED
|
@@ -9,12 +9,12 @@ Gem::Specification.new do |gem|
|
|
|
9
9
|
gem.version = EPUB::CFI::VERSION
|
|
10
10
|
gem.summary = %q{EPUB CFI parser and builder}
|
|
11
11
|
gem.description = %q{Parser and builder implementation for EPUB CFI defined at http://www.idpf.org/epub/linking/cfi/}
|
|
12
|
-
gem.license = "LGPL"
|
|
12
|
+
gem.license = "LGPL-3.0-or-later"
|
|
13
13
|
gem.authors = ["KITAITI Makoto"]
|
|
14
14
|
gem.email = "KitaitiMakoto@gmail.com"
|
|
15
15
|
gem.homepage = "https://gitlab.com/KitaitiMakoto/epub-cfi"
|
|
16
16
|
|
|
17
|
-
gem.files = `git ls-files`.split($/)
|
|
17
|
+
gem.files = `git ls-files`.split($/)
|
|
18
18
|
|
|
19
19
|
`git submodule --quiet foreach --recursive pwd`.split($/).each do |submodule|
|
|
20
20
|
submodule.sub!("#{Dir.pwd}/",'')
|
|
@@ -28,13 +28,15 @@ Gem::Specification.new do |gem|
|
|
|
28
28
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
|
29
29
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
|
30
30
|
gem.require_paths = ['lib']
|
|
31
|
+
gem.extensions = ["ext/epub-cfi/Rakefile"]
|
|
32
|
+
|
|
33
|
+
gem.add_runtime_dependency "racc"
|
|
31
34
|
|
|
32
|
-
gem.add_development_dependency "racc"
|
|
33
35
|
gem.add_development_dependency 'rake'
|
|
34
36
|
gem.add_development_dependency 'rubygems-tasks'
|
|
35
37
|
gem.add_development_dependency 'yard'
|
|
36
38
|
gem.add_development_dependency "test-unit"
|
|
37
39
|
gem.add_development_dependency "test-unit-notify"
|
|
38
|
-
gem.add_development_dependency "pretty_backtrace"
|
|
39
40
|
gem.add_development_dependency "simplecov"
|
|
41
|
+
gem.add_development_dependency "steep"
|
|
40
42
|
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
root = File.expand_path("../..", __dir__)
|
|
2
|
+
lib_dir = File.join(root, "lib")
|
|
3
|
+
source = File.join(lib_dir, "epub/cfi/parser.y")
|
|
4
|
+
target = File.join(lib_dir, "epub/cfi/parser.tab.rb")
|
|
5
|
+
|
|
6
|
+
task default: target
|
|
7
|
+
|
|
8
|
+
file target => source do |t|
|
|
9
|
+
Dir.chdir root do
|
|
10
|
+
sh "racc", "lib/epub/cfi/parser.y"
|
|
11
|
+
end
|
|
12
|
+
end
|
data/lib/epub/cfi/parser.rb
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
require "strscan"
|
|
1
2
|
require "epub/cfi/parser.tab"
|
|
2
3
|
|
|
3
4
|
class EPUB::CFI::Parser
|
|
4
5
|
include Comparable
|
|
5
6
|
|
|
6
7
|
UNICODE_CHARACTER_EXCLUDING_SPECIAL_CHARS_AND_SPACE_AND_DOT_AND_COLON_AND_TILDE_AND_ATMARK_AND_SOLIDUS_AND_EXCLAMATION_MARK_PATTERN = /\u0009|\u000A|\u000D|[\u0022-\u0027]|[\u002A-\u002B]|\u002D|[\u0030-\u0039]|\u003C|[\u003E-\u0040]|[\u0041-\u005A]|\u005C|[\u005F-\u007D]|[\u007F-\uD7FF]|[\uE000-\uFFFD]|[\u10000-\u10FFFF]/ # excluding special chars and space(\u0020) and dot(\u002E) and colon(\u003A) and tilde(\u007E) and atmark(\u0040) and solidus(\u002F) and exclamation mark(\u0021)
|
|
7
|
-
|
|
8
|
+
FRAGMENT_PREFIX = "epubcfi("
|
|
9
|
+
FRAGMENT_PREFIX_LENGTH = FRAGMENT_PREFIX.length
|
|
10
|
+
FRAGMENT_SUFFIX_LENGTH = ")".length
|
|
8
11
|
|
|
9
12
|
class << self
|
|
10
13
|
def parse(string, debug: $DEBUG)
|
|
@@ -18,8 +21,9 @@ class EPUB::CFI::Parser
|
|
|
18
21
|
end
|
|
19
22
|
|
|
20
23
|
def parse(string)
|
|
21
|
-
if string.start_with?
|
|
22
|
-
string = string[
|
|
24
|
+
if string.start_with? FRAGMENT_PREFIX
|
|
25
|
+
string = string[FRAGMENT_PREFIX_LENGTH .. -(FRAGMENT_SUFFIX_LENGTH + 1)]
|
|
26
|
+
# @type var string: String
|
|
23
27
|
end
|
|
24
28
|
@scanner = StringScanner.new(string, true)
|
|
25
29
|
do_parse
|
|
@@ -107,7 +111,10 @@ end
|
|
|
107
111
|
# @raise [Racc::ParseError] if given string is invalid
|
|
108
112
|
# @see CFI.parse
|
|
109
113
|
def EPUB::CFI(string)
|
|
110
|
-
|
|
111
|
-
|
|
114
|
+
case string
|
|
115
|
+
when EPUB::CFI::Location, EPUB::CFI::Range
|
|
116
|
+
string
|
|
117
|
+
else
|
|
112
118
|
EPUB::CFI.parse(string)
|
|
119
|
+
end
|
|
113
120
|
end
|
data/lib/epub/cfi/parser.y
CHANGED
data/lib/epub/cfi/version.rb
CHANGED
data/lib/epub/cfi.rb
CHANGED
|
@@ -221,7 +221,7 @@ module EPUB
|
|
|
221
221
|
end
|
|
222
222
|
|
|
223
223
|
def to_s
|
|
224
|
-
return @string_cache if @string_cache
|
|
224
|
+
return @string_cache if @string_cache # @type ivar @string_cache: String
|
|
225
225
|
string_cache = '['
|
|
226
226
|
string_cache << CFI.escape(id) if id
|
|
227
227
|
parameters.each_pair do |key, values|
|
|
@@ -242,7 +242,7 @@ module EPUB
|
|
|
242
242
|
end
|
|
243
243
|
|
|
244
244
|
def to_s
|
|
245
|
-
return @string_cache if @string_cache
|
|
245
|
+
return @string_cache if @string_cache # @type ivar @string_cache: String
|
|
246
246
|
string_cache = '['
|
|
247
247
|
string_cache << CFI.escape(preceded) if preceded
|
|
248
248
|
string_cache << ',' << CFI.escape(followed) if followed
|
|
@@ -279,13 +279,13 @@ module EPUB
|
|
|
279
279
|
def initialize(temporal=nil, x=nil, y=nil, assertion=nil)
|
|
280
280
|
raise RangeError, "dimension must be in 0..100 but passed #{x}" unless (0.0..100.0).cover?(x) if x
|
|
281
281
|
raise RangeError, "dimension must be in 0..100 but passed #{y}" unless (0.0..100.0).cover?(y) if y
|
|
282
|
-
warn "Assertion is passed to #{
|
|
282
|
+
warn "Assertion is passed to #{self.class} but cannot know how to handle with it: #{assertion}" if assertion
|
|
283
283
|
@temporal, @x, @y, @assertion = temporal, x, y, assertion
|
|
284
284
|
@string_cache = nil
|
|
285
285
|
end
|
|
286
286
|
|
|
287
287
|
def to_s
|
|
288
|
-
return @string_cache if @string_cache
|
|
288
|
+
return @string_cache if @string_cache # @type ivar @string_cache: String
|
|
289
289
|
string_cache = ''
|
|
290
290
|
string_cache << "~#{temporal}" if temporal
|
|
291
291
|
string_cache << "@#{x}:#{y}" if x or y
|
data/sig/epub-cfi.rbs
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# TypeProf 0.21.8
|
|
2
|
+
|
|
3
|
+
# Classes
|
|
4
|
+
module EPUB
|
|
5
|
+
def self.CFI: (String | CFI::Location | CFI::Range) -> (CFI::Location | CFI::Range)
|
|
6
|
+
|
|
7
|
+
module CFI
|
|
8
|
+
VERSION: String
|
|
9
|
+
SPECIAL_CHARS: "^[](),;="
|
|
10
|
+
RE_ESCAPED_SPECIAL_CHARS: String
|
|
11
|
+
|
|
12
|
+
def self.escape: (String string) -> String
|
|
13
|
+
def self.unescape: (String string) -> String
|
|
14
|
+
def self.parse: (String) -> (Location | Range)
|
|
15
|
+
|
|
16
|
+
class Location
|
|
17
|
+
include Comparable
|
|
18
|
+
|
|
19
|
+
attr_reader paths: Array[Path]
|
|
20
|
+
def self.from_parent_and_subpath: (Array[Path] parent_path, (Array[Path]?) subpath) -> Location
|
|
21
|
+
def self.resolve_path: (Array[Path] parent_path, (Array[Path]?) subpath) -> Array[Path]
|
|
22
|
+
def initialize: (?Array[Path] paths) -> void
|
|
23
|
+
def initialize_copy: (self original) -> void
|
|
24
|
+
def <=>: (self other) -> Integer?
|
|
25
|
+
def path_string: -> String
|
|
26
|
+
def to_s: -> String
|
|
27
|
+
def inspect: -> String
|
|
28
|
+
def join: (*Path other_paths) -> Location
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class Path
|
|
32
|
+
@string_cache: String
|
|
33
|
+
|
|
34
|
+
attr_reader steps: Array[Path | Step]
|
|
35
|
+
attr_reader offset: (CharacterOffset | TemporalSpatialOffset)?
|
|
36
|
+
def initialize: (?Array[Path | Step] steps, ?nil offset) -> void
|
|
37
|
+
def initialize_copy: (self original) -> void
|
|
38
|
+
def to_s: -> String
|
|
39
|
+
def <=>: (self other) -> Integer?
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class Range < ::Range[Location]
|
|
43
|
+
@string_cache: String
|
|
44
|
+
|
|
45
|
+
attr_accessor parent_path: Location
|
|
46
|
+
attr_accessor start_subpath: String
|
|
47
|
+
attr_accessor end_subpath: String
|
|
48
|
+
def self.from_parent_and_start_and_end: (Array[Path] parent_path, Array[Path] start_subpath, Array[Path] end_subpath) -> Range
|
|
49
|
+
def to_s: -> String
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
class Step
|
|
53
|
+
@string_cache: String?
|
|
54
|
+
|
|
55
|
+
attr_reader value: Integer
|
|
56
|
+
attr_reader assertion: (IDAssertion | String)?
|
|
57
|
+
alias step value
|
|
58
|
+
def initialize: (Integer value, ?(IDAssertion | String)? assertion) -> void
|
|
59
|
+
def initialize_copy: (self original) -> void
|
|
60
|
+
def to_s: -> String
|
|
61
|
+
def <=>: (self other) -> Integer?
|
|
62
|
+
def element?: -> bool
|
|
63
|
+
def character_data?: -> bool
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
class IDAssertion
|
|
67
|
+
@string_cache: String?
|
|
68
|
+
|
|
69
|
+
attr_reader id: String
|
|
70
|
+
attr_reader parameters: Hash[String, [String]]
|
|
71
|
+
def initialize: (String id, ?Hash[String, [String]] parameters) -> void
|
|
72
|
+
def to_s: -> String
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
class TextLocationAssertion
|
|
76
|
+
@string_cache: String?
|
|
77
|
+
|
|
78
|
+
attr_reader preceded: String?
|
|
79
|
+
attr_reader followed: String?
|
|
80
|
+
attr_reader parameters: Hash[String, [String]]
|
|
81
|
+
def initialize: (?String? preceded, ?String? followed, ?Hash[String, [String]] parameters) -> void
|
|
82
|
+
def to_s: -> String
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
class CharacterOffset
|
|
86
|
+
@string_cache: String?
|
|
87
|
+
|
|
88
|
+
attr_reader value: Integer
|
|
89
|
+
attr_reader assertion: TextLocationAssertion?
|
|
90
|
+
alias offset value
|
|
91
|
+
def initialize: (Integer value, ?TextLocationAssertion? assertion) -> void
|
|
92
|
+
def to_s: -> String
|
|
93
|
+
def <=>: (self other) -> Integer?
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
class TemporalSpatialOffset
|
|
97
|
+
@string_cache: String?
|
|
98
|
+
|
|
99
|
+
attr_reader temporal: (Float | Integer)?
|
|
100
|
+
attr_reader x: (Float | Integer)?
|
|
101
|
+
attr_reader y: (Float | Integer)?
|
|
102
|
+
attr_reader assertion: nil
|
|
103
|
+
def initialize: (?(Float | Integer)? temporal, ?(Float | Integer)? x, ?(Float | Integer)? y, ?nil assertion) -> void
|
|
104
|
+
def to_s: -> String
|
|
105
|
+
def <=>: (self other) -> Integer?
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
class Parser < Racc::Parser
|
|
109
|
+
Racc_arg: [[Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer], [Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer], [Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer], [Integer, Integer, Integer, Integer, Integer, Integer, nil, nil, Integer, nil, Integer, nil, Integer, nil, Integer, nil, Integer, nil, nil, nil, Integer, nil, Integer, Integer, Integer, Integer, nil, Integer, nil, Integer, nil, nil, nil, Integer, nil, nil, Integer, nil, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, Integer, nil, Integer, nil, nil, Integer, Integer, nil, nil, Integer, nil, Integer, Integer, Integer, Integer, Integer, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, Integer, Integer, nil, nil, Integer, nil, Integer, nil, Integer, Integer, nil, Integer, nil], [Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, Integer, Integer, nil, nil, nil, Integer, Integer], [Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, Integer, Integer, nil, nil, nil, Integer, Integer], [nil, nil, nil, nil, nil, Integer, nil, Integer, nil, nil, nil, nil, nil, Integer, nil, nil, Integer, nil, nil, nil, nil, Integer, Integer, nil, nil, nil, Integer, nil, nil, Integer, nil, Integer, nil, nil, Integer, Integer, nil, Integer, Integer], [nil, Integer, Integer, Integer, Integer, Integer, Integer, nil, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, nil, Integer, Integer, Integer, Integer, Integer, Integer, Integer, nil, Integer, Integer, Integer, Integer, Integer, nil, Integer, Integer, nil], Integer, [Integer, Integer, :racc_error, Integer, Integer, :_reduce_1, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_4, Integer, Integer, :_reduce_5, Integer, Integer, :_reduce_6, Integer, Integer, :_reduce_7, Integer, Integer, :_reduce_8, Integer, Integer, :_reduce_9, Integer, Integer, :_reduce_10, Integer, Integer, :_reduce_11, Integer, Integer, :_reduce_12, Integer, Integer, :_reduce_13, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_16, Integer, Integer, :_reduce_17, Integer, Integer, :_reduce_18, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_21, Integer, Integer, :_reduce_22, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_24, Integer, Integer, :_reduce_25, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_28, Integer, Integer, :_reduce_29, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_31, Integer, Integer, :_reduce_32, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_35, Integer, Integer, :_reduce_36, Integer, Integer, :_reduce_37, Integer, Integer, :_reduce_38, Integer, Integer, :_reduce_39, Integer, Integer, :_reduce_40, Integer, Integer, :_reduce_41, Integer, Integer, :_reduce_42, Integer, Integer, :_reduce_43, Integer, Integer, :_reduce_44, Integer, Integer, :_reduce_45, Integer, Integer, :_reduce_46, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_48, Integer, Integer, :_reduce_49, Integer, Integer, :_reduce_50, Integer, Integer, :_reduce_51, Integer, Integer, :_reduce_52, Integer, Integer, :_reduce_53, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_56, Integer, Integer, :_reduce_57, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none], Hash[:ATMARK | :CIRCUMFLEX | :CLOSING_PARENTHESIS | :CLOSING_SQUARE_BRACKET | :COLON | :COMMA | :DIGIT_NON_ZERO | :DOT | :EQUAL | :EXCLAMATION_MARK | :OPENING_PARENTHESIS | :OPENING_SQUARE_BRACKET | :SEMICOLON | :SOLIDUS | :SPACE | :TILDE | :UNICODE_CHARACTER_EXCLUDING_SPECIAL_CHARS_AND_SPACE_AND_DOT_AND_COLON_AND_TILDE_AND_ATMARK_AND_SOLIDUS_AND_EXCLAMATION_MARK | :ZERO | :error | false, Integer], Integer, Integer, true]
|
|
110
|
+
Racc_token_to_s_table: [String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String]
|
|
111
|
+
Racc_debug_parser: false
|
|
112
|
+
UNICODE_CHARACTER_EXCLUDING_SPECIAL_CHARS_AND_SPACE_AND_DOT_AND_COLON_AND_TILDE_AND_ATMARK_AND_SOLIDUS_AND_EXCLAMATION_MARK_PATTERN: Regexp
|
|
113
|
+
FRAGMENT_PREFIX: "epubcfi("
|
|
114
|
+
FRAGMENT_PREFIX_LENGTH: 8
|
|
115
|
+
FRAGMENT_SUFFIX_LENGTH: 1
|
|
116
|
+
include Comparable
|
|
117
|
+
|
|
118
|
+
def _reduce_none: (untyped val, untyped _values, untyped result) -> untyped
|
|
119
|
+
def self.parse: (String string, ?debug: boolish) -> (Location | Range)
|
|
120
|
+
def initialize: (?debug: boolish) -> void
|
|
121
|
+
def parse: (String string) -> (Location | Range)
|
|
122
|
+
def next_token: -> ([:ATMARK | :CIRCUMFLEX | :CLOSING_PARENTHESIS | :CLOSING_SQUARE_BRACKET | :COLON | :COMMA | :DIGIT_NON_ZERO | :DOT | :EQUAL | :EXCLAMATION_MARK | :OPENING_PARENTHESIS | :OPENING_SQUARE_BRACKET | :SEMICOLON | :SOLIDUS | :SPACE | :TILDE | :UNICODE_CHARACTER_EXCLUDING_SPECIAL_CHARS_AND_SPACE_AND_DOT_AND_COLON_AND_TILDE_AND_ATMARK_AND_SOLIDUS_AND_EXCLAMATION_MARK | :ZERO, String] | [bool, bool])
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
data/sig/shims/racc.rbs
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Test
|
|
2
|
+
module Unit
|
|
3
|
+
class TestCase
|
|
4
|
+
include Assertions
|
|
5
|
+
extend Data::ClassMethods
|
|
6
|
+
|
|
7
|
+
def self.data: (untyped) -> untyped
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
module Assertions
|
|
11
|
+
def assert_equal: (untyped, untyped) -> void
|
|
12
|
+
def assert_not_same: (untyped, untyped) -> void
|
|
13
|
+
def assert_nil: (untyped) -> void
|
|
14
|
+
def assert_true: (untyped) -> void
|
|
15
|
+
def assert_block: (string?) { -> void } -> void
|
|
16
|
+
def assert_raise: (singleton(Exception)?) { -> void } -> void
|
|
17
|
+
def assert_nothing_raised: { -> void } -> void
|
|
18
|
+
def build_message: (string, string?, *string) -> String
|
|
19
|
+
|
|
20
|
+
class AssertionMessage
|
|
21
|
+
def self.delayed_diff: (string? from, string? to) -> String
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
module Data
|
|
26
|
+
module ClassMethods
|
|
27
|
+
def data: (untyped) -> untyped
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
class TestCFI < Test::Unit::TestCase
|
|
2
|
+
private
|
|
3
|
+
|
|
4
|
+
def epubcfi: (String string) -> (EPUB::CFI::Location | EPUB::CFI::Range)
|
|
5
|
+
def assert_equal_node: (untyped expected, untyped actual, ?String message) -> void
|
|
6
|
+
|
|
7
|
+
class TestLocation < TestCFI
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class TestPath < TestCFI
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class TestRange < TestCFI
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
class TestStep < TestCFI
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class TestIDAssertion < TestCFI
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
class TestTextLocationAssertion < TestCFI
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class TestCharacterOffset < TestCFI
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
class TestSpatialOffset < TestCFI
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class TestTemporalOffset < TestCFI
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
class TestTemporalSpatialOffset < TestCFI
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
class TestParserCFI < Test::Unit::TestCase
|
|
39
|
+
end
|
data/test/helper.rb
CHANGED
data/test/test_cfi.rb
CHANGED
|
@@ -21,13 +21,14 @@ class TestCFI < Test::Unit::TestCase
|
|
|
21
21
|
|
|
22
22
|
def test_join
|
|
23
23
|
location = EPUB::CFI::Parser.parse('epubcfi(/6/14[chap05ref])')
|
|
24
|
+
# @type var location: EPUB::CFI::Location
|
|
24
25
|
other_path = EPUB::CFI::Path.new([EPUB::CFI::Path.new([
|
|
25
26
|
EPUB::CFI::Step.new(4, EPUB::CFI::IDAssertion.new('body01')),
|
|
26
27
|
EPUB::CFI::Step.new(10),
|
|
27
28
|
EPUB::CFI::Step.new(2),
|
|
28
29
|
EPUB::CFI::Step.new(1)
|
|
29
30
|
])])
|
|
30
|
-
joined = location.join(
|
|
31
|
+
joined = location.join(other_path)
|
|
31
32
|
|
|
32
33
|
assert_equal 'epubcfi(/6/14[chap05ref]!/4[body01]/10/2/1)', joined.to_s
|
|
33
34
|
end
|
|
@@ -81,6 +82,7 @@ class TestCFI < Test::Unit::TestCase
|
|
|
81
82
|
first = epubcfi('/6/4[chap01ref]!/4[body01]/10[para05]/2/1:1')
|
|
82
83
|
last = epubcfi('/6/4[chap01ref]!/4[body01]/10[para05]/3:4')
|
|
83
84
|
range = epubcfi('/6/4[chap01ref]!/4[body01]/10[para05],/2/1:1,/3:4')
|
|
85
|
+
# @type var range: EPUB::CFI::Range
|
|
84
86
|
assert_equal 0, first <=> range.first
|
|
85
87
|
assert_equal 0, last <=> range.last
|
|
86
88
|
|
|
@@ -93,7 +95,9 @@ class TestCFI < Test::Unit::TestCase
|
|
|
93
95
|
end
|
|
94
96
|
|
|
95
97
|
def test_cover
|
|
96
|
-
|
|
98
|
+
range = epubcfi('/6/4[chap01ref]!/4[body01]/10[para05],/2/1:1,/3:4')
|
|
99
|
+
# @type var range: EPUB::CFI::Range
|
|
100
|
+
assert_true range.cover? epubcfi('/6/4[chap01ref]!/4[body01]/10[para05]/2/2/4')
|
|
97
101
|
end
|
|
98
102
|
end
|
|
99
103
|
|
|
@@ -201,6 +205,15 @@ class TestCFI < Test::Unit::TestCase
|
|
|
201
205
|
end
|
|
202
206
|
end
|
|
203
207
|
|
|
208
|
+
class TestRactor < self
|
|
209
|
+
def test_ractor
|
|
210
|
+
cfi = EPUB::CFI("/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]]")
|
|
211
|
+
ractor = Ractor.new {Ractor.receive.to_s}
|
|
212
|
+
ractor.send cfi
|
|
213
|
+
assert_equal "epubcfi(/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]])", ractor.take
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
204
217
|
private
|
|
205
218
|
|
|
206
219
|
def epubcfi(string)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require_relative "helper"
|
|
2
|
+
require "tempfile"
|
|
3
|
+
|
|
4
|
+
class TestPackage < Test::Unit::TestCase
|
|
5
|
+
def test_build
|
|
6
|
+
Tempfile.create do |file|
|
|
7
|
+
assert system("gem", "build", "epub-cfi.gemspec", "--output", file.to_path, exception: true)
|
|
8
|
+
assert_path_exist file.to_path
|
|
9
|
+
assert file.size > 0
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test_install
|
|
14
|
+
gemspec = Gem::Specification.load("epub-cfi.gemspec")
|
|
15
|
+
system "rake", "build", exception: true
|
|
16
|
+
Dir.mktmpdir do |dir|
|
|
17
|
+
dir = File.realpath(dir)
|
|
18
|
+
system "gem", "install", "--install-dir", dir, File.join("pkg", gemspec.file_name), exception: true
|
|
19
|
+
assert_path_exist File.join(dir, "gems/#{gemspec.full_name}/lib/epub/cfi/parser.tab.rb")
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|