muwu 2.5.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.
Files changed (126) hide show
  1. checksums.yaml +7 -0
  2. data/bin/muwu +5 -0
  3. data/lib/muwu.rb +38 -0
  4. data/lib/muwu/cli/cli.rb +143 -0
  5. data/lib/muwu/cli/cli_help.rb +28 -0
  6. data/lib/muwu/cli/help/compile +22 -0
  7. data/lib/muwu/cli/help/concat +8 -0
  8. data/lib/muwu/cli/help/heading +2 -0
  9. data/lib/muwu/cli/help/inspect +7 -0
  10. data/lib/muwu/cli/help/new +8 -0
  11. data/lib/muwu/cli/help/reset +14 -0
  12. data/lib/muwu/cli/help/summary +14 -0
  13. data/lib/muwu/controller/controller.rb +120 -0
  14. data/lib/muwu/controller/controller_interaction.rb +146 -0
  15. data/lib/muwu/default/default.rb +51 -0
  16. data/lib/muwu/destination/destination.rb +212 -0
  17. data/lib/muwu/destination_builder/destination_builder.rb +127 -0
  18. data/lib/muwu/helper/hash_helper.rb +37 -0
  19. data/lib/muwu/helper/html_href_helper.rb +101 -0
  20. data/lib/muwu/helper/outline_helper.rb +160 -0
  21. data/lib/muwu/helper/regexp_lib.rb +101 -0
  22. data/lib/muwu/helper/sanitizer_helper.rb +50 -0
  23. data/lib/muwu/manifest/manifest.rb +158 -0
  24. data/lib/muwu/manifest_builder/manifest_builder.rb +102 -0
  25. data/lib/muwu/manifest_task/contents.rb +42 -0
  26. data/lib/muwu/manifest_task/document_css.rb +25 -0
  27. data/lib/muwu/manifest_task/document_html.rb +69 -0
  28. data/lib/muwu/manifest_task/document_js.rb +25 -0
  29. data/lib/muwu/manifest_task/metadata.rb +35 -0
  30. data/lib/muwu/manifest_task/navigator.rb +29 -0
  31. data/lib/muwu/manifest_task/subcontents.rb +48 -0
  32. data/lib/muwu/manifest_task/text.rb +51 -0
  33. data/lib/muwu/manifest_task/text_item.rb +124 -0
  34. data/lib/muwu/manifest_task/title.rb +34 -0
  35. data/lib/muwu/manifest_task_builder/contents_builder.rb +88 -0
  36. data/lib/muwu/manifest_task_builder/document_css_builder.rb +63 -0
  37. data/lib/muwu/manifest_task_builder/document_html_builder.rb +210 -0
  38. data/lib/muwu/manifest_task_builder/document_js_builder.rb +69 -0
  39. data/lib/muwu/manifest_task_builder/metadata_builder.rb +118 -0
  40. data/lib/muwu/manifest_task_builder/navigator_builder.rb +78 -0
  41. data/lib/muwu/manifest_task_builder/subcontents_builder.rb +90 -0
  42. data/lib/muwu/manifest_task_builder/text_builder.rb +125 -0
  43. data/lib/muwu/manifest_task_builder/text_item_builder.rb +314 -0
  44. data/lib/muwu/manifest_task_builder/title_builder.rb +122 -0
  45. data/lib/muwu/project/project.rb +430 -0
  46. data/lib/muwu/project_builder/assets/config/css/base/html_elements.scss +138 -0
  47. data/lib/muwu/project_builder/assets/config/css/base/index.scss +11 -0
  48. data/lib/muwu/project_builder/assets/config/css/base/mixin_text_section_heading.scss +23 -0
  49. data/lib/muwu/project_builder/assets/config/css/base/section_muwu_contents.scss +58 -0
  50. data/lib/muwu/project_builder/assets/config/css/base/section_muwu_metadata.scss +17 -0
  51. data/lib/muwu/project_builder/assets/config/css/base/section_muwu_navigator.scss +13 -0
  52. data/lib/muwu/project_builder/assets/config/css/base/section_muwu_subcontents.scss +58 -0
  53. data/lib/muwu/project_builder/assets/config/css/base/section_muwu_text.scss +48 -0
  54. data/lib/muwu/project_builder/assets/config/css/base/section_muwu_title.scss +22 -0
  55. data/lib/muwu/project_builder/assets/config/css/colors/dark.scss +32 -0
  56. data/lib/muwu/project_builder/assets/config/css/colors/index.scss +1 -0
  57. data/lib/muwu/project_builder/assets/config/css/colors/light.scss +34 -0
  58. data/lib/muwu/project_builder/assets/config/css/extensions/index.scss +1 -0
  59. data/lib/muwu/project_builder/assets/config/css/index.scss +19 -0
  60. data/lib/muwu/project_builder/assets/config/css_debugger/debug_section_text.scss +27 -0
  61. data/lib/muwu/project_builder/project_reader.rb +144 -0
  62. data/lib/muwu/project_builder/project_reset_css.rb +95 -0
  63. data/lib/muwu/project_builder/project_starter.rb +27 -0
  64. data/lib/muwu/project_builder/project_validator.rb +157 -0
  65. data/lib/muwu/project_builder/project_writer.rb +127 -0
  66. data/lib/muwu/project_exception/css_manifest_file_not_found.rb +23 -0
  67. data/lib/muwu/project_exception/dry_output_recommended_with_multiple_documents.rb +19 -0
  68. data/lib/muwu/project_exception/metadata_file_not_found.rb +24 -0
  69. data/lib/muwu/project_exception/metadata_value_not_given.rb +42 -0
  70. data/lib/muwu/project_exception/multiple_documents_outlined_with_stdout.rb +18 -0
  71. data/lib/muwu/project_exception/multiple_formats_requested_with_stdout.rb +18 -0
  72. data/lib/muwu/project_exception/navigator_not_recommended_with_stdout.rb +23 -0
  73. data/lib/muwu/project_exception/navigators_will_be_generated_automatically.rb +23 -0
  74. data/lib/muwu/project_exception/option_key_not_understood.rb +23 -0
  75. data/lib/muwu/project_exception/option_not_validatable.rb +23 -0
  76. data/lib/muwu/project_exception/option_value_not_understood.rb +24 -0
  77. data/lib/muwu/project_exception/options_file_not_found.rb +24 -0
  78. data/lib/muwu/project_exception/outline_file_not_found.rb +24 -0
  79. data/lib/muwu/project_exception/outline_step_not_understood.rb +23 -0
  80. data/lib/muwu/project_exception/output_already_open.rb +18 -0
  81. data/lib/muwu/project_exception/output_not_open.rb +18 -0
  82. data/lib/muwu/project_exception/subcontents_will_be_generated_automatically copy.rb +23 -0
  83. data/lib/muwu/project_exception/target_project_folder_already_exists.rb +24 -0
  84. data/lib/muwu/project_exception/text_source_file_not_found.rb +26 -0
  85. data/lib/muwu/project_exception_handler/fatal.rb +39 -0
  86. data/lib/muwu/project_options/project_options.rb +54 -0
  87. data/lib/muwu/project_options_builder/project_option_validator.rb +37 -0
  88. data/lib/muwu/project_options_builder/project_option_validator_key.rb +56 -0
  89. data/lib/muwu/project_options_builder/project_option_validator_value.rb +300 -0
  90. data/lib/muwu/project_options_builder/project_options_reader.rb +80 -0
  91. data/lib/muwu/render_concat/render_concat.rb +80 -0
  92. data/lib/muwu/render_html/render_html.rb +101 -0
  93. data/lib/muwu/render_html/render_markup_to_html.rb +87 -0
  94. data/lib/muwu/render_html_builder/render_css_builder.rb +34 -0
  95. data/lib/muwu/render_html_builder/render_html_builder.rb +34 -0
  96. data/lib/muwu/render_html_builder/render_js_builder.rb +34 -0
  97. data/lib/muwu/render_html_partial/js_library/_init_bare.js +7 -0
  98. data/lib/muwu/render_html_partial/js_library/_zepto.min.js +2 -0
  99. data/lib/muwu/render_html_partial/js_library/init.js +10 -0
  100. data/lib/muwu/render_html_partial/js_library/navigation.js +140 -0
  101. data/lib/muwu/render_html_partial/render_contents.rb +369 -0
  102. data/lib/muwu/render_html_partial/render_document_css.rb +45 -0
  103. data/lib/muwu/render_html_partial/render_document_html.rb +397 -0
  104. data/lib/muwu/render_html_partial/render_document_js.rb +37 -0
  105. data/lib/muwu/render_html_partial/render_js_library.rb +54 -0
  106. data/lib/muwu/render_html_partial/render_metadata.rb +120 -0
  107. data/lib/muwu/render_html_partial/render_navigator.rb +136 -0
  108. data/lib/muwu/render_html_partial/render_subcontents.rb +374 -0
  109. data/lib/muwu/render_html_partial/render_text.rb +74 -0
  110. data/lib/muwu/render_html_partial/render_text_item.rb +230 -0
  111. data/lib/muwu/render_html_partial/render_title.rb +71 -0
  112. data/lib/muwu/render_html_partial_builder/render_contents_builder.rb +100 -0
  113. data/lib/muwu/render_html_partial_builder/render_document_css_builder.rb +46 -0
  114. data/lib/muwu/render_html_partial_builder/render_document_html_builder.rb +211 -0
  115. data/lib/muwu/render_html_partial_builder/render_document_js_builder.rb +52 -0
  116. data/lib/muwu/render_html_partial_builder/render_metadata_builder.rb +47 -0
  117. data/lib/muwu/render_html_partial_builder/render_navigator_builder.rb +74 -0
  118. data/lib/muwu/render_html_partial_builder/render_subcontents_builder.rb +85 -0
  119. data/lib/muwu/render_html_partial_builder/render_text_builder.rb +86 -0
  120. data/lib/muwu/render_html_partial_builder/render_text_item_builder.rb +274 -0
  121. data/lib/muwu/render_html_partial_builder/render_title_builder.rb +47 -0
  122. data/lib/muwu/render_inspector/render_inspector.rb +224 -0
  123. data/lib/muwu/var/deflistdiv.rb +239 -0
  124. data/lib/muwu_loader.rb +35 -0
  125. data/test/what_no_tests.md +5 -0
  126. metadata +251 -0
