middleman-sculptor 0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +10 -0
  3. data/.gitignore +9 -0
  4. data/Gemfile +3 -0
  5. data/Rakefile +2 -0
  6. data/bin/middleman-sculptor +7 -0
  7. data/bin/sculpt +7 -0
  8. data/lib/middleman-sculptor.rb +16 -0
  9. data/lib/middleman-sculptor/cli.rb +57 -0
  10. data/lib/middleman-sculptor/cli/init.rb +15 -0
  11. data/lib/middleman-sculptor/cli/version.rb +12 -0
  12. data/lib/middleman-sculptor/extension.rb +13 -0
  13. data/lib/middleman-sculptor/hash_dot_syntax.rb +6 -0
  14. data/lib/middleman-sculptor/helpers/model.rb +110 -0
  15. data/lib/middleman-sculptor/helpers/outliner.rb +44 -0
  16. data/lib/middleman-sculptor/helpers/resources.rb +155 -0
  17. data/lib/middleman-sculptor/resource_patch.rb +49 -0
  18. data/lib/middleman-sculptor/sprockets_patch.rb +48 -0
  19. data/lib/middleman-sculptor/template.rb +39 -0
  20. data/lib/middleman-sculptor/template/.bowerrc +3 -0
  21. data/lib/middleman-sculptor/template/.editorconfig +10 -0
  22. data/lib/middleman-sculptor/template/.gitignore +2 -0
  23. data/lib/middleman-sculptor/template/Gemfile.tt +11 -0
  24. data/lib/middleman-sculptor/template/bower.json +12 -0
  25. data/lib/middleman-sculptor/template/config.tt +149 -0
  26. data/lib/middleman-sculptor/template/data/.gitkeep +0 -0
  27. data/lib/middleman-sculptor/template/source/assets/images/.gitkeep +0 -0
  28. data/lib/middleman-sculptor/template/source/assets/scripts/app.js +6 -0
  29. data/lib/middleman-sculptor/template/source/assets/scripts/glyptotheque.js +8 -0
  30. data/lib/middleman-sculptor/template/source/assets/scripts/glyptotheque/controllers.js +1 -0
  31. data/lib/middleman-sculptor/template/source/assets/scripts/glyptotheque/directives.js +124 -0
  32. data/lib/middleman-sculptor/template/source/assets/scripts/glyptotheque/services.js +1 -0
  33. data/lib/middleman-sculptor/template/source/assets/scripts/head-js.js +1 -0
  34. data/lib/middleman-sculptor/template/source/assets/scripts/iframe-js.js +1 -0
  35. data/lib/middleman-sculptor/template/source/assets/styles/glyptotheque.scss +9 -0
  36. data/lib/middleman-sculptor/template/source/assets/styles/glyptotheque/_$variables.scss +3 -0
  37. data/lib/middleman-sculptor/template/source/assets/styles/glyptotheque/_base.scss +58 -0
  38. data/lib/middleman-sculptor/template/source/assets/styles/glyptotheque/_codehilite.scss +10 -0
  39. data/lib/middleman-sculptor/template/source/assets/styles/glyptotheque/_html-outline.scss +131 -0
  40. data/lib/middleman-sculptor/template/source/assets/styles/glyptotheque/_model-utils.scss +78 -0
  41. data/lib/middleman-sculptor/template/source/assets/styles/glyptotheque/_model.scss +48 -0
  42. data/lib/middleman-sculptor/template/source/assets/styles/glyptotheque/_nav.scss +172 -0
  43. data/lib/middleman-sculptor/template/source/assets/styles/main.scss +18 -0
  44. data/lib/middleman-sculptor/template/source/assets/styles/pygments/borland.css +46 -0
  45. data/lib/middleman-sculptor/template/source/assets/styles/pygments/colorful.css +61 -0
  46. data/lib/middleman-sculptor/template/source/assets/styles/pygments/github.css +61 -0
  47. data/lib/middleman-sculptor/template/source/assets/styles/pygments/trac.css +59 -0
  48. data/lib/middleman-sculptor/template/source/glyptotheque/_model-outline-element.slim +22 -0
  49. data/lib/middleman-sculptor/template/source/glyptotheque/_model-outline.slim +3 -0
  50. data/lib/middleman-sculptor/template/source/glyptotheque/_model-utils.slim +13 -0
  51. data/lib/middleman-sculptor/template/source/glyptotheque/_model.slim +26 -0
  52. data/lib/middleman-sculptor/template/source/glyptotheque/_nav.slim +31 -0
  53. data/lib/middleman-sculptor/template/source/glyptotheque/directory-index.html.slim +14 -0
  54. data/lib/middleman-sculptor/template/source/glyptotheque/site-index.html.slim +5 -0
  55. data/lib/middleman-sculptor/template/source/glyptotheque/sitemap.json.erb +1 -0
  56. data/lib/middleman-sculptor/template/source/layouts/glyptotheque.slim +19 -0
  57. data/lib/middleman-sculptor/template/source/layouts/isolated.slim +19 -0
  58. data/lib/middleman-sculptor/template/source/layouts/layout.slim +18 -0
  59. data/lib/middleman-sculptor/version.rb +5 -0
  60. data/lib/middleman_extension.rb +1 -0
  61. data/middleman-sculptor.gemspec +29 -0
  62. metadata +197 -0
