middleman-sculptor 0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.editorconfig +10 -0
- data/.gitignore +9 -0
- data/Gemfile +3 -0
- data/Rakefile +2 -0
- data/bin/middleman-sculptor +7 -0
- data/bin/sculpt +7 -0
- data/lib/middleman-sculptor.rb +16 -0
- data/lib/middleman-sculptor/cli.rb +57 -0
- data/lib/middleman-sculptor/cli/init.rb +15 -0
- data/lib/middleman-sculptor/cli/version.rb +12 -0
- data/lib/middleman-sculptor/extension.rb +13 -0
- data/lib/middleman-sculptor/hash_dot_syntax.rb +6 -0
- data/lib/middleman-sculptor/helpers/model.rb +110 -0
- data/lib/middleman-sculptor/helpers/outliner.rb +44 -0
- data/lib/middleman-sculptor/helpers/resources.rb +155 -0
- data/lib/middleman-sculptor/resource_patch.rb +49 -0
- data/lib/middleman-sculptor/sprockets_patch.rb +48 -0
- data/lib/middleman-sculptor/template.rb +39 -0
- data/lib/middleman-sculptor/template/.bowerrc +3 -0
- data/lib/middleman-sculptor/template/.editorconfig +10 -0
- data/lib/middleman-sculptor/template/.gitignore +2 -0
- data/lib/middleman-sculptor/template/Gemfile.tt +11 -0
- data/lib/middleman-sculptor/template/bower.json +12 -0
- data/lib/middleman-sculptor/template/config.tt +149 -0
- data/lib/middleman-sculptor/template/data/.gitkeep +0 -0
- data/lib/middleman-sculptor/template/source/assets/images/.gitkeep +0 -0
- data/lib/middleman-sculptor/template/source/assets/scripts/app.js +6 -0
- data/lib/middleman-sculptor/template/source/assets/scripts/glyptotheque.js +8 -0
- data/lib/middleman-sculptor/template/source/assets/scripts/glyptotheque/controllers.js +1 -0
- data/lib/middleman-sculptor/template/source/assets/scripts/glyptotheque/directives.js +124 -0
- data/lib/middleman-sculptor/template/source/assets/scripts/glyptotheque/services.js +1 -0
- data/lib/middleman-sculptor/template/source/assets/scripts/head-js.js +1 -0
- data/lib/middleman-sculptor/template/source/assets/scripts/iframe-js.js +1 -0
- data/lib/middleman-sculptor/template/source/assets/styles/glyptotheque.scss +9 -0
- data/lib/middleman-sculptor/template/source/assets/styles/glyptotheque/_$variables.scss +3 -0
- data/lib/middleman-sculptor/template/source/assets/styles/glyptotheque/_base.scss +58 -0
- data/lib/middleman-sculptor/template/source/assets/styles/glyptotheque/_codehilite.scss +10 -0
- data/lib/middleman-sculptor/template/source/assets/styles/glyptotheque/_html-outline.scss +131 -0
- data/lib/middleman-sculptor/template/source/assets/styles/glyptotheque/_model-utils.scss +78 -0
- data/lib/middleman-sculptor/template/source/assets/styles/glyptotheque/_model.scss +48 -0
- data/lib/middleman-sculptor/template/source/assets/styles/glyptotheque/_nav.scss +172 -0
- data/lib/middleman-sculptor/template/source/assets/styles/main.scss +18 -0
- data/lib/middleman-sculptor/template/source/assets/styles/pygments/borland.css +46 -0
- data/lib/middleman-sculptor/template/source/assets/styles/pygments/colorful.css +61 -0
- data/lib/middleman-sculptor/template/source/assets/styles/pygments/github.css +61 -0
- data/lib/middleman-sculptor/template/source/assets/styles/pygments/trac.css +59 -0
- data/lib/middleman-sculptor/template/source/glyptotheque/_model-outline-element.slim +22 -0
- data/lib/middleman-sculptor/template/source/glyptotheque/_model-outline.slim +3 -0
- data/lib/middleman-sculptor/template/source/glyptotheque/_model-utils.slim +13 -0
- data/lib/middleman-sculptor/template/source/glyptotheque/_model.slim +26 -0
- data/lib/middleman-sculptor/template/source/glyptotheque/_nav.slim +31 -0
- data/lib/middleman-sculptor/template/source/glyptotheque/directory-index.html.slim +14 -0
- data/lib/middleman-sculptor/template/source/glyptotheque/site-index.html.slim +5 -0
- data/lib/middleman-sculptor/template/source/glyptotheque/sitemap.json.erb +1 -0
- data/lib/middleman-sculptor/template/source/layouts/glyptotheque.slim +19 -0
- data/lib/middleman-sculptor/template/source/layouts/isolated.slim +19 -0
- data/lib/middleman-sculptor/template/source/layouts/layout.slim +18 -0
- data/lib/middleman-sculptor/version.rb +5 -0
- data/lib/middleman_extension.rb +1 -0
- data/middleman-sculptor.gemspec +29 -0
- metadata +197 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bb144c55d87bf80698a9f4f5bc27c10e5c3d0849
|
4
|
+
data.tar.gz: 649c58c85fd0a5d5d1abb02162dd5c200b07b81e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d9b30166947a96a53dabb60084378cb7ad5f3dd74d9454cacdf38f122f0db313fec61d8529fc14693a5b7b4bb0839b85942014141aeb03d688e1984d6775f5af
|
7
|
+
data.tar.gz: f4bb812b679077796f884183e4113e2b1e6a5f9b29f0753aec5be3f89fa9ab9a5aa8759fbde71664b8fee5102510a886adc2cde53b1be47c8c4a74752da25320
|
data/.editorconfig
ADDED
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
data/bin/sculpt
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'middleman-core'
|
2
|
+
require 'middleman-sculptor/hash_dot_syntax'
|
3
|
+
require 'middleman-sculptor/cli'
|
4
|
+
require 'middleman-sculptor/resource_patch'
|
5
|
+
require 'middleman-sculptor/sprockets_patch'
|
6
|
+
|
7
|
+
begin
|
8
|
+
require "middleman-sculptor/template"
|
9
|
+
rescue LoadError
|
10
|
+
# v4
|
11
|
+
end
|
12
|
+
|
13
|
+
::Middleman::Extensions.register(:sculptor) do
|
14
|
+
require 'middleman-sculptor/extension'
|
15
|
+
::Middleman::SculptorExtension
|
16
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'middleman-core/cli'
|
2
|
+
|
3
|
+
require 'middleman-sculptor/cli/version'
|
4
|
+
require 'middleman-sculptor/cli/init'
|
5
|
+
|
6
|
+
module Middleman::Sculptor::Cli
|
7
|
+
class Base < Thor
|
8
|
+
@@middleman_classes = []
|
9
|
+
|
10
|
+
def self.exit_on_failure?
|
11
|
+
true
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.add_middleman_task(klass)
|
15
|
+
klass.namespace "sculptor_#{klass.namespace}"
|
16
|
+
@@middleman_classes << klass
|
17
|
+
end
|
18
|
+
|
19
|
+
add_middleman_task Middleman::Cli::Init
|
20
|
+
# add_middleman_task Middleman::Cli::Server
|
21
|
+
|
22
|
+
def help(meth=nil, subcommand=false)
|
23
|
+
if meth && !self.respond_to?(meth)
|
24
|
+
klass, task = Thor::Util.find_class_and_task_by_namespace("sculptor_#{meth}:#{meth}")
|
25
|
+
klass.start(['-h', task].compact, shell: shell)
|
26
|
+
else
|
27
|
+
list = []
|
28
|
+
sculptor_classes = Thor::Util.thor_classes_in(Middleman::Sculptor::Cli)
|
29
|
+
classes = @@middleman_classes + sculptor_classes
|
30
|
+
classes.each do |thor_class|
|
31
|
+
list += thor_class.printable_tasks(false)
|
32
|
+
end
|
33
|
+
list.sort! { |a, b| a[0] <=> b[0] }
|
34
|
+
|
35
|
+
shell.say 'Tasks:'
|
36
|
+
shell.print_table(list, indent: 2, truncate: true)
|
37
|
+
shell.say
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Intercept missing methods and search subtasks for them
|
42
|
+
# @param [Symbol] meth
|
43
|
+
def method_missing(meth, *args)
|
44
|
+
meth = meth.to_s
|
45
|
+
meth = self.class.map[meth] if self.class.map.key?(meth)
|
46
|
+
|
47
|
+
klass, task = Thor::Util.find_class_and_task_by_namespace("sculptor_#{meth}:#{meth}")
|
48
|
+
|
49
|
+
if klass.nil?
|
50
|
+
raise Thor::Error, "Command '#{meth}' not found. Try 'middleman-sculptor help' for a list of commands."
|
51
|
+
else
|
52
|
+
args.unshift(task) if task
|
53
|
+
klass.start(args, shell: shell)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'middleman-core/cli'
|
2
|
+
|
3
|
+
module Middleman::Cli
|
4
|
+
class Init < Thor
|
5
|
+
def init(name='.')
|
6
|
+
key = :sculptor
|
7
|
+
unless ::Middleman::Templates.registered.key?(key)
|
8
|
+
raise Thor::Error, "Unknown project template '#{key}'"
|
9
|
+
end
|
10
|
+
|
11
|
+
thor_group = ::Middleman::Templates.registered[key]
|
12
|
+
thor_group.new([name], options).invoke_all
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'middleman-sculptor/version'
|
2
|
+
|
3
|
+
module Middleman::Sculptor::Cli
|
4
|
+
class Version < Thor
|
5
|
+
namespace :sculptor_version
|
6
|
+
|
7
|
+
desc 'version', 'Show version'
|
8
|
+
def version
|
9
|
+
say "Sculptor #{Middleman::Sculptor::VERSION} (Middleman #{Middleman::VERSION})"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'middleman-sculptor/helpers/resources'
|
2
|
+
require 'middleman-sculptor/helpers/model'
|
3
|
+
require 'middleman-sculptor/helpers/outliner'
|
4
|
+
|
5
|
+
module Middleman
|
6
|
+
class SculptorExtension < Extension
|
7
|
+
self.defined_helpers = [
|
8
|
+
Middleman::Sculptor::Helpers::Resources,
|
9
|
+
Middleman::Sculptor::Helpers::Model,
|
10
|
+
Middleman::Sculptor::Helpers::Outliner
|
11
|
+
]
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
# require 'nokogiri'
|
3
|
+
|
4
|
+
module Middleman::Sculptor
|
5
|
+
module Helpers
|
6
|
+
module Model
|
7
|
+
def model(*options, &block)
|
8
|
+
id = options.first.is_a?(String) && options.shift || nil
|
9
|
+
options = options.first || {}
|
10
|
+
if block_given?
|
11
|
+
html = capture_html(&block)
|
12
|
+
metadata = options
|
13
|
+
end
|
14
|
+
|
15
|
+
if url = options[:url]
|
16
|
+
# Remote URL
|
17
|
+
if url.start_with?('http')
|
18
|
+
result = grab_remote(url, options[:css], options)
|
19
|
+
metadata = options
|
20
|
+
html = result.to_html
|
21
|
+
# Assume local path
|
22
|
+
else
|
23
|
+
html = partial(relative_dir(current_page.path, url).to_s)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
if metadata
|
28
|
+
options.reverse_merge!(metadata.symbolize_keys!)
|
29
|
+
end
|
30
|
+
|
31
|
+
options[:html] = html
|
32
|
+
options[:id] = id
|
33
|
+
|
34
|
+
models = {}
|
35
|
+
models[id] = {
|
36
|
+
iframe: options[:iframe] || false,
|
37
|
+
html: html
|
38
|
+
}
|
39
|
+
|
40
|
+
current_resource.add_metadata({ models: models })
|
41
|
+
|
42
|
+
partial('glyptotheque/model', locals: options)
|
43
|
+
end
|
44
|
+
|
45
|
+
def imodel(location=nil, options={}, &block)
|
46
|
+
options[:iframe] = true
|
47
|
+
model(location, options, &block)
|
48
|
+
end
|
49
|
+
|
50
|
+
def model_source(type, &block)
|
51
|
+
source_code = capture_html(&block)
|
52
|
+
partial('glyptotheque/model-source', locals: { source_type: type, source_code: source_code })
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def grab_remote(url, css, options)
|
58
|
+
puts "Fetching from #{url}"
|
59
|
+
|
60
|
+
css ||= 'body'
|
61
|
+
|
62
|
+
selector_index_pair = css.split(/\s+#(\d+)$/)
|
63
|
+
|
64
|
+
if options[:pretty] == true
|
65
|
+
doc = Nokogiri::XML(open(url), &:noblanks)
|
66
|
+
else
|
67
|
+
doc = Nokogiri::HTML(open(url), &:noblanks)
|
68
|
+
end
|
69
|
+
|
70
|
+
result = doc.css(selector_index_pair[0])
|
71
|
+
puts "Matching CSS: `#{selector_index_pair[0]}` (found #{pluralize(result.count, 'element')})"
|
72
|
+
|
73
|
+
# Select element with specified index e.g. `.selector #1`
|
74
|
+
if selector_index_pair[1]
|
75
|
+
puts "Select index #{selector_index_pair[1].to_i} from the list"
|
76
|
+
result = result[selector_index_pair[1].to_i]
|
77
|
+
end
|
78
|
+
|
79
|
+
@root_url = "#{URI(url).scheme}://#{URI(url).host}/"
|
80
|
+
|
81
|
+
if result.class == Nokogiri::XML::NodeSet
|
82
|
+
result.css('[src]').map do |e|
|
83
|
+
e.set_attribute('src', parse_relative_url(url, e.attr('src')))
|
84
|
+
end
|
85
|
+
elsif result.class == Nokogiri::XML::Element
|
86
|
+
result.set_attribute('src', parse_relative_url(url, result.attr('src'))) if result.attr('src')
|
87
|
+
end
|
88
|
+
|
89
|
+
if !result || result.is_a?(Array) && result.empty?
|
90
|
+
raise "Selector `#{selector_index_pair[0]}`#{selector_index_pair[1] ? '(index: ' + selector_index_pair[1] + ')': ''} not found at remote location`#{url}`"
|
91
|
+
end
|
92
|
+
|
93
|
+
return result
|
94
|
+
end
|
95
|
+
|
96
|
+
def parse_relative_url(url, path)
|
97
|
+
is_root = path.match(/^\/[^\/].*/)
|
98
|
+
if is_root
|
99
|
+
path.sub(/^\/(.*)/, @root_url + $1)
|
100
|
+
elsif path.match(/^\.{1,2}\//)
|
101
|
+
relative_dir(url, path).to_s
|
102
|
+
elsif path.match(/^\/\//)
|
103
|
+
"#{URI(url).scheme}:#{path}"
|
104
|
+
else
|
105
|
+
path
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
4
|
+
module Middleman::Sculptor
|
5
|
+
module Helpers
|
6
|
+
module Outliner
|
7
|
+
def outline(&block)
|
8
|
+
html = capture_html(&block)
|
9
|
+
doc = Nokogiri::HTML.fragment(html, encoding='utf-8')
|
10
|
+
|
11
|
+
elements = parse_elements(doc.children)
|
12
|
+
|
13
|
+
partial('glyptotheque/model-outline', locals: { elements: elements })
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def parse_elements(elements)
|
19
|
+
result = []
|
20
|
+
|
21
|
+
elements.each do |e|
|
22
|
+
text = e.xpath('text()').text
|
23
|
+
|
24
|
+
next unless e.element?
|
25
|
+
|
26
|
+
class_name = e.attributes['class'] && e.attributes['class'].value
|
27
|
+
id = e.attributes['id'] && e.attributes['id'].value
|
28
|
+
attributes = e.attributes.reject {|k| k == 'class' || k == 'id' }
|
29
|
+
|
30
|
+
result << {
|
31
|
+
el_name: e.name,
|
32
|
+
class_name: class_name,
|
33
|
+
id: id,
|
34
|
+
attrs: attributes.values.map { |a| { name: a.name, value: a.value } },
|
35
|
+
children: parse_elements(e.children),
|
36
|
+
text: text
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
return result
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require 'rest-client'
|
2
|
+
require 'oj'
|
3
|
+
|
4
|
+
module Middleman::Sculptor
|
5
|
+
module Helpers
|
6
|
+
module Resources
|
7
|
+
def include_javascripts(javascripts)
|
8
|
+
include_assets(:javascript_include_tag, javascripts)
|
9
|
+
end
|
10
|
+
|
11
|
+
def include_stylesheets(stylesheets)
|
12
|
+
include_assets(:stylesheet_link_tag, stylesheets)
|
13
|
+
end
|
14
|
+
|
15
|
+
def resource_file(resource)
|
16
|
+
resource.path.split('/').last.gsub(resource.ext, '')
|
17
|
+
end
|
18
|
+
|
19
|
+
def resource_dir(resource)
|
20
|
+
resource.url.split('/').last
|
21
|
+
end
|
22
|
+
|
23
|
+
def resources_for(dir, ext: 'html', exclude_indexes: false, sort_by: nil, ignore: nil, allow_hidden: false)
|
24
|
+
filtered = sitemap.resources
|
25
|
+
.reject {|r| r.url == dir} # Exclude main directory index
|
26
|
+
.select {|r| r.url.start_with?(dir)} # Select files in the given dir
|
27
|
+
|
28
|
+
collect_resources(filtered,
|
29
|
+
{ ext: ext, exclude_indexes: exclude_indexes, sort_by: sort_by, ignore: ignore, allow_hidden: allow_hidden}
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
def resource_tree(dir, ext: 'html', data_fields: [:title], exclude_indexes: false, sort_by: nil, ignore: nil)
|
34
|
+
resources_for(dir, ext: ext, exclude_indexes: exclude_indexes, sort_by: sort_by, ignore: ignore)
|
35
|
+
.map { |r| parse_resource(r, {
|
36
|
+
ext: ext,
|
37
|
+
data_fields: data_fields,
|
38
|
+
exclude_indexes: exclude_indexes,
|
39
|
+
sort_by: sort_by,
|
40
|
+
ignore: ignore
|
41
|
+
})
|
42
|
+
}
|
43
|
+
.reject { |r| r[:parent] != '/' } # Remove non-root directories from the root
|
44
|
+
end
|
45
|
+
|
46
|
+
def local_data(path)
|
47
|
+
current_path = current_resource.path
|
48
|
+
if current_resource.metadata.page.has_key? :local_url
|
49
|
+
current_path = current_resource.metadata.page.local_url
|
50
|
+
end
|
51
|
+
result = sitemap.find_resource_by_path(relative_dir(current_path, path).to_s)
|
52
|
+
raise "#{path} not found" unless result
|
53
|
+
|
54
|
+
case result.ext
|
55
|
+
when '.yaml', '.yml'
|
56
|
+
result = YAML.load(result.render)
|
57
|
+
when '.json'
|
58
|
+
result = Oj.load(result.render)
|
59
|
+
end
|
60
|
+
|
61
|
+
result
|
62
|
+
end
|
63
|
+
|
64
|
+
# Use in layouts, in templates either Frontmatter or this method can be used
|
65
|
+
def append_class(block_name, appended_classes='')
|
66
|
+
current_page_classes = current_page.data[block_name] || ''
|
67
|
+
existing_classes_a = current_page_classes.split(' ')
|
68
|
+
appended_classes_a = appended_classes.split(' ')
|
69
|
+
classes = existing_classes_a.concat(appended_classes_a).reverse.join(' ')
|
70
|
+
content_for(block_name, classes)
|
71
|
+
end
|
72
|
+
|
73
|
+
def get(url, options = {})
|
74
|
+
begin
|
75
|
+
result = RestClient.get(url, options)
|
76
|
+
rescue => e
|
77
|
+
raise "GET - #{e.message}: '#{url}'"
|
78
|
+
end
|
79
|
+
|
80
|
+
Oj.load(result)
|
81
|
+
end
|
82
|
+
|
83
|
+
def post(url, params = {}, headers = {})
|
84
|
+
begin
|
85
|
+
result = RestClient.post(url, params, headers)
|
86
|
+
rescue => e
|
87
|
+
raise "POST - #{e.message}: '#{url}'"
|
88
|
+
end
|
89
|
+
|
90
|
+
Oj.load(result)
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
def collect_resources(resources, options)
|
96
|
+
resources
|
97
|
+
.select {|r| r.ext == ".#{options[:ext]}"} # Select only files with specified extension
|
98
|
+
.sort_by {|r| r.url } # Sort by url (default)
|
99
|
+
.sort_by {|r| r.data[options[:sort_by]] || -1} # Sort by `sort_by` param
|
100
|
+
.reject {|r| # Reject hidden (Front matter)
|
101
|
+
r.data.hidden unless options[:allow_hidden]
|
102
|
+
}
|
103
|
+
.reject {|r| # Exclude all directory indexes
|
104
|
+
options[:exclude_indexes] ? r.directory_index? : false
|
105
|
+
}
|
106
|
+
.reject {|r| ignore ? r.url.match(options[:ignore]) : false } # Ignore URLs matching pattern (if provided)
|
107
|
+
.reject {|r| r.path.end_with? ("-isolated#{r.ext}")} # Ignore proxied '-isolated' mode pages
|
108
|
+
.reject {|r| r.path.start_with? ("glyptotheque/")} # Ignore Sculptor’s partials
|
109
|
+
end
|
110
|
+
|
111
|
+
def parse_resource(r, options)
|
112
|
+
data = {}
|
113
|
+
data[:path] = url_for("/#{r.path}")
|
114
|
+
data[:url] = r.url
|
115
|
+
|
116
|
+
# Add parent to top-level pages (not containing `/` in path)
|
117
|
+
if /^((?!\/).)*$/.match r.path
|
118
|
+
data[:parent] = '/'
|
119
|
+
end
|
120
|
+
|
121
|
+
if r.children.any?
|
122
|
+
data[:children] = collect_resources(r.children, options).map { |c| parse_resource(c, options) }
|
123
|
+
if r.parent
|
124
|
+
data[:parent] = r.parent.url
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
|
129
|
+
options[:data_fields].each do |field|
|
130
|
+
data[field] = r.data[field]
|
131
|
+
if field == :title && !r.data.title
|
132
|
+
data[field] = resource_dir(r)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
data
|
136
|
+
end
|
137
|
+
|
138
|
+
def include_assets(asset_tag, assets)
|
139
|
+
return unless assets
|
140
|
+
assets = assets.split(/,\s*/) if assets.is_a? String
|
141
|
+
resource_path = current_page.metadata && current_page.metadata.page[:local_url] || current_page.path
|
142
|
+
Array(assets).map { |a|
|
143
|
+
path = a.start_with?('http') ? a : relative_dir(resource_path, a)
|
144
|
+
"\n" + method(asset_tag).call(path)
|
145
|
+
}.join
|
146
|
+
end
|
147
|
+
|
148
|
+
# Constructs path relative to base path (first argument)
|
149
|
+
def relative_dir(path, *args)
|
150
|
+
relative_path = args ? args.join('/') : ''
|
151
|
+
Pathname(path).dirname.join(relative_path)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|