epubforge 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +17 -10
  3. data/VERSION +1 -1
  4. data/bin/epubforge +1 -1
  5. data/config/actions/epub.rb +50 -0
  6. data/config/actions/forge.rb +34 -13
  7. data/config/actions/git.rb +106 -0
  8. data/config/actions/help.rb +13 -13
  9. data/config/actions/html.rb +33 -0
  10. data/config/actions/mobi.rb +60 -0
  11. data/config/actions/new.rb +182 -0
  12. data/config/actions/word_count.rb +26 -24
  13. data/config/{actions → actions_to_ignore}/generate.rb +1 -1
  14. data/config/{actions → actions_to_ignore}/generate_chapter.rb +0 -0
  15. data/config/{actions → actions_to_ignore}/git_backup.rb +2 -2
  16. data/config/{actions → actions_to_ignore}/globals.rb +1 -1
  17. data/config/{actions → actions_to_ignore}/kindle.rb +3 -3
  18. data/config/{actions → actions_to_ignore}/local_action.rb +1 -1
  19. data/config/{actions → actions_to_ignore}/mobify.rb +3 -3
  20. data/config/actions_to_ignore/notes_to_epub.rb +19 -0
  21. data/config/actions_to_ignore/notes_to_kindle.rb +18 -0
  22. data/config/{actions → actions_to_ignore}/spell.rb +1 -1
  23. data/config/{actions → actions_to_ignore}/version.rb +3 -3
  24. data/config/{actions → actions_to_ignore}/wrap_scene_notes_in_hidden_div.rb +1 -1
  25. data/config/converters/epub_to_mobi.calibre.rb +8 -0
  26. data/config/converters/epub_to_mobi.kindlegen.rb +11 -0
  27. data/config/html_translators/default_kramdown.html_translator.rb +9 -0
  28. data/config/html_translators/default_markdown.html_translator.rb +10 -0
  29. data/config/html_translators/default_markdown_pandoc.html_translator.rb +10 -0
  30. data/config/html_translators/default_textile_pandoc.html_translator.rb +8 -0
  31. data/config/html_translators/default_xhtml.html_translator.rb +7 -0
  32. data/config/html_translators/fallback_html.html_translator.rb +9 -0
  33. data/config/html_translators/fallback_markdown.html_translator.rb +8 -0
  34. data/config/html_translators/fallback_textile.html_translator.rb +7 -0
  35. data/config/html_translators/fallback_txt.html_translator.rb +8 -0
  36. data/config/html_translators/fallback_unknown.html_translator.rb +7 -0
  37. data/lib/epubforge.rb +37 -82
  38. data/lib/{action/thor_action.rb → epubforge/action/action.rb} +89 -69
  39. data/lib/epubforge/action/action2.rb +109 -0
  40. data/lib/epubforge/action/action_definition.rb +62 -0
  41. data/lib/epubforge/action/actions_lookup.rb +45 -0
  42. data/lib/epubforge/action/chatterbox.rb +93 -0
  43. data/lib/{action → epubforge/action}/cli_command.rb +2 -2
  44. data/lib/{action → epubforge/action}/cli_sequence.rb +0 -0
  45. data/lib/{action → epubforge/action}/file_transformer.rb +0 -0
  46. data/lib/{action → epubforge/action}/hooks_interface.rb +2 -2
  47. data/lib/{action → epubforge/action}/run_description.rb +12 -9
  48. data/lib/{action → epubforge/action}/runner.rb +23 -24
  49. data/lib/{epub → epubforge/builder}/assets/asset.rb +1 -1
  50. data/lib/{epub → epubforge/builder}/assets/font.rb +1 -1
  51. data/lib/epubforge/builder/assets/html.rb +9 -0
  52. data/lib/{epub → epubforge/builder}/assets/image.rb +1 -1
  53. data/lib/epubforge/builder/assets/markdown.rb +9 -0
  54. data/lib/{epub → epubforge/builder}/assets/page.rb +12 -4
  55. data/lib/{epub → epubforge/builder}/assets/stylesheet.rb +1 -1
  56. data/lib/epubforge/builder/assets/textile.rb +9 -0
  57. data/lib/epubforge/builder/assets/xhtml.rb +9 -0
  58. data/lib/epubforge/builder/builder.rb +134 -0
  59. data/lib/{epub/builder.rb → epubforge/builder/epub.rb} +58 -161
  60. data/lib/epubforge/builder/html.rb +22 -0
  61. data/lib/epubforge/builder/packager.rb +16 -0
  62. data/lib/epubforge/core_extensions/array.rb +2 -0
  63. data/lib/{core_extensions → epubforge/core_extensions}/kernel.rb +0 -0
  64. data/lib/epubforge/core_extensions/nil_class.rb +2 -0
  65. data/lib/epubforge/core_extensions/object.rb +24 -0
  66. data/lib/{core_extensions → epubforge/core_extensions}/string.rb +1 -5
  67. data/lib/{custom_helpers.rb → epubforge/custom_helpers.rb} +0 -1
  68. data/lib/{errors.rb → epubforge/exceptions/errors.rb} +0 -0
  69. data/lib/{project → epubforge/project}/project.rb +23 -17
  70. data/lib/epubforge/utils/action_loader.rb +8 -0
  71. data/lib/epubforge/utils/class_loader.rb +102 -0
  72. data/lib/epubforge/utils/converter.rb +94 -0
  73. data/lib/{utils → epubforge/utils}/downloader.rb +0 -0
  74. data/lib/{utils → epubforge/utils}/file_orderer.rb +0 -0
  75. data/lib/epubforge/utils/file_path.rb +8 -0
  76. data/lib/epubforge/utils/html_translator.rb +126 -0
  77. data/lib/epubforge/utils/html_translator_queue.rb +113 -0
  78. data/lib/epubforge/utils/htmlizer.rb +61 -0
  79. data/lib/{utils → epubforge/utils}/misc.rb +0 -0
  80. data/lib/epubforge/utils/root_path.rb +8 -0
  81. data/lib/epubforge/utils/settings.rb +147 -0
  82. data/lib/epubforge/utils/template_evaluator.rb +7 -0
  83. data/templates/{default/book/afterword.markdown.template → project/book/afterword.markdown} +0 -0
  84. data/templates/project/book/chapter-%0000chapter%.markdown.template +4 -0
  85. data/templates/{default → project}/book/cover.xhtml.template +2 -2
  86. data/templates/{default/book/foreword.markdown.template → project/book/foreword.markdown} +0 -0
  87. data/templates/{default → project}/book/images/cover.png +0 -0
  88. data/templates/{default/book/stylesheets/stylesheet.css.template → project/book/stylesheets/stylesheet.css} +0 -0
  89. data/templates/project/book/title_page.markdown.template +5 -0
  90. data/templates/project/notes/character.%character.name_for_file%.markdown.template +15 -0
  91. data/templates/{default → project}/notes/images/cover.png +0 -0
  92. data/templates/{default/notes/stylesheets/stylesheet.css.template → project/notes/stylesheets/stylesheet.css} +0 -0
  93. data/templates/{default → project}/settings/actions/local_action.rb.example +1 -1
  94. data/templates/project/settings/config.rb.template +70 -0
  95. data/templates/project/settings/html_translators/example_translator.rb +29 -0
  96. data/templates/{default → project}/settings/wordcount.template +1 -1
  97. data/test/answers01.yml +30 -0
  98. data/test/helper.rb +62 -39
  99. data/test/misc/config.rb +5 -7
  100. data/test/test_epubforge.rb +18 -14
  101. data/test/{test_htmlizers.rb → test_html_translators.rb} +4 -8
  102. data/test/test_template_evaluator.rb +42 -0
  103. data/test/test_utils.rb +0 -11
  104. metadata +186 -189
  105. data/config/actions/gitify.rb +0 -72
  106. data/config/actions/init.rb +0 -138
  107. data/config/actions/notes_to_epub.rb +0 -18
  108. data/config/actions/notes_to_kindle.rb +0 -17
  109. data/config/htmlizers.rb +0 -70
  110. data/lib/action/actions_lookup.rb +0 -45
  111. data/lib/core_extensions/array.rb +0 -5
  112. data/lib/core_extensions/nil_class.rb +0 -5
  113. data/lib/core_extensions/object.rb +0 -5
  114. data/lib/epub/assets/html.rb +0 -8
  115. data/lib/epub/assets/markdown.rb +0 -8
  116. data/lib/epub/assets/textile.rb +0 -8
  117. data/lib/epub/assets/xhtml.rb +0 -8
  118. data/lib/epub/packager.rb +0 -16
  119. data/lib/utils/action_loader.rb +0 -7
  120. data/lib/utils/class_loader.rb +0 -102
  121. data/lib/utils/directory_builder.rb +0 -181
  122. data/lib/utils/file_path.rb +0 -152
  123. data/lib/utils/html_translator.rb +0 -100
  124. data/lib/utils/html_translator_queue.rb +0 -70
  125. data/lib/utils/htmlizer.rb +0 -92
  126. data/lib/utils/root_path.rb +0 -20
  127. data/lib/utils/settings.rb +0 -146
  128. data/lib/utils/template_evaluator.rb +0 -20
  129. data/templates/default/book/chapter-%i%.markdown.sequence +0 -4
  130. data/templates/default/book/title_page.markdown.template +0 -4
  131. data/templates/default/notes/character.named.markdown.template +0 -4
  132. data/templates/default/payload.rb +0 -65
  133. data/templates/default/settings/config.rb.form +0 -55
  134. data/templates/default/settings/htmlizers.rb +0 -0
  135. data/test/test_directory_builder.rb +0 -141
