fuse 0.1.7 → 0.1.8
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.
- data/lib/fuse.rb +1 -1
- data/lib/fuse/document.rb +35 -22
- data/lib/fuse/document/asset/style_sheet.rb +48 -1
- data/lib/fuse/document/asset_collection.rb +4 -0
- data/lib/fuse/server.rb +9 -1
- metadata +2 -2
data/lib/fuse.rb
CHANGED
data/lib/fuse/document.rb
CHANGED
|
@@ -44,27 +44,18 @@ class Fuse::Document
|
|
|
44
44
|
link['href'] = asset.relative_path
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
#attach
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
tag.content = raw
|
|
60
|
-
head << tag
|
|
61
|
-
else
|
|
62
|
-
collection.each do |asset|
|
|
63
|
-
data = asset.reference_with
|
|
64
|
-
tag = Nokogiri::XML::Node.new(data[:tag_name], document)
|
|
65
|
-
data[:attributes].each { |k, v| tag[k] = v unless v.nil? }
|
|
66
|
-
head << tag
|
|
67
|
-
end
|
|
47
|
+
#attach scripts
|
|
48
|
+
scripts = assets.of_type(Fuse::Document::Asset::JavaScript).sort!
|
|
49
|
+
head << tag_for_collection(scripts, document) unless scripts.empty?
|
|
50
|
+
|
|
51
|
+
#attach stylesheets
|
|
52
|
+
style_sheets = assets.of_type(Fuse::Document::Asset::StyleSheet)
|
|
53
|
+
style_sheets.group_by(&:conditional_signature).each_value do |conditional_collection|
|
|
54
|
+
conditional_collection.group_by(&:media).each do |media, media_collection|
|
|
55
|
+
media_collection.sort!
|
|
56
|
+
tag = tag_for_collection(media_collection, document)
|
|
57
|
+
tag['media'] = media unless media.nil? || media.empty? || Nokogiri::XML::NodeSet === tag
|
|
58
|
+
head << Nokogiri::HTML.fragment(media_collection.first.conditional.wrap(tag.to_html(encoding: @options[:encoding])), @options[:encoding])
|
|
68
59
|
end
|
|
69
60
|
end
|
|
70
61
|
|
|
@@ -94,7 +85,7 @@ class Fuse::Document
|
|
|
94
85
|
end
|
|
95
86
|
end
|
|
96
87
|
unless font_css.empty?
|
|
97
|
-
style_node = head.
|
|
88
|
+
style_node = head.add_child(Nokogiri::XML::Node.new 'style', document)
|
|
98
89
|
style_node.content = font_css + style_node.content
|
|
99
90
|
end
|
|
100
91
|
|
|
@@ -151,4 +142,26 @@ class Fuse::Document
|
|
|
151
142
|
def assets
|
|
152
143
|
@assets ||= Asset[root]
|
|
153
144
|
end
|
|
145
|
+
|
|
146
|
+
def tag_for_collection(collection, document)
|
|
147
|
+
return if collection.empty?
|
|
148
|
+
klass = collection.first.class
|
|
149
|
+
if @options[:embed_assets]
|
|
150
|
+
tag = Nokogiri::XML::Node.new(klass::EMBED_WITH, document)
|
|
151
|
+
raw = collection.map do |asset|
|
|
152
|
+
tag['type'] = asset.type
|
|
153
|
+
(@options[:compress_assets] ? asset.compress : asset.filtered).strip
|
|
154
|
+
end.reject{ |x| x.length == 0 }.join(klass::JOIN_WITH)
|
|
155
|
+
return unless raw.length > 0
|
|
156
|
+
tag.content = raw
|
|
157
|
+
tag
|
|
158
|
+
else
|
|
159
|
+
Nokogiri::XML::NodeSet.new(document, collection.map do |asset|
|
|
160
|
+
data = asset.reference_with
|
|
161
|
+
tag = Nokogiri::XML::Node.new(data[:tag_name], document)
|
|
162
|
+
data[:attributes].each { |k, v| tag[k] = v unless v.nil? }
|
|
163
|
+
tag
|
|
164
|
+
end)
|
|
165
|
+
end
|
|
166
|
+
end
|
|
154
167
|
end
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
class Fuse::Document::Asset
|
|
2
2
|
class StyleSheet < self
|
|
3
|
+
|
|
3
4
|
EMBED_WITH = 'style'
|
|
4
5
|
JOIN_WITH = ''
|
|
5
|
-
MEDIA_PATTERN = /\(([a-z]+(?:,\s*[a-z]+)*)\)
|
|
6
|
+
MEDIA_PATTERN = /\(([a-z]+(?:,\s*[a-z]+)*)\)(?:\.[a-z]+$|\s*\()/i
|
|
7
|
+
|
|
6
8
|
include HasDependents
|
|
9
|
+
|
|
7
10
|
def reference_with
|
|
8
11
|
{
|
|
9
12
|
tag_name: 'link',
|
|
@@ -14,16 +17,28 @@ class Fuse::Document::Asset
|
|
|
14
17
|
}
|
|
15
18
|
}
|
|
16
19
|
end
|
|
20
|
+
|
|
17
21
|
def media
|
|
18
22
|
@media ||= (match = MEDIA_PATTERN.match(path)) && match[1].split(/,\s*/).sort.join(', ')
|
|
19
23
|
end
|
|
24
|
+
|
|
25
|
+
def conditional
|
|
26
|
+
@conditional ||= Conditional.new self
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def conditional_signature
|
|
30
|
+
conditional.signature
|
|
31
|
+
end
|
|
32
|
+
|
|
20
33
|
def compress
|
|
21
34
|
original = raw
|
|
22
35
|
compressed = ::Sass.compile original, style: :compressed
|
|
23
36
|
Fuse.log "SASS: Compressed #{path} from #{original.bytesize} bytes to #{compressed.bytesize} bytes", :success
|
|
24
37
|
compressed
|
|
25
38
|
end
|
|
39
|
+
|
|
26
40
|
def type; 'text/css' end
|
|
41
|
+
|
|
27
42
|
class Sass < self
|
|
28
43
|
def filter
|
|
29
44
|
original = raw
|
|
@@ -32,5 +47,37 @@ class Fuse::Document::Asset
|
|
|
32
47
|
compiled
|
|
33
48
|
end
|
|
34
49
|
end
|
|
50
|
+
|
|
51
|
+
class Conditional
|
|
52
|
+
|
|
53
|
+
CONDITIONAL_PATTERN = /\((!|[lg]te?\s+)?ie(\s*\d+)?\)(?:\.[a-z]+$|\s*\()/i
|
|
54
|
+
|
|
55
|
+
attr_reader :comparison, :version
|
|
56
|
+
|
|
57
|
+
def initialize(style_sheet)
|
|
58
|
+
match = CONDITIONAL_PATTERN.match(style_sheet.path)
|
|
59
|
+
return unless match
|
|
60
|
+
@comparison = (match[1] || '').strip.downcase
|
|
61
|
+
@version = match[2].strip.to_i unless match[2].nil?
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def wrap(content)
|
|
65
|
+
if comparison == '!'
|
|
66
|
+
"<!--[if !IE]> -->#{content}<!-- <![endif]-->"
|
|
67
|
+
elsif comparison
|
|
68
|
+
"<!--[if #{signature}]>#{content}<![endif]-->"
|
|
69
|
+
else
|
|
70
|
+
content
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def signature
|
|
75
|
+
@signature ||= begin
|
|
76
|
+
ret = (comparison.nil? || comparison.empty?) ? 'IE' : comparison + ' IE'
|
|
77
|
+
ret << ' ' + version.to_s if version
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
35
82
|
end
|
|
36
83
|
end
|
data/lib/fuse/server.rb
CHANGED
|
@@ -10,6 +10,8 @@ class Fuse::Server
|
|
|
10
10
|
def call(env)
|
|
11
11
|
|
|
12
12
|
request = Rack::Request.new(env)
|
|
13
|
+
result = nil
|
|
14
|
+
status = 200
|
|
13
15
|
|
|
14
16
|
call_options = @options.merge Hash[request.GET.map{ |k, v| [k.to_sym, v] }]
|
|
15
17
|
|
|
@@ -34,9 +36,15 @@ class Fuse::Server
|
|
|
34
36
|
else
|
|
35
37
|
raise
|
|
36
38
|
end
|
|
39
|
+
end if request.path == '/'
|
|
40
|
+
|
|
41
|
+
if result.nil?
|
|
42
|
+
log env, 'Not found', :error
|
|
43
|
+
status = 404
|
|
44
|
+
result = render_error('Not found')
|
|
37
45
|
end
|
|
38
46
|
|
|
39
|
-
[
|
|
47
|
+
[status, {'Content-Type' => 'text/html'}, [result]]
|
|
40
48
|
|
|
41
49
|
end
|
|
42
50
|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: fuse
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.8
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2013-03-
|
|
12
|
+
date: 2013-03-24 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: thin
|