epubforge 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +17 -10
- data/VERSION +1 -1
- data/bin/epubforge +1 -1
- data/config/actions/epub.rb +50 -0
- data/config/actions/forge.rb +34 -13
- data/config/actions/git.rb +106 -0
- data/config/actions/help.rb +13 -13
- data/config/actions/html.rb +33 -0
- data/config/actions/mobi.rb +60 -0
- data/config/actions/new.rb +182 -0
- data/config/actions/word_count.rb +26 -24
- data/config/{actions → actions_to_ignore}/generate.rb +1 -1
- data/config/{actions → actions_to_ignore}/generate_chapter.rb +0 -0
- data/config/{actions → actions_to_ignore}/git_backup.rb +2 -2
- data/config/{actions → actions_to_ignore}/globals.rb +1 -1
- data/config/{actions → actions_to_ignore}/kindle.rb +3 -3
- data/config/{actions → actions_to_ignore}/local_action.rb +1 -1
- data/config/{actions → actions_to_ignore}/mobify.rb +3 -3
- data/config/actions_to_ignore/notes_to_epub.rb +19 -0
- data/config/actions_to_ignore/notes_to_kindle.rb +18 -0
- data/config/{actions → actions_to_ignore}/spell.rb +1 -1
- data/config/{actions → actions_to_ignore}/version.rb +3 -3
- data/config/{actions → actions_to_ignore}/wrap_scene_notes_in_hidden_div.rb +1 -1
- data/config/converters/epub_to_mobi.calibre.rb +8 -0
- data/config/converters/epub_to_mobi.kindlegen.rb +11 -0
- data/config/html_translators/default_kramdown.html_translator.rb +9 -0
- data/config/html_translators/default_markdown.html_translator.rb +10 -0
- data/config/html_translators/default_markdown_pandoc.html_translator.rb +10 -0
- data/config/html_translators/default_textile_pandoc.html_translator.rb +8 -0
- data/config/html_translators/default_xhtml.html_translator.rb +7 -0
- data/config/html_translators/fallback_html.html_translator.rb +9 -0
- data/config/html_translators/fallback_markdown.html_translator.rb +8 -0
- data/config/html_translators/fallback_textile.html_translator.rb +7 -0
- data/config/html_translators/fallback_txt.html_translator.rb +8 -0
- data/config/html_translators/fallback_unknown.html_translator.rb +7 -0
- data/lib/epubforge.rb +37 -82
- data/lib/{action/thor_action.rb → epubforge/action/action.rb} +89 -69
- data/lib/epubforge/action/action2.rb +109 -0
- data/lib/epubforge/action/action_definition.rb +62 -0
- data/lib/epubforge/action/actions_lookup.rb +45 -0
- data/lib/epubforge/action/chatterbox.rb +93 -0
- data/lib/{action → epubforge/action}/cli_command.rb +2 -2
- data/lib/{action → epubforge/action}/cli_sequence.rb +0 -0
- data/lib/{action → epubforge/action}/file_transformer.rb +0 -0
- data/lib/{action → epubforge/action}/hooks_interface.rb +2 -2
- data/lib/{action → epubforge/action}/run_description.rb +12 -9
- data/lib/{action → epubforge/action}/runner.rb +23 -24
- data/lib/{epub → epubforge/builder}/assets/asset.rb +1 -1
- data/lib/{epub → epubforge/builder}/assets/font.rb +1 -1
- data/lib/epubforge/builder/assets/html.rb +9 -0
- data/lib/{epub → epubforge/builder}/assets/image.rb +1 -1
- data/lib/epubforge/builder/assets/markdown.rb +9 -0
- data/lib/{epub → epubforge/builder}/assets/page.rb +12 -4
- data/lib/{epub → epubforge/builder}/assets/stylesheet.rb +1 -1
- data/lib/epubforge/builder/assets/textile.rb +9 -0
- data/lib/epubforge/builder/assets/xhtml.rb +9 -0
- data/lib/epubforge/builder/builder.rb +134 -0
- data/lib/{epub/builder.rb → epubforge/builder/epub.rb} +58 -161
- data/lib/epubforge/builder/html.rb +22 -0
- data/lib/epubforge/builder/packager.rb +16 -0
- data/lib/epubforge/core_extensions/array.rb +2 -0
- data/lib/{core_extensions → epubforge/core_extensions}/kernel.rb +0 -0
- data/lib/epubforge/core_extensions/nil_class.rb +2 -0
- data/lib/epubforge/core_extensions/object.rb +24 -0
- data/lib/{core_extensions → epubforge/core_extensions}/string.rb +1 -5
- data/lib/{custom_helpers.rb → epubforge/custom_helpers.rb} +0 -1
- data/lib/{errors.rb → epubforge/exceptions/errors.rb} +0 -0
- data/lib/{project → epubforge/project}/project.rb +23 -17
- data/lib/epubforge/utils/action_loader.rb +8 -0
- data/lib/epubforge/utils/class_loader.rb +102 -0
- data/lib/epubforge/utils/converter.rb +94 -0
- data/lib/{utils → epubforge/utils}/downloader.rb +0 -0
- data/lib/{utils → epubforge/utils}/file_orderer.rb +0 -0
- data/lib/epubforge/utils/file_path.rb +8 -0
- data/lib/epubforge/utils/html_translator.rb +126 -0
- data/lib/epubforge/utils/html_translator_queue.rb +113 -0
- data/lib/epubforge/utils/htmlizer.rb +61 -0
- data/lib/{utils → epubforge/utils}/misc.rb +0 -0
- data/lib/epubforge/utils/root_path.rb +8 -0
- data/lib/epubforge/utils/settings.rb +147 -0
- data/lib/epubforge/utils/template_evaluator.rb +7 -0
- data/templates/{default/book/afterword.markdown.template → project/book/afterword.markdown} +0 -0
- data/templates/project/book/chapter-%0000chapter%.markdown.template +4 -0
- data/templates/{default → project}/book/cover.xhtml.template +2 -2
- data/templates/{default/book/foreword.markdown.template → project/book/foreword.markdown} +0 -0
- data/templates/{default → project}/book/images/cover.png +0 -0
- data/templates/{default/book/stylesheets/stylesheet.css.template → project/book/stylesheets/stylesheet.css} +0 -0
- data/templates/project/book/title_page.markdown.template +5 -0
- data/templates/project/notes/character.%character.name_for_file%.markdown.template +15 -0
- data/templates/{default → project}/notes/images/cover.png +0 -0
- data/templates/{default/notes/stylesheets/stylesheet.css.template → project/notes/stylesheets/stylesheet.css} +0 -0
- data/templates/{default → project}/settings/actions/local_action.rb.example +1 -1
- data/templates/project/settings/config.rb.template +70 -0
- data/templates/project/settings/html_translators/example_translator.rb +29 -0
- data/templates/{default → project}/settings/wordcount.template +1 -1
- data/test/answers01.yml +30 -0
- data/test/helper.rb +62 -39
- data/test/misc/config.rb +5 -7
- data/test/test_epubforge.rb +18 -14
- data/test/{test_htmlizers.rb → test_html_translators.rb} +4 -8
- data/test/test_template_evaluator.rb +42 -0
- data/test/test_utils.rb +0 -11
- metadata +186 -189
- data/config/actions/gitify.rb +0 -72
- data/config/actions/init.rb +0 -138
- data/config/actions/notes_to_epub.rb +0 -18
- data/config/actions/notes_to_kindle.rb +0 -17
- data/config/htmlizers.rb +0 -70
- data/lib/action/actions_lookup.rb +0 -45
- data/lib/core_extensions/array.rb +0 -5
- data/lib/core_extensions/nil_class.rb +0 -5
- data/lib/core_extensions/object.rb +0 -5
- data/lib/epub/assets/html.rb +0 -8
- data/lib/epub/assets/markdown.rb +0 -8
- data/lib/epub/assets/textile.rb +0 -8
- data/lib/epub/assets/xhtml.rb +0 -8
- data/lib/epub/packager.rb +0 -16
- data/lib/utils/action_loader.rb +0 -7
- data/lib/utils/class_loader.rb +0 -102
- data/lib/utils/directory_builder.rb +0 -181
- data/lib/utils/file_path.rb +0 -152
- data/lib/utils/html_translator.rb +0 -100
- data/lib/utils/html_translator_queue.rb +0 -70
- data/lib/utils/htmlizer.rb +0 -92
- data/lib/utils/root_path.rb +0 -20
- data/lib/utils/settings.rb +0 -146
- data/lib/utils/template_evaluator.rb +0 -20
- data/templates/default/book/chapter-%i%.markdown.sequence +0 -4
- data/templates/default/book/title_page.markdown.template +0 -4
- data/templates/default/notes/character.named.markdown.template +0 -4
- data/templates/default/payload.rb +0 -65
- data/templates/default/settings/config.rb.form +0 -55
- data/templates/default/settings/htmlizers.rb +0 -0
- data/test/test_directory_builder.rb +0 -141
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3af4d3450b3369cb3d99d89942078b6b6fffc0f5
|
4
|
+
data.tar.gz: 32e50a33bc8ea53caa1d64075c3a0cc4ebe4f5fd
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d8cb4d480ea8e8759cd3d0b94fc7bea6ebbb9d3aaa4ca9564e3743c75ddde0d7e8d3bb462e9024c5ef156a24b6038a2185b747874babfddfd966d6f326391485
|
7
|
+
data.tar.gz: 0bc3df2a1b8168d504f504270601fa092c81928837308a4f3f704d93a60b91258e7a8bb5c995e722e183c2e915591e5f320fc9cefbbd4a89b08198345531ad16
|
data/Gemfile
CHANGED
@@ -9,18 +9,25 @@ source "http://rubygems.org"
|
|
9
9
|
# Add dependencies to develop your gem here.
|
10
10
|
# Include everything needed to run rake, tests, features, etc.
|
11
11
|
|
12
|
-
gem "xdg"
|
13
|
-
gem "builder"
|
12
|
+
gem "xdg", "~> 2"
|
13
|
+
gem "builder", "~> 3"
|
14
14
|
gem "nokogiri", "~> 1.5"
|
15
|
-
gem "thor"
|
15
|
+
gem "thor", "~> 0"
|
16
|
+
gem "kramdown", ">= 1.3"
|
17
|
+
|
16
18
|
# gem "configurator2"
|
17
|
-
gem '
|
18
|
-
gem 'fun_with_configurations'
|
19
|
+
gem 'fun_with_gems', "~> 0.0"
|
20
|
+
gem 'fun_with_configurations', "~> 0.0"
|
21
|
+
gem 'fun_with_templates', "~> 0.0"
|
22
|
+
gem 'fun_with_string_colors', "~> 0.0"
|
23
|
+
gem 'fun_with_patterns', "~> 0.0"
|
19
24
|
|
20
25
|
group :development do
|
21
|
-
gem "
|
22
|
-
gem "
|
23
|
-
gem "
|
24
|
-
gem "
|
25
|
-
gem "
|
26
|
+
# gem "shoulda", "~> 3.5"
|
27
|
+
# gem "rdoc", "~> 3.12"
|
28
|
+
# gem "bundler", "~> 1.0"
|
29
|
+
# gem "jeweler", "~> 2.0"
|
30
|
+
# gem "simplecov", "~> 0", ">= 0.8"
|
31
|
+
# gem "debugger", "~> 1", ">= 1.6"
|
32
|
+
gem "fun_with_testing", "~> 0.0", ">= 0.0.2"
|
26
33
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.11
|
data/bin/epubforge
CHANGED
@@ -0,0 +1,50 @@
|
|
1
|
+
module EpubForge
|
2
|
+
module Action
|
3
|
+
class Epub < Action2
|
4
|
+
define_action( "epub" ) do |action|
|
5
|
+
# include_standard_options
|
6
|
+
action.help( "Create ebooks in various formats from the .markdown files in the project's book/ and notes/ subdirectories." )
|
7
|
+
# keyword( "forge" )
|
8
|
+
# desc( "forge", "Wraps the project up in a .epub (ebook) file.")
|
9
|
+
action.execute do
|
10
|
+
epub_common( "book" )
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
define_action( "epub:notes" ) do |action|
|
15
|
+
action.help( "Create ebooks for your story bible, instead of your main book" )
|
16
|
+
|
17
|
+
action.execute do
|
18
|
+
epub_common( "notes" )
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
def epub_common( target, opts = {} )
|
24
|
+
# opts[:page_order] ||= project.config["pages"][target]
|
25
|
+
case target
|
26
|
+
when "book"
|
27
|
+
opts[:book_dir] ||= project.book_dir
|
28
|
+
outfile = opts.delete(:outfile) || project.filename_for_book.ext("epub")
|
29
|
+
when "notes"
|
30
|
+
opts[:book_dir] ||= project.notes_dir
|
31
|
+
outfile = opts.delete(:outfile) || project.filename_for_notes.ext("epub")
|
32
|
+
else
|
33
|
+
# Hope the caller knows what it's doing.
|
34
|
+
opts[:book_dir] ||= project.book_dir.up.join( target )
|
35
|
+
outfile = opts.delete(:outfile) || project.root_dir.join( "#{project.default_project_basename}.#{target}.epub" )
|
36
|
+
end
|
37
|
+
|
38
|
+
opts[:verbose] = verbose?
|
39
|
+
builder = EpubForge::Builder::Epub.new( project, opts )
|
40
|
+
|
41
|
+
builder.build
|
42
|
+
builder.package( outfile )
|
43
|
+
builder.clean
|
44
|
+
say_all_is_well( "Done building epub <#{outfile}>" )
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
|
data/config/actions/forge.rb
CHANGED
@@ -1,22 +1,43 @@
|
|
1
1
|
module EpubForge
|
2
2
|
module Action
|
3
|
-
class Forge <
|
4
|
-
|
5
|
-
|
3
|
+
class Forge < Action2
|
4
|
+
define_action( "forge" ) do |action|
|
5
|
+
action.help( "Create all book formats" )
|
6
|
+
|
7
|
+
action.execute do
|
8
|
+
raise "todo"
|
9
|
+
builder = EpubForge::Builder::Epub.new( project )
|
10
|
+
build( builder, project.filename_for_book.ext("epub") )
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
define_action( "forge:notes" ) do |action|
|
15
|
+
action.help( "Create all formats of of book's notes.")
|
16
|
+
|
17
|
+
action.execute do
|
18
|
+
raise "todo"
|
19
|
+
builder = EpubForge::Builder::Epub.new( project, book_dir: project.notes_dir,
|
20
|
+
page_order: project.config[:pages][:notes] )
|
21
|
+
|
22
|
+
build( builder, project.filename_for_notes.ext("epub") )
|
23
|
+
end
|
24
|
+
end
|
6
25
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
26
|
+
define_action( "forge:formats" ) do |action|
|
27
|
+
action.help( "List information about which ebook formats are available." )
|
28
|
+
|
29
|
+
action.execute do
|
30
|
+
puts "TODO!".paint( :bg_red, :white, :bold )
|
31
|
+
raise "todo"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def build( builder, builds_file )
|
12
36
|
builder.build
|
13
|
-
builder.package(
|
37
|
+
builder.package( builds_file )
|
14
38
|
builder.clean
|
15
|
-
puts "Done building epub <#{
|
39
|
+
puts "Done building epub <#{builds_file}>"
|
16
40
|
end
|
17
|
-
|
18
|
-
desc( "forge:epub", "Wraps the project up in a .epub (ebook) file." )
|
19
|
-
alias :epub :forge # I _think_ this will allow me to also use forge:epub as an alias for forge
|
20
41
|
end
|
21
42
|
end
|
22
43
|
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
module EpubForge
|
2
|
+
module Action
|
3
|
+
class Git < Action2
|
4
|
+
define_action( "git:save" ) do |action|
|
5
|
+
action.help( "commit changes to your project to your repository" )
|
6
|
+
action.usage( "git:save 'optional commit message'" )
|
7
|
+
|
8
|
+
action.execute do
|
9
|
+
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
#
|
15
|
+
# class GitBackup < Action
|
16
|
+
# description "commit your project to the git repo and back it up"
|
17
|
+
# keywords :backup, :save, :commit
|
18
|
+
# usage "#{$PROGRAM_NAME} commit <project directory (optional if current dir)> \"optional message\""
|
19
|
+
#
|
20
|
+
# desc( "do:save", "save to your git repository")
|
21
|
+
# def do( project, *args )
|
22
|
+
# @project = project
|
23
|
+
# @message = args.length > 0 ? args.last : "incremental backup"
|
24
|
+
#
|
25
|
+
# unless project_already_gitted?
|
26
|
+
# say_error "Not a git-backed project. Aborting."
|
27
|
+
# say_instruction "Run 'epubforge gitify <project>' to create a backup repository."
|
28
|
+
# return false
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# `cd #{@project.root_dir} && git commit -a -m "#{@message}" && git push`
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
#
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
define_action( "git:init" ) do |action|
|
39
|
+
action.help( "create a git repository of the project folder on an external host or thumb drive" )
|
40
|
+
|
41
|
+
action.execute do
|
42
|
+
@project = project
|
43
|
+
@conf = @project.config
|
44
|
+
@gitconf = @conf.git
|
45
|
+
|
46
|
+
@cli_sequence = CliSequence.new
|
47
|
+
@cli_sequence.default( :verbose, true )
|
48
|
+
@cli_sequence.default( :local_dir, @project.root_dir )
|
49
|
+
|
50
|
+
|
51
|
+
if project_already_gitted?
|
52
|
+
say_error "Already seems to be a git project. delete the .git folder if this is incorrect."
|
53
|
+
return false
|
54
|
+
end
|
55
|
+
|
56
|
+
project_name_with_folder = @gitconf["repo_folder"].fwf_filepath
|
57
|
+
|
58
|
+
if @gitconf["remote_host"]
|
59
|
+
remote_host = "#{@gitconf['remote_user']}@#{@gitconf['remote_host']}"
|
60
|
+
@cli_sequence.default( :remote, remote_host )
|
61
|
+
project_url = "ssh://#{remote_host}#{project_name_with_folder}"
|
62
|
+
|
63
|
+
@cli_sequence.add_remote_command( "mkdir -p #{project_name_with_folder}", "rm -rf #{project_name_with_folder}" )
|
64
|
+
@cli_sequence.add_remote_command( "git --bare init #{project_name_with_folder}" )
|
65
|
+
identifier = project_name_with_folder.join( @gitconf["repo_id"] )
|
66
|
+
@cli_sequence.add_remote_command( "touch #{identifier}", "rm #{identifier}" ) # undo isn't needed here, since the directory will be wiped out.
|
67
|
+
else
|
68
|
+
project_url = "file://#{project_name_with_folder}"
|
69
|
+
@cli_sequence.add_local_command( "mkdir -p #{project_name_with_folder}", "rm -rf #{project_name_with_folder}" )
|
70
|
+
@cli_sequence.add_local_command( "git --bare init #{project_name_with_folder}" )
|
71
|
+
identifier = project_name_with_folder.join( @gitconf["repo_id"] )
|
72
|
+
@cli_sequence.add_local_command( "touch #{identifier}", "rm #{identifier}" )
|
73
|
+
end
|
74
|
+
|
75
|
+
# running locally
|
76
|
+
@cli_sequence.add_local_command "git init", "rm -rf .git"
|
77
|
+
@cli_sequence.add_local_command "git remote add origin #{project_url}"
|
78
|
+
@cli_sequence.add_local_command "git add ."
|
79
|
+
@cli_sequence.add_local_command "git commit -a -m \"Initial commit\""
|
80
|
+
@cli_sequence.add_local_command "git config branch.master.remote origin"
|
81
|
+
@cli_sequence.add_local_command "git config branch.master.merge refs/heads/master"
|
82
|
+
@cli_sequence.add_local_command "git push origin master" # need to be explicit about branch the first time
|
83
|
+
|
84
|
+
if @cli_sequence.execute
|
85
|
+
say_all_is_well( "All done. The url for this project is #{project_url}" )
|
86
|
+
else
|
87
|
+
say_error( "Command sequence failed." )
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
protected
|
93
|
+
def git_remote_exec( cmd )
|
94
|
+
say_subtly( "attempting to run remotely: #{cmd}" )
|
95
|
+
`cd #{@project.root_dir} && ssh #{@gitconf["remote_user"]}@#{@gitconf["remote_host"]} "#{cmd}"`
|
96
|
+
say( "Success: #{$?.success?}")
|
97
|
+
end
|
98
|
+
|
99
|
+
def git_local_exec( cmd )
|
100
|
+
say_subtly( "attempting to run locally: #{cmd}" )
|
101
|
+
`cd #{@project.root_dir} && #{cmd}`
|
102
|
+
say( "Success: #{$?.success?}")
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
data/config/actions/help.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
module EpubForge
|
2
2
|
module Action
|
3
|
-
class Help <
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
3
|
+
class Help < Action2
|
4
|
+
define_action( "help" ) do |action|
|
5
|
+
action.project_not_required
|
6
|
+
action.help( "Print out information for various actions." )
|
7
|
+
|
8
|
+
action.execute do |*args|
|
9
|
+
say_instruction "epubforge [action] [folder]"
|
10
|
+
say_instruction "Actions:"
|
11
|
+
for keyword, action in Action2.loader_pattern_registry
|
12
|
+
say_instruction " #{keyword} : #{action.help}"
|
13
|
+
say_instruction " usage: #{$PROGRAM_NAME} #{action.usage}" unless action.usage.fwf_blank?
|
14
|
+
end
|
15
|
+
end
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module EpubForge
|
2
|
+
module Action
|
3
|
+
class HTML < Action2
|
4
|
+
define_action( "html" ) do |action|
|
5
|
+
action.help( "Create an HTML version of your book" )
|
6
|
+
action.execute do
|
7
|
+
book_dir = @project.root_dir.join( "book" )
|
8
|
+
filename = @project.filename_for_book.ext( "html" )
|
9
|
+
html_common( book_dir, filename )
|
10
|
+
end
|
11
|
+
|
12
|
+
define_action( "html:notes" ) do |action|
|
13
|
+
action.help( "Create an HTML version of your notebook" )
|
14
|
+
action.execute do
|
15
|
+
book_dir = @project.root_dir.join( "notes" )
|
16
|
+
filename = @project.filename_for_notes.ext( "html" )
|
17
|
+
html_common( book_dir, filename )
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
def html_common( book_dir, filename )
|
23
|
+
builder = EpubForge::Builder::Html.new( project, {:book_dir => book_dir} )
|
24
|
+
|
25
|
+
builder.build
|
26
|
+
builder.package( filename )
|
27
|
+
builder.clean
|
28
|
+
puts "Done building #{filename}.".paint(:green)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module EpubForge
|
2
|
+
module Action
|
3
|
+
class Mobi < Action2
|
4
|
+
define_action( "mobi" ) do |action|
|
5
|
+
action.help( "Converts .epub to .mobi." )
|
6
|
+
|
7
|
+
action.execute do
|
8
|
+
converters = Utils::Converter.converts( :epub, :mobi )
|
9
|
+
|
10
|
+
# TODO: Uses the first converter it finds. Suboptimal.
|
11
|
+
for converter in converters
|
12
|
+
if converter.is_executable_installed?
|
13
|
+
@converter = converter
|
14
|
+
break
|
15
|
+
end
|
16
|
+
end
|
17
|
+
mobi_convert_common
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
define_action( "mobi:convert:calibre" ) do |action|
|
22
|
+
action.help( "Converts .epub to .mobi, using Calibre's ebook-convert utility" )
|
23
|
+
action.execute do
|
24
|
+
@converter = Utils::Converter[:epub_to_mobi_calibre]
|
25
|
+
mobi_convert_common
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
define_action( "mobi:convert:kindlegen" ) do |action|
|
30
|
+
action.execute do
|
31
|
+
@converter = Utils::Converter[:epub_to_mobi_kindlegen]
|
32
|
+
mobi_convert_common
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
protected
|
37
|
+
def mobi_convert_common
|
38
|
+
src = @project.filename_for_book.ext( "epub" )
|
39
|
+
dest = @project.filename_for_book.ext( "mobi" )
|
40
|
+
|
41
|
+
unless src.file?
|
42
|
+
puts "Failure: source .epub doesn't exist: #{src}".pain(:red)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Sigh, Kindlegen is stupid
|
46
|
+
if @converter.label == :epub_to_mobi_kindlegen
|
47
|
+
dest = dest.basename
|
48
|
+
end
|
49
|
+
|
50
|
+
conversion = @converter.convert( src, { :dest => dest, :command_line_options => "" } )
|
51
|
+
|
52
|
+
if conversion
|
53
|
+
puts "Success!".paint(:green)
|
54
|
+
else
|
55
|
+
puts "Failure!".paint(:red)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
module EpubForge
|
2
|
+
module Action
|
3
|
+
class New < Action2
|
4
|
+
define_action( "new" ) do |action|
|
5
|
+
action.project_not_required
|
6
|
+
|
7
|
+
action.help( "Create a brand new project." )
|
8
|
+
action.usage( "new <DIRECTORY_NAME>" )
|
9
|
+
action.default( :verbose, false )
|
10
|
+
|
11
|
+
action.execute do
|
12
|
+
if @project.is_a?(Project)
|
13
|
+
say_error "The directory given (#{@project.root_dir}) is already an EpubForge project. Quitting."
|
14
|
+
false
|
15
|
+
elsif parse_args( *args )
|
16
|
+
get_template_filepath_from_options
|
17
|
+
configure_configuration( @opts[:answers] || {} )
|
18
|
+
FunWith::Templates::TemplateEvaluator.write( @template_dir, self.destination_root_filepath, @template_options )
|
19
|
+
else
|
20
|
+
false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
#
|
25
|
+
#
|
26
|
+
#
|
27
|
+
#
|
28
|
+
#
|
29
|
+
# src_dirs = src_entries.select{ |d| @template_dir.join(d).directory? }.uniq
|
30
|
+
#
|
31
|
+
# for dir in src_dirs
|
32
|
+
# puts "creating dir #{dir}"
|
33
|
+
# empty_directory( self.destination_root_filepath.join( dir ) )
|
34
|
+
# debugger unless self.destination_root_filepath.join( dir ).directory?
|
35
|
+
# 5
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# debugger unless self.destination_root_filepath.directory?
|
39
|
+
#
|
40
|
+
# for entry in src_entries - src_dirs
|
41
|
+
# case entry.ext
|
42
|
+
# when "template"
|
43
|
+
# dst = self.destination_root_filepath.join( entry ).without_ext
|
44
|
+
# puts dst.inspect
|
45
|
+
# puts entry.inspect
|
46
|
+
# FunWith::Files::FilePath.template( entry, dst )
|
47
|
+
# when "sequence"
|
48
|
+
# @chapter_count ||= @opts[:answers][:chapter_count] if @opts[:answers]
|
49
|
+
# @chapter_count ||= ask_prettily("Setting up chapter files.\n How many chapters will your book have (you can add more later)? >>> ").to_i
|
50
|
+
#
|
51
|
+
# 1.upto( @chapter_count ) do |i|
|
52
|
+
# dst = self.destination_root_filepath.join( entry ).gsub( /%i%/, sprintf( "%04i", i) ).without_ext
|
53
|
+
# FunWith::Files::FilePath.template( entry, dst, {:i => i} )
|
54
|
+
# end
|
55
|
+
# when "form"
|
56
|
+
# configure_configuration( @opts[:answers] || {} )
|
57
|
+
# dst = self.destination_root_filepath.join( entry ).without_ext
|
58
|
+
# FunWith::Files::FilePath.template( entry, dst, @template_options )
|
59
|
+
# say_all_is_well( "Your configuration is all set up!" )
|
60
|
+
# say_instruction( "run 'epubforge gitify' to initialize the backup repository." )
|
61
|
+
# else
|
62
|
+
# copy_file( entry, self.destination_root_filepath.join( entry ) )
|
63
|
+
# end
|
64
|
+
# end
|
65
|
+
# end
|
66
|
+
|
67
|
+
protected
|
68
|
+
def configure_configuration(opts = {})
|
69
|
+
say_instruction( "Don't think too hard about these next few questions. You can always change your mind by editing settings/config" )
|
70
|
+
|
71
|
+
opts[:book] ||= {}
|
72
|
+
opts[:book][:title] ||= ask_prettily( "What is the name of your book?" )
|
73
|
+
opts[:book][:author] ||= ask_prettily( "What is the name of the author?" )
|
74
|
+
opts[:license] ||= ask_from_menu( "What license do you want your book under?", [ "All Rights Reserved",
|
75
|
+
"Creative Commons Non-Commercial, No Derivatives License",
|
76
|
+
"Creative Commons Non-Commercial, Share-Alike License",
|
77
|
+
"GNU Free Documentation License",
|
78
|
+
"Public Domain",
|
79
|
+
"Other" ] )
|
80
|
+
if opts[:license] == "Other"
|
81
|
+
opts[:license] = ask_prettily( "Type in the license you wish to use : " )
|
82
|
+
end
|
83
|
+
|
84
|
+
opts[:chapter] ||= (1..(ask_prettily( "How many chapters?" ).to_i))
|
85
|
+
|
86
|
+
@template_options = opts
|
87
|
+
|
88
|
+
if git_installed?
|
89
|
+
if opts[:use_git] || opts[:use_git].nil? && yes_prettily?( "Do you want to back up your project using git?" )
|
90
|
+
configure_git( opts[:git] || {} )
|
91
|
+
end
|
92
|
+
else
|
93
|
+
warn( "The program 'git' must be installed and locatable if you want epubforge to back up your project." )
|
94
|
+
end
|
95
|
+
|
96
|
+
configure_character
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
def configure_git( opts = {} )
|
102
|
+
opts[:remote] = "Back up to a remote host."
|
103
|
+
opts[:thumb] = "Back up to an external or thumb drive."
|
104
|
+
opts[:backup_type] ||= ask_from_menu( "Where would you like to back up your project to?",
|
105
|
+
[ opts[:remote],
|
106
|
+
opts[:thumb] ] )
|
107
|
+
|
108
|
+
opts[:repo_id] ||= rand(16**32).to_s(16)
|
109
|
+
|
110
|
+
if opts[:backup_type] == opts[:remote]
|
111
|
+
opts[:host] ||= ask_prettily("Enter the name of the remote host : ")
|
112
|
+
opts[:user] ||= ask_prettily("Enter your user name : ")
|
113
|
+
opts[:repo] ||= ask_prettily("Enter the name of the folder on the remote host. A folder called #{backup_folder_name} will be created there : ")
|
114
|
+
elsif opts[:backup_type] == opts[:thumb]
|
115
|
+
opts[:repo] ||= ask_prettily("Enter the full path to the backup folder. A folder called #{backup_folder_name} will be created there: ")
|
116
|
+
else
|
117
|
+
say_error("I'm confused by the requested backup style <#{opts[:backup_type]}>. Skipping git configuration.")
|
118
|
+
opts = nil
|
119
|
+
return false
|
120
|
+
end
|
121
|
+
|
122
|
+
# TODO: What if the target file system uses a different file separator?
|
123
|
+
opts[:repo] = opts[:repo].fwf_filepath.join( backup_folder_name ) if opts[:repo].is_a?(String)
|
124
|
+
@template_options[:git] = opts
|
125
|
+
true
|
126
|
+
end
|
127
|
+
|
128
|
+
def configure_character
|
129
|
+
@template_options[:character] = {
|
130
|
+
:name => "Mr. Example Protagonist",
|
131
|
+
:name_for_file => "mister_example_protagonist",
|
132
|
+
:description => "Tall, red hair, angry complexion, indifferent to fashion and hygiene.",
|
133
|
+
:summary => "Example once drove a man to drink, because the guy's liver once killed his dad.",
|
134
|
+
:age => 23
|
135
|
+
}
|
136
|
+
end
|
137
|
+
|
138
|
+
def backup_folder_name
|
139
|
+
(@template_options[:book][:title] || "").epf_underscorize + ".epubforge.git"
|
140
|
+
end
|
141
|
+
|
142
|
+
# Expects the following arguments: 1:<project directory (shouldn't exist)>, 2: options hash.
|
143
|
+
# Options hash includes:
|
144
|
+
def parse_args( *args )
|
145
|
+
@opts = args.last.is_a?(Hash) ? args.pop : {}
|
146
|
+
project_root = args.shift
|
147
|
+
|
148
|
+
case project_root
|
149
|
+
when NilClass
|
150
|
+
say_error "No destination directory given."
|
151
|
+
return false
|
152
|
+
when Project
|
153
|
+
say_error "You seem to be creating a project within a project. Cut it out."
|
154
|
+
return false
|
155
|
+
end
|
156
|
+
|
157
|
+
self.destination_root_filepath = project_root.fwf_filepath
|
158
|
+
|
159
|
+
if self.destination_root_filepath.exist? &&
|
160
|
+
(!(self.destination_root_filepath.empty?) || !(self.destination_root_filepath.directory?))
|
161
|
+
say_error "This action must create a new directory or act upon an empty directory. Quitting."
|
162
|
+
return false
|
163
|
+
end
|
164
|
+
|
165
|
+
true
|
166
|
+
end
|
167
|
+
|
168
|
+
# TODO: Shouldn't the user settings / project settings also be searchable?
|
169
|
+
# Wouldn't preference be given to project, then user settings?
|
170
|
+
def get_template_filepath_from_options
|
171
|
+
@template_to_use = (@opts[:template] || "project").fwf_filepath # TODO: should turn into an option
|
172
|
+
if @template_to_use.absolute?
|
173
|
+
@template_dir = @template_to_use
|
174
|
+
else
|
175
|
+
@template_dir = EpubForge.root.join( "templates", @template_to_use )
|
176
|
+
end
|
177
|
+
|
178
|
+
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|