@@ -1,70 +0,0 @@
1
- module EpubForge
2
- module Utils
3
- # A priority stack (like a priority queue, but FILO) with a simple job:
4
- # keep track of the translators (by name and by group), and return them
5
- # to the object user in the order they should be tried.
6
- class HtmlTranslatorQueue
7
- GROUP_NAMES = HtmlTranslator::GROUP_NAMES
8
-
9
-
10
- def initialize
11
- @translators = {}
12
- @all_translators = []
13
- @translators_named = {}
14
- for name in GROUP_NAMES
15
- @translators[name] = []
16
- end
17
- end
18
-
19
- # def translators_handling_format( requested_format )
20
- # htmlizers = GROUP_NAMES.map{ |group|
21
- # (@translator_queue.keys - [:all, :named]).map do |format|
22
- # htmlizers = @translator_queue[format][group]
23
- # htmlizers ? htmlizers.select{|html| html.handles_format?(requested_format) } : []
24
- # end
25
- # }
26
- #
27
- # htmlizers.flatten
28
- # end
29
-
30
- # last installed, first yielded (within a given group)
31
- #
32
- # Returns them in priority order, user-defined ones first.
33
- # At the moment, it is up to individual translators to accept or
34
- # reject the translation job based on the file format (by extension, which is lame).
35
- def each( &block )
36
- ordered_translators = []
37
- for group in GROUP_NAMES.map{|g| @translators[g].reverse }
38
- ordered_translators += group
39
- end
40
-
41
- if block_given?
42
- for translator in ordered_translators
43
- yield translator
44
- end
45
- else
46
- ordered_translators.to_enum
47
- end
48
- end
49
-
50
- def length
51
- @all_translators.length
52
- end
53
-
54
- def categorize( htmlizer )
55
- unless GROUP_NAMES.include?( htmlizer.group )
56
- puts "No group specified for htmlizer #{htmlizer}. Group must be one of the following symbols: #{GROUP_NAMES.map(&:inspect).inspect}"
57
- return false
58
- end
59
-
60
- @all_translators << htmlizer
61
- @translators_named[htmlizer.name] = htmlizer if htmlizer.name
62
- @translators[htmlizer.group] << htmlizer
63
- end
64
-
65
- def named( sym )
66
- @translators_named[sym]
67
- end
68
- end
69
- end
70
- end
@@ -1,92 +0,0 @@
1
- module EpubForge
2
- module Utils
3
-
4
- # Htmlizer coordinates the discovery, selection, and running of HtmlTranslators.
5
- # It can be handed basically any supported filetype (markdown, textile, txt), and
6
- # hand back an HTML translation of the file.
7
- class Htmlizer
8
- include Singleton
9
-
10
- def setup_once
11
- return false if @already_set_up
12
- @already_set_up = true
13
- @exec_location = {}
14
-
15
- @translator_queue = HtmlTranslatorQueue.new
16
-
17
- add_htmlizers( EpubForge.root( 'config', 'htmlizers.rb' ) )
18
- add_htmlizers( EpubForge::USER_SETTINGS.join( 'htmlizers.rb' ) )
19
-
20
- @already_set_up
21
- end
22
-
23
- public
24
- def location( name, path = nil )
25
- @exec_location[name] = path if path
26
- @exec_location[name]
27
- end
28
-
29
- # Commenting out for the moment. Philosophically, maybe it shouldn't provide access to individual translators.
30
- # def translators_named( name )
31
- # @translator_queue[:named][name]
32
- # end
33
-
34
-
35
- def self.define( &block )
36
- htmlizer = HtmlTranslator.new
37
- yield htmlizer
38
- self.instance.categorize( htmlizer )
39
- end
40
-
41
- def categorize( htmlizer )
42
- @translator_queue.categorize( htmlizer )
43
- end
44
-
45
- def add_htmlizers( htmlizers_file )
46
- if htmlizers_file.exist?
47
- begin
48
- require htmlizers_file.to_s
49
- rescue Exception => e
50
- puts e.message
51
- puts e.backtrace.map{|line| "\t#{line}" }
52
- puts "Failed to load htmlizers from project file #{htmlizers_file} Soldiering onward."
53
- end
54
- end
55
- end
56
-
57
-
58
- # available options
59
- # :htmlizer => the sym for the requested htmlizer.
60
- # :opts => a string representing options to execute cmd with
61
- def translate( filename, opts = {} )
62
- translator = opts[:translator]
63
- translator = @translator_queue.named( translator ) if translator.is_a?( Symbol )
64
- opts = opts[:opts] || ""
65
-
66
- if translator
67
- if result = translator.translate( filename, {opts: opts } )
68
- return result
69
- else
70
- puts "Named Htmlizer #{htmlizer} did not return html. Falling back on other htmlizers"
71
- end
72
- end
73
-
74
- for translator in @translator_queue
75
- if result = translator.translate( filename, opts )
76
- return result
77
- end
78
- end
79
-
80
- "<!-- COULD NOT FIND HTMLIZER FOR #{filename} -->"
81
- end
82
-
83
- def self.format_from_filename( filename )
84
- ext = filename.fwf_filepath.ext
85
- ext.epf_blank? ? :unknown : ext.to_sym
86
- end
87
- end
88
-
89
- Htmlizer.instance.setup_once
90
- end
91
- end
92
-
@@ -1,20 +0,0 @@
1
- module EpubForge
2
- module Utils
3
- module RootPath
4
- def root( *args )
5
- if args.length > 0
6
- args.unshift( @root_path )
7
- FilePath.new( *args )
8
- else
9
- FilePath.new( @root_path )
10
- end
11
- end
12
-
13
- def set_root_path( path )
14
- @root_path = FilePath.new( path )
15
- end
16
- end
17
- end
18
- end
19
-
20
- EpubForge.extend EpubForge::Utils::RootPath
@@ -1,146 +0,0 @@
1
- # have to make a tweak to configurator to allow it to work with project class instances
2
- module Configurator
3
- def self.extended(base)
4
- if base.respond_to?(:class_eval)
5
- base.class_eval { remove_instance_variable(:@configuration) if defined? @configuration }
6
- else
7
- puts "EXTENDING #{base} AS WE SPEAK"
8
- base.instance_variable_set( :@got_extended, true )
9
- # base.instance_variable_set( :@configuration, nil )
10
- end
11
- end
12
- end
13
-
14
- module EpubForge
15
- module Utils
16
- class Settings
17
- def self.thing_to_configure( *args )
18
- if( args.length >= 1 )
19
- @thing_to_configure = args.first
20
- end
21
- @thing_to_configure
22
- end
23
-
24
- # Takes a configurator object and (optionally) a settings file to write it out to.
25
- def initialize( configable, file = nil )
26
- @configable = configable
27
- @file = file.fwf_filepath.expand if file
28
- install_configuration
29
- end
30
-
31
- def act_on_string( keqv, set = :set )
32
- k,v = parse_kv( keqv )
33
- if set == :unset
34
- unset( k )
35
- elsif set == :set
36
- set( k, v )
37
- end
38
- end
39
-
40
- def set( key, val )
41
- setting, last_key = descend_key( key )
42
- setting[last_key] = val
43
- end
44
-
45
- def unset( key )
46
- setting, last_key = descend_key( key )
47
- setting.delete( last_key )
48
- end
49
-
50
- def write_settings_file( settings_file = nil )
51
- settings_file ||= @file
52
- settings_file = settings_file.fwf_filepath
53
- @depth = 0
54
- str = indented_line("EpubForge::Utils::Settings.thing_to_configure.config do")
55
- str += write_config( @configable.config.to_hash )
56
- str += indented_line("end")
57
- settings_file.write( str )
58
- end
59
-
60
- protected
61
- def install_configuration
62
- self.class.thing_to_configure( @configable )
63
- self.class.thing_to_configure.extend( Configurator )
64
- require @file
65
- self.class.thing_to_configure( nil )
66
- end
67
-
68
- def indented_line( str )
69
- puts " " * @depth + str + "\n"
70
- " " * @depth + str + "\n"
71
- end
72
-
73
- def write_config( h )
74
- str = ""
75
- @depth += 2
76
- for k, v in h
77
- if v.is_a?(Hash)
78
- str += indented_line( "#{k} do" )
79
- str += write_config( v )
80
- str += indented_line( "end" )
81
- else
82
- str += indented_line( "#{k} #{stringify_value( v )}" )
83
- end
84
- end
85
- @depth -= 2
86
-
87
- str
88
- end
89
-
90
- def stringify_value( v )
91
- case v
92
- when Regexp
93
- "/#{v.source}/"
94
- when Numeric
95
- "#{v}"
96
- when String
97
- escape_string( v )
98
- when FunWith::Files::FilePath
99
- escape_string( v ) + ".fwf_filepath"
100
- when Array # TODO: Is there a way to enter arrays?
101
- "[ #{ v.map{ |item| stringify_value(item) }.join(', ') } ]"
102
- when NilClass
103
- "nil"
104
- when TrueClass
105
- "true"
106
- when FalseClass
107
- "false"
108
- end
109
- end
110
-
111
- def escape_string( s )
112
- s.inspect
113
- end
114
-
115
- # If given a hierarchical setting key like git:host:url,
116
- # returns the hash attached to config[:git][:host], so the caller can say
117
- # rval[:url] = "bannedsorcery.com". Creates empty hashes as it descends,
118
- # if neccessary.
119
- def descend_key( k )
120
- keychain = k.split(":").map{ |key| :"#{key}" }
121
-
122
- s = @configable.config
123
-
124
- for key in keychain[0..-2]
125
- s[key] ||= {}
126
- s = s[key]
127
- end
128
-
129
- [s, keychain.last]
130
- end
131
-
132
- def parse_kv( str )
133
- if m = str.match( /^([a-z0-9_:]+)=(.*)$/ )
134
- discard, k, v = m.to_a
135
- elsif m = str.match( /^([a-z0-9_:]+)$/ )
136
- discard, k = m.to_a
137
- v = nil
138
- else
139
- k = v = nil
140
- end
141
-
142
- [k, v]
143
- end
144
- end
145
- end
146
- end
@@ -1,20 +0,0 @@
1
- module EpubForge
2
- module Utils
3
- class TemplateEvaluator
4
- attr_reader :content, :vars, :result
5
- def initialize( content, vars = {} )
6
- if content.is_a?(Pathname) && content.file?
7
- @content = @content.read
8
- else
9
- @content = content.to_s
10
- end
11
-
12
- @vars = vars
13
-
14
- @result = with_locals(@vars) do
15
- ERB.new( @content ).result( binding )
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,4 +0,0 @@
1
- Chapter <%= @i %>
2
- ========<%= "=" * @i.to_s.length %>
3
-
4
-
@@ -1,4 +0,0 @@
1
- The Adventures of Writer-Man!
2
- =============================
3
-
4
- by Annotatia Von Helmermurmer
@@ -1,4 +0,0 @@
1
- George
2
- ======
3
-
4
- He's just a guy, y'know?
@@ -1,65 +0,0 @@
1
- dir '/'
2
- dir 'book'
3
- template 'title_page.markdown'
4
- template 'foreword.markdown'
5
- template 'afterword.markdown'
6
- sequence 'scene-{04i}.markdown'
7
- dir 'images'
8
- file 'cover.png'
9
- dir 'stylesheets'
10
- template 'stylesheet.css'
11
- dir 'notes'
12
- sequence 'character.{name}.markdown'
13
- dir 'settings'
14
- template 'config'
15
- file 'htmlizers.rb'
16
- template 'wordcount'
17
- dir 'actions'
18
- file 'local_action.rb.example'
19
-
20
-
21
- class Munition
22
- end
23
-
24
- class FileSequence < Munition
25
- end
26
-
27
- class DirectorySequence < Munition
28
- end
29
-
30
- class TemplateFile < Munition
31
- end
32
-
33
-
34
-
35
- class Payload
36
- def initialize( src, &block )
37
- @munitions = []
38
- yield self if block_given?
39
- end
40
-
41
- def dir( name, &block )
42
-
43
- yield if block_given?
44
- end
45
-
46
- def root( dir = nil )
47
- @root = dir.fwf_filepath if dir
48
- @root
49
- end
50
-
51
- def sequence( name, count )
52
-
53
- end
54
-
55
- def deploy( dst )
56
- @munitions.each do |munition|
57
- munition.deploy( dst )
58
- end
59
- end
60
- end
61
-
62
- Template::Payload.new do |t|
63
- dir.template
64
-
65
- end
@@ -1,55 +0,0 @@
1
- # Used by epubforge.
2
- FunWith::Configurations::Config.new do
3
- metadata do
4
- name "<%= config[:title] || "My Book" %>" # The title of the book
5
- author "<%= config[:author] || "Author" %>" # Your moniker. Your Nom de Plume. The thing people say to get your attention.
6
- license "<%= config[:license] || "All Rights Reserved" %>"
7
- publisher "<%= config[:publisher] || 'My Publisher' %>"
8
- original_publication "<%= config[:original_publication] || Time.now.strftime('%Y-%m-%d') %>" # The year this work was first published
9
- end
10
-
11
- filename "<%= config[:title].epf_underscorize %>" # The default filename for your ebook (no extension).
12
-
13
-
14
- <% if config[:git] -%>
15
- ############### GOT GIT? #####################################
16
- git do
17
- repo_folder "<%= config[:git][:repo] %>"
18
- remote_host "<%= config[:git][:host] %>"
19
- remote_user "<%= config[:git][:user] %>"
20
- repo_id "<%= config[:git][:repo_id] %>"
21
- end
22
- ############### /GOT GIT? #####################################
23
- <% end -%>
24
-
25
-
26
- # Any pages not listed here will be added
27
- # to the ebook after the listed pages, in alphabetical order of
28
- # filename. In this example, the title_page.markdown file goes first,
29
- # then the foreword.markdown page, then chapters 1 and 2 (in alphanumeric order)
30
- # and finally the afterword. Any pages not matched will be put after the
31
- # set of matched pages.
32
-
33
- pages do
34
- book [
35
- # matches title_page.markdown, title_page.textile, or
36
- # title_page.(any other valid extension). This will be the first
37
- # scene/chapter/division in the book.
38
- "title_page",
39
- "foreword",
40
-
41
- # filename matches chapter, followed by anything. If you have a page called
42
- # chapter_summary that comes after, you might want to define the matcher more
43
- # specifically, for example 'chapter-\d+' (chapter followed by dash followed by any number of numbers).
44
- #
45
- "chapter-.*",
46
- "afterword"
47
- ]
48
-
49
- notes [
50
- # You can set the order that the notes entries appear in below.
51
- "example89823786",
52
- "example89723987"
53
- ]
54
- end
55
- end