@@ -0,0 +1,122 @@
1
+ module Muwu
2
+ module ManifestTaskBuilders
3
+ class TitleBuilder
4
+
5
+
6
+ include Muwu
7
+ include Helper
8
+
9
+
10
+ attr_accessor(
11
+ :outline_fragment_title,
12
+ :parent_document,
13
+ :project,
14
+ :task
15
+ )
16
+
17
+
18
+ def self.build
19
+ builder = new
20
+ yield(builder)
21
+ builder.task
22
+ end
23
+
24
+
25
+ def initialize
26
+ @task = ManifestTask::Title.new
27
+ end
28
+
29
+
30
+ def build_from_outline(outline_fragment_title, parent_document)
31
+ @destination = parent_document.destination
32
+ @outline_fragment_title = outline_fragment_title
33
+ @parent_document = parent_document
34
+ @project = parent_document.project
35
+ phase_1_set_parent
36
+ phase_1_set_project
37
+ phase_2_set_destination
38
+ phase_2_set_metadata
39
+ phase_3_validate_metadata_values_exist
40
+ end
41
+
42
+
43
+ def phase_1_set_parent
44
+ @task.parent_document = @parent_document
45
+ end
46
+
47
+
48
+ def phase_1_set_project
49
+ @task.project = @project
50
+ end
51
+
52
+
53
+ def phase_2_set_destination
54
+ @task.destination = @destination
55
+ end
56
+
57
+
58
+ def phase_2_set_metadata
59
+ @task.metadata = determine_metadata
60
+ end
61
+
62
+
63
+ def phase_3_validate_metadata_values_exist
64
+ ProjectValidator.new(@project).validate_task_title(@task)
65
+ end
66
+
67
+
68
+
69
+ private
70
+
71
+
72
+ def determine_metadata
73
+ case @outline_fragment_title
74
+ when Hash
75
+ determine_metadata_selected
76
+ when String
77
+ determine_metadata_default
78
+ end
79
+ end
80
+
81
+
82
+ def determine_metadata_default
83
+ metadata = {}
84
+ @project.options.render_title_section_metadata.each do |key|
85
+ metadata[key] = @project.metadata[key]
86
+ end
87
+ metadata
88
+ end
89
+
90
+
91
+ def determine_metadata_selected
92
+ metadata = {}
93
+ keys = @outline_fragment_title.flatten[1]
94
+ keys.each do |key|
95
+ if key =~ RegexpLib.metadata_key_date_of_this_edition
96
+ metadata.merge!(determine_metadata_date_of_this_edition(key: key))
97
+ else
98
+ metadata.merge!(determine_metadata_selected_and_validate(key))
99
+ end
100
+ end
101
+ metadata
102
+ end
103
+
104
+
105
+ def determine_metadata_selected_and_validate(key)
106
+ metadata = @project.metadata.select { |k,v| k.downcase == key.downcase }
107
+ if metadata.empty?
108
+ metadata = {key => nil}
109
+ end
110
+ metadata
111
+ end
112
+
113
+
114
+ def determine_metadata_date_of_this_edition(key: 'date of this edition')
115
+ metadata = {key => @project.metadata["date of this edition"]}
116
+ metadata
117
+ end
118
+
119
+
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,430 @@
1
+ module Muwu
2
+ class Project
3
+
4
+
5
+ include Muwu
6
+ include Helper
7
+
8
+
9
+ attr_accessor(
10
+ :exceptions,
11
+ :instance_date,
12
+ :javascript_libraries_requested,
13
+ :manifest,
14
+ :metadata,
15
+ :options,
16
+ :outline,
17
+ :slug,
18
+ :working_directory
19
+ )
20
+
21
+
22
+ def initialize
23
+ @exceptions = []
24
+ @instance_date = Time.now.strftime('%Y-%m-%d')
25
+ @metadata = {}
26
+ @outline = []
27
+ end
28
+
29
+
30
+ def inspect
31
+ ["#{self.to_s}", "{", inspect_instance_variables, "}"].join(' ')
32
+ end
33
+
34
+
35
+ def inspect_instance_variables
36
+ self.instance_variables.map { |v| "#{v}=#<#{instance_variable_get(v).class}>" }.join(", ")
37
+ end
38
+
39
+
40
+
41
+ public
42
+
43
+
44
+ def css_manifest_file_does_exist
45
+ File.exists?(css_manifest_filename) == true
46
+ end
47
+
48
+
49
+ def css_manifest_filename
50
+ File.absolute_path(File.join(path_css, 'index.scss'))
51
+ end
52
+
53
+
54
+ def css_basename
55
+ if @options.output_file_css_basename.to_s == ''
56
+ SanitizerHelper::sanitize_destination_file_basename(slug).downcase
57
+ else
58
+ SanitizerHelper::sanitize_destination_file_basename(@options.output_file_css_basename).downcase
59
+ end
60
+ end
61
+
62
+
63
+ def default_text_block_name
64
+ Default::PROJECT_OUTLINE[:default_text_block_name]
65
+ end
66
+
67
+
68
+ def does_not_have_crucial_files
69
+ exceptions_include?(ProjectException::MetadataFileNotFound) &&
70
+ exceptions_include?(ProjectException::OptionsFileNotFound) &&
71
+ exceptions_include?(ProjectException::OutlineFileNotFound)
72
+ end
73
+
74
+
75
+ def exceptions_add(exception)
76
+ @exceptions << exception
77
+ end
78
+
79
+
80
+ def exceptions_fatal
81
+ @exceptions.select{ |e| e.type == :fatal }
82
+ end
83
+
84
+
85
+ def exceptions_include?(exception)
86
+ @exceptions.map{ |e| e.class }.include?(exception)
87
+ end
88
+
89
+
90
+ def has_multiple_html_documents
91
+ @manifest.documents_html_count > 1
92
+ end
93
+
94
+
95
+ def html_basename
96
+ if @options.output_file_html_basename.to_s == ''
97
+ SanitizerHelper::sanitize_destination_file_basename('index').downcase
98
+ else
99
+ SanitizerHelper::sanitize_destination_file_basename(@options.output_file_html_basename).downcase
100
+ end
101
+ end
102
+
103
+
104
+ def js_basename
105
+ if @options.output_file_js_basename.to_s == ''
106
+ SanitizerHelper::sanitize_destination_file_basename(slug).downcase
107
+ else
108
+ SanitizerHelper::sanitize_destination_file_basename(@options.output_file_js_basename).downcase
109
+ end
110
+ end
111
+
112
+
113
+ def metadata_file_does_exist
114
+ File.exists?(metadata_filename) == true
115
+ end
116
+
117
+
118
+ def metadata_file_does_not_exist
119
+ File.exists?(metadata_filename) == false
120
+ end
121
+
122
+
123
+ def metadata_filename
124
+ determine_project_asset_filepath(:metadata)
125
+ end
126
+
127
+
128
+ def options_file_does_exist
129
+ File.exists?(options_filename) == true
130
+ end
131
+
132
+
133
+ def options_file_does_not_exist
134
+ File.exists?(options_filename) == false
135
+ end
136
+
137
+
138
+ def options_filename
139
+ determine_project_asset_filepath(:options)
140
+ end
141
+
142
+
143
+ def outline_file_does_exist
144
+ File.exists?(outline_filename) == true
145
+ end
146
+
147
+
148
+ def outline_file_does_not_exist
149
+ File.exists?(outline_filename) == false
150
+ end
151
+
152
+
153
+ def outline_filename
154
+ determine_project_asset_filepath(:outline)
155
+ end
156
+
157
+
158
+ def outline_has_more_than_one_document
159
+ outline_length > 1
160
+ end
161
+
162
+
163
+ def outline_has_only_one_document
164
+ outline_length == 1
165
+ end
166
+
167
+
168
+ def outline_length
169
+ outline.length
170
+ end
171
+
172
+
173
+ def outline_text_block_names
174
+ result = []
175
+ outline_text_blocks.each do |text_block|
176
+ text_block_name = determine_text_block_name(text_block)
177
+ if text_block_name == ''
178
+ result << 'main'
179
+ else
180
+ result << text_block_name
181
+ end
182
+ end
183
+ result.uniq
184
+ end
185
+
186
+
187
+ def outline_text_blocks
188
+ @outline.flatten.select { |outline_step| (Hash === outline_step) && (RegexpLib.outline_text =~ outline_step.flatten[0]) }
189
+ end
190
+
191
+
192
+ def outline_text_blocks_named(text_root_name)
193
+ result = []
194
+ outline_text_blocks.each do |text_block|
195
+ text_block_name = determine_text_block_name(text_block)
196
+ if text_block_name == text_root_name.downcase
197
+ result.concat(text_block.flatten[1])
198
+ end
199
+ end
200
+ result
201
+ end
202
+
203
+
204
+ def outline_text_pathnames
205
+ @options.outline_text_pathnames
206
+ end
207
+
208
+
209
+ def outline_text_pathnames_are_explicit
210
+ @options.outline_text_pathnames == 'explicit'
211
+ end
212
+
213
+
214
+ def outline_text_pathnames_are_flexible
215
+ @options.outline_text_pathnames == 'flexible'
216
+ end
217
+
218
+
219
+ def outline_text_pathnames_are_implicit
220
+ @options.outline_text_pathnames == 'implicit'
221
+ end
222
+
223
+
224
+ def outlined_documents
225
+ @outline
226
+ end
227
+
228
+
229
+ def outlined_documents_by_index
230
+ result = {}
231
+ @outline.each_index do |index|
232
+ result[index] = @outline[index]
233
+ end
234
+ result
235
+ end
236
+
237
+
238
+ def output_destination
239
+ @options.output_destination
240
+ end
241
+
242
+
243
+ def output_destination_requests_stdout
244
+ @options.output_destination == 'stdout'
245
+ end
246
+
247
+
248
+ def output_formats_several
249
+ @options.output_formats.length > 1
250
+ end
251
+
252
+
253
+ def path_config
254
+ File.absolute_path(File.join(@working_directory, 'config'))
255
+ end
256
+
257
+
258
+ def path_css
259
+ File.absolute_path(File.join(path_config, 'css'))
260
+ end
261
+
262
+
263
+ def path_css_base
264
+ File.absolute_path(File.join(path_css, 'base'))
265
+ end
266
+
267
+
268
+ def path_css_colors
269
+ File.absolute_path(File.join(path_css, 'colors'))
270
+ end
271
+
272
+
273
+ def path_css_extensions
274
+ File.absolute_path(File.join(path_css, 'extensions'))
275
+ end
276
+
277
+
278
+ def path_images
279
+ File.absolute_path(File.join(@working_directory, 'images'))
280
+ end
281
+
282
+
283
+ def path_outline
284
+ @working_directory
285
+ end
286
+
287
+
288
+ def path_text
289
+ File.absolute_path(File.join(@working_directory, 'text'))
290
+ end
291
+
292
+
293
+ def slug
294
+ if @metadata.has_key?('slug')
295
+ @metadata['slug']
296
+ else
297
+ working_directory_name
298
+ end
299
+ end
300
+
301
+
302
+ def sort_outline_text_blocks
303
+ result = []
304
+ outline_text_blocks.each do |text_block|
305
+ text_block_name = determine_text_block_name(text_block)
306
+ text_block_contents = determine_text_block_contents(text_block)
307
+ existing_block = result.select { |b| b.has_key?(text_block_name) }.flatten
308
+ if existing_block.empty?
309
+ result << { text_block_name => text_block_contents }
310
+ else
311
+ existing_block[text_block_name].concat(text_block_contents)
312
+ end
313
+ end
314
+ result
315
+ end
316
+
317
+
318
+ def text_block_naming_is_simple
319
+ outline_text_block_names == [default_text_block_name]
320
+ end
321
+
322
+
323
+ def text_block_naming_is_not_simple
324
+ text_block_naming_is_simple == false
325
+ end
326
+
327
+
328
+ def title
329
+ if @metadata.has_key?('title')
330
+ @metadata['title']
331
+ else
332
+ working_directory_name
333
+ end
334
+ end
335
+
336
+
337
+ def will_create_css_file
338
+ @options.output_formats.include?('css')
339
+ end
340
+
341
+
342
+ def will_create_html_file_only
343
+ @options.output_formats == ['html']
344
+ end
345
+
346
+
347
+ def will_create_javascript_file
348
+ if will_require_javascript_libraries
349
+ @options.output_formats.include?('js')
350
+ end
351
+ end
352
+
353
+
354
+ def will_require_javascript_libraries
355
+ @javascript_libraries_requested.count > 0
356
+ end
357
+
358
+
359
+ def will_embed_at_least_one_asset
360
+ will_embed_css || will_embed_js
361
+ end
362
+
363
+
364
+ def will_embed_css
365
+ will_create_css_file == false
366
+ end
367
+
368
+
369
+ def will_embed_js
370
+ will_create_javascript_file == false
371
+ end
372
+
373
+
374
+ def will_generate_navigators_automatically
375
+ (outline_has_more_than_one_document) && (@options.generate_navigators_automatically == true) && (@options.output_destination == 'file')
376
+ end
377
+
378
+
379
+ def will_generate_subcontents_automatically
380
+ (outline_has_more_than_one_document) && (@options.generate_subcontents_automatically == true)
381
+ end
382
+
383
+
384
+ def will_render_section_numbers
385
+ @options.render_section_numbers == true
386
+ end
387
+
388
+
389
+ def will_not_generate_navigators_automatically
390
+ not will_generate_navigators_automatically
391
+ end
392
+
393
+
394
+ def will_not_generate_subcontents_automatically
395
+ not will_generate_subcontents_automatically
396
+ end
397
+
398
+
399
+ def working_directory_name
400
+ @working_directory.split(File::SEPARATOR)[-1]
401
+ end
402
+
403
+
404
+
405
+ private
406
+
407
+
408
+ def determine_project_asset_filepath(type)
409
+ File.absolute_path(File.join(@working_directory, Default::FILEPATHS[type], Default::FILENAMES[type]))
410
+ end
411
+
412
+
413
+ def determine_text_block_contents(text_block)
414
+ text_block.flatten[1]
415
+ end
416
+
417
+
418
+ def determine_text_block_name(text_block)
419
+ directive = text_block.flatten[0]
420
+ components = directive.partition(RegexpLib.outline_text_plus_whitespace)
421
+ text_block_name = components[2].to_s.downcase.strip
422
+ if text_block_name == ''
423
+ text_block_name = default_text_block_name
424
+ end
425
+ text_block_name
426
+ end
427
+
428
+
429
+ end
430
+ end