epub-cfi 0.1.1 → 0.1.2
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 +5 -5
- data/.document +1 -1
- data/.gitlab-ci.yml +11 -6
- data/.yardopts +1 -1
- data/{ChangeLog.md → ChangeLog.adoc} +7 -2
- data/README.adoc +80 -0
- data/Rakefile +5 -5
- data/appveyor.yml +21 -0
- data/lib/epub/cfi.rb +15 -8
- data/lib/epub/cfi/parser.rb +74 -49
- data/lib/epub/cfi/version.rb +1 -1
- data/test/test_cfi.rb +22 -0
- data/test/test_parser.rb +11 -0
- metadata +6 -6
- data/README.md +0 -85
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c7bd4bcf31dae58b934393de702fb036186b950bbeb72d065931d0406506c2be
|
4
|
+
data.tar.gz: 5820d5272ed8c29790c69e959c1e4b140eae9e567182b2c5929dbbcff41efc0e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83d606fc2a8321349c6b055df31610bbc384b7c42e620ee01ec6b1461b2c6a51534327c70442894a70f8faf6c0cee0a0506e84b55c5765a25a97d2ae6548ac7e
|
7
|
+
data.tar.gz: 8b950b018d6bde45b2c1107ab2c19048c4e05e06cc49c4cd59c4c77a5b4b706228bc2268b65eebbb91314a51104b5fa48ddf5371c202c187bda1faf023fbccab
|
data/.document
CHANGED
data/.gitlab-ci.yml
CHANGED
@@ -1,12 +1,7 @@
|
|
1
1
|
before_script:
|
2
2
|
- ruby -v
|
3
3
|
- which ruby
|
4
|
-
- gem install racc rake rubygems-tasks yard test-unit test-unit-notify pretty_backtrace simplecov
|
5
|
-
|
6
|
-
test:2.2:
|
7
|
-
image: ruby:2.2
|
8
|
-
script:
|
9
|
-
rake test
|
4
|
+
- gem install --no-document racc rake rubygems-tasks yard test-unit test-unit-notify pretty_backtrace simplecov
|
10
5
|
|
11
6
|
test:2.3:
|
12
7
|
image: ruby:2.3
|
@@ -17,3 +12,13 @@ test:2.4:
|
|
17
12
|
image: ruby:2.4
|
18
13
|
script:
|
19
14
|
rake test
|
15
|
+
|
16
|
+
test:2.5:
|
17
|
+
image: ruby:2.5
|
18
|
+
script:
|
19
|
+
rake test
|
20
|
+
|
21
|
+
test:2.6:
|
22
|
+
image: ruby:2.6
|
23
|
+
script:
|
24
|
+
rake test
|
data/.yardopts
CHANGED
@@ -1 +1 @@
|
|
1
|
-
--markup
|
1
|
+
--markup asciidoc --title "EPUB CFI Documentation" --protected
|
@@ -1,9 +1,14 @@
|
|
1
|
-
|
1
|
+
=== 0.1.2 / 2019-05-19
|
2
|
+
|
3
|
+
* Scan CFI string on demand to reduce memory footprint
|
4
|
+
* Make CFI() funciton accepts CFI instance
|
5
|
+
|
6
|
+
=== 0.1.1 / 2017-09-17
|
2
7
|
|
3
8
|
* Add `CFI::Location.from_parent_and_subpath`
|
4
9
|
* [BUG FIX]Consider the case subpath includes step indirection in Range.from_parent_and_start_and_end
|
5
10
|
|
6
|
-
|
11
|
+
=== 0.1.0 / 2017-03-12
|
7
12
|
|
8
13
|
* Initial release:
|
9
14
|
|
data/README.adoc
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
= EPUB CFI
|
2
|
+
|
3
|
+
image:https://badge.fury.io/rb/epub-cfi.svg["Gem Version", link="https://badge.fury.io/rb/epub-cfi"]
|
4
|
+
image:https://gitlab.com/KitaitiMakoto/epub-cfi/badges/master/pipeline.svg[link="https://gitlab.com/KitaitiMakoto/epub-cfi/commits/master",title="pipeline status"]
|
5
|
+
image:https://gitlab.com/KitaitiMakoto/epub-cfi/badges/master/coverage.svg[link="https://gitlab.com/KitaitiMakoto/epub-cfi/commits/master",title="coverage report"]
|
6
|
+
|
7
|
+
* https://gitlab.com/KitaitiMakoto/epub-cfi[Homepage]
|
8
|
+
* http://rubydoc.info/gems/epub-cfi/frames[Documentation]
|
9
|
+
* mailto:KitaitiMakoto+at+gmail.com[Email]
|
10
|
+
|
11
|
+
== Description
|
12
|
+
|
13
|
+
Parser and builder implementation for EPUB CFI defined at http://www.idpf.org/epub/linking/cfi/
|
14
|
+
|
15
|
+
Extracted from http://www.rubydoc.info/gems/epub-parser/file/docs/Home.markdown[EPUB Parser].
|
16
|
+
|
17
|
+
== Features
|
18
|
+
|
19
|
+
* Parses EPUB CFI string.
|
20
|
+
* Builds EPUB CFI(implemented but currently useless).
|
21
|
+
* Converts EPUB CFI object to a string.
|
22
|
+
|
23
|
+
== Examples
|
24
|
+
|
25
|
+
----
|
26
|
+
require 'epub/cfi'
|
27
|
+
|
28
|
+
location = EPUB::CFI.parse("epubcfi(/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]])")
|
29
|
+
# Or location = EPUB::CFI("epubcfi(/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]])")
|
30
|
+
# => #<EPUB::CFI::Location:/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]]>
|
31
|
+
location.to_s # => "epubcfi(/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]])"
|
32
|
+
|
33
|
+
location1 = EPUB::CFI("/6/4[chap01ref]!/4[body01]/10[para05]/1:3[xx,y]")
|
34
|
+
location2 = EPUB::CFI("/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3[yyy]")
|
35
|
+
location1 < location2 # => true
|
36
|
+
location1 <=> location2 # => -1
|
37
|
+
# location1 appears earlier than location2
|
38
|
+
|
39
|
+
range = EPUB::CFI("/6/4[chap01ref]!/4[body01]/10[para05],/2/1:1,/3:4")
|
40
|
+
# => #<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]/2/1:1>..#<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]/3:4>
|
41
|
+
range.kind_of? ::Range # => true
|
42
|
+
range.begin
|
43
|
+
# => #<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]/2/1:1>
|
44
|
+
range.end
|
45
|
+
# => #<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]/3:4>
|
46
|
+
range.start_subpath
|
47
|
+
# => "/2/1:1"
|
48
|
+
range.end_subpath
|
49
|
+
# => "/3:4"
|
50
|
+
range.parent_path
|
51
|
+
# => #<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]>
|
52
|
+
range.to_s # => "epubcfi(/6/4[chap01ref]!/4[body01]/10[para05],/2/1:1,/3:4)"
|
53
|
+
|
54
|
+
builtin_range = location2..location1
|
55
|
+
# => #<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3[yyy]>..#<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]/1:3[xx,y]>
|
56
|
+
builtin_range.to_s
|
57
|
+
# => "epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3[yyy])..epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/1:3[xx,y])"
|
58
|
+
builtin_range.kind_of? ::Range # => true
|
59
|
+
builtin_range.kind_of? EPUB::CFI::Range # => false
|
60
|
+
cfi_range = EPUB::CFI::Range.new(location2, location1)
|
61
|
+
# => #<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3[yyy]>..#<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]/1:3[xx,y]>
|
62
|
+
cfi_range.kind_of? ::Range # => true
|
63
|
+
cfi_range.kind_of? EPUB::CFI::Range # => true
|
64
|
+
----
|
65
|
+
|
66
|
+
== Install
|
67
|
+
|
68
|
+
[listing]
|
69
|
+
$ gem install epub-cfi
|
70
|
+
|
71
|
+
== See also
|
72
|
+
|
73
|
+
* http://www.idpf.org/epub/linking/cfi/[EPUB Canonical Fragment Identifiers 1.1]
|
74
|
+
* http://www.rubydoc.info/gems/epub-parser/file/docs/Home.markdown[EPUB Parser]
|
75
|
+
|
76
|
+
== Copyright
|
77
|
+
|
78
|
+
Copyright (c) 2017 KITAITI Makoto
|
79
|
+
|
80
|
+
See {file:COPYING.txt} for details.
|
data/Rakefile
CHANGED
@@ -3,16 +3,17 @@ require 'rake'
|
|
3
3
|
|
4
4
|
task :default => "lib/epub/cfi/parser.tab.rb"
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
desc "Build EPUB CFI parser"
|
7
|
+
file "lib/epub/cfi/parser.tab.rb" => "lib/epub/cfi/parser.y" do |task|
|
8
|
+
sh "racc #{task.source}"
|
8
9
|
end
|
9
10
|
|
10
11
|
require "rake/clean"
|
11
|
-
|
12
|
+
CLOBBER.include "lib/epub/cfi/parser.tab.rb"
|
12
13
|
|
13
14
|
require 'rubygems/tasks'
|
14
15
|
Gem::Tasks.new
|
15
|
-
task :build =>
|
16
|
+
task :build => "lib/epub/cfi/parser.tab.rb"
|
16
17
|
|
17
18
|
require 'rake/testtask'
|
18
19
|
Rake::TestTask.new do |test|
|
@@ -24,4 +25,3 @@ task :test => "lib/epub/cfi/parser.tab.rb"
|
|
24
25
|
|
25
26
|
require 'yard'
|
26
27
|
YARD::Rake::YardocTask.new
|
27
|
-
task :doc => :yard
|
data/appveyor.yml
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
version: 1.0.{build}-{branch}
|
2
|
+
|
3
|
+
environment:
|
4
|
+
matrix:
|
5
|
+
- RUBY_VERSION: 23
|
6
|
+
- RUBY_VERSION: 24
|
7
|
+
- RUBY_VERSION: 25
|
8
|
+
- RUBY_VERSION: 26
|
9
|
+
|
10
|
+
install:
|
11
|
+
- set PATH=C:\Ruby%RUBY_VERSION%\bin;%PATH%
|
12
|
+
- gem install --no-document racc rake rubygems-tasks yard test-unit test-unit-notify pretty_backtrace simplecov
|
13
|
+
|
14
|
+
build: off
|
15
|
+
|
16
|
+
before_test:
|
17
|
+
- ruby -v
|
18
|
+
- gem -v
|
19
|
+
|
20
|
+
test_script:
|
21
|
+
- rake test
|
data/lib/epub/cfi.rb
CHANGED
@@ -6,15 +6,30 @@ module EPUB
|
|
6
6
|
RE_ESCAPED_SPECIAL_CHARS = Regexp.escape(SPECIAL_CHARS)
|
7
7
|
|
8
8
|
class << self
|
9
|
+
# Escapes special characters in string
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# EPUB::CFI.escape("2[1]") #=> "2^[1^]"
|
13
|
+
#
|
14
|
+
# @param string [String] Component string of EPUB CFI
|
15
|
+
# @return [String] Escaped comonent string
|
9
16
|
def escape(string)
|
10
17
|
string.gsub(/([#{RE_ESCAPED_SPECIAL_CHARS}])/o, '^\1')
|
11
18
|
end
|
12
19
|
|
20
|
+
# Unescape escaped characters in string
|
21
|
+
#
|
22
|
+
# @example
|
23
|
+
# EPUB::CFI.unescape("2^[1^]") #=> "2[1]"
|
24
|
+
#
|
25
|
+
# @param string [String] Escape component string of EPUB CFI
|
26
|
+
# @return [String] Unescaped component string
|
13
27
|
def unescape(string)
|
14
28
|
string.gsub(/\^([#{RE_ESCAPED_SPECIAL_CHARS}])/o, '\1')
|
15
29
|
end
|
16
30
|
end
|
17
31
|
|
32
|
+
# {Location} indicates a point in an EPUB Publication.
|
18
33
|
class Location
|
19
34
|
include Comparable
|
20
35
|
|
@@ -141,14 +156,6 @@ module EPUB
|
|
141
156
|
end
|
142
157
|
end
|
143
158
|
end
|
144
|
-
|
145
|
-
def each_step_with_instruction
|
146
|
-
yield [step, nil]
|
147
|
-
local_path.each_step_with_instruction do |s, instruction|
|
148
|
-
yield [s, instruction]
|
149
|
-
end
|
150
|
-
self
|
151
|
-
end
|
152
159
|
end
|
153
160
|
|
154
161
|
class Range < ::Range
|
data/lib/epub/cfi/parser.rb
CHANGED
@@ -7,12 +7,12 @@ class EPUB::CFI::Parser
|
|
7
7
|
UNICODE_CHARACTER_PATTERN = Regexp.union(UNICODE_CHARACTER_EXCLUDING_SPECIAL_CHARS_AND_SPACE_AND_DOT_AND_COLON_AND_TILDE_AND_ATMARK_AND_SOLIDUS_AND_EXCLAMATION_MARK_PATTERN, Regexp.new(Regexp.escape(EPUB::CFI::SPECIAL_CHARS), / \.:~@!/))
|
8
8
|
|
9
9
|
class << self
|
10
|
-
def parse(string, debug:
|
10
|
+
def parse(string, debug: $DEBUG)
|
11
11
|
new(debug: debug).parse(string)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
def initialize(debug:
|
15
|
+
def initialize(debug: $DEBUG)
|
16
16
|
@yydebug = debug
|
17
17
|
super()
|
18
18
|
end
|
@@ -22,67 +22,92 @@ class EPUB::CFI::Parser
|
|
22
22
|
string = string['epubcfi('.length .. -2]
|
23
23
|
end
|
24
24
|
@scanner = StringScanner.new(string, true)
|
25
|
-
@q = []
|
26
|
-
until @scanner.eos?
|
27
|
-
case
|
28
|
-
when @scanner.scan(/[1-9]/)
|
29
|
-
@q << [:DIGIT_NON_ZERO, @scanner[0]]
|
30
|
-
when @scanner.scan(/0/)
|
31
|
-
@q << [:ZERO, @scanner[0]]
|
32
|
-
when @scanner.scan(/ /)
|
33
|
-
@q << [:SPACE, @scanner[0]]
|
34
|
-
when @scanner.scan(/\^/)
|
35
|
-
@q << [:CIRCUMFLEX, @scanner[0]]
|
36
|
-
when @scanner.scan(/\[/)
|
37
|
-
@q << [:OPENING_SQUARE_BRACKET, @scanner[0]]
|
38
|
-
when @scanner.scan(/\]/)
|
39
|
-
@q << [:CLOSING_SQUARE_BRACKET, @scanner[0]]
|
40
|
-
when @scanner.scan(/\(/)
|
41
|
-
@q << [:OPENING_PARENTHESIS, @scanner[0]]
|
42
|
-
when @scanner.scan(/\)/)
|
43
|
-
@q << [:CLOSING_PARENTHESIS, @scanner[0]]
|
44
|
-
when @scanner.scan(/,/)
|
45
|
-
@q << [:COMMA, @scanner[0]]
|
46
|
-
when @scanner.scan(/;/)
|
47
|
-
@q << [:SEMICOLON, @scanner[0]]
|
48
|
-
when @scanner.scan(/=/)
|
49
|
-
@q << [:EQUAL, @scanner[0]]
|
50
|
-
when @scanner.scan(/\./)
|
51
|
-
@q << [:DOT, @scanner[0]]
|
52
|
-
when @scanner.scan(/:/)
|
53
|
-
@q << [:COLON, @scanner[0]]
|
54
|
-
when @scanner.scan(/~/)
|
55
|
-
@q << [:TILDE, @scanner[0]]
|
56
|
-
when @scanner.scan(/@/)
|
57
|
-
@q << [:ATMARK, @scanner[0]]
|
58
|
-
when @scanner.scan(/\//)
|
59
|
-
@q << [:SOLIDUS, @scanner[0]]
|
60
|
-
when @scanner.scan(/!/)
|
61
|
-
@q << [:EXCLAMATION_MARK, @scanner[0]]
|
62
|
-
when @scanner.scan(UNICODE_CHARACTER_EXCLUDING_SPECIAL_CHARS_AND_SPACE_AND_DOT_AND_COLON_AND_TILDE_AND_ATMARK_AND_SOLIDUS_AND_EXCLAMATION_MARK_PATTERN)
|
63
|
-
@q << [:UNICODE_CHARACTER_EXCLUDING_SPECIAL_CHARS_AND_SPACE_AND_DOT_AND_COLON_AND_TILDE_AND_ATMARK_AND_SOLIDUS_AND_EXCLAMATION_MARK, @scanner[0]]
|
64
|
-
else
|
65
|
-
raise 'unexpected character'
|
66
|
-
end
|
67
|
-
end
|
68
|
-
@q << [false, false]
|
69
|
-
|
70
25
|
do_parse
|
71
26
|
end
|
72
27
|
|
73
28
|
def next_token
|
74
|
-
@
|
29
|
+
return [false, false] if @scanner.eos?
|
30
|
+
|
31
|
+
case
|
32
|
+
when @scanner.scan(/[1-9]/)
|
33
|
+
[:DIGIT_NON_ZERO, @scanner[0]]
|
34
|
+
when @scanner.scan(/0/)
|
35
|
+
[:ZERO, @scanner[0]]
|
36
|
+
when @scanner.scan(/ /)
|
37
|
+
[:SPACE, @scanner[0]]
|
38
|
+
when @scanner.scan(/\^/)
|
39
|
+
[:CIRCUMFLEX, @scanner[0]]
|
40
|
+
when @scanner.scan(/\[/)
|
41
|
+
[:OPENING_SQUARE_BRACKET, @scanner[0]]
|
42
|
+
when @scanner.scan(/\]/)
|
43
|
+
[:CLOSING_SQUARE_BRACKET, @scanner[0]]
|
44
|
+
when @scanner.scan(/\(/)
|
45
|
+
[:OPENING_PARENTHESIS, @scanner[0]]
|
46
|
+
when @scanner.scan(/\)/)
|
47
|
+
[:CLOSING_PARENTHESIS, @scanner[0]]
|
48
|
+
when @scanner.scan(/,/)
|
49
|
+
[:COMMA, @scanner[0]]
|
50
|
+
when @scanner.scan(/;/)
|
51
|
+
[:SEMICOLON, @scanner[0]]
|
52
|
+
when @scanner.scan(/=/)
|
53
|
+
[:EQUAL, @scanner[0]]
|
54
|
+
when @scanner.scan(/\./)
|
55
|
+
[:DOT, @scanner[0]]
|
56
|
+
when @scanner.scan(/:/)
|
57
|
+
[:COLON, @scanner[0]]
|
58
|
+
when @scanner.scan(/~/)
|
59
|
+
[:TILDE, @scanner[0]]
|
60
|
+
when @scanner.scan(/@/)
|
61
|
+
[:ATMARK, @scanner[0]]
|
62
|
+
when @scanner.scan(/\//)
|
63
|
+
[:SOLIDUS, @scanner[0]]
|
64
|
+
when @scanner.scan(/!/)
|
65
|
+
[:EXCLAMATION_MARK, @scanner[0]]
|
66
|
+
when @scanner.scan(UNICODE_CHARACTER_EXCLUDING_SPECIAL_CHARS_AND_SPACE_AND_DOT_AND_COLON_AND_TILDE_AND_ATMARK_AND_SOLIDUS_AND_EXCLAMATION_MARK_PATTERN)
|
67
|
+
[:UNICODE_CHARACTER_EXCLUDING_SPECIAL_CHARS_AND_SPACE_AND_DOT_AND_COLON_AND_TILDE_AND_ATMARK_AND_SOLIDUS_AND_EXCLAMATION_MARK, @scanner[0]]
|
68
|
+
else
|
69
|
+
raise 'unexpected character'
|
70
|
+
end
|
75
71
|
end
|
76
72
|
end
|
77
73
|
|
78
74
|
module EPUB::CFI
|
79
75
|
module_function
|
80
76
|
|
77
|
+
# Parses the given string, creates a new {CFI} object and return it.
|
78
|
+
#
|
79
|
+
# @example Parses a URI fragment string
|
80
|
+
# EPUB::CFI.parse("epubcfi(/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]])")
|
81
|
+
# #=> #<EPUB::CFI::Location:/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]]>
|
82
|
+
#
|
83
|
+
# @example Parses a path string
|
84
|
+
# EPUB::CFI.parse("/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]]")
|
85
|
+
# #=> #<EPUB::CFI::Location:/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]]>
|
86
|
+
#
|
87
|
+
# @param string [String]
|
88
|
+
# @return [CFI]
|
89
|
+
# @raise [Racc::ParseError] if given string is invalid
|
81
90
|
def parse(string)
|
82
91
|
EPUB::CFI::Parser.parse(string)
|
83
92
|
end
|
84
93
|
end
|
85
94
|
|
95
|
+
# Creates a new {CFI} object from the given string and return it.
|
96
|
+
#
|
97
|
+
# @example Creates from a URI fragment string
|
98
|
+
# EPUB::CFI("epubcfi(/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]])")
|
99
|
+
# #=> #<EPUB::CFI::Location:/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]]>
|
100
|
+
#
|
101
|
+
# @example Creates from a path string
|
102
|
+
# EPUB::CFI("/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]]")
|
103
|
+
# #=> #<EPUB::CFI::Location:/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]]>
|
104
|
+
#
|
105
|
+
# @param string [String, CFI]
|
106
|
+
# @return [CFI] CFI parsed from +string+ when +string+ is a String. +string+ itself when it's a CFI
|
107
|
+
# @raise [Racc::ParseError] if given string is invalid
|
108
|
+
# @see CFI.parse
|
86
109
|
def EPUB::CFI(string)
|
87
|
-
EPUB::CFI.
|
110
|
+
string.kind_of?(EPUB::CFI::Location) || string.kind_of?(EPUB::CFI::Range) ?
|
111
|
+
string :
|
112
|
+
EPUB::CFI.parse(string)
|
88
113
|
end
|
data/lib/epub/cfi/version.rb
CHANGED
data/test/test_cfi.rb
CHANGED
@@ -11,6 +11,28 @@ class TestCFI < Test::Unit::TestCase
|
|
11
11
|
assert_equal '^[](),;=', EPUB::CFI.unescape('^^^[^]^(^)^,^;^=')
|
12
12
|
end
|
13
13
|
|
14
|
+
class TestLocation < self
|
15
|
+
def test_copy
|
16
|
+
cfi = EPUB::CFI::Parser.parse('epubcfi(/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]])')
|
17
|
+
cloned = cfi.clone
|
18
|
+
assert_equal cfi, cloned
|
19
|
+
assert_not_same cfi, cloned
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_join
|
23
|
+
location = EPUB::CFI::Parser.parse('epubcfi(/6/14[chap05ref])')
|
24
|
+
other_path = EPUB::CFI::Path.new([EPUB::CFI::Path.new([
|
25
|
+
EPUB::CFI::Step.new(4, EPUB::CFI::IDAssertion.new('body01')),
|
26
|
+
EPUB::CFI::Step.new(10),
|
27
|
+
EPUB::CFI::Step.new(2),
|
28
|
+
EPUB::CFI::Step.new(1)
|
29
|
+
])])
|
30
|
+
joined = location.join([other_path])
|
31
|
+
|
32
|
+
assert_equal 'epubcfi(/6/14[chap05ref]!/4[body01]/10/2/1)', joined.to_s
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
14
36
|
class TestPath < self
|
15
37
|
data([
|
16
38
|
'epubcfi(/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]])',
|
data/test/test_parser.rb
CHANGED
@@ -53,4 +53,15 @@ class TestParserCFI < Test::Unit::TestCase
|
|
53
53
|
EPUB::CFI(cfi)
|
54
54
|
end
|
55
55
|
end
|
56
|
+
|
57
|
+
def test_cfi_function_accepts_cfi_instance
|
58
|
+
cfi = EPUB::CFI::Parser.parse('epubcfi(/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]])')
|
59
|
+
parsed = nil
|
60
|
+
|
61
|
+
assert_nothing_raised do
|
62
|
+
parsed = EPUB::CFI(cfi)
|
63
|
+
end
|
64
|
+
|
65
|
+
assert_equal cfi, parsed
|
66
|
+
end
|
56
67
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: epub-cfi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- KITAITI Makoto
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-05-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: racc
|
@@ -133,9 +133,10 @@ files:
|
|
133
133
|
- ".gitlab-ci.yml"
|
134
134
|
- ".yardopts"
|
135
135
|
- COPYING.txt
|
136
|
-
- ChangeLog.
|
137
|
-
- README.
|
136
|
+
- ChangeLog.adoc
|
137
|
+
- README.adoc
|
138
138
|
- Rakefile
|
139
|
+
- appveyor.yml
|
139
140
|
- epub-cfi.gemspec
|
140
141
|
- lib/epub/cfi.rb
|
141
142
|
- lib/epub/cfi/parser.rb
|
@@ -164,8 +165,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
164
165
|
- !ruby/object:Gem::Version
|
165
166
|
version: '0'
|
166
167
|
requirements: []
|
167
|
-
|
168
|
-
rubygems_version: 2.6.13
|
168
|
+
rubygems_version: 3.0.3
|
169
169
|
signing_key:
|
170
170
|
specification_version: 4
|
171
171
|
summary: EPUB CFI parser and builder
|
data/README.md
DELETED
@@ -1,85 +0,0 @@
|
|
1
|
-
EPUB CFI
|
2
|
-
========
|
3
|
-
|
4
|
-
* [Homepage](https://gitlab.com/KitaitiMakoto/epub-cfi)
|
5
|
-
* [Documentation](http://rubydoc.info/gems/epub-cfi/frames)
|
6
|
-
* [Email](mailto:KitaitiMakoto at gmail.com)
|
7
|
-
|
8
|
-
Description
|
9
|
-
-----------
|
10
|
-
|
11
|
-
Parser and builder implementation for EPUB CFI defined at http://www.idpf.org/epub/linking/cfi/
|
12
|
-
|
13
|
-
Extracted from [EPUB Parser][].
|
14
|
-
|
15
|
-
[EPUB Parser]: http://www.rubydoc.info/gems/epub-parser/file/docs/Home.markdown
|
16
|
-
|
17
|
-
Features
|
18
|
-
--------
|
19
|
-
|
20
|
-
* Parses EPUB CFI string.
|
21
|
-
* Builds EPUB CFI(implemented but currently useless).
|
22
|
-
* Converts EPUB CFI object to a string.
|
23
|
-
|
24
|
-
Examples
|
25
|
-
--------
|
26
|
-
|
27
|
-
require 'epub/cfi'
|
28
|
-
|
29
|
-
location = EPUB::CFI.parse("epubcfi(/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]])")
|
30
|
-
# Or location = EPUB::CFI("epubcfi(/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]])")
|
31
|
-
# => #<EPUB::CFI::Location:/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]]>
|
32
|
-
location.to_s # => "epubcfi(/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]])"
|
33
|
-
|
34
|
-
location1 = EPUB::CFI("/6/4[chap01ref]!/4[body01]/10[para05]/1:3[xx,y]")
|
35
|
-
location2 = EPUB::CFI("/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3[yyy]")
|
36
|
-
location1 < location2 # => true
|
37
|
-
location1 <=> location2 # => -1
|
38
|
-
# location1 appears earlier than location2
|
39
|
-
|
40
|
-
range = EPUB::CFI("/6/4[chap01ref]!/4[body01]/10[para05],/2/1:1,/3:4")
|
41
|
-
# => #<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]/2/1:1>..#<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]/3:4>
|
42
|
-
range.kind_of? ::Range # => true
|
43
|
-
range.begin
|
44
|
-
# => #<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]/2/1:1>
|
45
|
-
range.end
|
46
|
-
# => #<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]/3:4>
|
47
|
-
range.start_subpath
|
48
|
-
# => "/2/1:1"
|
49
|
-
range.end_subpath
|
50
|
-
# => "/3:4"
|
51
|
-
range.parent_path
|
52
|
-
# => #<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]>
|
53
|
-
range.to_s # => "epubcfi(/6/4[chap01ref]!/4[body01]/10[para05],/2/1:1,/3:4)"
|
54
|
-
|
55
|
-
builtin_range = location2..location1
|
56
|
-
# => #<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3[yyy]>..#<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]/1:3[xx,y]>
|
57
|
-
builtin_range.to_s
|
58
|
-
# => "epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3[yyy])..epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/1:3[xx,y])"
|
59
|
-
builtin_range.kind_of? ::Range # => true
|
60
|
-
builtin_range.kind_of? EPUB::CFI::Range # => false
|
61
|
-
cfi_range = EPUB::CFI::Range.new(location2, location1)
|
62
|
-
# => #<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3[yyy]>..#<EPUB::CFI::Location:/6/4[chap01ref]!/4[body01]/10[para05]/1:3[xx,y]>
|
63
|
-
cfi_range.kind_of? ::Range # => true
|
64
|
-
cfi_range.kind_of? EPUB::CFI::Range # => true
|
65
|
-
|
66
|
-
Install
|
67
|
-
-------
|
68
|
-
|
69
|
-
$ gem install epub-cfi
|
70
|
-
|
71
|
-
See also
|
72
|
-
--------
|
73
|
-
|
74
|
-
* [EPUB Canonical Fragment Identifiers 1.1][spec]
|
75
|
-
* [EPUB Parser][]
|
76
|
-
|
77
|
-
[spec]: http://www.idpf.org/epub/linking/cfi/
|
78
|
-
[EPUB Parser]: http://www.rubydoc.info/gems/epub-parser/file/docs/Home.markdown
|
79
|
-
|
80
|
-
Copyright
|
81
|
-
---------
|
82
|
-
|
83
|
-
Copyright (c) 2017 KITAITI Makoto
|
84
|
-
|
85
|
-
See {file:COPYING.txt} for details.
|