ebps 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +3 -0
- data/InstalledFiles +36 -0
- data/LICENSE.txt +339 -0
- data/Manifest.txt +56 -0
- data/README.txt +28 -0
- data/Rakefile +28 -0
- data/SetupConfig +30 -0
- data/bin/ebps +86 -0
- data/example/config.yml +12 -0
- data/example/converter_for_firefox.rb +59 -0
- data/example/data.yml +60 -0
- data/example/example.sh +3 -0
- data/example/sample.epub +0 -0
- data/lib/ebps.rb +5 -0
- data/lib/ebps/config.rb +61 -0
- data/lib/ebps/conversion/de_fachinfo_yaml.rb +81 -0
- data/lib/ebps/conversion/epub.rb +38 -0
- data/lib/ebps/conversion/fachinfo_xml.rb +170 -0
- data/lib/ebps/conversion/fachinfo_yaml.rb +113 -0
- data/lib/ebps/conversion/import_module_sample.rb +86 -0
- data/lib/ebps/conversion/mobi_pocket.rb +30 -0
- data/lib/ebps/conversion/oebps.rb +537 -0
- data/lib/ebps/conversion/patinfo_yaml.rb +107 -0
- data/lib/ebps/data/default_cover.jpg +0 -0
- data/lib/ebps/data/stylesheet.css +16 -0
- data/lib/ebps/postprocess/bookworm.rb +16 -0
- data/lib/ebps/postprocess/copy.rb +28 -0
- data/lib/ebps/postprocess/system_call.rb +18 -0
- data/lib/ebps/preprocess/copy.rb +28 -0
- data/lib/ebps/preprocess/system_call.rb +18 -0
- data/lib/ebps/text/chapter.rb +36 -0
- data/lib/ebps/text/document.rb +36 -0
- data/lib/ebps/text/format.rb +34 -0
- data/lib/ebps/text/paragraph.rb +63 -0
- data/lib/ebps/text/picture.rb +41 -0
- data/lib/ebps/text/table.rb +65 -0
- data/lib/ebps/util/mail.rb +47 -0
- data/lib/ebps/util/smtp_tls.rb +62 -0
- data/spec/conversion/data/DF_15164_1_3.gif +0 -0
- data/spec/conversion/data/DF_15164_2_3.gif +0 -0
- data/spec/conversion/data/appendix.png +0 -0
- data/spec/conversion/data/fachinfo.xml +1151 -0
- data/spec/conversion/data/fachinfo.yaml +1214 -0
- data/spec/conversion/data/fachinfo_with_image.xml +334 -0
- data/spec/conversion/data/fachinfo_with_table.xml +1101 -0
- data/spec/conversion/data/fachinfos.de.oddb.yaml +5789 -0
- data/spec/conversion/data/images/5c/5c54d52c8132230e8c40c37a428fe761.png +0 -0
- data/spec/conversion/de_fachinfo_yaml_spec.rb +86 -0
- data/spec/conversion/epub_spec.rb +59 -0
- data/spec/conversion/fachinfo_xml_spec.rb +245 -0
- data/spec/conversion/fachinfo_yaml_spec.rb +52 -0
- data/spec/conversion/mobi_pocket_spec.rb +55 -0
- data/spec/conversion/oebps_spec.rb +555 -0
- data/spec/text/chapter_spec.rb +65 -0
- data/spec/text/document_spec.rb +78 -0
- data/spec/text/paragraph_spec.rb +77 -0
- metadata +145 -0
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
|
6
|
+
# Hoe.plugin :compiler
|
7
|
+
# Hoe.plugin :cucumberfeatures
|
8
|
+
# Hoe.plugin :gem_prelude_sucks
|
9
|
+
# Hoe.plugin :inline
|
10
|
+
# Hoe.plugin :inline
|
11
|
+
# Hoe.plugin :manifest
|
12
|
+
# Hoe.plugin :newgem
|
13
|
+
# Hoe.plugin :racc
|
14
|
+
# Hoe.plugin :rubyforge
|
15
|
+
# Hoe.plugin :rubyforge
|
16
|
+
# Hoe.plugin :website
|
17
|
+
|
18
|
+
Hoe.spec 'ebps' do
|
19
|
+
# HEY! If you fill these out in ~/.hoe_template/Rakefile.erb then
|
20
|
+
# you'll never have to touch them again!
|
21
|
+
# (delete this comment too, of course)
|
22
|
+
|
23
|
+
developer('Masaomi Hatakeyama, Zeno R.R. Davatz', 'mhatakeyama@ywesee.com, zdavatz@ywesee.com')
|
24
|
+
|
25
|
+
# self.rubyforge_name = 'ebpsx' # if different than 'ebps'
|
26
|
+
end
|
27
|
+
|
28
|
+
# vim: syntax=ruby
|
data/SetupConfig
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
---
|
2
|
+
install_prefix:
|
3
|
+
localstatedir: /var/lib
|
4
|
+
prefix: /usr
|
5
|
+
rubyprog: /usr/bin/ruby18
|
6
|
+
rubypath: /usr/bin/ruby18
|
7
|
+
siterubyverarch: /usr/lib/ruby/site_ruby/1.8/i686-linux
|
8
|
+
no_ext: false
|
9
|
+
no_ri: true
|
10
|
+
extconfopt: ""
|
11
|
+
type: site
|
12
|
+
no_doc: false
|
13
|
+
librubyverarch: /usr/lib/ruby/1.8/i686-linux
|
14
|
+
installdirs: site
|
15
|
+
no_test: true
|
16
|
+
siteruby: /usr/lib/ruby/site_ruby
|
17
|
+
root:
|
18
|
+
siterubyver: /usr/lib/ruby/site_ruby/1.8
|
19
|
+
sysconfdir: /etc
|
20
|
+
rbdir: /usr/lib/ruby/site_ruby/1.8
|
21
|
+
datadir: /usr/share
|
22
|
+
shebang: ruby
|
23
|
+
makeprog: make
|
24
|
+
librubyver: /usr/lib/ruby/1.8
|
25
|
+
mandir: /usr/share/man
|
26
|
+
libdir: /usr/lib
|
27
|
+
libruby: /usr/lib/ruby
|
28
|
+
sodir: /usr/lib/ruby/site_ruby/1.8/i686-linux
|
29
|
+
docdir: /usr/share/doc
|
30
|
+
bindir: /usr/bin
|
data/bin/ebps
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
log = []
|
4
|
+
|
5
|
+
if RUBY_VERSION < '1.9'
|
6
|
+
warning = <<-EOS
|
7
|
+
#$0 is designed to run on Ruby 1.9 and higher.
|
8
|
+
Running on Ruby #{RUBY_VERSION} may result in unexpected results or errors,
|
9
|
+
particularly in the handling of multibyte characters.
|
10
|
+
EOS
|
11
|
+
log.push "Warning: " << warning
|
12
|
+
warn warning
|
13
|
+
end
|
14
|
+
|
15
|
+
$: << File.expand_path('../lib', File.dirname(__FILE__))
|
16
|
+
|
17
|
+
require 'ebps'
|
18
|
+
require 'ebps/util/mail'
|
19
|
+
|
20
|
+
def identify_module namespace, name
|
21
|
+
module_name = name.gsub /(^|_)./ do |match| match.upcase.delete '_' end
|
22
|
+
namespace.const_get module_name
|
23
|
+
end
|
24
|
+
|
25
|
+
begin
|
26
|
+
|
27
|
+
import_from = EBPS.config.import_from
|
28
|
+
export_to = EBPS.config.export_to
|
29
|
+
require "ebps/conversion/#{import_from}"
|
30
|
+
require "ebps/conversion/#{export_to}"
|
31
|
+
|
32
|
+
EBPS.config.preprocess.each do |name, data|
|
33
|
+
require "ebps/preprocess/#{name}"
|
34
|
+
result = identify_module(EBPS::Preprocess, name).preprocess(data)
|
35
|
+
log.push sprintf('Preprocess: %s', result)
|
36
|
+
end
|
37
|
+
|
38
|
+
importer = identify_module EBPS::Conversion, import_from
|
39
|
+
exporter = identify_module EBPS::Conversion, export_to
|
40
|
+
|
41
|
+
model = []
|
42
|
+
source_path = EBPS.config.source
|
43
|
+
inputs = ""
|
44
|
+
if File.ftype(source_path) == 'directory'
|
45
|
+
inputs << "Input files for conversion:"
|
46
|
+
Dir.foreach(source_path) do |name|
|
47
|
+
path = File.join source_path, name
|
48
|
+
if File.ftype(path) == 'file'
|
49
|
+
inputs << "\n" << path
|
50
|
+
File.open(path) do |fh|
|
51
|
+
model.concat importer.import(fh, path)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
else
|
56
|
+
inputs << "Input file for conversion: " << source_path
|
57
|
+
source = File.open(source_path)
|
58
|
+
model = importer.import source, source_path
|
59
|
+
end
|
60
|
+
log.push inputs
|
61
|
+
|
62
|
+
EBPS.config.decorate.each do |path, name|
|
63
|
+
require path
|
64
|
+
decorator = identify_module(EBPS::Decorator, name)
|
65
|
+
model.each do |doc|
|
66
|
+
decorator.decorate(doc)
|
67
|
+
end
|
68
|
+
log.push sprintf('Decorate: %s.decorate', name)
|
69
|
+
end
|
70
|
+
|
71
|
+
target = EBPS.config.target
|
72
|
+
exporter.export model, target
|
73
|
+
|
74
|
+
log.push sprintf("The Ebook %s was generated and stored in %s",
|
75
|
+
File.basename(target), File.dirname(target))
|
76
|
+
|
77
|
+
EBPS.config.postprocess.each do |name, data|
|
78
|
+
require "ebps/postprocess/#{name}"
|
79
|
+
result = identify_module(EBPS::Postprocess, name).postprocess(data)
|
80
|
+
log.push sprintf('Postprocess: %s', result)
|
81
|
+
end
|
82
|
+
rescue StandardError => err
|
83
|
+
log.push err
|
84
|
+
ensure
|
85
|
+
EBPS::Util::Mail.notify log
|
86
|
+
end
|
data/example/config.yml
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
---
|
2
|
+
smtp_server: smtp_server
|
3
|
+
smtp_user: username@domain
|
4
|
+
smtp_pass: 'password'
|
5
|
+
report_to:
|
6
|
+
- email_address
|
7
|
+
source: ./data.yml
|
8
|
+
target: ./sample.epub
|
9
|
+
import_from: import_module_sample
|
10
|
+
export_to: epub
|
11
|
+
language: de
|
12
|
+
title: Firmenliste Schweiz
|
@@ -0,0 +1,59 @@
|
|
1
|
+
#!/usr/bin/env ruby19
|
2
|
+
|
3
|
+
$: << File.expand_path('../lib', File.dirname(__FILE__))
|
4
|
+
|
5
|
+
require 'ebps'
|
6
|
+
require 'ebps/util/mail'
|
7
|
+
|
8
|
+
def identify_module namespace, name
|
9
|
+
module_name = name.gsub /(^|_)./ do |match| match.upcase.delete '_' end
|
10
|
+
namespace.const_get module_name
|
11
|
+
end
|
12
|
+
|
13
|
+
begin
|
14
|
+
|
15
|
+
log = []
|
16
|
+
|
17
|
+
# Read modules
|
18
|
+
import_from = EBPS.config.import_from
|
19
|
+
export_to = EBPS.config.export_to
|
20
|
+
require "ebps/conversion/#{import_from}"
|
21
|
+
require "ebps/conversion/#{export_to}"
|
22
|
+
|
23
|
+
importer = identify_module EBPS::Conversion, import_from
|
24
|
+
exporter = identify_module EBPS::Conversion, export_to
|
25
|
+
|
26
|
+
# Import process
|
27
|
+
model = []
|
28
|
+
source_path = EBPS.config.source
|
29
|
+
inputs = ""
|
30
|
+
if File.ftype(source_path) == 'directory'
|
31
|
+
inputs << "Input files for conversion:"
|
32
|
+
Dir.foreach(source_path) do |name|
|
33
|
+
path = File.join source_path, name
|
34
|
+
if File.ftype(path) == 'file'
|
35
|
+
inputs << "\n" << path
|
36
|
+
File.open(path) do |fh|
|
37
|
+
model.concat importer.import(fh, path)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
else
|
42
|
+
inputs << "Input file for conversion: " << source_path
|
43
|
+
source = File.open(source_path)
|
44
|
+
model = importer.import source, source_path
|
45
|
+
end
|
46
|
+
log.push inputs
|
47
|
+
|
48
|
+
# Export process
|
49
|
+
target = EBPS.config.target
|
50
|
+
exporter.export model, target
|
51
|
+
|
52
|
+
log.push sprintf("The Ebook %s was generated and stored in %s",
|
53
|
+
File.basename(target), File.dirname(target))
|
54
|
+
|
55
|
+
rescue StandardError => err
|
56
|
+
log.push err
|
57
|
+
ensure
|
58
|
+
EBPS::Util::Mail.notify log
|
59
|
+
end
|
data/example/data.yml
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
--- !ywesee,2010/CompanyInfo
|
2
|
+
oid: 123456789
|
3
|
+
descriptions: !ywesee,2010/SimpleLanguage::Descriptions
|
4
|
+
de: !ywesee,2010/CompanyInfo2010
|
5
|
+
name: ywesee GmbH
|
6
|
+
short_description: !ywesee,2010/Text::Chapter
|
7
|
+
heading: ywesee - intellectual capital connected
|
8
|
+
sections: []
|
9
|
+
|
10
|
+
general_information: !ywesee,2010/Text::Chapter
|
11
|
+
heading: About ywesee GmbH
|
12
|
+
sections:
|
13
|
+
- !ywesee,2010/Text::Section
|
14
|
+
subheading: ""
|
15
|
+
paragraphs:
|
16
|
+
- !ywesee,2010/Text::Paragraph
|
17
|
+
formats:
|
18
|
+
- !ywesee,2010/Text::Format
|
19
|
+
values:
|
20
|
+
- :italic
|
21
|
+
start: 0
|
22
|
+
end: 9
|
23
|
+
- !ywesee,2010/Text::Format
|
24
|
+
values: []
|
25
|
+
|
26
|
+
start: 10
|
27
|
+
end: -1
|
28
|
+
text: "ywesee GmbH is an OpenSource Software company with a bias for OpenStandards and a dedicated focus on the HealthCare industry."
|
29
|
+
preformatted: false
|
30
|
+
- !ywesee,2010/Text::Paragraph
|
31
|
+
formats:
|
32
|
+
- !ywesee,2010/Text::Format
|
33
|
+
values:
|
34
|
+
- :italic
|
35
|
+
start: 0
|
36
|
+
end: 11
|
37
|
+
- !ywesee,2010/Text::Format
|
38
|
+
values: []
|
39
|
+
|
40
|
+
start: 12
|
41
|
+
end: -1
|
42
|
+
text: "Web site: http://www.ywesee.com"
|
43
|
+
preformatted: false
|
44
|
+
address_form: !ywesee,2010/Text::Chapter
|
45
|
+
heading: Kontakt zu ywesee
|
46
|
+
sections:
|
47
|
+
- !ywesee,2010/Text::Section
|
48
|
+
subheading: "Address"
|
49
|
+
paragraphs:
|
50
|
+
- !ywesee,2010/Text::Paragraph
|
51
|
+
formats:
|
52
|
+
- !ywesee,2010/Text::Format
|
53
|
+
values: []
|
54
|
+
|
55
|
+
start: 0
|
56
|
+
end: -1
|
57
|
+
text: "Winterthurerstrasse 52, 8006 Zürich, Schweiz."
|
58
|
+
preformatted: false
|
59
|
+
|
60
|
+
|
data/example/example.sh
ADDED
data/example/sample.epub
ADDED
Binary file
|
data/lib/ebps.rb
ADDED
data/lib/ebps/config.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'rclconf'
|
2
|
+
|
3
|
+
module EBPS
|
4
|
+
run_as = File.basename $0
|
5
|
+
default_config_files = [
|
6
|
+
"/etc/ebps/#{run_as}.yml",
|
7
|
+
'/etc/ebps/ebps.yml',
|
8
|
+
]
|
9
|
+
defaults = {
|
10
|
+
'config' => default_config_files,
|
11
|
+
'log_level' => 'INFO',
|
12
|
+
## interesting configuration values start here
|
13
|
+
'appendix' => nil,
|
14
|
+
'author' => nil,
|
15
|
+
'content_title' => nil,
|
16
|
+
'cover' => File.expand_path('data/default_cover.jpg', File.dirname(__FILE__)),
|
17
|
+
'decorate' => [],
|
18
|
+
'export_to' => nil,
|
19
|
+
'guide_index' => 'Index',
|
20
|
+
'html_index' => true,
|
21
|
+
'image_prefix' => '',
|
22
|
+
'image_suffix' => '',
|
23
|
+
'image_format' => 'gif',
|
24
|
+
'import_from' => nil,
|
25
|
+
'index_name' => 'Index',
|
26
|
+
'keep_tmpfiles' => false,
|
27
|
+
'kindlegen_args' => '-c2 -nomin -unicode',
|
28
|
+
'kindlegen_path' => 'kindlegen',
|
29
|
+
'kindle_quirks' => false,
|
30
|
+
'language' => nil,
|
31
|
+
'link_drug_brand_name' => false,
|
32
|
+
'max_depth' => 3,
|
33
|
+
'name' => 'ebps',
|
34
|
+
'preprocess' => {},
|
35
|
+
'postprocess' => {},
|
36
|
+
'report_from' => 'EBPS <ebps@ywesee.com>',
|
37
|
+
'report_subject' => 'Ebook %s finished at %s',
|
38
|
+
'report_subject_err'=> 'Ebook %s could not be completed (%s)',
|
39
|
+
'report_time_format'=> '%d.%m.%Y %H:%M:%S',
|
40
|
+
'report_to' => [],
|
41
|
+
'smtp_authtype' => :plain,
|
42
|
+
'smtp_domain' => 'ywesee.com',
|
43
|
+
'smtp_pass' => nil,
|
44
|
+
'smtp_port' => 587,
|
45
|
+
'smtp_server' => 'mail.ywesee.com',
|
46
|
+
'smtp_user' => nil,
|
47
|
+
'sort' => true,
|
48
|
+
'source' => nil,
|
49
|
+
'stylesheet' => File.expand_path('data/stylesheet.css', File.dirname(__FILE__)),
|
50
|
+
'target' => nil,
|
51
|
+
'title' => nil,
|
52
|
+
'xml_indent' => nil,
|
53
|
+
}
|
54
|
+
|
55
|
+
config = RCLConf::RCLConf.new(ARGV, defaults)
|
56
|
+
config.load(config.config)
|
57
|
+
@config = config
|
58
|
+
def self.config
|
59
|
+
@config
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'ebps/text/document'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module EBPS
|
5
|
+
YAML.add_domain_type 'de.oddb.org,2007',
|
6
|
+
'ODDB::Util::M10lDocument' do |type, val|
|
7
|
+
if descr = val['canonical']
|
8
|
+
descr[EBPS.config.language.to_sym]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
YAML.add_domain_type 'de.oddb.org,2007', 'ODDB::Text::Document' do |type, val|
|
12
|
+
doc = Text::Document.new
|
13
|
+
doc.title << val['title'].to_s.strip
|
14
|
+
val['chapters'].each do |chapter|
|
15
|
+
doc.add_chapter chapter
|
16
|
+
end
|
17
|
+
doc
|
18
|
+
end
|
19
|
+
YAML.add_domain_type 'de.oddb.org,2007', 'ODDB::Text::Chapter' do |type, val|
|
20
|
+
pars = val['paragraphs']
|
21
|
+
chp = Text::Chapter.new
|
22
|
+
if (heading = pars.first) && heading.respond_to?(:text)
|
23
|
+
pars.shift
|
24
|
+
chp.heading << heading.text
|
25
|
+
end
|
26
|
+
chp.paragraphs.concat pars
|
27
|
+
chp
|
28
|
+
end
|
29
|
+
YAML.add_domain_type 'de.oddb.org,2007', 'ODDB::Text::Paragraph' do |type, val|
|
30
|
+
fmts = val['formats']
|
31
|
+
par = if fmts.size == 1 && fmts.first.values.include?('i')
|
32
|
+
Text::Subheading.new
|
33
|
+
else
|
34
|
+
Text::Paragraph.new
|
35
|
+
end
|
36
|
+
par << val['text']
|
37
|
+
par.formats.replace fmts
|
38
|
+
par
|
39
|
+
end
|
40
|
+
YAML.add_domain_type 'de.oddb.org,2007', 'ODDB::Text::Format' do |type, val|
|
41
|
+
fmt = Text::Format.new
|
42
|
+
fmt.values = val['values']
|
43
|
+
fmt.start = val['start']
|
44
|
+
fmt.end = val['end']
|
45
|
+
fmt
|
46
|
+
end
|
47
|
+
YAML.add_domain_type 'de.oddb.org,2007', 'ODDB::Text::Table' do |type, val|
|
48
|
+
table = Text::Table.new
|
49
|
+
table.rows.replace val['rows']
|
50
|
+
table
|
51
|
+
end
|
52
|
+
YAML.add_domain_type 'de.oddb.org,2007', 'ODDB::Text::Picture' do |type, val|
|
53
|
+
path = File.join EBPS.config.image_prefix, val['path']
|
54
|
+
file = File.basename path
|
55
|
+
handle = nil
|
56
|
+
begin
|
57
|
+
handle = open path
|
58
|
+
picture = Text::Picture.new
|
59
|
+
picture << handle.read
|
60
|
+
picture
|
61
|
+
rescue StandardError => e
|
62
|
+
par = Text::Paragraph.new
|
63
|
+
par << e.message
|
64
|
+
par
|
65
|
+
end
|
66
|
+
end
|
67
|
+
module Conversion
|
68
|
+
module DeFachinfoYaml
|
69
|
+
def self.import string_or_io, path=nil
|
70
|
+
collection = {}
|
71
|
+
YAML.each_document string_or_io do |doc|
|
72
|
+
if doc
|
73
|
+
collection.store Digest::MD5.hexdigest(doc.to_s), doc
|
74
|
+
end
|
75
|
+
end
|
76
|
+
## apparently we have some nil-values here (?)
|
77
|
+
collection.values.compact
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# - encoding: utf-8
|
2
|
+
require 'builder'
|
3
|
+
require 'ebps/conversion/oebps'
|
4
|
+
require 'zip/zip'
|
5
|
+
|
6
|
+
module EBPS
|
7
|
+
module Conversion
|
8
|
+
module Epub
|
9
|
+
def self.compile_epub target, tmpdir, name
|
10
|
+
Zip::ZipOutputStream.open(target) do |zh|
|
11
|
+
zh.put_next_entry('mimetype', nil, nil, Zip::ZipEntry::STORED)
|
12
|
+
zh << 'application/epub+zip'
|
13
|
+
zh.put_next_entry('META-INF/container.xml')
|
14
|
+
zh << <<-EOS
|
15
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
16
|
+
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
|
17
|
+
<rootfiles>
|
18
|
+
<rootfile full-path="OPS/#{name}" media-type="application/oebps-package+xml"/>
|
19
|
+
</rootfiles>
|
20
|
+
</container>
|
21
|
+
EOS
|
22
|
+
Dir.foreach(tmpdir) do |entry|
|
23
|
+
path = File.join tmpdir, entry
|
24
|
+
if File.ftype(path) == 'file'
|
25
|
+
zh.put_next_entry("OPS/#{entry}")
|
26
|
+
zh << File.read(path)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
def self.export docs, target, override_tmpdir=nil
|
32
|
+
Oebps.export docs, target, override_tmpdir do |tmpdir, name|
|
33
|
+
compile_epub target, tmpdir, name
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|