repub 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -121,7 +121,7 @@ module Repub
121
121
  # Get item's anchor and href
122
122
  a = item.name == 'a' ? item : item.at('a')
123
123
  next if !a
124
- href = a[:href]
124
+ href = a['href']
125
125
  next if !href
126
126
  # Is this a leaf item or node ?
127
127
  subsection = item.xpath(@selectors[:toc_section]).first
@@ -1,4 +1,5 @@
1
1
  require 'delegate'
2
+ require 'yaml'
2
3
 
3
4
  module Repub
4
5
  class App
@@ -29,26 +30,26 @@ module Repub
29
30
  profile = Profile.new
30
31
  if p = profile[name]
31
32
  keys = p.keys.map{|k| k.to_s }.sort.map{|k| k.to_sym }
32
- keys.each do |k|
33
- v = p[k]
34
- next if v.nil? || (v.respond_to?(:empty?) && v.empty?)
35
- case k
33
+ keys.each do |key|
34
+ val = p[key]
35
+ next if val.nil? || (val.respond_to?(:empty?) && val.empty?)
36
+ case key
36
37
  when :selectors
37
- printf("%4s%-6s\n", '', k)
38
- selector_keys = v.keys.map{|k| k.to_s }.sort.map{|k| k.to_sym }
39
- selector_keys.each { |sk| printf("%8s%-12s %s\n", '', sk, v[sk]) }
38
+ printf("%4s%-6s\n", '', key)
39
+ selector_keys = val.keys.map{|k| k.to_s }.sort.map{|k| k.to_sym }
40
+ selector_keys.each { |sk| printf("%8s%-12s %s\n", '', sk, val[sk]) }
40
41
  when :remove
41
- printf("%4s%-6s\n", '', k)
42
- v.each { |rk| printf("%20s %s\n", '', rk) }
42
+ printf("%4s%-6s\n", '', key)
43
+ val.each { |rk| printf("%20s %s\n", '', rk) }
43
44
  when :rx
44
- printf("%4s%-6s\n", '', k)
45
- v.each { |rk| printf("%20s %s\n", '', rk) }
45
+ printf("%4s%-6s\n", '', key)
46
+ val.each { |rk| printf("%20s %s\n", '', rk) }
46
47
  when :metadata
47
- printf("%4s%-6s\n", '', k)
48
- metadata_keys = v.keys.map{|k| k.to_s }.sort.map{|k| k.to_sym }
49
- metadata_keys.each { |mk| printf("%8s%-12s %s\n", '', mk, v[mk]) }
48
+ printf("%4s%-6s\n", '', key)
49
+ metadata_keys = val.keys.map{|k| k.to_s }.sort.map{|k| k.to_sym }
50
+ metadata_keys.each { |mk| printf("%8s%-12s %s\n", '', mk, val[mk]) }
50
51
  else
51
- printf("%4s%-16s %s\n", '', k, v)
52
+ printf("%4s%-16s %s\n", '', key, val)
52
53
  end
53
54
  end
54
55
  end
@@ -1,28 +1,28 @@
1
- require 'rubygems'
2
- require 'builder'
3
-
4
- module Repub
5
- module Epub
6
-
7
- class Container
8
- def to_xml
9
- out = ''
10
- builder = Builder::XmlMarkup.new(:target => out, :indent => 4)
11
- builder.instruct!
12
- builder.container :xmlns => "urn:oasis:names:tc:opendocument:xmlns:container", :version => "1.0" do
13
- builder.rootfiles do
14
- builder.rootfile 'full-path' => "content.opf", 'media-type' => "application/oebps-package+xml"
15
- end
16
- end
17
- out
18
- end
19
-
20
- def save(path = 'container.xml')
21
- File.open(path, 'w') do |f|
22
- f << to_xml
23
- end
24
- end
25
- end
26
-
27
- end
28
- end
1
+ require 'rubygems'
2
+ require 'builder'
3
+
4
+ module Repub
5
+ module Epub
6
+
7
+ class Container
8
+ def to_xml
9
+ out = ''
10
+ builder = Builder::XmlMarkup.new(:target => out)
11
+ builder.instruct!
12
+ builder.container :xmlns => "urn:oasis:names:tc:opendocument:xmlns:container", :version => "1.0" do
13
+ builder.rootfiles do
14
+ builder.rootfile 'full-path' => "content.opf", 'media-type' => "application/oebps-package+xml"
15
+ end
16
+ end
17
+ out
18
+ end
19
+
20
+ def save(path = 'container.xml')
21
+ File.open(path, 'w') do |f|
22
+ f << to_xml
23
+ end
24
+ end
25
+ end
26
+
27
+ end
28
+ end
@@ -8,12 +8,9 @@ module Repub
8
8
 