@@ -0,0 +1,49 @@
1
+ require 'middleman-core/sitemap/resource'
2
+ # This method is patched to make Middleman output the correct path
3
+ # when rendering multiple pages via proxy
4
+ module Middleman
5
+ module Sitemap
6
+ class Resource
7
+ # Render this resource
8
+ # @return [String]
9
+ def render(opts={}, locs={}, &block)
10
+ return app.template_data_for_file(source_file) unless template?
11
+
12
+ relative_source = Pathname(source_file).relative_path_from(Pathname(app.root))
13
+
14
+ instrument 'render.resource', path: relative_source, destination_path: destination_path do
15
+ md = metadata.dup
16
+ opts = md[:options].deep_merge(opts)
17
+
18
+ # Pass "renderer_options" hash from frontmatter along to renderer
19
+ if md[:page]['renderer_options']
20
+ opts[:renderer_options] = {}
21
+ md[:page]['renderer_options'].each do |k, v|
22
+ opts[:renderer_options][k.to_sym] = v
23
+ end
24
+ end
25
+
26
+ locs = md[:locals].deep_merge(locs)
27
+
28
+ # Forward remaining data to helpers
29
+ app.data.store('page', md[:page]) if md.key?(:page)
30
+
31
+ blocks = Array(md[:blocks]).dup
32
+ blocks << block if block_given?
33
+
34
+ # PATCH
35
+ # reset app.current_path to current resource on each render
36
+ # so that a prerendered resource has the correct mappings to original resource
37
+ app.current_path = destination_path
38
+
39
+ # Certain output file types don't use layouts
40
+ unless opts.key?(:layout)
41
+ opts[:layout] = false if %w(.js .json .css .txt).include?(ext)
42
+ end
43
+
44
+ app.render_template(source_file, locs, opts, blocks)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,48 @@
1
+ require 'middleman-sprockets/extension'
2
+
3
+ module Middleman
4
+ class SprocketsExtension < Extension
5
+ def after_configuration
6
+ ::Tilt.register ::Sprockets::EjsTemplate, 'ejs'
7
+ ::Tilt.register ::Sprockets::EcoTemplate, 'eco'
8
+ ::Tilt.register ::Sprockets::JstProcessor, 'jst'
9
+
10
+ if app.respond_to?(:template_extensions)
11
+ app.template_extensions :jst => :js, :eco => :js, :ejs => :js
12
+ end
13
+
14
+ if app.config.defines_setting?(:debug_assets) && !options.setting(:debug_assets).value_set?
15
+ options[:debug_assets] = app.config[:debug_assets]
16
+ end
17
+
18
+ config_environment = @environment
19
+ debug_assets = !app.build? && options[:debug_assets]
20
+ @environment = ::Middleman::Sprockets::Environment.new(app, :debug_assets => debug_assets)
21
+ config_environment.apply_to_environment(@environment)
22
+
23
+ append_paths_from_gems
24
+ import_images_and_fonts_from_gems
25
+
26
+ # Setup Sprockets Sass options
27
+ if app.config.defines_setting?(:sass)
28
+ app.config[:sass].each { |k, v| ::Sprockets::Sass.options[k] = v }
29
+ end
30
+
31
+ # Intercept requests to /javascripts and /stylesheets and pass to sprockets
32
+ our_sprockets = self.environment
33
+
34
+ [app.config[:js_dir], app.config[:css_dir], app.config[:images_dir], app.config[:fonts_dir]].each do |dir|
35
+ app.map("/#{dir}") { run our_sprockets }
36
+ end
37
+
38
+ # PATCH: Pass any `scripts` directory in `source` through Sprockets
39
+ Dir.glob("#{app.root}/**/scripts").each do |dir|
40
+ relative_dir = (dir.split('/') - (app.root.split('/') << app.source)).join('/')
41
+ if app.config[:js_dir] != relative_dir
42
+ our_sprockets.append_path(dir) # Append custom JS path into our sprockets path
43
+ app.map("/#{relative_dir}") { run our_sprockets }
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,39 @@
1
+ require 'middleman-core/templates'
2
+
3
+ module Middleman
4
+ module Sculptor
5
+ class Template < Middleman::Templates::Base
6
+ class_option 'css_dir', default: 'assets/styles'
7
+ class_option 'js_dir', default: 'assets/scripts'
8
+ class_option 'images_dir', default: 'assets/images'
9
+
10
+ def self.source_root
11
+ File.join(File.dirname(__FILE__), 'template')
12
+ end
13
+
14
+ def self.gemfile_template
15
+ 'Gemfile.tt'
16
+ end
17
+
18
+ def build_scaffold
19
+ template 'config.tt', File.join(location, 'config.rb')
20
+ copy_file '.gitignore', File.join(location, '.gitignore')
21
+ copy_file '.editorconfig', File.join(location, '.editorconfig')
22
+ copy_file '.bowerrc', File.join(location, '.bowerrc')
23
+ copy_file 'bower.json', File.join(location, 'bower.json')
24
+
25
+ directory 'source', File.join(location, 'source')
26
+ directory 'data', File.join(location, 'data')
27
+ end
28
+
29
+ def handle_bower
30
+ # Install Bower if necessary
31
+ run("command -v bower >/dev/null 2>&1 || npm install -g bower")
32
+ # Install dependencies
33
+ run("cd #{location}; bower install")
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ Middleman::Templates.register(:sculptor, Middleman::Sculptor::Template)
@@ -0,0 +1,3 @@
1
+ {
2
+ "directory" : "bower_components"
3
+ }
@@ -0,0 +1,10 @@
1
+ # editorconfig.org
2
+ root = true
3
+
4
+ [*]
5
+ indent_style = space
6
+ indent_size = 2
7
+ end_of_line = lf
8
+ charset = utf-8
9
+ trim_trailing_whitespace = true
10
+ insert_final_newline = true
@@ -0,0 +1,2 @@
1
+ bower_components
2
+ build/
@@ -0,0 +1,11 @@
1
+ # If you have OpenSSL installed, we recommend updating
2
+ # the following line to use "https"
3
+ source 'http://rubygems.org'
4
+
5
+ gem 'middleman', '~> <%= Middleman::VERSION %>'
6
+ gem 'middleman-sculptor', '~> <%= Middleman::Sculptor::VERSION %>'
7
+ gem 'middleman-livereload', '~> 3.4.2'
8
+ gem 'middleman-deploy', '~> 1.0.0'
9
+ gem 'middleman-autoprefixer'
10
+ gem 'middleman-syntax'
11
+ gem 'bourbon'
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "sculptor",
3
+ "version": "0.0.1",
4
+ "private": "true",
5
+ "dependencies": {
6
+ "angular": "~1.2.16",
7
+ "lodash": "*",
8
+ "mousetrap": "~1.4.6",
9
+ "store": "~2.1.6",
10
+ "iframe-resizer": "~2.8.6"
11
+ }
12
+ }
@@ -0,0 +1,149 @@
1
+ ###################
2
+ # Page options, layouts, aliases and proxies
3
+ ###################
4
+
5
+ # With alternative layout
6
+ page '/**', layout: 'glyptotheque'
7
+ # With no layout
8
+ page "/glyptotheque/*", layout: false, directory_index: false
9
+ page '*.css', layout: false
10
+ page '*.js', layout: false
11
+ page '*.json', layout: false
12
+
13
+ # Proxy default site index to Glyptotheque index template
14
+ proxy 'index.html', 'glyptotheque/site-index.html'
15
+ proxy 'sitemap.json', 'glyptotheque/sitemap.json'
16
+
17
+ ready do
18
+ last_dir = nil
19
+ # Prerender resources to populate models
20
+ resources = resources_for('/', exclude_indexes: true, allow_hidden: true).each do |r|
21
+ r.render
22
+ end
23
+
24
+ # Create mappings for isolated component pages (iframe embeddable)
25
+ resources.each do |r|
26
+ # Create virtual index files
27
+ dir = File.dirname(r.path)
28
+ index_exists = !!sitemap.find_resource_by_path("#{dir}/index.html")
29
+ if last_dir != dir && !index_exists
30
+ proxy "#{dir}/index.html", 'glyptotheque/directory-index.html', locals: {
31
+ name: dir
32
+ }
33
+ last_dir = dir
34
+ end
35
+
36
+ if r.metadata[:models]
37
+ r.metadata.models.each do |id, model|
38
+ proxy "#{r.path.sub(r.ext, '')}-#{id}-isolated.html",
39
+ r.path,
40
+ layout: 'isolated',
41
+ id: id
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ activate :sculptor
48
+ activate :syntax, css_class: 'codehilite'
49
+ activate :autoprefixer
50
+
51
+ ###################
52
+ # Helpers
53
+ ###################
54
+
55
+ # helpers do
56
+ # end
57
+
58
+ <% if options[:css_dir] -%>
59
+ set :css_dir, '<%= options[:css_dir] -%>'
60
+ <% else -%>
61
+ # Change the CSS directory
62
+ # set :css_dir, "alternative_css_directory"
63
+ <% end -%>
64
+ <% if options[:js_dir] -%>
65
+ set :js_dir, '<%= options[:js_dir] -%>'
66
+ <% else -%>
67
+ # Change the JS directory
68
+ # set :js_dir, "alternative_js_directory"
69
+ <% end -%>
70
+ <% if options[:images_dir] -%>
71
+ set :images_dir, '<%= options[:images_dir] -%>'
72
+ <% else -%>
73
+ # Change the images directory
74
+ # set :images_dir, "alternative_image_directory"
75
+ <% end -%>
76
+
77
+ set :relative_links, true
78
+
79
+ bowerrc_dir = JSON.parse(IO.read("#{root}/.bowerrc"))['directory']
80
+
81
+ # Compass configuration
82
+ compass_config do |config|
83
+ config.sass_options = {
84
+ quiet: true
85
+ }
86
+ # For Style Guide CSS sources
87
+ # config.output_style = :expanded
88
+ end
89
+
90
+ # Sprockets
91
+ ready do
92
+ sprockets.append_path(File.join(root, bowerrc_dir))
93
+ end
94
+
95
+ Slim::Engine.disable_option_validator!
96
+ Slim::Engine.set_options pretty: true
97
+ Slim::Engine.set_options attr_list_delims: { '(' => ')', '[' => ']' }
98
+
99
+ # Development-secific configuration
100
+ configure :development do
101
+ activate :livereload, no_swf: true
102
+ end
103
+
104
+ # Build-specific configuration
105
+ configure :build do
106
+ compass_config do |config|
107
+ config.sass_options = { :line_comments => false }
108
+ end
109
+
110
+ # For example, change the Compass output style for deployment
111
+ # activate :minify_css
112
+
113
+ # Minify Javascript on build
114
+ # activate :minify_javascript
115
+
116
+ # Enable cache buster
117
+ # activate :asset_hash
118
+
119
+ # Use relative URLs
120
+ activate :relative_assets
121
+
122
+ # Or use a different image path
123
+ # set :http_prefix, "/Content/images/"
124
+ end
125
+
126
+ ###################
127
+ # Additional tasks
128
+ ###################
129
+
130
+ # Simple launcher for local evaluation build
131
+ # Double click `build/launch.command` (Mac)
132
+ after_build do |builder|
133
+ file = "#{build_dir}/launch.command"
134
+ open(file, 'w') do |f|
135
+ f << "#!/bin/bash\n"
136
+ f << 'cd `dirname $0` && open "http://localhost:8000" && python -m SimpleHTTPServer'
137
+ end
138
+ File.chmod(0555, file)
139
+ end
140
+
141
+ # Middleman Deploy
142
+ activate :deploy do |deploy|
143
+ deploy.method = :git
144
+ # Optional Settings
145
+ # deploy.remote = 'custom-remote' # remote name or git url, default: origin
146
+ # deploy.branch = 'custom-branch' # default: gh-pages
147
+ # deploy.strategy = :submodule # commit strategy: can be :force_push or :submodule, default: :force_push
148
+ # deploy.commit_message = 'custom-message' # commit message (can be empty), default: Automated commit at `timestamp` by middleman-deploy `version`
149
+ end
@@ -0,0 +1,6 @@
1
+ //= require angular
2
+ //= require lodash
3
+ //= require iframe-resizer
4
+ //= require mousetrap/mousetrap.min
5
+
6
+ //= require glyptotheque
@@ -0,0 +1,8 @@
1
+ //= require_tree ./glyptotheque
2
+
3
+ angular.module('glyptotheque', ['directives', 'controllers', 'services']);
4
+
5
+ iFrameResize({
6
+ enablePublicMethods: true,
7
+ heightCalculationMethod: 'lowestElement'
8
+ });
@@ -0,0 +1,124 @@
1
+ angular.module('directives', [])
2
+
3
+ .directive('glyptoModel', function($compile, $http, $templateCache) {
4
+ return {
5
+ restrict: 'C',
6
+ scope: true
7
+ };
8
+ })
9
+
10
+ .directive('glyptoNavToggle', function() {
11
+ return {
12
+ restrict: 'C',
13
+ link: function($scope, $element, $attrs) {
14
+ $scope.$root.navIsHidden = store.get('glypto-menu-hidden');
15
+
16
+ Mousetrap.bind('command+shift+e', function() {
17
+ $scope.toggle();
18
+ $scope.$apply();
19
+ });
20
+
21
+ $scope.toggle = function() {
22
+ $scope.$root.navIsHidden = !$scope.$root.navIsHidden;
23
+ store.set('glypto-menu-hidden', $scope.$root.navIsHidden);
24
+ };
25
+ }
26
+ };
27
+ })
28
+
29
+ .directive('glyptoMenu', function() {
30
+ return {
31
+ restrict: 'E',
32
+ replace: true,
33
+ scope: true,
34
+ templateUrl: 'glyptotheque/menu.html',
35
+ controller: function($scope) {
36
+ $scope.items = window.APP_CONTEXT.sitemap;
37
+ },
38
+ link: function() {
39
+ // Remove nav placeholder when menu is created
40
+ angular.element(document.getElementById('glypto-nav-placeholder')).remove();
41
+ }
42
+ };
43
+ })
44
+
45
+ .directive('glyptoMenuTree', function() {
46
+ return {
47
+ restrict: 'E',
48
+ replace: true,
49
+ transclude: true,
50
+ scope: {
51
+ items: '=',
52
+ filter: '='
53
+ },
54
+ templateUrl: 'glyptotheque/menu-tree.html'
55
+ };
56
+ })
57
+
58
+ .directive('glyptoMenuNode', function($compile) {
59
+ return {
60
+ restrict: 'E',
61
+ replace: true,
62
+ templateUrl: 'glyptotheque/menu-node.html',
63
+ link: function($scope, $element, $attrs) {
64
+ $scope.isSelected = $scope.node.url === window.APP_CONTEXT.current_url;
65
+
66
+ if ($scope.node.children && $scope.node.children.length > 0) {
67
+ var childNode = $compile('<glypto-menu-tree items="node.children" filter="filter"></glypto-menu-tree>')($scope);
68
+ $element.append(childNode);
69
+ }
70
+ }
71
+ };
72
+ })
73
+
74
+ .directive('glyptoSearch', function() {
75
+ return {
76
+ restrict: 'A',
77
+ link: function($scope, $element, $attrs) {
78
+ var activated;
79
+ var placeholderText = $element.attr('placeholder');
80
+
81
+ Mousetrap.bind('/', function(evt) {
82
+ if(!activated) {
83
+ evt.preventDefault();
84
+ }
85
+ $element[0].focus();
86
+ $element.attr('placeholder', placeholderText.replace(/\(.*\)/, ''));
87
+ });
88
+
89
+ Mousetrap.bind('esc', function(evt) {
90
+ if(!activated) {
91
+ evt.preventDefault();
92
+ }
93
+ $element[0].blur();
94
+ $element.attr('placeholder', placeholderText);
95
+ });
96
+
97
+ $element.on('focus', function() {
98
+ activated = true;
99
+ });
100
+
101
+ $element.on('blur', function() {
102
+ activated = false;
103
+ });
104
+ }
105
+ };
106
+ })
107
+
108
+ .directive('iframe', function() {
109
+ return {
110
+ restrict: 'E',
111
+ link: function($scope, $element, $attrs) {
112
+ var iframe = $element[0];
113
+
114
+ $scope.$watch('navIsHidden', function() {
115
+ if(iframe.contentWindow.parentIFrame) {
116
+ // compensata for nav transition
117
+ setTimeout(function() {
118
+ iframe.contentWindow.parentIFrame.size();
119
+ }, 400)
120
+ }
121
+ });
122
+ }
123
+ };
124
+ });