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
@@ -0,0 +1,113 @@
1
+
2
+ module EpubForge
3
+ module Utils
4
+ module HtmlTranslatorQueue
5
+ GROUP_NAMES = [:preferred, :user, :default, :fallback]
6
+
7
+ def self.included( base )
8
+ base.send( :include, FunWith::Patterns::Loader )
9
+ base.extend( HtmlTranslatorQueue::ClassMethods )
10
+ base.loader_pattern_only_register_classes( self )
11
+ end
12
+
13
+ module ClassMethods
14
+ def loader_pattern_register_item( translator )
15
+ @translators ||= {}
16
+ @translators[:all] ||= []
17
+ @translators[:named] ||= {}
18
+
19
+ for name in HtmlTranslatorQueue::GROUP_NAMES
20
+ @translators[name] ||= []
21
+ end
22
+
23
+ self.categorize( translator )
24
+
25
+ nil # returning true will break loader
26
+ end
27
+
28
+
29
+
30
+ def translators
31
+ @translators
32
+ end
33
+
34
+ def categorize( translator )
35
+ unless GROUP_NAMES.include?( translator.group )
36
+ puts "No group specified for html translator #{translator}. Group must be one of the following symbols: #{GROUP_NAMES.map(&:inspect).inspect}"
37
+ return false
38
+ end
39
+
40
+ @translators[:all] << translator
41
+ @translators[:named][translator.name] = translator if translator.name
42
+ @translators[translator.group] << translator
43
+ end
44
+
45
+ def named( sym )
46
+ @translators[:named][sym]
47
+ end
48
+
49
+ def each_translator( &block )
50
+ ordered_translators = []
51
+ for group in GROUP_NAMES.map{|g| @translators[g].reverse }
52
+ ordered_translators += group
53
+ end
54
+
55
+ if block_given?
56
+ for translator in ordered_translators
57
+ yield translator
58
+ end
59
+ else
60
+ ordered_translators.to_enum
61
+ end
62
+ end
63
+
64
+ def location( name, path = nil )
65
+ @exec_location ||= {}
66
+ @exec_location[name] = path if path
67
+ @exec_location[name]
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ # # A priority stack (like a priority queue, but FILO) with a simple job:
75
+ # # keep track of the translators (by name and by group), and return them
76
+ # # to the object user in the order they should be tried.
77
+ # class HtmlTranslatorQueue
78
+ # def self.group_names
79
+ # HtmlTranslator::GROUP_NAMES
80
+ # end
81
+ #
82
+ # def initialize
83
+ # @translators = {}
84
+ # @all_translators = []
85
+ # @translators_named = {}
86
+ # for name in GROUP_NAMES
87
+ # @translators[name] = []
88
+ # end
89
+ # end
90
+ #
91
+ # # def translators_handling_format( requested_format )
92
+ # # htmlizers = GROUP_NAMES.map{ |group|
93
+ # # (@translator_queue.keys - [:all, :named]).map do |format|
94
+ # # htmlizers = @translator_queue[format][group]
95
+ # # htmlizers ? htmlizers.select{|html| html.handles_format?(requested_format) } : []
96
+ # # end
97
+ # # }
98
+ # #
99
+ # # htmlizers.flatten
100
+ # # end
101
+ #
102
+ # # last installed, first yielded (within a given group)
103
+ # #
104
+ # # Returns them in priority order, user-defined ones first.
105
+ # # At the moment, it is up to individual translators to accept or
106
+ # # reject the translation job based on the file format (by extension, which is lame).
107
+ #
108
+ # def length
109
+ # @all_translators.length
110
+ # end
111
+ # end
112
+ # end
113
+ # end
@@ -0,0 +1,61 @@
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
+ # @already_set_up
18
+ # end
19
+ #
20
+ #
21
+ # # Commenting out for the moment. Philosophically, maybe it shouldn't provide access to individual translators.
22
+ # # def translators_named( name )
23
+ # # @translator_queue[:named][name]
24
+ # # end
25
+ #
26
+ # #
27
+ # # def self.define( &block )
28
+ # # htmlizer = HtmlTranslator.new
29
+ # # yield htmlizer
30
+ # # HtmlTranslator.categorize( htmlizer )
31
+ # # end
32
+ # #
33
+ # # def categorize( htmlizer )
34
+ # # HtmlTranslator.categorize( htmlizer )
35
+ # # end
36
+ # #
37
+ # # def add_htmlizers( htmlizers_file )
38
+ # # if htmlizers_file.exist?
39
+ # # begin
40
+ # # require htmlizers_file.to_s
41
+ # # rescue Exception => e
42
+ # # puts e.message
43
+ # # puts e.backtrace.map{|line| "\t#{line}" }
44
+ # # puts "Failed to load htmlizers from project file #{htmlizers_file} Soldiering onward."
45
+ # # end
46
+ # # end
47
+ # # end
48
+ #
49
+ #
50
+ # # available options
51
+ # # :htmlizer => the sym for the requested htmlizer.
52
+ # # :opts => a string representing options to execute cmd with
53
+ #
54
+ #
55
+ #
56
+ # end
57
+ #
58
+ # Htmlizer.instance.setup_once
59
+ # end
60
+ # end
61
+ #
File without changes
@@ -0,0 +1,8 @@
1
+ # should be obsoleted by FunWith::Files::RootPath
2
+ module EpubForge
3
+ module Utils
4
+ module RootPath
5
+ end
6
+ end
7
+ end
8
+
@@ -0,0 +1,147 @@
1
+ # TODO: Merge into FunWith::Configurations?
2
+ # have to make a tweak to configurator to allow it to work with project class instances
3
+ # module Configurator
4
+ # def self.extended(base)
5
+ # if base.respond_to?(:class_eval)
6
+ # base.class_eval { remove_instance_variable(:@configuration) if defined? @configuration }
7
+ # else
8
+ # puts "EXTENDING #{base} AS WE SPEAK"
9
+ # base.instance_variable_set( :@got_extended, true )
10
+ # # base.instance_variable_set( :@configuration, nil )
11
+ # end
12
+ # end
13
+ # end
14
+ #
15
+ # module EpubForge
16
+ # module Utils
17
+ # class Settings
18
+ # def self.thing_to_configure( *args )
19
+ # if( args.length >= 1 )
20
+ # @thing_to_configure = args.first
21
+ # end
22
+ # @thing_to_configure
23
+ # end
24
+ #
25
+ # # Takes a configurator object and (optionally) a settings file to write it out to.
26
+ # def initialize( configable, file = nil )
27
+ # @configable = configable
28
+ # @file = file.fwf_filepath.expand if file
29
+ # install_configuration
30
+ # end
31
+ #
32
+ # def act_on_string( keqv, setflag = :set )
33
+ # k,v = parse_kv( keqv )
34
+ # if setflag == :unset
35
+ # unset( k )
36
+ # elsif setflag == :set
37
+ # set( k, v )
38
+ # end
39
+ # end
40
+ #
41
+ # def set( key, val )
42
+ # setting, last_key = descend_key( key )
43
+ # setting[last_key] = val
44
+ # end
45
+ #
46
+ # def unset( key )
47
+ # setting, last_key = descend_key( key )
48
+ # setting.delete( last_key )
49
+ # end
50
+ #
51
+ # def write_settings_file( settings_file = nil )
52
+ # settings_file ||= @file
53
+ # settings_file = settings_file.fwf_filepath
54
+ # @depth = 0
55
+ # str = indented_line("EpubForge::Utils::Settings.thing_to_configure.config do")
56
+ # str += write_config( @configable.config.to_hash )
57
+ # str += indented_line("end")
58
+ # settings_file.write( str )
59
+ # end
60
+ #
61
+ # protected
62
+ # def install_configuration
63
+ # self.class.thing_to_configure( @configable )
64
+ # self.class.thing_to_configure.extend( Configurator )
65
+ # require @file
66
+ # self.class.thing_to_configure( nil )
67
+ # end
68
+ #
69
+ # def indented_line( str )
70
+ # puts " " * @depth + str + "\n"
71
+ # " " * @depth + str + "\n"
72
+ # end
73
+ #
74
+ # def write_config( h )
75
+ # str = ""
76
+ # @depth += 2
77
+ # for k, v in h
78
+ # if v.is_a?(Hash)
79
+ # str += indented_line( "#{k} do" )
80
+ # str += write_config( v )
81
+ # str += indented_line( "end" )
82
+ # else
83
+ # str += indented_line( "#{k} #{stringify_value( v )}" )
84
+ # end
85
+ # end
86
+ # @depth -= 2
87
+ #
88
+ # str
89
+ # end
90
+ #
91
+ # def stringify_value( v )
92
+ # case v
93
+ # when Regexp
94
+ # "/#{v.source}/"
95
+ # when Numeric
96
+ # "#{v}"
97
+ # when String
98
+ # escape_string( v )
99
+ # when FunWith::Files::FilePath
100
+ # escape_string( v ) + ".fwf_filepath"
101
+ # when Array # TODO: Is there a way to enter arrays?
102
+ # "[ #{ v.map{ |item| stringify_value(item) }.join(', ') } ]"
103
+ # when NilClass
104
+ # "nil"
105
+ # when TrueClass
106
+ # "true"
107
+ # when FalseClass
108
+ # "false"
109
+ # end
110
+ # end
111
+ #
112
+ # def escape_string( s )
113
+ # s.inspect
114
+ # end
115
+ #
116
+ # # If given a hierarchical setting key like git:host:url,
117
+ # # returns the hash attached to config[:git][:host], so the caller can say
118
+ # # rval[:url] = "bannedsorcery.com". Creates empty hashes as it descends,
119
+ # # if neccessary.
120
+ # def descend_key( k )
121
+ # keychain = k.split(":").map{ |key| :"#{key}" }
122
+ #
123
+ # s = @configable.config
124
+ #
125
+ # for key in keychain[0..-2]
126
+ # s[key] ||= {}
127
+ # s = s[key]
128
+ # end
129
+ #
130
+ # [s, keychain.last]
131
+ # end
132
+ #
133
+ # def parse_kv( str )
134
+ # if m = str.match( /^([a-z0-9_:]+)=(.*)$/ )
135
+ # discard, k, v = m.to_a
136
+ # elsif m = str.match( /^([a-z0-9_:]+)$/ )
137
+ # discard, k = m.to_a
138
+ # v = nil
139
+ # else
140
+ # k = v = nil
141
+ # end
142
+ #
143
+ # [k, v]
144
+ # end
145
+ # end
146
+ # end
147
+ # end
@@ -0,0 +1,7 @@
1
+ # Should be obsoleted by FunWith::Templates::TemplateEvaluator
2
+ module EpubForge
3
+ module Utils
4
+ class TemplateEvaluator
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ Chapter <%= @chapter %>
2
+ ========<%= "=" * @chapter.to_s.length %>
3
+
4
+
@@ -4,10 +4,10 @@
4
4
 
