bunto-assets 1.0.0.pre.alpha
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +19 -0
- data/LICENSE +21 -0
- data/README.md +275 -0
- data/Rakefile +3 -0
- data/lib/bunto/assets/addons/autoprefixer.rb +13 -0
- data/lib/bunto/assets/addons/bootstrap.rb +7 -0
- data/lib/bunto/assets/addons/font_awesome.rb +7 -0
- data/lib/bunto/assets/addons/javascript.rb +11 -0
- data/lib/bunto/assets/cached.rb +20 -0
- data/lib/bunto/assets/config.rb +76 -0
- data/lib/bunto/assets/env.rb +207 -0
- data/lib/bunto/assets/hook.rb +78 -0
- data/lib/bunto/assets/hooks/bunto/drops.rb +9 -0
- data/lib/bunto/assets/hooks/bunto/setup.rb +13 -0
- data/lib/bunto/assets/hooks/bunto/write.rb +9 -0
- data/lib/bunto/assets/hooks/cache.rb +15 -0
- data/lib/bunto/assets/hooks/compression.rb +17 -0
- data/lib/bunto/assets/hooks/configuration.rb +12 -0
- data/lib/bunto/assets/hooks/context.rb +11 -0
- data/lib/bunto/assets/hooks/erb.rb +15 -0
- data/lib/bunto/assets/hooks/helpers.rb +14 -0
- data/lib/bunto/assets/hooks/logger.rb +9 -0
- data/lib/bunto/assets/hooks/sources.rb +13 -0
- data/lib/bunto/assets/hooks/sprockets.rb +9 -0
- data/lib/bunto/assets/hooks/version.rb +11 -0
- data/lib/bunto/assets/hooks.rb +20 -0
- data/lib/bunto/assets/liquid/drop.rb +76 -0
- data/lib/bunto/assets/liquid/filters.rb +28 -0
- data/lib/bunto/assets/liquid/tag/defaults/image.rb +69 -0
- data/lib/bunto/assets/liquid/tag/defaults.rb +23 -0
- data/lib/bunto/assets/liquid/tag/parser.rb +200 -0
- data/lib/bunto/assets/liquid/tag/proxied_asset.rb +114 -0
- data/lib/bunto/assets/liquid/tag/proxies.rb +118 -0
- data/lib/bunto/assets/liquid/tag.rb +203 -0
- data/lib/bunto/assets/liquid.rb +15 -0
- data/lib/bunto/assets/logger.rb +59 -0
- data/lib/bunto/assets/patches/bunto/cleaner.rb +16 -0
- data/lib/bunto/assets/patches/bunto/site.rb +11 -0
- data/lib/bunto/assets/patches/kernel.rb +29 -0
- data/lib/bunto/assets/patches/sprockets/asset.rb +21 -0
- data/lib/bunto/assets/patches.rb +10 -0
- data/lib/bunto/assets/processors/liquid.rb +42 -0
- data/lib/bunto/assets/proxies/magick.rb +155 -0
- data/lib/bunto/assets/version.rb +11 -0
- data/lib/bunto/assets.rb +24 -0
- data/lib/bunto-assets.rb +7 -0
- metadata +197 -0
@@ -0,0 +1,78 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
module Bunto
|
8
|
+
module Assets
|
9
|
+
class Hook
|
10
|
+
class UnknownHookError < RuntimeError
|
11
|
+
def initialize(base: nil, point: nil)
|
12
|
+
super "Unknown hook #{base ? "base" : "point"} '#{base || point}'"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# ----------------------------------------------------------------------
|
17
|
+
|
18
|
+
HOOK_ALIASES = {
|
19
|
+
:env => {
|
20
|
+
:post_init => :init,
|
21
|
+
:pre_init => :init
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
25
|
+
# ----------------------------------------------------------------------
|
26
|
+
|
27
|
+
HOOK_POINTS = {
|
28
|
+
:env => [
|
29
|
+
:init
|
30
|
+
]
|
31
|
+
}
|
32
|
+
|
33
|
+
# ----------------------------------------------------------------------
|
34
|
+
|
35
|
+
def self.all
|
36
|
+
@_all ||= {}
|
37
|
+
end
|
38
|
+
|
39
|
+
# ----------------------------------------------------------------------
|
40
|
+
# Trigger a hook, giving an optional block where we pass you the,
|
41
|
+
# proc we got and then you can do as you please (such as instance eval)
|
42
|
+
# but if you do not give us one then we simply pass the args.
|
43
|
+
# ----------------------------------------------------------------------
|
44
|
+
|
45
|
+
def self.trigger(base, point_, *args, &block)
|
46
|
+
raise ArgumentError, "Do not give args with a block" if args.size > 0 && block_given?
|
47
|
+
if all.key?(base) && all[base].key?(point_)
|
48
|
+
Set.new.merge(point(base, point_, :early)).merge(point(base, point_)).map do |v|
|
49
|
+
block_given?? block.call(v) : v.call(*args)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# ----------------------------------------------------------------------
|
55
|
+
|
56
|
+
def self.point(base, point, when_ = :late)
|
57
|
+
point = all[base][point] ||= {
|
58
|
+
:early => Set.new,
|
59
|
+
:late => Set.new
|
60
|
+
}
|
61
|
+
|
62
|
+
point[when_]
|
63
|
+
end
|
64
|
+
|
65
|
+
# ----------------------------------------------------------------------
|
66
|
+
|
67
|
+
def self.register(base, point, when_ = :late, &block)
|
68
|
+
raise UnknownHookError, base: base unless HOOK_POINTS.key?(base)
|
69
|
+
point = HOOK_ALIASES[base][point] if HOOK_ALIASES.fetch(base, {}).key?(point)
|
70
|
+
raise UnknownHookError, point: point unless HOOK_POINTS[base].include?(point)
|
71
|
+
all[base] ||= {}
|
72
|
+
|
73
|
+
point(base, point, when_) \
|
74
|
+
.add(block)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
Bunto::Hooks.register :site, :pre_render do |bunto, payload|
|
8
|
+
payload["assets"] = bunto.sprockets.to_liquid_payload
|
9
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
Bunto::Hooks.register :site, :after_reset do |bunto|
|
8
|
+
Bunto::Assets::Env.new(bunto)
|
9
|
+
|
10
|
+
excludes = Set.new(bunto.config["exclude"])
|
11
|
+
bunto.sprockets.excludes.map(&excludes.method(:add))
|
12
|
+
bunto.config["exclude"] = excludes.to_a
|
13
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
Bunto::Hooks.register :site, :post_write do |bunto|
|
8
|
+
bunto.sprockets.write_all
|
9
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
Bunto::Assets::Hook.register :env, :init do
|
8
|
+
cache_dir = asset_config.fetch("cache", ".asset-cache")
|
9
|
+
|
10
|
+
if cache_dir
|
11
|
+
self.cache = Sprockets::Cache::FileStore.new(
|
12
|
+
bunto.in_source_dir(cache_dir)
|
13
|
+
)
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
Bunto::Assets::Hook.register :env, :init do
|
8
|
+
if compress?("css")
|
9
|
+
self.css_compressor = :sass
|
10
|
+
end
|
11
|
+
|
12
|
+
if compress?("js")
|
13
|
+
try_require "uglifier" do
|
14
|
+
self.js_compressor = :uglify
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
Bunto::Assets::Hook.register :env, :init, :early do
|
8
|
+
bunto.config["assets"] = Bunto::Assets::Config.merge(asset_config)
|
9
|
+
Bunto::Assets::Config.merge_sources(
|
10
|
+
bunto, asset_config
|
11
|
+
)
|
12
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
Bunto::Assets::Hook.register :env, :init do
|
8
|
+
context_class.class_eval(
|
9
|
+
&self.class.context_patches
|
10
|
+
)
|
11
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
Bunto::Assets::Hook.register :env, :init, :early do
|
8
|
+
self.config = hash_reassoc(config, :engines) do |hash|
|
9
|
+
hash.delete(
|
10
|
+
".erb"
|
11
|
+
)
|
12
|
+
|
13
|
+
hash
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
require "sprockets/helpers"
|
8
|
+
|
9
|
+
Bunto::Assets::Hook.register :env, :init do
|
10
|
+
Sprockets::Helpers.configure do |config|
|
11
|
+
config.prefix = prefix_path
|
12
|
+
config.digest = digest?
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
Bunto::Assets::Hook.register :env, :init do
|
8
|
+
self.logger = Bunto::Assets::Logger.new
|
9
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
Bunto::Assets::Hook.register :env, :init do
|
8
|
+
asset_config["sources"] ||= []
|
9
|
+
|
10
|
+
asset_config["sources"].each do |path|
|
11
|
+
append_path bunto.in_source_dir(path)
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
Bunto::Assets::Hook.register :env, :init do
|
8
|
+
bunto.sprockets = self
|
9
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
Bunto::Assets::Hook.register :env, :init do
|
8
|
+
self.version = Digest::MD5.hexdigest(
|
9
|
+
asset_config.inspect
|
10
|
+
)
|
11
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
require_relative "hooks/bunto/drops"
|
8
|
+
require_relative "hooks/bunto/setup"
|
9
|
+
require_relative "hooks/bunto/write"
|
10
|
+
|
11
|
+
require_relative "hooks/context"
|
12
|
+
require_relative "hooks/compression"
|
13
|
+
require_relative "hooks/configuration"
|
14
|
+
require_relative "hooks/helpers"
|
15
|
+
require_relative "hooks/logger"
|
16
|
+
require_relative "hooks/sources"
|
17
|
+
require_relative "hooks/sprockets"
|
18
|
+
require_relative "hooks/version"
|
19
|
+
require_relative "hooks/cache"
|
20
|
+
require_relative "hooks/erb"
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
require "fastimage"
|
8
|
+
|
9
|
+
module Bunto
|
10
|
+
module Assets
|
11
|
+
module Liquid
|
12
|
+
class Drop < ::Liquid::Drop
|
13
|
+
extend Forwardable
|
14
|
+
def initialize(path, bunto)
|
15
|
+
@path = path
|
16
|
+
@bunto = bunto
|
17
|
+
@asset = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
# --------------------------------------------------------------------
|
21
|
+
|
22
|
+
def_delegator :asset, :digest_path
|
23
|
+
def_delegator :asset, :logical_path
|
24
|
+
def_delegator :asset, :content_type, :type
|
25
|
+
def_delegator :asset, :content_type
|
26
|
+
def_delegator :asset, :filename
|
27
|
+
|
28
|
+
# --------------------------------------------------------------------
|
29
|
+
|
30
|
+
def basename
|
31
|
+
File.basename(@path)
|
32
|
+
end
|
33
|
+
|
34
|
+
# --------------------------------------------------------------------
|
35
|
+
|
36
|
+
def width
|
37
|
+
if image?
|
38
|
+
dimensions.first
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# --------------------------------------------------------------------
|
43
|
+
|
44
|
+
def height
|
45
|
+
if image?
|
46
|
+
dimensions.last
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# --------------------------------------------------------------------
|
51
|
+
|
52
|
+
def dimensions
|
53
|
+
if image?
|
54
|
+
@dimensions ||= FastImage.new(asset.filename).size
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# --------------------------------------------------------------------
|
59
|
+
|
60
|
+
private
|
61
|
+
def image?
|
62
|
+
%W(image/png image/jpeg image/gif).include?(
|
63
|
+
asset.content_type
|
64
|
+
)
|
65
|
+
end
|
66
|
+
|
67
|
+
# --------------------------------------------------------------------
|
68
|
+
|
69
|
+
private
|
70
|
+
def asset
|
71
|
+
@asset ||= @bunto.sprockets.find_asset(@path)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Frozen-string-literal: true
|
2
|
+
# Copyright: 2016-present - MIT License
|
3
|
+
# Encoding: utf-8
|
4
|
+
|
5
|
+
module Bunto
|
6
|
+
module Assets
|
7
|
+
module Liquid
|
8
|
+
module Filters
|
9
|
+
ACCEPTABLE_FILTERS = [:css, :img, :asset_path, :stylesheet,
|
10
|
+
:javascript, :style, :img, :js]
|
11
|
+
|
12
|
+
# --------------------------------------------------------------------
|
13
|
+
|
14
|
+
ACCEPTABLE_FILTERS.each do |val|
|
15
|
+
define_method val do |path, args = ""|
|
16
|
+
Tag.send(:new, val, "#{path} #{args}", "").render(@context)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# ----------------------------------------------------------------------------
|
25
|
+
# Register it with Liquid, good luck from here.
|
26
|
+
# ----------------------------------------------------------------------------
|
27
|
+
|
28
|
+
Liquid::Template.register_filter(Bunto::Assets::Liquid::Filters)
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
module Bunto
|
8
|
+
module Assets
|
9
|
+
module Liquid
|
10
|
+
class Tag
|
11
|
+
module Defaults
|
12
|
+
class Image
|
13
|
+
def self.for?(tag)
|
14
|
+
tag == "img" || tag == "image"
|
15
|
+
end
|
16
|
+
|
17
|
+
# ----------------------------------------------------------------
|
18
|
+
# TODO: In 3.0 env needs to be enforced if this is not changed,
|
19
|
+
# for now it's not enforced to maintain the 2.0 API.
|
20
|
+
# ----------------------------------------------------------------
|
21
|
+
|
22
|
+
def initialize(args, asset, env = nil)
|
23
|
+
@args = args
|
24
|
+
@asset = asset
|
25
|
+
@env = env
|
26
|
+
end
|
27
|
+
|
28
|
+
# ----------------------------------------------------------------
|
29
|
+
|
30
|
+
def set!
|
31
|
+
set_img_dimensions
|
32
|
+
set_img_alt
|
33
|
+
end
|
34
|
+
|
35
|
+
# ----------------------------------------------------------------
|
36
|
+
# TODO: 3.0 - Remove the `!@env`
|
37
|
+
# ----------------------------------------------------------------
|
38
|
+
|
39
|
+
private
|
40
|
+
def set_img_alt
|
41
|
+
if !@env || @env.asset_config["features"]["automatic_img_alt"]
|
42
|
+
@args[:html] ||= {}
|
43
|
+
unless @args[:html].key?("alt")
|
44
|
+
@args[:html]["alt"] = @asset.logical_path
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# ----------------------------------------------------------------
|
50
|
+
# TODO: 3.0 - Remove the `!@env`
|
51
|
+
# ----------------------------------------------------------------
|
52
|
+
|
53
|
+
private
|
54
|
+
def set_img_dimensions
|
55
|
+
if !@env || @env.asset_config["features"]["automatic_img_size"]
|
56
|
+
dimensions = FastImage.new(@asset.filename).size
|
57
|
+
return unless dimensions
|
58
|
+
@args[:html] ||= {}
|
59
|
+
|
60
|
+
@args[:html][ "width"] ||= dimensions.first
|
61
|
+
@args[:html]["height"] ||= dimensions. last
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Bunto
|
2
|
+
module Assets
|
3
|
+
module Liquid
|
4
|
+
class Tag
|
5
|
+
module Defaults
|
6
|
+
require_relative "defaults/image"
|
7
|
+
|
8
|
+
# ------------------------------------------------------------------
|
9
|
+
# TODO: In 1.0 env needs to be enforced, right now it's not
|
10
|
+
# because it's maintain 2.0 API.
|
11
|
+
# ------------------------------------------------------------------
|
12
|
+
|
13
|
+
module_function
|
14
|
+
def set_defaults_for!(tag, args, asset, env = nil)
|
15
|
+
constants.select { |const| const_get(const).for?(tag) }.each do |const|
|
16
|
+
const_get(const).new(args, asset, env).set!
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,200 @@
|
|
1
|
+
# ----------------------------------------------------------------------------
|
2
|
+
# Frozen-string-literal: true
|
3
|
+
# Copyright: 2016-present - MIT License
|
4
|
+
# Encoding: utf-8
|
5
|
+
# ----------------------------------------------------------------------------
|
6
|
+
|
7
|
+
require_relative "proxies"
|
8
|
+
require "forwardable"
|
9
|
+
|
10
|
+
module Bunto
|
11
|
+
module Assets
|
12
|
+
module Liquid
|
13
|
+
|
14
|
+
# ----------------------------------------------------------------------
|
15
|
+
# Examples:
|
16
|
+
# - {% tag value argument:value %}
|
17
|
+
# - {% tag value "argument:value" %}
|
18
|
+
# - {% tag value argument:"I have spaces" %}
|
19
|
+
# - {% tag value argument:value\:with\:colon %}
|
20
|
+
# - {% tag value argument:"I can even escape \\: here too!" %}
|
21
|
+
# - {% tag value proxy:key:value %}
|
22
|
+
# ----------------------------------------------------------------------
|
23
|
+
|
24
|
+
class Tag
|
25
|
+
class Parser
|
26
|
+
attr_reader :args, :raw_args
|
27
|
+
extend Forwardable
|
28
|
+
|
29
|
+
def_delegator :@args, :each
|
30
|
+
def_delegator :@args, :key?
|
31
|
+
def_delegator :@args, :fetch
|
32
|
+
def_delegator :@args, :store
|
33
|
+
def_delegator :@args, :to_h
|
34
|
+
def_delegator :@args, :[]=
|
35
|
+
def_delegator :@args, :[]
|
36
|
+
|
37
|
+
# ------------------------------------------------------------------
|
38
|
+
|
39
|
+
ACCEPT = {
|
40
|
+
"css" => "text/css", "js" => "application/javascript"
|
41
|
+
}
|
42
|
+
|
43
|
+
# ------------------------------------------------------------------
|
44
|
+
|
45
|
+
class UnescapedColonError < StandardError
|
46
|
+
def initialize
|
47
|
+
super "Unescaped double colon argument."
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# ------------------------------------------------------------------
|
52
|
+
|
53
|
+
class UnknownProxyError < StandardError
|
54
|
+
def initialize
|
55
|
+
super "Unknown proxy argument."
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# ------------------------------------------------------------------
|
60
|
+
|
61
|
+
def initialize(args, tag, processed: false, raw_args: nil)
|
62
|
+
if processed && raw_args
|
63
|
+
@args = args
|
64
|
+
@raw_args = raw_args
|
65
|
+
@tag = tag
|
66
|
+
|
67
|
+
elsif processed && !raw_args
|
68
|
+
raise ArgumentError, "You must provide raw_args if you pre-process." \
|
69
|
+
"Please provide the raw args."
|
70
|
+
|
71
|
+
else
|
72
|
+
@tag = tag
|
73
|
+
@raw_args = args
|
74
|
+
parse_raw
|
75
|
+
set_accept
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# ------------------------------------------------------------------
|
80
|
+
|
81
|
+
def parse_liquid(context)
|
82
|
+
return self unless context.is_a?(Object::Liquid::Context)
|
83
|
+
liquid = context.registers[:site].liquid_renderer.file("(bunto:assets)")
|
84
|
+
out = parse_hash_liquid(to_h, liquid, context)
|
85
|
+
self.class.new(out, @tag, raw_args: @raw_args, \
|
86
|
+
processed: true)
|
87
|
+
end
|
88
|
+
|
89
|
+
# ------------------------------------------------------------------
|
90
|
+
|
91
|
+
def to_html
|
92
|
+
(self[:html] || {}).map do |key, val|
|
93
|
+
%{ #{key}="#{val}"}
|
94
|
+
end.join
|
95
|
+
end
|
96
|
+
|
97
|
+
# ------------------------------------------------------------------
|
98
|
+
|
99
|
+
def proxies
|
100
|
+
keys = (args.keys - Proxies.base_keys - [:file, :html])
|
101
|
+
args.select do |key, _|
|
102
|
+
keys.include?(key)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# ------------------------------------------------------------------
|
107
|
+
|
108
|
+
def proxies?
|
109
|
+
proxies.any?
|
110
|
+
end
|
111
|
+
|
112
|
+
# ------------------------------------------------------------------
|
113
|
+
|
114
|
+
private
|
115
|
+
def parse_hash_liquid(hash_, liquid, context)
|
116
|
+
hash_.each_with_object({}) do |(key, val), hash|
|
117
|
+
val = liquid.parse(val).render(context) if val.is_a?(String)
|
118
|
+
val = parse_hash_liquid(val, liquid, context) if val.is_a?(Hash)
|
119
|
+
hash[key] = val
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# ------------------------------------------------------------------
|
124
|
+
|
125
|
+
private
|
126
|
+
def parse_raw
|
127
|
+
@args = from_shellwords.each_with_index.each_with_object({}) do |(key, index), hash|
|
128
|
+
if index == 0 then hash.store(:file, key)
|
129
|
+
elsif key =~ /:/ && (key = key.split(/(?<!\\):/))
|
130
|
+
parse_col hash, key
|
131
|
+
|
132
|
+
else
|
133
|
+
(hash[:html] ||= {})[key] = true
|
134
|
+
end
|
135
|
+
|
136
|
+
hash
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# ------------------------------------------------------------------
|
141
|
+
|
142
|
+
private
|
143
|
+
def parse_col(hash, key)
|
144
|
+
key.push(key.delete_at(-1).gsub(/\\:/, ":"))
|
145
|
+
return as_proxy hash, key if key.size == 3
|
146
|
+
return as_bool_or_html hash, key if key.size == 2
|
147
|
+
raise UnescapedColonError
|
148
|
+
end
|
149
|
+
|
150
|
+
# ------------------------------------------------------------------
|
151
|
+
|
152
|
+
private
|
153
|
+
def as_bool_or_html(hash, key)
|
154
|
+
okey = key
|
155
|
+
key, sub_key = key
|
156
|
+
if Proxies.has?(key, @tag, "@#{sub_key}")
|
157
|
+
(hash[key.to_sym] ||= {})[sub_key.to_sym] = true
|
158
|
+
else
|
159
|
+
(hash[:html] ||= {})[key] = \
|
160
|
+
okey[1]
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
# ------------------------------------------------------------------
|
165
|
+
|
166
|
+
private
|
167
|
+
def as_proxy(hash, key)
|
168
|
+
key, sub_key, val = key
|
169
|
+
if Proxies.has?(key, @tag, sub_key)
|
170
|
+
(hash[key.to_sym] ||= {})[sub_key.to_sym] = \
|
171
|
+
val
|
172
|
+
|
173
|
+
elsif Proxies.has?(key)
|
174
|
+
raise UnknownProxyError
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
# ------------------------------------------------------------------
|
179
|
+
|
180
|
+
private
|
181
|
+
def set_accept
|
182
|
+
if ACCEPT.key?(@tag) && (!@args.key?(:sprockets) || \
|
183
|
+
!@args[:sprockets].key?(:accept))
|
184
|
+
|
185
|
+
(@args[:sprockets] ||= {})[:accept] = \
|
186
|
+
ACCEPT[@tag]
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
# ------------------------------------------------------------------
|
191
|
+
|
192
|
+
private
|
193
|
+
def from_shellwords
|
194
|
+
Shellwords.shellwords(@raw_args)
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|