emcee 0.1.6 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/emcee.rb +4 -4
- data/lib/emcee/compressors/html_compressor.rb +11 -42
- data/lib/emcee/helpers/{action_view/asset_tag_helper.rb → asset_tag_helper.rb} +0 -0
- data/lib/emcee/helpers/{action_view/asset_url_helper.rb → asset_url_helper.rb} +0 -0
- data/lib/emcee/helpers/{sprockets/view_helpers.rb → sprockets_helper.rb} +0 -0
- data/lib/emcee/loose_assets.rb +19 -0
- data/lib/emcee/processors/directive_processor.rb +33 -0
- data/lib/emcee/processors/import_processor.rb +39 -0
- data/lib/emcee/processors/script_processor.rb +67 -0
- data/lib/emcee/processors/stylesheet_processor.rb +90 -0
- data/lib/emcee/railtie.rb +23 -27
- data/lib/emcee/version.rb +1 -1
- data/test/compressors_test.rb +1 -1
- data/test/dummy/app/assets/elements/application.html +1 -0
- data/test/dummy/app/assets/elements/compile/test5.css.scss +5 -0
- data/test/dummy/app/assets/elements/compile/test5.html +2 -0
- data/test/dummy/log/development.log +120 -0
- data/test/dummy/log/test.log +20934 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/1b8013559a887e8b8d91472ef246fef9 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/1e24025f59396708b3bb44543bed32fc +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/219d0afb67879a67bae32b4fe4c708ac +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/2f90dac85033dad7b068860c3f6b7b27 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/32cae461a9446107294c8a0230f5080c +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/4fd1effec4d6579ba9d4f03ed156a15b +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/6c9d8a21af4539e19a3462e79ac4d70c +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/a69c3d00e22ad6c0d6ece35c9fd5f316 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/af6ba4ae23c6790e0f474b01ceee8dd9 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/cf517b62bd978b748afe38d5beb317de +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/df6cfcc50da209231a7d9e140e5bafdc +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/e0949aa3dcdcab5f8b45d30e26f6ddd2 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/ffd4adb86602a60c7fcedd5d472166d3 +0 -0
- data/test/{controllers_test.rb → dummy_app_integration_test.rb} +7 -4
- data/test/processors_test.rb +45 -11
- metadata +34 -12
- data/lib/emcee/helpers/sprockets/compressing_helpers.rb +0 -35
- data/lib/emcee/processors/html_processor.rb +0 -84
- data/lib/emcee/processors/processor_includes.rb +0 -111
- data/test/emcee_test.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c387ce066ddbe7c70f67a78aaa1a73069136cbb
|
4
|
+
data.tar.gz: 73d6cd25ac0479920b3de9e64137faf64b6a1910
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cfa30497244debf49f23ba859b7d30983d524c7deec742151b6389c7afb145963e1a2071fb60ba03ddd86f9063612e162c9ed4ccee345ca1089625d13f984c5d
|
7
|
+
data.tar.gz: 7e3be5d29444812fd9443da6366fc49a39853ff40d0fb9b21f640b9ceec73279072771b6dfe1f0525bb9d48dfc9fa38b824a5ef8c98d8490b99e53df7bda8fc3
|
data/lib/emcee.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require "emcee/version"
|
2
2
|
|
3
|
-
require "emcee/helpers/
|
4
|
-
require "emcee/helpers/
|
5
|
-
require "emcee/helpers/
|
6
|
-
require "emcee/helpers/sprockets/compressing_helpers"
|
3
|
+
require "emcee/helpers/asset_url_helper"
|
4
|
+
require "emcee/helpers/asset_tag_helper"
|
5
|
+
require "emcee/helpers/sprockets_helper"
|
7
6
|
|
7
|
+
require "emcee/loose_assets"
|
8
8
|
require "emcee/railtie"
|
@@ -1,48 +1,17 @@
|
|
1
1
|
module Emcee
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
#
|
10
|
-
class HtmlCompressor
|
11
|
-
# Match html comments.
|
12
|
-
#
|
13
|
-
# <!--
|
14
|
-
# Comments
|
15
|
-
# -->
|
16
|
-
#
|
17
|
-
HTML_COMMENTS = /\<!\s*--(?:.*?)(?:--\s*\>)/m
|
2
|
+
# HtmlCompressor is a very basic compressor that removes blank lines and
|
3
|
+
# comments from an HTML file.
|
4
|
+
class HtmlCompressor
|
5
|
+
HTML_COMMENTS = /\<!\s*--(?:.*?)(?:--\s*\>)/m
|
6
|
+
JS_MULTI_COMMENTS = /\/\*(?:.*?)\*\//m
|
7
|
+
JS_COMMENTS = /\/\/.*$/
|
8
|
+
BLANK_LINES = /^[\s]*$\n/
|
18
9
|
|
19
|
-
|
20
|
-
|
21
|
-
# /*
|
22
|
-
# Comments
|
23
|
-
# */
|
24
|
-
#
|
25
|
-
JS_MULTI_COMMENTS = /\/\*(?:.*?)\*\//m
|
10
|
+
def compress(string)
|
11
|
+
ops = [HTML_COMMENTS, JS_MULTI_COMMENTS, JS_COMMENTS, BLANK_LINES]
|
26
12
|
|
27
|
-
|
28
|
-
|
29
|
-
# // Comments
|
30
|
-
#
|
31
|
-
# This does not have the /m modifier, because we only want it to match a
|
32
|
-
# single line at a time.
|
33
|
-
#
|
34
|
-
JS_COMMENTS = /\/\/.*$/
|
35
|
-
|
36
|
-
# Match blank lines.
|
37
|
-
BLANK_LINES = /^[\s]*$\n/
|
38
|
-
|
39
|
-
# Remove comments and blank lines from our html.
|
40
|
-
def compress(string)
|
41
|
-
ops = [HTML_COMMENTS, JS_MULTI_COMMENTS, JS_COMMENTS, BLANK_LINES]
|
42
|
-
|
43
|
-
ops.reduce(string) do |output, op|
|
44
|
-
output.gsub(op, "")
|
45
|
-
end
|
13
|
+
ops.reduce(string) do |output, op|
|
14
|
+
output.gsub(op, "")
|
46
15
|
end
|
47
16
|
end
|
48
17
|
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Monkey patch Sprockets-rails so that loose html files are handled correctly.
|
2
|
+
#
|
3
|
+
# Not sure that modifying another gem's railtie is a good idea, but it works
|
4
|
+
# for now.
|
5
|
+
module Sprockets
|
6
|
+
class Railtie
|
7
|
+
# Remove the LOOSE_APP_ASSETS constant so we can modify it without Ruby
|
8
|
+
# complaining.
|
9
|
+
remove_const(:LOOSE_APP_ASSETS) if defined?(LOOSE_APP_ASSETS)
|
10
|
+
|
11
|
+
# Add .html to the loose app assets file extensions.
|
12
|
+
LOOSE_APP_ASSETS = lambda do |filename, path|
|
13
|
+
path =~ /app\/assets/ && !%w(.js .css .html).include?(File.extname(filename))
|
14
|
+
end
|
15
|
+
|
16
|
+
# Add the .html extension to the 'precompile' regex.
|
17
|
+
config.assets.precompile = [LOOSE_APP_ASSETS, /(?:\/|\\|\A)application\.(css|js|html)$/]
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Emcee
|
2
|
+
# The `DirectiveProcessor` is responsible for parsing and evaluating
|
3
|
+
# directive comments in a source file.
|
4
|
+
class DirectiveProcessor < Sprockets::DirectiveProcessor
|
5
|
+
# Matches the entire header/directive block. This is everything from the
|
6
|
+
# top of the file, enclosed in html comments.
|
7
|
+
HEADER_PATTERN = /\A((?m:\s*)(<!--(?m:.*?)-->))+/
|
8
|
+
|
9
|
+
# Implement `render` so that it uses our own header pattern.
|
10
|
+
def render(context, locals)
|
11
|
+
@context = context
|
12
|
+
@pathname = context.pathname
|
13
|
+
@directory = File.dirname(@pathname)
|
14
|
+
|
15
|
+
@header = data[HEADER_PATTERN, 0] || ""
|
16
|
+
@body = $' || data
|
17
|
+
# Ensure body ends in a new line
|
18
|
+
@body += "\n" if @body != "" && @body !~ /\n\Z/m
|
19
|
+
|
20
|
+
@included_pathnames = []
|
21
|
+
|
22
|
+
@result = ""
|
23
|
+
@result.force_encoding(body.encoding)
|
24
|
+
|
25
|
+
@has_written_body = false
|
26
|
+
|
27
|
+
process_directives
|
28
|
+
process_source
|
29
|
+
|
30
|
+
@result
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Emcee
|
2
|
+
# ImportProcessor scans a file for html imports and adds them to the current
|
3
|
+
# required assets.
|
4
|
+
class ImportProcessor
|
5
|
+
# Match an html import tag.
|
6
|
+
#
|
7
|
+
# <link rel="import" href="assets/example.html">
|
8
|
+
#
|
9
|
+
IMPORT_PATTERN = /^\s*<link .*rel=["']import["'].*>$/
|
10
|
+
|
11
|
+
# Match the path from the href attribute of an html import or stylesheet
|
12
|
+
# include tag. Captures the actual path.
|
13
|
+
#
|
14
|
+
# href="/assets/example.css"
|
15
|
+
#
|
16
|
+
HREF_PATH_PATTERN = /href=["'](?<path>[\w\.\/-]+)["']/
|
17
|
+
|
18
|
+
def process(context, data, directory)
|
19
|
+
require_assets(context, data, directory)
|
20
|
+
remove_imports(data)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def require_assets(context, data, directory)
|
26
|
+
data.scan(IMPORT_PATTERN) do |import_tag|
|
27
|
+
path = import_tag[HREF_PATH_PATTERN, :path]
|
28
|
+
return unless path
|
29
|
+
|
30
|
+
absolute_path = File.absolute_path(path, directory)
|
31
|
+
context.require_asset(absolute_path)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def remove_imports(data)
|
36
|
+
data.gsub(IMPORT_PATTERN, "")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Emcee
|
2
|
+
# ScriptProcessor scans a document for external script references and inlines
|
3
|
+
# them into the current document.
|
4
|
+
class ScriptProcessor
|
5
|
+
# Match a script tag.
|
6
|
+
#
|
7
|
+
# <script src="assets/example.js"></script>
|
8
|
+
#
|
9
|
+
SCRIPT_PATTERN = /^\s*<script .*src=["'].+\.js["']><\/script>$/
|
10
|
+
|
11
|
+
# Match the source path from a script tag. Captures the actual path.
|
12
|
+
#
|
13
|
+
# src="/assets/example.js"
|
14
|
+
#
|
15
|
+
SRC_PATH_PATTERN = /src=["'](?<path>[\w\.\/-]+)["']/
|
16
|
+
|
17
|
+
# Match the indentation whitespace of a line
|
18
|
+
#
|
19
|
+
INDENT_PATTERN = /^(?<indent>\s*)/
|
20
|
+
|
21
|
+
def process(context, data, directory)
|
22
|
+
tags = find_tags(data)
|
23
|
+
paths = get_paths(tags)
|
24
|
+
indents = get_indents(tags)
|
25
|
+
contents = get_contents(paths, directory)
|
26
|
+
inline_scripts(data, tags, indents, contents)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def read_file(path)
|
32
|
+
File.read(path)
|
33
|
+
end
|
34
|
+
|
35
|
+
def find_tags(data)
|
36
|
+
data.scan(SCRIPT_PATTERN).map do |tag|
|
37
|
+
tag
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def get_paths(tags)
|
42
|
+
tags.map do |tag|
|
43
|
+
tag[SRC_PATH_PATTERN, :path]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def get_indents(tags)
|
48
|
+
tags.map do |tag|
|
49
|
+
tag[INDENT_PATTERN, :indent] || ""
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def get_contents(paths, directory)
|
54
|
+
paths.map do |path|
|
55
|
+
absolute_path = File.absolute_path(path, directory)
|
56
|
+
read_file(absolute_path)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def inline_scripts(data, tags, indents, contents)
|
61
|
+
tags.each_with_index.reduce(data) do |output, (tag, i)|
|
62
|
+
indent, content = indents[i], contents[i]
|
63
|
+
output.gsub(tag, "#{indent}<script>#{content}\n#{indent}</script>")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require "sass"
|
2
|
+
|
3
|
+
module Emcee
|
4
|
+
# StylesheetProcessor scans a document for external stylesheet references and
|
5
|
+
# inlines them into the current document.
|
6
|
+
class StylesheetProcessor
|
7
|
+
# Match a stylesheet link tag.
|
8
|
+
#
|
9
|
+
# <link rel="stylesheet" href="assets/example.css">
|
10
|
+
#
|
11
|
+
STYLESHEET_PATTERN = /^\s*<link .*rel=["']stylesheet["'].*>$/
|
12
|
+
|
13
|
+
# Match the path from the href attribute of an html import or stylesheet
|
14
|
+
# include tag. Captures the actual path.
|
15
|
+
#
|
16
|
+
# href="/assets/example.css"
|
17
|
+
#
|
18
|
+
HREF_PATH_PATTERN = /href=["'](?<path>[\w\.\/-]+)["']/
|
19
|
+
|
20
|
+
# Match the indentation whitespace of a line
|
21
|
+
#
|
22
|
+
INDENT_PATTERN = /^(?<indent>\s*)/
|
23
|
+
|
24
|
+
def process(context, data, directory)
|
25
|
+
tags = find_tags(data)
|
26
|
+
paths = get_paths(tags)
|
27
|
+
indents = get_indents(tags)
|
28
|
+
contents = get_contents(paths, directory)
|
29
|
+
inline_styles(data, tags, indents, contents)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def read_file(path)
|
35
|
+
File.read(path)
|
36
|
+
end
|
37
|
+
|
38
|
+
def find_tags(data)
|
39
|
+
data.scan(STYLESHEET_PATTERN).map do |tag|
|
40
|
+
tag
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def get_paths(tags)
|
45
|
+
tags.map do |tag|
|
46
|
+
tag[HREF_PATH_PATTERN, :path]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_indents(tags)
|
51
|
+
tags.map do |tag|
|
52
|
+
tag[INDENT_PATTERN, :indent] || ""
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def get_contents(paths, directory)
|
57
|
+
paths.map do |path|
|
58
|
+
absolute_path = get_absolute_path(path, directory)
|
59
|
+
if sass?(absolute_path)
|
60
|
+
get_sass_content(absolute_path)
|
61
|
+
else
|
62
|
+
read_file(absolute_path)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def get_absolute_path(path, directory)
|
68
|
+
normal_path = File.absolute_path(path, directory)
|
69
|
+
sassy_path = File.absolute_path(path + ".scss", directory)
|
70
|
+
return sassy_path if File.file?(sassy_path)
|
71
|
+
normal_path
|
72
|
+
end
|
73
|
+
|
74
|
+
def get_sass_content(path)
|
75
|
+
content = read_file(path)
|
76
|
+
Sass::Engine.new(content, syntax: :scss).render
|
77
|
+
end
|
78
|
+
|
79
|
+
def sass?(path)
|
80
|
+
File.extname(path) == ".scss"
|
81
|
+
end
|
82
|
+
|
83
|
+
def inline_styles(data, tags, indents, contents)
|
84
|
+
tags.each_with_index.reduce(data) do |output, (tag, i)|
|
85
|
+
indent, content = indents[i], contents[i]
|
86
|
+
output.gsub(tag, "#{indent}<style>#{content}\n#{indent}</style>")
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
data/lib/emcee/railtie.rb
CHANGED
@@ -1,39 +1,35 @@
|
|
1
|
-
require "emcee/processors/
|
1
|
+
require "emcee/processors/directive_processor"
|
2
|
+
require "emcee/processors/import_processor"
|
3
|
+
require "emcee/processors/script_processor"
|
4
|
+
require "emcee/processors/stylesheet_processor"
|
2
5
|
require "emcee/compressors/html_compressor"
|
3
6
|
|
4
7
|
module Emcee
|
5
8
|
class Railtie < Rails::Railtie
|
6
|
-
initializer :
|
9
|
+
initializer :add_preprocessors do |app|
|
7
10
|
app.assets.register_mime_type "text/html", ".html"
|
8
|
-
app.assets.register_preprocessor "text/html",
|
11
|
+
app.assets.register_preprocessor "text/html", DirectiveProcessor
|
9
12
|
end
|
10
13
|
|
11
|
-
initializer :
|
12
|
-
app.assets.
|
14
|
+
initializer :add_postprocessors do |app|
|
15
|
+
app.assets.register_postprocessor "text/html", :import_processor do |context, data|
|
16
|
+
directory = File.dirname(context.pathname)
|
17
|
+
ImportProcessor.new.process(context, data, directory)
|
18
|
+
end
|
19
|
+
app.assets.register_postprocessor "text/html", :script_processor do |context, data|
|
20
|
+
directory = File.dirname(context.pathname)
|
21
|
+
ScriptProcessor.new.process(context, data, directory)
|
22
|
+
end
|
23
|
+
app.assets.register_postprocessor "text/html", :stylesheet_processor do |context, data|
|
24
|
+
directory = File.dirname(context.pathname)
|
25
|
+
StylesheetProcessor.new.process(context, data, directory)
|
26
|
+
end
|
13
27
|
end
|
14
|
-
end
|
15
|
-
end
|
16
28
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
# Not sure that modifying another gem's railtie is a good idea, but it works
|
22
|
-
# for now.
|
23
|
-
module Sprockets
|
24
|
-
class Railtie
|
25
|
-
# Horrible hack: remove this 'constant' so we can redefine it without ruby
|
26
|
-
# complaining.
|
27
|
-
remove_const(:LOOSE_APP_ASSETS) if defined?(LOOSE_APP_ASSETS)
|
28
|
-
|
29
|
-
# Ugly hack #1: redefine this 'constant' to recognize html files. Is there
|
30
|
-
# a way to extend instead of redefining?
|
31
|
-
LOOSE_APP_ASSETS = lambda do |filename, path|
|
32
|
-
path =~ /app\/assets/ && !%w(.js .css .html).include?(File.extname(filename))
|
29
|
+
initializer :add_compressors do |app|
|
30
|
+
app.assets.register_bundle_processor "text/html", :html_compressor do |context, data|
|
31
|
+
HtmlCompressor.new.compress(data)
|
32
|
+
end
|
33
33
|
end
|
34
|
-
|
35
|
-
# Ugly hack #2: same as above (#1). Is there a way to extend this instead
|
36
|
-
# of redefining?
|
37
|
-
config.assets.precompile = [LOOSE_APP_ASSETS, /(?:\/|\\|\A)application\.(css|js|html)$/]
|
38
34
|
end
|
39
35
|
end
|
data/lib/emcee/version.rb
CHANGED
data/test/compressors_test.rb
CHANGED