9
9
  def initialize(uid)
10
10
  @metadata = Metadata.new('Untitled', 'en', uid, Date.today.to_s)
11
- @css_counter = 0
12
- @img_counter = 0
13
- @html_counter = 0
14
11
  @manifest_items = []
15
12
  @spine_items = []
16
- @manifest_items << ContentItem.new('ncx', 'toc.ncx', 'application/x-dtbncx+xml')
13
+ @manifest_items << ContentItem.new('ncx', 'toc.ncx')
17
14
  end
18
15
 
19
16
  class Metadata < Struct.new(
@@ -31,40 +28,42 @@ module Repub
31
28
  end
32
29
 
33
30
  attr_reader :metadata
34
-
35
- def add_page_template(href = 'page-template.xpgt', id = 'pt')
36
- @manifest_items << ContentItem.new(id, href, 'application/vnd.adobe-page-template+xml')
37
- end
38
-
39
- def add_stylesheet(href, id = nil)
40
- @manifest_items << ContentItem.new(id || "css_#{@css_counter += 1}", href, 'text/css')
41
- end
42
-
43
- def add_image(href, id = nil)
44
- image_type = case(href.strip.downcase)
45
- when /.*\.(jpeg|jpg)$/
46
- 'image/jpeg'
47
- when /.*\.png$/
48
- 'image/png'
49
- when /.*\.gif$/
50
- 'image/gif'
51
- when /.*\.svg$/
52
- 'image/svg+xml'
53
- else
54
- raise 'Unsupported image type'
55
- end
56
- @manifest_items << ContentItem.new(id || "img_#{@img_counter += 1}", href, image_type)
31
+
32
+ def add_item(href, id = nil)
33
+ item = ContentItem.new(id || "item_#{@manifest_items.size}", href)
34
+ @manifest_items << item
35
+ @spine_items << item if item.document?
57
36
  end
58
37
 
59
- def add_document(href, id = nil)
60
- manifest_item = ContentItem.new(id || "item_#{@html_counter += 1}", href, 'application/xhtml+xml')
61
- @manifest_items << manifest_item
62
- @spine_items << manifest_item
63
- end
38
+ #def add_stylesheet(href, id = nil)
39
+ # @manifest_items << ContentItem.new(id || "css_#{@css_counter += 1}", href, 'text/css')
40
+ #end
41
+ #
42
+ #def add_image(href, id = nil)
43
+ # image_type = case(href.strip.downcase)
44
+ # when /.*\.(jpeg|jpg)$/
45
+ # 'image/jpeg'
46
+ # when /.*\.png$/
47
+ # 'image/png'
48
+ # when /.*\.gif$/
49
+ # 'image/gif'
50
+ # when /.*\.svg$/
51
+ # 'image/svg+xml'
52
+ # else
53
+ # raise 'Unsupported image type'
54
+ # end
55
+ # @manifest_items << ContentItem.new(id || "img_#{@img_counter += 1}", href, image_type)
56
+ #end
57
+ #
58
+ #def add_document(href, id = nil)
59
+ # manifest_item = ContentItem.new(id || "item_#{@html_counter += 1}", href, 'application/xhtml+xml')
60
+ # @manifest_items << manifest_item
61
+ # @spine_items << manifest_item
62
+ #end
64
63
 
65
64
  def to_xml
66
65
  out = ''
67
- builder = Builder::XmlMarkup.new(:target => out, :indent => 4)
66
+ builder = Builder::XmlMarkup.new(:target => out)
68
67
  builder.instruct!
69
68
  builder.package :xmlns => "http://www.idpf.org/2007/opf",
70
69
  'unique-identifier' => "dcidid",
@@ -83,7 +82,7 @@ module Repub
83
82
  end
84
83
 
85
84
  private
86
-
85
+
87
86
  def metadata_to_xml(builder)
88
87
  builder.metadata 'xmlns:dc' => "http://purl.org/dc/elements/1.1/",
89
88
  'xmlns:dcterms' => "http://purl.org/dc/terms/",
@@ -129,6 +128,32 @@ module Repub
129
128
  :href,
130
129
  :media_type
131
130
  )