5
5
  <html xmlns="http://www.w3.org/1999/xhtml">
6
6
  <head>
7
- <title></title>
7
+ <title><%= @book[:title] %>, by <%= @book[:author] %></title>
8
8
  </head>
9
9
 
10
10
  <body>
11
- <p><img class="cover" alt="The Improbable Rise of Singularity Girl, by Bryce Anderson" src="../Images/cover.jpg" /></p>
11
+ <p><img class="cover" alt="<%= @book[:title] %>, by <%= @book[:author] %>" src="<%= @book[:cover].nil? ? "../Images/cover.jpg" : @book[:cover].path %>" /></p>
12
12
  </body>
13
13
  </html>
@@ -0,0 +1,5 @@
1
+ <%= @book[:title] %>
2
+ <%= "=" * (@book[:title] || "===").length %>
3
+
4
+ by <%= @book[:author] %>
5
+
@@ -0,0 +1,15 @@
1
+ <%= @character[:name] %>
2
+ <%= "=" * (@character[:name] || "").length %>
3
+
4
+ Summary
5
+ -------
6
+
7
+ <%= @character[:summary] %>
8
+
9
+ Description
10
+ -----------
11
+
12
+ Age: <%= @character[:age] %>
13
+
14
+ <%= @character[:description] %>
15
+
@@ -1,6 +1,6 @@
1
1
  module EpubForge
