middleman-presentation-core 0.16.0.alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rdebugrc +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +52 -0
- data/.simplecov +25 -0
- data/.yardopts +5 -0
- data/Guardfile +13 -0
- data/LICENSE.software +21 -0
- data/Rakefile +200 -0
- data/config/license_finder.yml +13 -0
- data/cucumber.yml +2 -0
- data/doc/licenses/dependencies.csv +55 -0
- data/doc/licenses/dependencies.db +0 -0
- data/doc/licenses/dependencies.html +1415 -0
- data/doc/licenses/dependencies.md +603 -0
- data/doc/licenses/dependencies_detailed.csv +190 -0
- data/doc/yard/.keep +0 -0
- data/features/build_presentation.feature +62 -0
- data/features/code_highlighting.feature +43 -0
- data/features/components.feature +29 -0
- data/features/create_plugin-cli.feature +11 -0
- data/features/create_presentation-cli.feature +349 -0
- data/features/create_slide-cli.feature +188 -0
- data/features/create_slides-templates-cli.feature +114 -0
- data/features/create_theme-cli.feature +58 -0
- data/features/default_slides.feature +58 -0
- data/features/edit_slide-cli.feature +121 -0
- data/features/export_presentation-cli.feature +23 -0
- data/features/grouping_slides.feature +150 -0
- data/features/ignore_slides.feature +103 -0
- data/features/init_application-cli.feature +59 -0
- data/features/init_predefined_slides.feature +9 -0
- data/features/language_detection.feature +0 -0
- data/features/list_assets-cli.feature +13 -0
- data/features/list_components-cli.feature +13 -0
- data/features/list_helpers-cli.feature +13 -0
- data/features/list_plugins-cli.feature +13 -0
- data/features/list_styles-cli.feature +17 -0
- data/features/plugins.feature +63 -0
- data/features/presentation.feature +57 -0
- data/features/rename_slide-cli.feature +176 -0
- data/features/render_slides.feature +76 -0
- data/features/show_config-cli.feature +25 -0
- data/features/show_footer.feature +14 -0
- data/features/show_slide_number.feature +31 -0
- data/features/show_support_information-cli.feature +12 -0
- data/features/support/aruba.rb +18 -0
- data/features/support/ci.rb +3 -0
- data/features/support/env.rb +25 -0
- data/features/support/fixtures.rb +21 -0
- data/features/support/hash.rb +2 -0
- data/features/support/reporting.rb +2 -0
- data/features/version_number.feature +15 -0
- data/fixtures/middleman-presentation-simple_plugin/Rakefile +1 -0
- data/fixtures/middleman-presentation-simple_plugin/lib/middleman-presentation-plugin.rb +0 -0
- data/fixtures/middleman-presentation-simple_plugin/lib/middleman-presentation-simple_plugin/helpers.rb +13 -0
- data/fixtures/middleman-presentation-simple_plugin/lib/middleman-presentation-simple_plugin/plugin.rb +34 -0
- data/fixtures/middleman-presentation-simple_plugin/lib/middleman-presentation-simple_plugin/version.rb +8 -0
- data/fixtures/middleman-presentation-simple_plugin/lib/middleman-presentation-simple_plugin.rb +11 -0
- data/fixtures/middleman-presentation-simple_plugin/middleman-presentation-simple_plugin.gemspec +22 -0
- data/fixtures/middleman-presentation-simple_plugin/vendor/assets/stylesheets/test_simple.scss +3 -0
- data/lib/middleman-presentation-core/application_config.rb +198 -0
- data/lib/middleman-presentation-core/asset.rb +103 -0
- data/lib/middleman-presentation-core/asset_component.rb +34 -0
- data/lib/middleman-presentation-core/asset_list.rb +84 -0
- data/lib/middleman-presentation-core/asset_store.rb +73 -0
- data/lib/middleman-presentation-core/assets_loader.rb +95 -0
- data/lib/middleman-presentation-core/assets_manager.rb +73 -0
- data/lib/middleman-presentation-core/cache.rb +49 -0
- data/lib/middleman-presentation-core/cli/base.rb +30 -0
- data/lib/middleman-presentation-core/cli/base_group.rb +11 -0
- data/lib/middleman-presentation-core/cli/build.rb +13 -0
- data/lib/middleman-presentation-core/cli/build_presentation.rb +57 -0
- data/lib/middleman-presentation-core/cli/change.rb +13 -0
- data/lib/middleman-presentation-core/cli/change_slide.rb +82 -0
- data/lib/middleman-presentation-core/cli/create.rb +16 -0
- data/lib/middleman-presentation-core/cli/create_plugin.rb +62 -0
- data/lib/middleman-presentation-core/cli/create_presentation.rb +300 -0
- data/lib/middleman-presentation-core/cli/create_slide.rb +52 -0
- data/lib/middleman-presentation-core/cli/create_theme.rb +81 -0
- data/lib/middleman-presentation-core/cli/edit.rb +13 -0
- data/lib/middleman-presentation-core/cli/edit_slide.rb +49 -0
- data/lib/middleman-presentation-core/cli/export.rb +11 -0
- data/lib/middleman-presentation-core/cli/export_presentation.rb +55 -0
- data/lib/middleman-presentation-core/cli/init.rb +12 -0
- data/lib/middleman-presentation-core/cli/init_application.rb +48 -0
- data/lib/middleman-presentation-core/cli/init_predefined_slides.rb +31 -0
- data/lib/middleman-presentation-core/cli/list.rb +66 -0
- data/lib/middleman-presentation-core/cli/reset_thor.rb +18 -0
- data/lib/middleman-presentation-core/cli/runner.rb +47 -0
- data/lib/middleman-presentation-core/cli/serve.rb +13 -0
- data/lib/middleman-presentation-core/cli/serve_presentation.rb +30 -0
- data/lib/middleman-presentation-core/cli/shared.rb +51 -0
- data/lib/middleman-presentation-core/cli/show.rb +70 -0
- data/lib/middleman-presentation-core/comparable_slide.rb +69 -0
- data/lib/middleman-presentation-core/component.rb +86 -0
- data/lib/middleman-presentation-core/components_manager.rb +96 -0
- data/lib/middleman-presentation-core/configuration_file.rb +15 -0
- data/lib/middleman-presentation-core/css_class_extracter.rb +41 -0
- data/lib/middleman-presentation-core/custom_template.rb +15 -0
- data/lib/middleman-presentation-core/erb_template.rb +15 -0
- data/lib/middleman-presentation-core/errors.rb +10 -0
- data/lib/middleman-presentation-core/existing_slide.rb +92 -0
- data/lib/middleman-presentation-core/frontend_component.rb +75 -0
- data/lib/middleman-presentation-core/group_template.rb +15 -0
- data/lib/middleman-presentation-core/helpers_manager.rb +37 -0
- data/lib/middleman-presentation-core/ignore_file.rb +52 -0
- data/lib/middleman-presentation-core/liquid_template.rb +15 -0
- data/lib/middleman-presentation-core/list.rb +7 -0
- data/lib/middleman-presentation-core/locale_configurator.rb +84 -0
- data/lib/middleman-presentation-core/logger.rb +8 -0
- data/lib/middleman-presentation-core/main.rb +55 -0
- data/lib/middleman-presentation-core/markdown_template.rb +15 -0
- data/lib/middleman-presentation-core/middleman_environment.rb +108 -0
- data/lib/middleman-presentation-core/middleman_extension.rb +12 -0
- data/lib/middleman-presentation-core/middleman_step_definitions.rb +131 -0
- data/lib/middleman-presentation-core/new_slide.rb +140 -0
- data/lib/middleman-presentation-core/overwrite_sass.rb +22 -0
- data/lib/middleman-presentation-core/plugin.rb +8 -0
- data/lib/middleman-presentation-core/plugin_api.rb +65 -0
- data/lib/middleman-presentation-core/plugins_manager.rb +7 -0
- data/lib/middleman-presentation-core/predefined_slide_templates_directory.rb +15 -0
- data/lib/middleman-presentation-core/presentation_helper.rb +69 -0
- data/lib/middleman-presentation-core/register_extension.rb +4 -0
- data/lib/middleman-presentation-core/roles/comparable_by_name.rb +24 -0
- data/lib/middleman-presentation-core/slide_group.rb +33 -0
- data/lib/middleman-presentation-core/slide_list.rb +52 -0
- data/lib/middleman-presentation-core/slide_name.rb +61 -0
- data/lib/middleman-presentation-core/start.rb +68 -0
- data/lib/middleman-presentation-core/step_definitions.rb +238 -0
- data/lib/middleman-presentation-core/syntax_highlighter.rb +42 -0
- data/lib/middleman-presentation-core/test_helpers.rb +22 -0
- data/lib/middleman-presentation-core/transformers/file_keeper.rb +13 -0
- data/lib/middleman-presentation-core/transformers/group_slides.rb +34 -0
- data/lib/middleman-presentation-core/transformers/ignore_slides.rb +28 -0
- data/lib/middleman-presentation-core/transformers/remove_duplicate_slides.rb +32 -0
- data/lib/middleman-presentation-core/transformers/sort_slides.rb +13 -0
- data/lib/middleman-presentation-core/utils.rb +40 -0
- data/lib/middleman-presentation-core/version.rb +8 -0
- data/lib/middleman-presentation-core.rb +127 -0
- data/locales/de.yml +233 -0
- data/locales/en.yml +236 -0
- data/middleman-presentation-core.gemspec +40 -0
- data/source/slides/01.html.liquid +0 -0
- data/spec/asset_component_spec.rb +13 -0
- data/spec/asset_list_spec.rb +50 -0
- data/spec/asset_spec.rb +45 -0
- data/spec/asset_store_spec.rb +61 -0
- data/spec/assets_manager_spec.rb +111 -0
- data/spec/components_manager_spec.rb +142 -0
- data/spec/css_class_extracter_spec.rb +28 -0
- data/spec/existing_slide_spec.rb +177 -0
- data/spec/frontend_component_spec.rb +94 -0
- data/spec/helpers_manager_spec.rb +90 -0
- data/spec/ignore_file_spec.rb +75 -0
- data/spec/new_slide_spec.rb +155 -0
- data/spec/presentation_helper_spec.rb +137 -0
- data/spec/shared_examples/.keep +0 -0
- data/spec/slide_group_spec.rb +54 -0
- data/spec/slide_list_spec.rb +125 -0
- data/spec/slide_name_spec.rb +53 -0
- data/spec/spec_helper.rb +19 -0
- data/spec/support/aruba.rb +53 -0
- data/spec/support/ci.rb +20 -0
- data/spec/support/environment.rb +18 -0
- data/spec/support/filesystem.rb +22 -0
- data/spec/support/locale.rb +2 -0
- data/spec/support/reporting.rb +2 -0
- data/spec/support/rspec.rb +9 -0
- data/spec/support/string.rb +2 -0
- data/spec/transformers/file_keeper_spec.rb +24 -0
- data/spec/transformers/group_slides_spec.rb +44 -0
- data/spec/transformers/ignore_slides_spec.rb +64 -0
- data/spec/transformers/remove_duplicate_slides_spec.rb +120 -0
- data/spec/transformers/sort_slides_spec.rb +17 -0
- data/spec/utils_spec.rb +14 -0
- data/templates/.bowerrc.tt +4 -0
- data/templates/.gitignore +5 -0
- data/templates/Gemfile.tt +32 -0
- data/templates/LICENSE.presentation +1 -0
- data/templates/Rakefile +59 -0
- data/templates/bower.json.tt +8 -0
- data/templates/bundler_config.tt +6 -0
- data/templates/config.rb.tt +2 -0
- data/templates/config.yaml.tt +17 -0
- data/templates/gitignore.tt +14 -0
- data/templates/plugin/%plugin_name%.gemspec.tt +24 -0
- data/templates/plugin/.gitignore +13 -0
- data/templates/plugin/Gemfile.tt +4 -0
- data/templates/plugin/LICENSE.txt.tt +22 -0
- data/templates/plugin/README.md.tt +31 -0
- data/templates/plugin/Rakefile +1 -0
- data/templates/plugin/lib/%plugin_name%/version.rb.tt +8 -0
- data/templates/plugin/lib/%plugin_name%.rb.tt +10 -0
- data/templates/predefined_slides.d/00_00.html.erb.tt +26 -0
- data/templates/predefined_slides.d/00_01.html.md.tt +6 -0
- data/templates/predefined_slides.d/999980.html.erb.tt +4 -0
- data/templates/predefined_slides.d/999981.html.erb.tt +27 -0
- data/templates/predefined_slides.d/999982.html.erb.tt +4 -0
- data/templates/presentation_theme/bower.json.tt +20 -0
- data/templates/presentation_theme/images/.keep +0 -0
- data/templates/presentation_theme/javascripts/%theme_name%.js.tt +0 -0
- data/templates/presentation_theme/stylesheets/%theme_name%.scss.tt +9 -0
- data/templates/presentation_theme/stylesheets/_fonts.scss.tt +0 -0
- data/templates/presentation_theme/stylesheets/_images.scss.tt +5 -0
- data/templates/presentation_theme/stylesheets/_theme.scss.tt +251 -0
- data/templates/rackup.config.erb +16 -0
- data/templates/script/bootstrap +5 -0
- data/templates/script/build +3 -0
- data/templates/script/export +3 -0
- data/templates/script/presentation +3 -0
- data/templates/script/slide +3 -0
- data/templates/script/start +43 -0
- data/templates/slides/custom.md.tt +3 -0
- data/templates/slides/erb.tt +5 -0
- data/templates/slides/group.tt +3 -0
- data/templates/slides/liquid.tt +5 -0
- data/templates/slides/markdown.tt +3 -0
- data/templates/source/index.html.erb +1 -0
- data/templates/source/javascripts/application.js.tt +3 -0
- data/templates/source/layout.erb +133 -0
- data/templates/source/stylesheets/application.scss.tt +3 -0
- metadata +574 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Middleman
|
|
3
|
+
module Presentation
|
|
4
|
+
# A group of slides
|
|
5
|
+
class SlideGroup
|
|
6
|
+
private
|
|
7
|
+
|
|
8
|
+
attr_reader :template
|
|
9
|
+
|
|
10
|
+
public
|
|
11
|
+
|
|
12
|
+
attr_reader :name, :slides
|
|
13
|
+
|
|
14
|
+
def initialize(name:, slides:, template:)
|
|
15
|
+
@name = name
|
|
16
|
+
@slides = slides
|
|
17
|
+
@template = template
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Combine paths of all slides
|
|
21
|
+
def partial_path
|
|
22
|
+
slides.map(&:partial_path).to_list
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Call block for each slide
|
|
26
|
+
def render(&block)
|
|
27
|
+
slides_content = slides.each_with_object([]) { |e, a| a << e.render(&block) }.join("\n")
|
|
28
|
+
|
|
29
|
+
template.result(slides: slides_content)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Middleman
|
|
3
|
+
module Presentation
|
|
4
|
+
# List of slides
|
|
5
|
+
class SlideList
|
|
6
|
+
include Enumerable
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
attr_accessor :transformers, :slides
|
|
11
|
+
|
|
12
|
+
public
|
|
13
|
+
|
|
14
|
+
def initialize(names, slide_builder:, **args, &block)
|
|
15
|
+
@slides = Array(names).map { |n| slide_builder.new(n, **args) }
|
|
16
|
+
@transformers = []
|
|
17
|
+
|
|
18
|
+
block.call(self) if block_given?
|
|
19
|
+
|
|
20
|
+
@slides = transformers.reduce(@slides) { |a, e| e.transform(a) }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def transform_with(transformer)
|
|
24
|
+
transformers << transformer
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def all
|
|
28
|
+
slides.dup
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def each(&block)
|
|
32
|
+
slides.each(&block)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def each_new(&block)
|
|
36
|
+
all.keep_if { |s| s.respond_to?(:exist?) && !s.exist? }.each(&block)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def each_existing(&block)
|
|
40
|
+
all.keep_if { |s| s.respond_to?(:exist?) && s.exist? }.each(&block)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def existing_slides
|
|
44
|
+
all.keep_if { |s| s.respond_to?(:exist?) && s.exist? }
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def to_a
|
|
48
|
+
all
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Middleman
|
|
3
|
+
module Presentation
|
|
4
|
+
# Determine slide name base on old slide
|
|
5
|
+
class SlideName
|
|
6
|
+
private
|
|
7
|
+
|
|
8
|
+
attr_reader :old_slide, :base_name, :type
|
|
9
|
+
|
|
10
|
+
public
|
|
11
|
+
|
|
12
|
+
# Create new instance
|
|
13
|
+
#
|
|
14
|
+
# @param [ExistingSlide] old_slide
|
|
15
|
+
# The old slide which should be used
|
|
16
|
+
#
|
|
17
|
+
# @param [String] base_name
|
|
18
|
+
# The requested new base of the file name
|
|
19
|
+
#
|
|
20
|
+
# @param [String] type
|
|
21
|
+
# The requested new type for the slide name
|
|
22
|
+
def initialize(old_slide, base_name:, type:)
|
|
23
|
+
@old_slide = old_slide
|
|
24
|
+
@base_name = base_name
|
|
25
|
+
@type = type
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Return the string version of slide name
|
|
29
|
+
def to_s
|
|
30
|
+
return determine_base_name + guess_type if base_name.blank? && type.blank?
|
|
31
|
+
|
|
32
|
+
determine_base_name + determine_type
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
def guess_type
|
|
38
|
+
case File.extname(old_slide.ext_name)
|
|
39
|
+
when '.md'
|
|
40
|
+
'.erb'
|
|
41
|
+
when '.erb'
|
|
42
|
+
'.md'
|
|
43
|
+
else
|
|
44
|
+
'.md'
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def determine_base_name
|
|
49
|
+
return base_name if base_name
|
|
50
|
+
|
|
51
|
+
old_slide.base_name
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def determine_type
|
|
55
|
+
return type.gsub(/^\./, '').prepend('.') if type
|
|
56
|
+
|
|
57
|
+
File.extname(old_slide.ext_name)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
# Main
|
|
3
|
+
module Middleman
|
|
4
|
+
# Presentation extension
|
|
5
|
+
module Presentation
|
|
6
|
+
class << self
|
|
7
|
+
def start(environment)
|
|
8
|
+
environment.instance_eval do
|
|
9
|
+
activate :sprockets unless respond_to? :sprockets
|
|
10
|
+
|
|
11
|
+
# For testing only otherwise config = Middleman::Pre...::Config.new
|
|
12
|
+
# is run before the new home is set and the config file is created
|
|
13
|
+
# and there is not used.
|
|
14
|
+
Middleman::Presentation.config.redetect if ENV['MP_ENV'] == 'test'
|
|
15
|
+
|
|
16
|
+
set :js_dir, Middleman::Presentation.config.scripts_directory
|
|
17
|
+
set :images_dir, Middleman::Presentation.config.images_directory
|
|
18
|
+
set :build_dir, Middleman::Presentation.config.build_directory
|
|
19
|
+
set :css_dir, Middleman::Presentation.config.stylesheets_directory
|
|
20
|
+
set :source_dir, Middleman::Presentation.config.sources_directory
|
|
21
|
+
|
|
22
|
+
Middleman::Presentation::AssetsLoader.new(bower_directory: MiddlemanEnvironment.new.bower_path).load_at_presentation_runtime
|
|
23
|
+
|
|
24
|
+
helpers Middleman::Presentation.helpers_manager.available_helpers
|
|
25
|
+
|
|
26
|
+
set :markdown_engine, :kramdown
|
|
27
|
+
set :markdown,
|
|
28
|
+
parse_block_html: true,
|
|
29
|
+
tables: true,
|
|
30
|
+
syntax_highlighter: 'middleman_presentation',
|
|
31
|
+
syntax_highlighter_opts: {
|
|
32
|
+
code_block_class: 'mp-code-block',
|
|
33
|
+
inline_code_class: 'mp-code-inline'
|
|
34
|
+
},
|
|
35
|
+
smart_quotes: true
|
|
36
|
+
|
|
37
|
+
# ignore slides so that a user doesn't need to prepend slide names
|
|
38
|
+
# with an underscore
|
|
39
|
+
ignore 'slides/*'
|
|
40
|
+
|
|
41
|
+
# all fetchable components reside in the bower directory. Their
|
|
42
|
+
# assets are required with "component_name/path/to/asset.scss".
|
|
43
|
+
# Therefore it's suffice enough to add the bower directory only.
|
|
44
|
+
sprockets.append_path Pathname.new(File.join(root, Middleman::Presentation::MiddlemanEnvironment.new.bower_directory))
|
|
45
|
+
|
|
46
|
+
# all non fetchable components can be hidden in rubygems and
|
|
47
|
+
# therefor the full path to that components needs to be added
|
|
48
|
+
Middleman::Presentation.components_manager.each_nonfetchable_component do |c|
|
|
49
|
+
next if sprockets.appended_paths.include? c.path
|
|
50
|
+
|
|
51
|
+
sprockets.append_path c.path
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
Middleman::Presentation.assets_manager.each_loadable_asset do |a|
|
|
55
|
+
sprockets.import_asset a.load_path, &a.destination_path_resolver
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
configure :build do
|
|
59
|
+
if Middleman::Presentation.config.minify_assets
|
|
60
|
+
activate :minify_css
|
|
61
|
+
activate :minify_javascript
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
Before do
|
|
3
|
+
@aruba_timeout_seconds = 120
|
|
4
|
+
ENV['MM_ENV'] = 'development'
|
|
5
|
+
ENV['MP_ENV'] = 'test'
|
|
6
|
+
|
|
7
|
+
step 'a mocked home directory'
|
|
8
|
+
step 'I configure bundler for fast testing'
|
|
9
|
+
step 'git is configured with username "User" and email-address "email@example.com"'
|
|
10
|
+
step 'I set the language for the shell to "en_GB.UTF-8"'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
Given(/I configure bundler for fast testing/) do
|
|
14
|
+
config = []
|
|
15
|
+
config << "BUNDLE_PATH: #{ENV['BUNDLE_PATH']}" if ENV.key? 'BUNDLE_PATH'
|
|
16
|
+
|
|
17
|
+
config_file = File.join ENV['HOME'], '.bundle', 'config'
|
|
18
|
+
|
|
19
|
+
FileUtils.mkdir_p File.dirname(config_file)
|
|
20
|
+
File.write config_file, config.join("\n")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Clean environment
|
|
24
|
+
Around do |_, block|
|
|
25
|
+
old_env = ENV.to_h
|
|
26
|
+
|
|
27
|
+
block.call
|
|
28
|
+
|
|
29
|
+
ENV.replace old_env
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
When(/^I start debugging/) do
|
|
33
|
+
# rubocop:disable Lint/Debugger
|
|
34
|
+
require 'pry'
|
|
35
|
+
binding.pry
|
|
36
|
+
# rubocop:enable Lint/Debugger
|
|
37
|
+
|
|
38
|
+
''
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
Given(/^I use presentation fixture "([^"]+)" with title "([^"]+)"(?: and date "([^"]+)")?$/) do |name, title, date|
|
|
42
|
+
directory = []
|
|
43
|
+
directory << name
|
|
44
|
+
directory << ('-' + title)
|
|
45
|
+
directory << ('-' + date) if date
|
|
46
|
+
|
|
47
|
+
directory = directory.join.characterize
|
|
48
|
+
|
|
49
|
+
command = []
|
|
50
|
+
command << "middleman-presentation create presentation #{temporary_fixture_path(directory)}"
|
|
51
|
+
command << "--title #{Shellwords.escape(title)}"
|
|
52
|
+
command << "--date #{Shellwords.escape(date)}" if date
|
|
53
|
+
|
|
54
|
+
system(command.join(' ')) unless temporary_fixture_exist?(directory)
|
|
55
|
+
|
|
56
|
+
FileUtils.cp_r temporary_fixture_path(directory), absolute_path(name)
|
|
57
|
+
step %(I cd to "#{name}")
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
Given(/^I set the language for the shell to "([^"]+)"$/) do |language|
|
|
61
|
+
set_env 'LANG', language
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
Given(/only the executables of gems "([^"]+)" can be found in PATH/) do |gems|
|
|
65
|
+
dirs = []
|
|
66
|
+
|
|
67
|
+
dirs.concat gems.split(/,\s?/).map(&:strip).each_with_object([]) { |e, a| a << Gem::Specification.find_by_name(e).bin_dir }
|
|
68
|
+
|
|
69
|
+
if ci?
|
|
70
|
+
dirs << "/home/travis/.rvm/rubies/ruby-#{RUBY_VERSION}/bin"
|
|
71
|
+
dirs << "/home/travis/.rvm/rubies/ruby-#{Gem.ruby_api_version}/bin" unless Gem.ruby_api_version == RUBY_VERSION
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
dirs << '/usr/bin'
|
|
75
|
+
|
|
76
|
+
set_env 'PATH', dirs.join(':')
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
Given(/^I create a new presentation with title "([^"]+)"(?: for speaker "([^"]+)")?(?: on "([^"]+)")?$/) do |title, speaker, date|
|
|
80
|
+
options = {}
|
|
81
|
+
options[:title] = title
|
|
82
|
+
options[:speaker] = speaker if speaker
|
|
83
|
+
options[:date] = date if date
|
|
84
|
+
|
|
85
|
+
step %(I successfully run `middleman-presentation create presentation presentation1 #{options.to_options.join(' ')}`)
|
|
86
|
+
step 'I cd to "presentation1"'
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
Given(/^I prepend "([^"]+)" to environment variable "([^"]+)"$/) do |value, variable|
|
|
90
|
+
set_env variable, value + ENV[variable]
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
Given(/^a slide named "(.*?)" with:$/) do |name, string|
|
|
94
|
+
step %(a file named "source/slides/#{name}" with:), string
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
Given(/^a project template named "(.*?)" with:$/) do |name, string|
|
|
98
|
+
step %(a file named "templates/#{name}" with:), string
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
Given(/^a user template named "(.*?)" with:$/) do |name, string|
|
|
102
|
+
step %(a file named "~/.config/middleman-presentation/templates/#{name}" with:), string
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
Given(/^a presentation theme named "(.*?)" does not exist$/) do |name|
|
|
106
|
+
step %(I remove the directory "middleman-presentation-theme-#{name}")
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
Given(/^a file named "(.*?)" does not exist$/) do |name|
|
|
110
|
+
FileUtils.rm_rf absolute_path(name)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
Given(/^a directory named "(.*?)" does not exist$/) do |name|
|
|
114
|
+
step %(I remove the directory "#{name}")
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
Given(/^a plugin named "(.*?)" does not exist$/) do |name|
|
|
118
|
+
step %(I remove the directory "#{name}")
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
Then(%r{^a plugin named "(.*?)" should exist( with default files/directories created)?$}) do |name, default_files|
|
|
122
|
+
step %(a directory named "#{name}" should exist)
|
|
123
|
+
|
|
124
|
+
if default_files
|
|
125
|
+
%W(
|
|
126
|
+
#{name}/#{name}.gemspec
|
|
127
|
+
#{name}/lib/#{name}.rb
|
|
128
|
+
#{name}/lib/#{name}/version.rb
|
|
129
|
+
#{name}/Gemfile
|
|
130
|
+
#{name}/LICENSE.txt
|
|
131
|
+
#{name}/README.md
|
|
132
|
+
#{name}/Rakefile
|
|
133
|
+
#{name}/.gitignore
|
|
134
|
+
).each do |file|
|
|
135
|
+
step %(a file named "#{file}" should exist)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
%W(
|
|
139
|
+
#{name}/lib
|
|
140
|
+
#{name}/lib/#{name}
|
|
141
|
+
).each do |file|
|
|
142
|
+
step %(a directory named "#{file}" should exist)
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
Given(/^git is configured with username "(.*?)" and email-address "(.*?)"$/) do |name, email|
|
|
148
|
+
step %(I successfully run `git config --global user.email "#{email}"`)
|
|
149
|
+
step %(I successfully run `git config --global user.name "#{name}"`)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
Given(/^a user config file for middleman\-presentation with:$/) do |string|
|
|
153
|
+
step 'a file named "~/.config/middleman-presentation/application.yaml" with:', string
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
Given(/^a presentation config file for middleman\-presentation with:$/) do |string|
|
|
157
|
+
step 'a file named ".middleman-presentation.yaml" with:', string
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
Then(/^the user config file for middleman\-presentation should contain:$/) do |string|
|
|
161
|
+
step 'the file "~/.config/middleman-presentation/application.yaml" should contain:', string
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
Then(/^the presentation config file for middleman\-presentation should contain:$/) do |string|
|
|
165
|
+
step 'the file ".middleman-presentation.yaml" should contain:', string
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
Then(%r{^a presentation theme named "(.*?)" should exist( with default files/directories created)?$}) do |name, default_files|
|
|
169
|
+
name = "middleman-presentation-theme-#{name}"
|
|
170
|
+
|
|
171
|
+
step %(a directory named "#{name}" should exist)
|
|
172
|
+
|
|
173
|
+
if default_files
|
|
174
|
+
step %(a directory named "#{name}/stylesheets" should exist)
|
|
175
|
+
step %(a directory named "#{name}/javascripts" should exist)
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
Then(/^I go to "([^"]*)" and see the following error message:$/) do |url, message|
|
|
180
|
+
message = capture :stderr do
|
|
181
|
+
# rubocop:disable Lint/HandleExceptions:
|
|
182
|
+
begin
|
|
183
|
+
@browser.get(URI.escape(url))
|
|
184
|
+
rescue StandardError
|
|
185
|
+
end
|
|
186
|
+
# rubocop:enable Lint/HandleExceptions:
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
expect(message).to include message
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
Then(/^a directory named "(.*?)" is a git repository$/) do |name|
|
|
193
|
+
step %(a directory named "#{name}/.git" should exist)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
Given(/^a slide named "(.*?)" does not exist$/) do |name|
|
|
197
|
+
FileUtils.rm_rf absolute_path('source', 'slides', name)
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
Then(/^a slide named "(.*?)" should exist$/) do |name|
|
|
201
|
+
step %(a file named "source/slides/#{name}" should exist)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
Then(/^a slide named "(.*?)" should exist with:$/) do |name, string|
|
|
205
|
+
step %(the file "source/slides/#{name}" should contain:), string
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
When(/^I successfully run `([^`]+)` in clean environment$/) do |command|
|
|
209
|
+
Bundler.with_clean_env do
|
|
210
|
+
step %(I successfully run `#{command}`)
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
Given(/^I add a stylesheet asset named "(.*?)" to the presentation$/) do |asset|
|
|
215
|
+
import_string = "@import '#{asset}';"
|
|
216
|
+
|
|
217
|
+
step 'I append to "source/stylesheets/application.scss" with:', import_string
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
When(/^I successfully run `([^`]+)` in debug mode$/) do |cmd|
|
|
221
|
+
step "I run `#{cmd}` in debug mode"
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
When(/^I run `([^`]+)` in debug mode$/) do |cmd|
|
|
225
|
+
in_current_dir do
|
|
226
|
+
# rubocop:disable Lint/Debugger
|
|
227
|
+
require 'pry'
|
|
228
|
+
binding.pry
|
|
229
|
+
# rubocop:enable Lint/Debugger
|
|
230
|
+
system(cmd)
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
Then(/^the size of "(.*?)" should be much smaller than from "(.*?)"$/) do |file1, file2|
|
|
235
|
+
in_current_dir do
|
|
236
|
+
expect(File.size(file1)).to be < File.size(file2)
|
|
237
|
+
end
|
|
238
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'kramdown'
|
|
3
|
+
|
|
4
|
+
# External
|
|
5
|
+
module Kramdown
|
|
6
|
+
# External
|
|
7
|
+
module Converter
|
|
8
|
+
# External
|
|
9
|
+
module SyntaxHighlighter
|
|
10
|
+
# Middleman Presentation Converter
|
|
11
|
+
module MiddlemanPresentation
|
|
12
|
+
def self.call(converter, text, lang, type, _unused_opts)
|
|
13
|
+
opts = converter.options[:syntax_highlighter_opts].dup
|
|
14
|
+
text = ERB::Util.html_escape(text)
|
|
15
|
+
|
|
16
|
+
case type
|
|
17
|
+
when :span
|
|
18
|
+
%(<code class=\"#{opts[:inline_code_class]}\">#{text}</code>)
|
|
19
|
+
when :block
|
|
20
|
+
%(<pre class=\"#{opts[:code_block_class]}\"><code class=\"#{opts[:language_prefix]}#{lang}\">#{text}</code></pre>)
|
|
21
|
+
else
|
|
22
|
+
%(<pre class=\"#{opts[:code_block_class]}\"><code class=\"#{opts[:language_prefix]}#{lang}\">#{text}</code></pre>)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# External
|
|
31
|
+
module Kramdown
|
|
32
|
+
# External
|
|
33
|
+
module Converter
|
|
34
|
+
klass = ::Kramdown::Converter::SyntaxHighlighter::MiddlemanPresentation
|
|
35
|
+
kn_down = :middleman_presentation
|
|
36
|
+
|
|
37
|
+
add_syntax_highlighter(kn_down) do |converter, text, lang, type, opts|
|
|
38
|
+
add_syntax_highlighter(kn_down, klass)
|
|
39
|
+
syntax_highlighter(kn_down).call(converter, text, lang, type, opts)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Middleman
|
|
3
|
+
module Presentation
|
|
4
|
+
# Test helpers
|
|
5
|
+
module TestHelpers
|
|
6
|
+
# Helpers for tests
|
|
7
|
+
def ci?
|
|
8
|
+
ENV.key?('CI') || ENV.key?('TRAVIS')
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def temporary_fixture_path(name)
|
|
12
|
+
File.expand_path("../../../tmp/fixtures/#{name}", __FILE__)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def temporary_fixture_exist?(name)
|
|
16
|
+
File.exist? File.expand_path("../../../tmp/fixtures/#{name}", __FILE__)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
module_function :temporary_fixture_path
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Middleman
|
|
3
|
+
module Presentation
|
|
4
|
+
module Transformers
|
|
5
|
+
# Group slides together
|
|
6
|
+
class GroupSlides
|
|
7
|
+
private
|
|
8
|
+
|
|
9
|
+
attr_reader :template
|
|
10
|
+
|
|
11
|
+
public
|
|
12
|
+
|
|
13
|
+
def initialize(template:)
|
|
14
|
+
@template = template
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def transform(slides)
|
|
18
|
+
groups = Set.new
|
|
19
|
+
|
|
20
|
+
new_slides = slides.map do |slide|
|
|
21
|
+
if slide.group && groups.none? { |g| g.name == slide.group }
|
|
22
|
+
slide = group = SlideGroup.new name: slide.group, slides: slides.select { |s| s.group? slide.group }, template: template
|
|
23
|
+
groups << group
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
slide
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
new_slides - groups.map(&:slides).flatten
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Middleman
|
|
3
|
+
module Presentation
|
|
4
|
+
module Transformers
|
|
5
|
+
# Ignore slides in list: delete them from list
|
|
6
|
+
class IgnoreSlides
|
|
7
|
+
private
|
|
8
|
+
|
|
9
|
+
attr_reader :ignore_file
|
|
10
|
+
|
|
11
|
+
public
|
|
12
|
+
|
|
13
|
+
def initialize(ignore_file:, ignore_file_builder: IgnoreFile)
|
|
14
|
+
@ignore_file = ignore_file_builder.new(ignore_file)
|
|
15
|
+
|
|
16
|
+
invalid_ignore_file = Pathname.new(ignore_file).dirname + Pathname.new('.slideignore')
|
|
17
|
+
|
|
18
|
+
message = "Invalid ignore file \"#{invalid_ignore_file}\" detected. I'm going to ignore it. Please use the correct one \"#{ignore_file}\"."
|
|
19
|
+
Middleman::Presentation.logger.warn message if invalid_ignore_file.exist?
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def transform(slides)
|
|
23
|
+
slides.delete_if { |slide| ignore_file.ignore? slide }
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Middleman
|
|
3
|
+
module Presentation
|
|
4
|
+
module Transformers
|
|
5
|
+
# Remove duplicates slides from list
|
|
6
|
+
class RemoveDuplicateSlides
|
|
7
|
+
private
|
|
8
|
+
|
|
9
|
+
attr_reader :additional_slides, :raise_error
|
|
10
|
+
|
|
11
|
+
public
|
|
12
|
+
|
|
13
|
+
def initialize(additional_slides: [], raise_error: false)
|
|
14
|
+
@additional_slides = additional_slides
|
|
15
|
+
@raise_error = raise_error
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def transform(slides)
|
|
19
|
+
temp_slides = (Array(slides) + Array(additional_slides)).uniq
|
|
20
|
+
|
|
21
|
+
duplicate_slides = temp_slides.each_with_object([]) do |e, a|
|
|
22
|
+
a << slides.select { |s| e.similar?(s) && !e.eql?(s) }
|
|
23
|
+
end.flatten
|
|
24
|
+
|
|
25
|
+
fail ArgumentError, Middleman::Presentation.t('errors.duplicate_slide_names', slide_names: duplicate_slides.map(&:file_name).to_list) if !duplicate_slides.blank? && raise_error
|
|
26
|
+
|
|
27
|
+
slides - duplicate_slides
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Middleman
|
|
3
|
+
module Presentation
|
|
4
|
+
# Utils module
|
|
5
|
+
module Utils
|
|
6
|
+
# Create zip archive from directory
|
|
7
|
+
#
|
|
8
|
+
# @param [String] source_directory
|
|
9
|
+
# The source directory
|
|
10
|
+
#
|
|
11
|
+
# @param [String] destination_file
|
|
12
|
+
# The zip file which should be created
|
|
13
|
+
#
|
|
14
|
+
# @param [String] prefix
|
|
15
|
+
# A prefix for the zip file, e.g. dir1/dir2/ => dir1/dir2/zip_file.
|
|
16
|
+
# Please mind the trailing '/'.
|
|
17
|
+
def zip(source_directory, destination_file, prefix: nil)
|
|
18
|
+
Zip.setup do |c|
|
|
19
|
+
c.on_exists_proc = true
|
|
20
|
+
c.continue_on_exists_proc = true
|
|
21
|
+
c.unicode_names = true
|
|
22
|
+
c.default_compression = Zlib::BEST_COMPRESSION
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
Zip::File.open(destination_file, Zip::File::CREATE) do |file|
|
|
26
|
+
Dir.glob(File.join(source_directory, '**', '*')).each do |filename|
|
|
27
|
+
|
|
28
|
+
path = ''
|
|
29
|
+
path << prefix if prefix
|
|
30
|
+
path << Pathname.new(filename).relative_path_from(Pathname.new(source_directory)).to_s
|
|
31
|
+
|
|
32
|
+
file.add(path, filename)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
module_function :zip
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|