magicshelf 0.2.1
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/.gitignore +3 -0
- data/Gemfile +6 -0
- data/Procfile +4 -0
- data/README.md +38 -0
- data/Rakefile +16 -0
- data/bin/console +14 -0
- data/bin/magicconvert +40 -0
- data/bin/server +8 -0
- data/bin/setup +7 -0
- data/config.ru +6 -0
- data/lib/magicshelf.rb +33 -0
- data/lib/magicshelf/dirchanger.rb +22 -0
- data/lib/magicshelf/dirrenamer.rb +30 -0
- data/lib/magicshelf/dirstructureflattener.rb +25 -0
- data/lib/magicshelf/epubgenerator.rb +86 -0
- data/lib/magicshelf/exception.rb +4 -0
- data/lib/magicshelf/executionpipe.rb +105 -0
- data/lib/magicshelf/filecleaner.rb +19 -0
- data/lib/magicshelf/fileextractor.rb +48 -0
- data/lib/magicshelf/filemover.rb +24 -0
- data/lib/magicshelf/filenamevalidator.rb +31 -0
- data/lib/magicshelf/fileserver.rb +103 -0
- data/lib/magicshelf/kindlegenwrapper.rb +33 -0
- data/lib/magicshelf/kindlestrip.rb +250 -0
- data/lib/magicshelf/kindlestripper.rb +25 -0
- data/lib/magicshelf/makeitvertical.rb +41 -0
- data/lib/magicshelf/mobitask.rb +58 -0
- data/lib/magicshelf/tempdiropener.rb +18 -0
- data/lib/magicshelf/version.rb +3 -0
- data/magicshelf.gemspec +37 -0
- data/public/css/index.css +29 -0
- data/public/css/pure-min.css +11 -0
- data/server_config.yml.sample +2 -0
- data/views/generate_mobi.erb +62 -0
- data/views/index.erb +51 -0
- metadata +290 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'magicshelf/exception'
|
2
|
+
require 'magicshelf/kindlestrip'
|
3
|
+
|
4
|
+
module MagicShelf
|
5
|
+
class KindleStripperError < Error; end
|
6
|
+
|
7
|
+
class KindleStripper
|
8
|
+
attr_accessor :inputfile, :outputfile
|
9
|
+
|
10
|
+
def enter()
|
11
|
+
MagicShelf.logger.debug('enter KindleStripper')
|
12
|
+
|
13
|
+
# check parameters
|
14
|
+
raise MagicShelf::EpubGeneratorError.new("inputfile is not set") if @inputfile == nil
|
15
|
+
raise MagicShelf::EpubGeneratorError.new("outputfile is not set") if @outputfile == nil
|
16
|
+
|
17
|
+
yield
|
18
|
+
end
|
19
|
+
|
20
|
+
def process()
|
21
|
+
stripped_file = SectionStripper.strip(@inputfile, @outputfile)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'magicshelf/exception'
|
2
|
+
require 'rmagick'
|
3
|
+
|
4
|
+
module MagicShelf
|
5
|
+
class MakeItVerticalError < Error; end
|
6
|
+
|
7
|
+
class MakeItVertical
|
8
|
+
attr_accessor :workdir, :erase_original
|
9
|
+
def initialize()
|
10
|
+
@erase_original = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def enter()
|
14
|
+
yield
|
15
|
+
end
|
16
|
+
|
17
|
+
def process()
|
18
|
+
@workdir ||= Dir.pwd
|
19
|
+
Dir.glob(File.join(@workdir,'**/*')).select{|f|File.file?(f)}.each do |f|
|
20
|
+
begin
|
21
|
+
img = Magick::Image.read(f).first
|
22
|
+
rescue Magick::ImageMagickError, RuntimeError => ex
|
23
|
+
MagicShelf.logger.info("#{f} is not an image file. skipped.")
|
24
|
+
end
|
25
|
+
next if img.nil?
|
26
|
+
if img.columns > img.rows
|
27
|
+
img.rotate!(90)
|
28
|
+
newfile = File.join(File.dirname(f), File.basename(f,'.*') + '-rotate' + File.extname(f))
|
29
|
+
img.write(newfile)
|
30
|
+
MagicShelf.logger.info("#{f} is rotated and saved to #{newfile}.")
|
31
|
+
if @erase_original
|
32
|
+
FileUtils.remove(f)
|
33
|
+
MagicShelf.logger.info("#{f} is erased.")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'resque'
|
2
|
+
require 'redis'
|
3
|
+
require 'magicshelf'
|
4
|
+
require 'magicshelf/executionpipe'
|
5
|
+
|
6
|
+
module MagicShelf
|
7
|
+
module MobiTask
|
8
|
+
@queue = :default
|
9
|
+
|
10
|
+
# Runs a subprocess and applies handlers for stdout and stderr
|
11
|
+
# TODO make this function to a redis task and run it background
|
12
|
+
# Params:
|
13
|
+
# +inputfile+:: must be fullpath to the input file
|
14
|
+
# +title+:: book title
|
15
|
+
# +booktype+:: book type: must be one of ["comic", "novelimage", "novel", "ltr"]
|
16
|
+
# +outputfile+:: must be fullpath to the output file
|
17
|
+
def self.perform(params)
|
18
|
+
inputfile = params['inputfile']
|
19
|
+
title = params['title']
|
20
|
+
author = params['author']
|
21
|
+
booktype = params['booktype']
|
22
|
+
outputfile = params['outputfile']
|
23
|
+
MagicShelf.logger.info("generate_mobi with params: #{params}")
|
24
|
+
|
25
|
+
MagicShelf::ExecutionPipe.new.enter { |params,&block|
|
26
|
+
Dir.mktmpdir("magicshelf") do |dir|
|
27
|
+
params[:workdir] = dir
|
28
|
+
block.call
|
29
|
+
end
|
30
|
+
}.pipe(MagicShelf::FileExtractor.new,:workdir => [:destdir]) { |this|
|
31
|
+
this.inputfile = File.expand_path(inputfile)
|
32
|
+
}.enter(:destdir => [:workdir]) {|params, &block|
|
33
|
+
Dir.chdir(params[:workdir]) do
|
34
|
+
block.call
|
35
|
+
end
|
36
|
+
}.pipe(MagicShelf::DirRenamer.new, :workdir => [:workdir]) { |this|
|
37
|
+
}.pipe(MagicShelf::FileNameValidator.new, :workdir => [:workdir]) { |this|
|
38
|
+
}.pipe(MagicShelf::MakeItVertical.new, :workdir => [:workdir]) { |this|
|
39
|
+
}.pipe(MagicShelf::EpubGenerator.new, :workdir => [:workdir]) { |this|
|
40
|
+
this.title = title
|
41
|
+
this.creator = author
|
42
|
+
this.book_type = booktype
|
43
|
+
this.outputfile = 'test.epub'
|
44
|
+
}.pipe(MagicShelf::KindleGenWrapper.new, :outputfile => [:inputfile]) { |this|
|
45
|
+
this.outputfile = 'test.mobi'
|
46
|
+
}.process(:inputfile => [:file,:inputfile], :outputfile => [:outputfile]) { |params|
|
47
|
+
FileUtils.remove(params[:file])
|
48
|
+
}.pipe(MagicShelf::KindleStripper.new, :outputfile => [:inputfile]) { |this|
|
49
|
+
this.outputfile = File.expand_path('test_strip.mobi')
|
50
|
+
}.pipe(MagicShelf::FileCleaner.new, :inputfile => [:file], :outputfile => [:outputfile]) { |this|
|
51
|
+
}.pipe(MagicShelf::FileMover.new, :outputfile => [:inputfile]) { |this|
|
52
|
+
this.outputfile = File.expand_path(outputfile)
|
53
|
+
}.execute
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'magicshelf/exception'
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
module MagicShelf
|
5
|
+
class TempDirOpenerError < Error; end
|
6
|
+
|
7
|
+
class TempDirOpener
|
8
|
+
def enter
|
9
|
+
Dir.mktmpdir("magicshelf_tempdir") {|dir|
|
10
|
+
@workdir = dir
|
11
|
+
yield
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def process
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/magicshelf.gemspec
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'magicshelf/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "magicshelf"
|
8
|
+
spec.version = MagicShelf::VERSION
|
9
|
+
spec.authors = ["Shohei Fujii"]
|
10
|
+
spec.email = ["fujii.shohei@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Access and get your e-book from kindle anywhere}
|
13
|
+
spec.description = %q{zip/rar to mobi (via epub) converter and serve files from web interface}
|
14
|
+
spec.homepage = ""
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|sandbox|)/}) }
|
17
|
+
spec.bindir = "bin"
|
18
|
+
spec.executables = "magicconvert"
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.10"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
spec.add_development_dependency "pry"
|
24
|
+
spec.add_development_dependency "pry-doc"
|
25
|
+
spec.add_development_dependency "pry-rescue"
|
26
|
+
spec.add_development_dependency "shotgun"
|
27
|
+
spec.add_development_dependency "foreman"
|
28
|
+
spec.add_development_dependency "test-unit", "~> 3.1.2"
|
29
|
+
|
30
|
+
spec.add_dependency "gepub", '~> 0.7.0beta2'
|
31
|
+
spec.add_dependency "resque"
|
32
|
+
spec.add_dependency "ruby-filemagic"
|
33
|
+
spec.add_dependency "rubyzip"
|
34
|
+
spec.add_dependency "sinatra-contrib"
|
35
|
+
spec.add_dependency "naturally", '~> 1.4.0'
|
36
|
+
spec.add_dependency "rmagick"
|
37
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
div#page-title{
|
2
|
+
text-align: center;
|
3
|
+
}
|
4
|
+
div.sortby-selection-menu {
|
5
|
+
background-color: #000;
|
6
|
+
}
|
7
|
+
.pure-menu-link{
|
8
|
+
color: #eee;
|
9
|
+
}
|
10
|
+
|
11
|
+
table#file_list {
|
12
|
+
width: 100%;
|
13
|
+
}
|
14
|
+
.pure-table td, .pure-table th{
|
15
|
+
padding: .1em .1em .4em;
|
16
|
+
}
|
17
|
+
|
18
|
+
td#file {
|
19
|
+
width: 50%;
|
20
|
+
}
|
21
|
+
td#buttons {
|
22
|
+
width: 20%;
|
23
|
+
}
|
24
|
+
td#mtime {
|
25
|
+
width: 30%;
|
26
|
+
}
|
27
|
+
a.file-button {
|
28
|
+
padding: .2em .3em;
|
29
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
/*!
|
2
|
+
Pure v0.6.0
|
3
|
+
Copyright 2014 Yahoo! Inc. All rights reserved.
|
4
|
+
Licensed under the BSD License.
|
5
|
+
https://github.com/yahoo/pure/blob/master/LICENSE.md
|
6
|
+
*/
|
7
|
+
/*!
|
8
|
+
normalize.css v^3.0 | MIT License | git.io/normalize
|
9
|
+
Copyright (c) Nicolas Gallagher and Jonathan Neal
|
10
|
+
*/
|
11
|
+
/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.hidden,[hidden]{display:none!important}.pure-img{max-width:100%;height:auto;display:block}.pure-g{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,"Droid Sans",Helvetica,Arial,sans-serif;display:-webkit-flex;-webkit-flex-flow:row wrap;display:-ms-flexbox;-ms-flex-flow:row wrap;-ms-align-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class *="pure-u"]{font-family:sans-serif}.pure-u-1,.pure-u-1-1,.pure-u-1-2,.pure-u-1-3,.pure-u-2-3,.pure-u-1-4,.pure-u-3-4,.pure-u-1-5,.pure-u-2-5,.pure-u-3-5,.pure-u-4-5,.pure-u-5-5,.pure-u-1-6,.pure-u-5-6,.pure-u-1-8,.pure-u-3-8,.pure-u-5-8,.pure-u-7-8,.pure-u-1-12,.pure-u-5-12,.pure-u-7-12,.pure-u-11-12,.pure-u-1-24,.pure-u-2-24,.pure-u-3-24,.pure-u-4-24,.pure-u-5-24,.pure-u-6-24,.pure-u-7-24,.pure-u-8-24,.pure-u-9-24,.pure-u-10-24,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%;*width:4.1357%}.pure-u-1-12,.pure-u-2-24{width:8.3333%;*width:8.3023%}.pure-u-1-8,.pure-u-3-24{width:12.5%;*width:12.469%}.pure-u-1-6,.pure-u-4-24{width:16.6667%;*width:16.6357%}.pure-u-1-5{width:20%;*width:19.969%}.pure-u-5-24{width:20.8333%;*width:20.8023%}.pure-u-1-4,.pure-u-6-24{width:25%;*width:24.969%}.pure-u-7-24{width:29.1667%;*width:29.1357%}.pure-u-1-3,.pure-u-8-24{width:33.3333%;*width:33.3023%}.pure-u-3-8,.pure-u-9-24{width:37.5%;*width:37.469%}.pure-u-2-5{width:40%;*width:39.969%}.pure-u-5-12,.pure-u-10-24{width:41.6667%;*width:41.6357%}.pure-u-11-24{width:45.8333%;*width:45.8023%}.pure-u-1-2,.pure-u-12-24{width:50%;*width:49.969%}.pure-u-13-24{width:54.1667%;*width:54.1357%}.pure-u-7-12,.pure-u-14-24{width:58.3333%;*width:58.3023%}.pure-u-3-5{width:60%;*width:59.969%}.pure-u-5-8,.pure-u-15-24{width:62.5%;*width:62.469%}.pure-u-2-3,.pure-u-16-24{width:66.6667%;*width:66.6357%}.pure-u-17-24{width:70.8333%;*width:70.8023%}.pure-u-3-4,.pure-u-18-24{width:75%;*width:74.969%}.pure-u-19-24{width:79.1667%;*width:79.1357%}.pure-u-4-5{width:80%;*width:79.969%}.pure-u-5-6,.pure-u-20-24{width:83.3333%;*width:83.3023%}.pure-u-7-8,.pure-u-21-24{width:87.5%;*width:87.469%}.pure-u-11-12,.pure-u-22-24{width:91.6667%;*width:91.6357%}.pure-u-23-24{width:95.8333%;*width:95.8023%}.pure-u-1,.pure-u-1-1,.pure-u-5-5,.pure-u-24-24{width:100%}.pure-button{display:inline-block;zoom:1;line-height:normal;white-space:nowrap;vertical-align:middle;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button{font-family:inherit;font-size:100%;padding:.5em 1em;color:#444;color:rgba(0,0,0,.8);border:1px solid #999;border:0 rgba(0,0,0,0);background-color:#E6E6E6;text-decoration:none;border-radius:2px}.pure-button-hover,.pure-button:hover,.pure-button:focus{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#1a000000', GradientType=0);background-image:-webkit-gradient(linear,0 0,0 100%,from(transparent),color-stop(40%,rgba(0,0,0,.05)),to(rgba(0,0,0,.1)));background-image:-webkit-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:-moz-linear-gradient(top,rgba(0,0,0,.05) 0,rgba(0,0,0,.1));background-image:-o-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1))}.pure-button:focus{outline:0}.pure-button-active,.pure-button:active{box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset;border-color:#000\9}.pure-button[disabled],.pure-button-disabled,.pure-button-disabled:hover,.pure-button-disabled:focus,.pure-button-disabled:active{border:0;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);filter:alpha(opacity=40);-khtml-opacity:.4;-moz-opacity:.4;opacity:.4;cursor:not-allowed;box-shadow:none}.pure-button-hidden{display:none}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button-primary,.pure-button-selected,a.pure-button-primary,a.pure-button-selected{background-color:#0078e7;color:#fff}.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form select,.pure-form textarea{padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;vertical-align:middle;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-form input:not([type]){padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-form input[type=color]{padding:.2em .5em}.pure-form input[type=text]:focus,.pure-form input[type=password]:focus,.pure-form input[type=email]:focus,.pure-form input[type=url]:focus,.pure-form input[type=date]:focus,.pure-form input[type=month]:focus,.pure-form input[type=time]:focus,.pure-form input[type=datetime]:focus,.pure-form input[type=datetime-local]:focus,.pure-form input[type=week]:focus,.pure-form input[type=number]:focus,.pure-form input[type=search]:focus,.pure-form input[type=tel]:focus,.pure-form input[type=color]:focus,.pure-form select:focus,.pure-form textarea:focus{outline:0;border-color:#129FEA}.pure-form input:not([type]):focus{outline:0;border-color:#129FEA}.pure-form input[type=file]:focus,.pure-form input[type=radio]:focus,.pure-form input[type=checkbox]:focus{outline:thin solid #129FEA;outline:1px auto #129FEA}.pure-form .pure-checkbox,.pure-form .pure-radio{margin:.5em 0;display:block}.pure-form input[type=text][disabled],.pure-form input[type=password][disabled],.pure-form input[type=email][disabled],.pure-form input[type=url][disabled],.pure-form input[type=date][disabled],.pure-form input[type=month][disabled],.pure-form input[type=time][disabled],.pure-form input[type=datetime][disabled],.pure-form input[type=datetime-local][disabled],.pure-form input[type=week][disabled],.pure-form input[type=number][disabled],.pure-form input[type=search][disabled],.pure-form input[type=tel][disabled],.pure-form input[type=color][disabled],.pure-form select[disabled],.pure-form textarea[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input:not([type])[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input[readonly],.pure-form select[readonly],.pure-form textarea[readonly]{background-color:#eee;color:#777;border-color:#ccc}.pure-form input:focus:invalid,.pure-form textarea:focus:invalid,.pure-form select:focus:invalid{color:#b94a48;border-color:#e9322d}.pure-form input[type=file]:focus:invalid:focus,.pure-form input[type=radio]:focus:invalid:focus,.pure-form input[type=checkbox]:focus:invalid:focus{outline-color:#e9322d}.pure-form select{height:2.25em;border:1px solid #ccc;background-color:#fff}.pure-form select[multiple]{height:auto}.pure-form label{margin:.5em 0 .2em}.pure-form fieldset{margin:0;padding:.35em 0 .75em;border:0}.pure-form legend{display:block;width:100%;padding:.3em 0;margin-bottom:.3em;color:#333;border-bottom:1px solid #e5e5e5}.pure-form-stacked input[type=text],.pure-form-stacked input[type=password],.pure-form-stacked input[type=email],.pure-form-stacked input[type=url],.pure-form-stacked input[type=date],.pure-form-stacked input[type=month],.pure-form-stacked input[type=time],.pure-form-stacked input[type=datetime],.pure-form-stacked input[type=datetime-local],.pure-form-stacked input[type=week],.pure-form-stacked input[type=number],.pure-form-stacked input[type=search],.pure-form-stacked input[type=tel],.pure-form-stacked input[type=color],.pure-form-stacked input[type=file],.pure-form-stacked select,.pure-form-stacked label,.pure-form-stacked textarea{display:block;margin:.25em 0}.pure-form-stacked input:not([type]){display:block;margin:.25em 0}.pure-form-aligned input,.pure-form-aligned textarea,.pure-form-aligned select,.pure-form-aligned .pure-help-inline,.pure-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.pure-form-aligned textarea{vertical-align:top}.pure-form-aligned .pure-control-group{margin-bottom:.5em}.pure-form-aligned .pure-control-group label{text-align:right;display:inline-block;vertical-align:middle;width:10em;margin:0 1em 0 0}.pure-form-aligned .pure-controls{margin:1.5em 0 0 11em}.pure-form input.pure-input-rounded,.pure-form .pure-input-rounded{border-radius:2em;padding:.5em 1em}.pure-form .pure-group fieldset{margin-bottom:10px}.pure-form .pure-group input,.pure-form .pure-group textarea{display:block;padding:10px;margin:0 0 -1px;border-radius:0;position:relative;top:-1px}.pure-form .pure-group input:focus,.pure-form .pure-group textarea:focus{z-index:3}.pure-form .pure-group input:first-child,.pure-form .pure-group textarea:first-child{top:1px;border-radius:4px 4px 0 0;margin:0}.pure-form .pure-group input:first-child:last-child,.pure-form .pure-group textarea:first-child:last-child{top:1px;border-radius:4px;margin:0}.pure-form .pure-group input:last-child,.pure-form .pure-group textarea:last-child{top:-2px;border-radius:0 0 4px 4px;margin:0}.pure-form .pure-group button{margin:.35em 0}.pure-form .pure-input-1{width:100%}.pure-form .pure-input-2-3{width:66%}.pure-form .pure-input-1-2{width:50%}.pure-form .pure-input-1-3{width:33%}.pure-form .pure-input-1-4{width:25%}.pure-form .pure-help-inline,.pure-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:.875em}.pure-form-message{display:block;color:#666;font-size:.875em}@media only screen and (max-width :480px){.pure-form button[type=submit]{margin:.7em 0 0}.pure-form input:not([type]),.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form label{margin-bottom:.3em;display:block}.pure-group input:not([type]),.pure-group input[type=text],.pure-group input[type=password],.pure-group input[type=email],.pure-group input[type=url],.pure-group input[type=date],.pure-group input[type=month],.pure-group input[type=time],.pure-group input[type=datetime],.pure-group input[type=datetime-local],.pure-group input[type=week],.pure-group input[type=number],.pure-group input[type=search],.pure-group input[type=tel],.pure-group input[type=color]{margin-bottom:0}.pure-form-aligned .pure-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.pure-form-aligned .pure-controls{margin:1.5em 0 0}.pure-form .pure-help-inline,.pure-form-message-inline,.pure-form-message{display:block;font-size:.75em;padding:.2em 0 .8em}}.pure-menu{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:3}.pure-menu-list,.pure-menu-item{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%}.pure-menu-link,.pure-menu-heading{display:block;text-decoration:none;white-space:nowrap}.pure-menu-horizontal{width:100%;white-space:nowrap}.pure-menu-horizontal .pure-menu-list{display:inline-block}.pure-menu-horizontal .pure-menu-item,.pure-menu-horizontal .pure-menu-heading,.pure-menu-horizontal .pure-menu-separator{display:inline-block;*display:inline;zoom:1;vertical-align:middle}.pure-menu-item .pure-menu-item{display:block}.pure-menu-children{display:none;position:absolute;left:100%;top:0;margin:0;padding:0;z-index:3}.pure-menu-horizontal .pure-menu-children{left:0;top:auto;width:inherit}.pure-menu-allow-hover:hover>.pure-menu-children,.pure-menu-active>.pure-menu-children{display:block;position:absolute}.pure-menu-has-children>.pure-menu-link:after{padding-left:.5em;content:"\25B8";font-size:small}.pure-menu-horizontal .pure-menu-has-children>.pure-menu-link:after{content:"\25BE"}.pure-menu-scrollable{overflow-y:scroll;overflow-x:hidden}.pure-menu-scrollable .pure-menu-list{display:block}.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list{display:inline-block}.pure-menu-horizontal.pure-menu-scrollable{white-space:nowrap;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;padding:.5em 0}.pure-menu-horizontal.pure-menu-scrollable::-webkit-scrollbar{display:none}.pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-separator{width:1px;height:1.3em;margin:0 .3em}.pure-menu-heading{text-transform:uppercase;color:#565d64}.pure-menu-link{color:#777}.pure-menu-children{background-color:#fff}.pure-menu-link,.pure-menu-disabled,.pure-menu-heading{padding:.5em 1em}.pure-menu-disabled{opacity:.5}.pure-menu-disabled .pure-menu-link:hover{background-color:transparent}.pure-menu-active>.pure-menu-link,.pure-menu-link:hover,.pure-menu-link:focus{background-color:#eee}.pure-menu-selected .pure-menu-link,.pure-menu-selected .pure-menu-link:visited{color:#000}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table td:first-child,.pure-table th:first-child{border-left-width:0}.pure-table thead{background-color:#e0e0e0;color:#000;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td{background-color:#f2f2f2}.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child>td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child>td{border-bottom-width:0}
|
@@ -0,0 +1,62 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8">
|
5
|
+
<link rel="stylesheet" type="text/css" href="/css/pure-min.css">
|
6
|
+
<link rel="stylesheet" type="text/css" href="/css/index.css">
|
7
|
+
<title><%= page_title %></title>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
<form class="pure-form pure-form-aligned" method="post">
|
11
|
+
<fieldset>
|
12
|
+
<div class="pure-control-group">
|
13
|
+
<label for="inputfile">Input File</label>
|
14
|
+
<input id="inputfile" type="text" placeholder='<%= path %>' readonly>
|
15
|
+
</div>
|
16
|
+
<div class="pure-control-group">
|
17
|
+
<label for="title">Book Title</label>
|
18
|
+
<input id="title" name="title" type="text" placeholder="title" required>
|
19
|
+
</div>
|
20
|
+
|
21
|
+
<div class="pure-control-group">
|
22
|
+
<label for="author">Book Author</label>
|
23
|
+
<input id="author" name="author" type="text" placeholder="author">
|
24
|
+
</div>
|
25
|
+
|
26
|
+
<div class="pure-control-group">
|
27
|
+
<label for="outputfile">Output Filename (optional)</label>
|
28
|
+
<input id="outputfile" name="outputfile" type="text" placeholder="filename.mobi" value="">
|
29
|
+
</div>
|
30
|
+
|
31
|
+
<div class="pure-control-group">
|
32
|
+
<label for="booktype">Book Type</label>
|
33
|
+
<form class="pure-form">
|
34
|
+
<label for="booktype-comic" class="pure-radio">
|
35
|
+
<input id="booktype-comic" type="radio" name="booktype" value="comic" checked>
|
36
|
+
comic
|
37
|
+
</label>
|
38
|
+
|
39
|
+
<label for="booktype-novel" class="pure-radio">
|
40
|
+
<input id="booktype-novel" type="radio" name="booktype" value="novel">
|
41
|
+
novel
|
42
|
+
</label>
|
43
|
+
|
44
|
+
<label for="booktype-novelimage" class="pure-radio">
|
45
|
+
<input id="booktype-novelimage" type="radio" name="booktype" value="novelimage">
|
46
|
+
novelimage
|
47
|
+
</label>
|
48
|
+
|
49
|
+
<label for="booktype-ltr" class="pure-radio">
|
50
|
+
<input id="booktype-ltr" type="radio" name="booktype" value="ltr">
|
51
|
+
ltr
|
52
|
+
</label>
|
53
|
+
</form>
|
54
|
+
</div>
|
55
|
+
|
56
|
+
<div class="pure-controls">
|
57
|
+
<button type="submit" class="pure-button pure-button-primary">Generate Mobi</button>
|
58
|
+
</div>
|
59
|
+
</fieldset>
|
60
|
+
</form>
|
61
|
+
</body>
|
62
|
+
</html>
|
data/views/index.erb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8">
|
5
|
+
<link rel="stylesheet" type="text/css" href="/css/pure-min.css">
|
6
|
+
<link rel="stylesheet" type="text/css" href="/css/index.css">
|
7
|
+
<title><%= page_title %></title>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
<div id="page-title"><h2><%= page_title %></h2></div>
|
11
|
+
<div class="sortby-selection-menu pure-menu pure-menu-horizontal">
|
12
|
+
<ul class="pure-menu-list">
|
13
|
+
<li class="pure-menu-item"><a href="/files/<%= path %>?sort_by=title" class="pure-menu-link">Title</a></li>
|
14
|
+
<li class="pure-menu-item"><a href="/files/<%= path %>?sort_by=title_reverse" class="pure-menu-link">Title(reverse)</a></li>
|
15
|
+
<li class="pure-menu-item"><a href="/files/<%= path %>?sort_by=date" class="pure-menu-link">Date</a></li>
|
16
|
+
<li class="pure-menu-item"><a href="/files/<%= path %>?sort_by=date_reverse" class="pure-menu-link">Date(reverse)</a></li>
|
17
|
+
<% if upperpath %>
|
18
|
+
<li class="pure-menu-item">
|
19
|
+
<%= '<a href="/files/' + upperpath + '?sort_by=' + sort_type + '" class="pure-menu-link">../</a>' %>
|
20
|
+
</li>
|
21
|
+
<% end %>
|
22
|
+
</ul>
|
23
|
+
</div>
|
24
|
+
<table id="file_list" class="pure-table">
|
25
|
+
<thead>
|
26
|
+
<tr>
|
27
|
+
<td>File/Directory</td>
|
28
|
+
<td>Button</td>
|
29
|
+
<td>Last Modified</td>
|
30
|
+
</tr>
|
31
|
+
</thead>
|
32
|
+
<tbody>
|
33
|
+
<% files_withmtime.each_with_index do |(f, mtime),index| %>
|
34
|
+
<tr>
|
35
|
+
<% if File.file? f %>
|
36
|
+
<td class="file"><%= "<a href='/get_file/#{f}'>#{File.basename(f)}</a>" %></td>
|
37
|
+
<% else %>
|
38
|
+
<td class="directory"><%= "<a href='/files/#{f}?sort_by=#{sort_type}'>#{f}/</a>" %></td>
|
39
|
+
<% end %>
|
40
|
+
<td class='buttons'>
|
41
|
+
<%= "<a class='file-button pure-button' href='/generate_mobi/#{f}'>Generate</a>" %>
|
42
|
+
</td>
|
43
|
+
<td class="mtime"><%= mtime %></td>
|
44
|
+
</tr>
|
45
|
+
<% end %>
|
46
|
+
</tbody>
|
47
|
+
</table>
|
48
|
+
|
49
|
+
</body>
|
50
|
+
</html>
|
51
|
+
|
metadata
ADDED
@@ -0,0 +1,290 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: magicshelf
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Shohei Fujii
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-08-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.10'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.10'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry-doc
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry-rescue
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: shotgun
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: foreman
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: test-unit
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 3.1.2
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 3.1.2
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: gepub
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 0.7.0beta2
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 0.7.0beta2
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: resque
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: ruby-filemagic
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: rubyzip
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: sinatra-contrib
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :runtime
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: naturally
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - "~>"
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: 1.4.0
|
202
|
+
type: :runtime
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - "~>"
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: 1.4.0
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: rmagick
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - ">="
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '0'
|
216
|
+
type: :runtime
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - ">="
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '0'
|
223
|
+
description: zip/rar to mobi (via epub) converter and serve files from web interface
|
224
|
+
email:
|
225
|
+
- fujii.shohei@gmail.com
|
226
|
+
executables:
|
227
|
+
- magicconvert
|
228
|
+
extensions: []
|
229
|
+
extra_rdoc_files: []
|
230
|
+
files:
|
231
|
+
- ".gitignore"
|
232
|
+
- Gemfile
|
233
|
+
- Procfile
|
234
|
+
- README.md
|
235
|
+
- Rakefile
|
236
|
+
- bin/console
|
237
|
+
- bin/magicconvert
|
238
|
+
- bin/server
|
239
|
+
- bin/setup
|
240
|
+
- config.ru
|
241
|
+
- lib/magicshelf.rb
|
242
|
+
- lib/magicshelf/dirchanger.rb
|
243
|
+
- lib/magicshelf/dirrenamer.rb
|
244
|
+
- lib/magicshelf/dirstructureflattener.rb
|
245
|
+
- lib/magicshelf/epubgenerator.rb
|
246
|
+
- lib/magicshelf/exception.rb
|
247
|
+
- lib/magicshelf/executionpipe.rb
|
248
|
+
- lib/magicshelf/filecleaner.rb
|
249
|
+
- lib/magicshelf/fileextractor.rb
|
250
|
+
- lib/magicshelf/filemover.rb
|
251
|
+
- lib/magicshelf/filenamevalidator.rb
|
252
|
+
- lib/magicshelf/fileserver.rb
|
253
|
+
- lib/magicshelf/kindlegenwrapper.rb
|
254
|
+
- lib/magicshelf/kindlestrip.rb
|
255
|
+
- lib/magicshelf/kindlestripper.rb
|
256
|
+
- lib/magicshelf/makeitvertical.rb
|
257
|
+
- lib/magicshelf/mobitask.rb
|
258
|
+
- lib/magicshelf/tempdiropener.rb
|
259
|
+
- lib/magicshelf/version.rb
|
260
|
+
- magicshelf.gemspec
|
261
|
+
- public/css/index.css
|
262
|
+
- public/css/pure-min.css
|
263
|
+
- server_config.yml.sample
|
264
|
+
- views/generate_mobi.erb
|
265
|
+
- views/index.erb
|
266
|
+
homepage: ''
|
267
|
+
licenses: []
|
268
|
+
metadata: {}
|
269
|
+
post_install_message:
|
270
|
+
rdoc_options: []
|
271
|
+
require_paths:
|
272
|
+
- lib
|
273
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
274
|
+
requirements:
|
275
|
+
- - ">="
|
276
|
+
- !ruby/object:Gem::Version
|
277
|
+
version: '0'
|
278
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
279
|
+
requirements:
|
280
|
+
- - ">="
|
281
|
+
- !ruby/object:Gem::Version
|
282
|
+
version: '0'
|
283
|
+
requirements: []
|
284
|
+
rubyforge_project:
|
285
|
+
rubygems_version: 2.4.5
|
286
|
+
signing_key:
|
287
|
+
specification_version: 4
|
288
|
+
summary: Access and get your e-book from kindle anywhere
|
289
|
+
test_files: []
|
290
|
+
has_rdoc:
|