2
2
  module Action
3
- class <%= @class_name %> < ThorAction
3
+ class <%= @class_name %> < Action
4
4
 
5
5
  <% for action in @actions %>
6
6
  desc( "<%= @slug %>:<%= action %>", "do action <%= action %>" )
@@ -0,0 +1,70 @@
1
+ # Used by epubforge.
2
+ metadata do
3
+ name "<%= @book[:title] || "My Book" %>" # The title of the book
4
+ author "<%= @book[:author] || "Author" %>" # Your moniker. Your Nom de Plume. The thing people say to get your attention.
5
+ license "<%= @book[:license] || "All Rights Reserved" %>"
6
+ publisher "<%= @book[:publisher] || 'My Publisher' %>"
7
+ original_publication "<%= @book[:original_publication] || Time.now.strftime('%Y-%m-%d') %>" # The year this work was first published
8
+ end
9
+
10
+ filename "<%= (@book[:title] || "my_book").epf_underscorize %>" # The default filename for your ebook (no extension).
11
+
12
+ ############### GOT GIT? #####################################
13
+ #
14
+ # settings to allow epubforge to interact with a git repository. It's a way to back up your story.
15
+ # I hope eventually to add some basic branching support (for folks who don't want to use git directly).
16
+ # If your repo is on a thumb drive, please make sure it's plugged in.
17
+ <% if @git %>
18
+ git do
19
+ repo_folder "<%= @git[:repo] %>"
20
+ remote_host "<%= @git[:host] %>"
21
+ remote_user "<%= @git[:user] %>"
22
+ repo_id "<%= @git[:repo_id] %>"
23
+ end
24
+ <% else %>
25
+ # git do
26
+ # repo_folder "/path/to/folder"
27
+ # remote_host "my.hostname.com"
28
+ # remote_user "myusername"
29
+ # repo_id "not sure we're using this"
30
+ # end
31
+ <% end %>
32
+ ############### /GOT GIT? #####################################
33
+
34
+
35
+ # Any pages not listed here will be added
36
+ # to the ebook after the listed pages, in alphabetical order of
37
+ # filename. In this example, the title_page.markdown file goes first,
38
+ # then the foreword.markdown page, then chapters 1 and 2 (in alphanumeric order)
39
+ # and finally the afterword. Any pages not matched will be put after the
40
+ # set of matched pages.
41
+ #
42
+ # Note that the items in the list represent regular expressions. It works by
43
+ # sorting the sections into bins, based on the first regexp matched. Within the bins,
44
+ # results are returned in alphabetical order.
45
+ #
46
+ # Single quotes are preferred, because you don't have to escape backslashes for character classes
47
+ # like \s, \d, etc. This needs to be made easier for people who don't have a grasp of regular
48
+ # expressions.
49
+ pages do
50
+ book [
51
+ # matches title_page.markdown, title_page.textile, or
52
+ # title_page.(any other valid extension). This will be the first
53
+ # scene/chapter/division in the book.
54
+ 'title_page',
55
+ 'foreword',
56
+
57
+ # filename matches chapter, followed by anything. If you have a page called
58
+ # chapter_summary that comes after, you might want to define the matcher more
59
+ # specifically, for example 'chapter-\d+' (chapter followed by dash followed by any number of numbers).
60
+ #
61
+ 'chapter-.*',
62
+ 'afterword'
63
+ ]
64
+
65
+ notes [
66
+ # You can set the order that the notes entries appear in below.
67
+ "example89823786",
68
+ "example89723987"
69
+ ]
70
+ end