131
+
132
+ def initialize(id, href)
133
+ super(id, href)
134
+ self.media_type = case href.strip.downcase
135
+ when /.*\.html?$/
136
+ 'application/xhtml+xml'
137
+ when /.*\.css$/
138
+ 'text/css'
139
+ when /.*\.(jpeg|jpg)$/
140
+ 'image/jpeg'
141
+ when /.*\.png$/
142
+ 'image/png'
143
+ when /.*\.gif$/
144
+ 'image/gif'
145
+ when /.*\.svg$/
146
+ 'image/svg+xml'
147
+ when /.*\.ncx$/
148
+ 'application/x-dtbncx+xml'
149
+ else
150
+ raise 'Unknown media type'
151
+ end
152
+ end
153
+
154
+ def document?
155
+ self.media_type == 'application/xhtml+xml'
156
+ end
132
157
  end
133
158
 
134
159
  def manifest_to_xml(manifest_items, builder)
@@ -1,139 +1,139 @@
1
- require 'rubygems'
2
- require 'builder'
3
-
4
- module Repub
5
- module Epub
6
-
7
- class Toc
8
-
9
- def initialize(uid)
10
- @head = Head.new(uid)
11
- @doc_title = DocTitle.new('Untitled')
12
- @nav_map = NavMap.new
13
- end
14
-
15
- def title
16
- @doc_title.text
17
- end
18
-
19
- def title=(text)
20
- @doc_title = DocTitle.new(text)
21
- end
22
-
23
- attr_reader :nav_map
24
-
25
- def to_xml
26
- out = ''
27
- builder = Builder::XmlMarkup.new(:target => out, :indent => 4)
28
- builder.instruct!
29
- builder.declare! :DOCTYPE, :ncx, :PUBLIC, "-//NISO//DTD ncx 2005-1//EN", "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd"
30
- builder.ncx :xmlns => "http://www.daisy.org/z3986/2005/ncx/", :version => "2005-1" do
31
- @nav_map.calc_depth_and_play_order
32
- @head.depth = @nav_map.depth
33
- @head.to_xml(builder)
34
- @doc_title.to_xml(builder)
35
- @nav_map.to_xml(builder)
36
- end
37
- out
38
- end
39
-
40
- def save(path = 'toc.ncx')
41
- File.open(path, 'w') do |f|
42
- f << to_xml
43
- end
44
- end
45
-
46
- class Head < Struct.new(
47
- :uid
48
- )
49
-
50
- attr_accessor :depth
51
-
52
- def to_xml(builder)
53
- builder.head do
54
- builder.meta :name => "dtb:uid", :content => self.uid
55
- builder.meta :name => "dtb:depth", :content => @depth
56
- builder.meta :name => "dtb:totalPageCount", :content => 0
57
- builder.meta :name => "dtb:dtb:maxPageNumber", :content => 0
58
- end
59
- end
60
- end
61
-
62
- class DocTitle < Struct.new(
63
- :text
64
- )
65
-
66
- def to_xml(builder)
67
- builder.docTitle do
68
- builder.text self.text
69
- end
70
- end
71
- end
72
-
73
- class NavMap
74
- class NavPoint < Struct.new(
75
- :title,
76
- :src
77
- )
78
-
79
- def initialize(title, src)
80
- super
81
- @@last_play_order = 0
82
- @play_order = 0
83
- @child_points = []
84
- end
85
-
86
- def add_nav_point(title, src)
87
- nav_point = NavPoint.new(title, src)
88
- @child_points << nav_point
89
- nav_point
90
- end
91
-
92
- def to_xml(builder)
93
- builder.navPoint :id => "navPoint-#{@play_order}", :playOrder => @play_order do
94
- builder.navLabel do
95
- builder.text self.title
96
- end
97
- builder.content :src => self.src
98
- @child_points.each { |child_point| child_point.to_xml(builder) }
99
- end
100
- end
101
-
102
- def calc_depth_and_play_order(nav_map, depth)
103
- nav_map.depth = depth
104
- @play_order = @@last_play_order += 1
105
- @child_points.each { |child_point| child_point.calc_depth_and_play_order(nav_map, depth + 1) }
106
- end
107
- end
108
-
109
- def initialize
110
- @nav_points = []
111
- @depth = 1
112
- end
113
-
114
- def add_nav_point(title, src)
115
- nav_point = NavPoint.new(title, src)
116
- @nav_points << nav_point
117
- nav_point
118
- end
119
-
120
- attr_reader :depth
121
-
122
- def depth=(value)
123
- @depth = value if value > @depth
124
- end
125
-
126
- def calc_depth_and_play_order
127
- @nav_points.each { |nav_point| nav_point.calc_depth_and_play_order(self, 1) }
128
- end
129
-
130
- def to_xml(builder)
131
- builder.navMap do
132
- @nav_points.each { |nav_point| nav_point.to_xml(builder) }
133
- end
134
- end
135
- end
136
- end
137
-
138
- end
139
- end
1
+ require 'rubygems'
2
+ require 'builder'
3
+
4
+ module Repub
5
+ module Epub
6
+
7
+ class Toc
8
+
9
+ def initialize(uid)
10
+ @head = Head.new(uid)
11
+ @doc_title = DocTitle.new('Untitled')
12
+ @nav_map = NavMap.new
13
+ end
14
+
15
+ def title
16
+ @doc_title.text
17
+ end
18
+
19
+ def title=(text)
20
+ @doc_title = DocTitle.new(text)
21
+ end
22
+
23
+ attr_reader :nav_map
24
+
25
+ def to_xml
26
+ out = ''
27
+ builder = Builder::XmlMarkup.new(:target => out)
28
+ builder.instruct!
29
+ builder.declare! :DOCTYPE, :ncx, :PUBLIC, "-//NISO//DTD ncx 2005-1//EN", "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd"
30
+ builder.ncx :xmlns => "http://www.daisy.org/z3986/2005/ncx/", :version => "2005-1" do
31
+ @nav_map.calc_depth_and_play_order
32
+ @head.depth = @nav_map.depth
33
+ @head.to_xml(builder)
34
+ @doc_title.to_xml(builder)
35
+ @nav_map.to_xml(builder)
36
+ end
37
+ out
38
+ end
39
+
40
+ def save(path = 'toc.ncx')
41
+ File.open(path, 'w') do |f|
42
+ f << to_xml
43
+ end
44
+ end
45
+
46
+ class Head < Struct.new(
47
+ :uid
48
+ )
49
+
50
+ attr_accessor :depth
51
+
52
+ def to_xml(builder)
53
+ builder.head do
54
+ builder.meta :name => "dtb:uid", :content => self.uid
55
+ builder.meta :name => "dtb:depth", :content => @depth
56
+ builder.meta :name => "dtb:totalPageCount", :content => 0
57
+ builder.meta :name => "dtb:maxPageNumber", :content => 0
58
+ end
59
+ end
60
+ end
61
+
62
+ class DocTitle < Struct.new(
63
+ :text
64
+ )
65
+
66
+ def to_xml(builder)
67
+ builder.docTitle do
68
+ builder.text self.text
69
+ end
70
+ end
71
+ end
72
+
73
+ class NavMap
74
+ class NavPoint < Struct.new(
75
+ :title,
76
+ :src
77
+ )
78
+
79
+ def initialize(title, src)
80
+ super
81
+ @@last_play_order = 0
82
+ @play_order = 0
83
+ @child_points = []
84
+ end
85
+
86
+ def add_nav_point(title, src)
87
+ nav_point = NavPoint.new(title, src)
88
+ @child_points << nav_point
89
+ nav_point
90
+ end
91
+
92
+ def to_xml(builder)
93
+ builder.navPoint :id => "navPoint-#{@play_order}", :playOrder => @play_order do
94
+ builder.navLabel do
95
+ builder.text self.title
96
+ end
97
+ builder.content :src => self.src
98
+ @child_points.each { |child_point| child_point.to_xml(builder) }
99
+ end
100
+ end
101
+
102
+ def calc_depth_and_play_order(nav_map, depth)
103
+ nav_map.depth = depth
104
+ @play_order = @@last_play_order += 1
105
+ @child_points.each { |child_point| child_point.calc_depth_and_play_order(nav_map, depth + 1) }
106
+ end
107
+ end
108
+
109
+ def initialize
110
+ @nav_points = []
111
+ @depth = 1
112
+ end
113
+
114
+ def add_nav_point(title, src)
115
+ nav_point = NavPoint.new(title, src)
116
+ @nav_points << nav_point
117
+ nav_point
118
+ end
119
+
120
+ attr_reader :depth
121
+
122
+ def depth=(value)
123
+ @depth = value if value > @depth
124
+ end
125
+
126
+ def calc_depth_and_play_order
127
+ @nav_points.each { |nav_point| nav_point.calc_depth_and_play_order(self, 1) }
128
+ end
129
+
130
+ def to_xml(builder)
131
+ builder.navMap do
132
+ @nav_points.each { |nav_point| nav_point.to_xml(builder) }
133
+ end
134
+ end
135
+ end
136
+ end
137
+
138
+ end
139
+ end