web_components_rails 2.0.0 → 2.1.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8102053ec0869cf2a7275393e5c053857c819948
4
- data.tar.gz: e05aab90298de3d274cb188f0a0c3bea330b7542
3
+ metadata.gz: b09f5c09128952911e23c7d01d9c32a15646d442
4
+ data.tar.gz: 02876ac28c8bcb83da2530d22e814bf613675e7a
5
5
  SHA512:
6
- metadata.gz: 776fc43f0c492a451a9f0226443c526d7ce9d70bcd3a148a590658af95e71ab70a4454f3b4a8b6e5453d77a8b6d2a912dfc3d40edc08ff2ee84585b47f3c786b
7
- data.tar.gz: 7bf2804cede559b349079c70ac6e7f0e09e7490d41455a96957a6b87bff5417215f899a6897a1a8845b64bb0ab2e28ca008c2ced3fb42af91012247499487e46
6
+ metadata.gz: 84aa01e3227cf376f61dc8c4682ccbec450325b014b42946701ea7c9049ba07894ddcc2e4ee9cc776091f3af5407d5991ce0a17d6ab9e371e847587f5ae50990
7
+ data.tar.gz: be43d982b2c169077db220d449f0be06a91d33ddcb6e3f11a6ff009baab445a9274dc4ab2ce28a02828ac22ad1886aea5509fdb768df91aae5f41f36f4ee44dd
data/README.md CHANGED
@@ -18,6 +18,15 @@ gem 'web_components_rails'
18
18
  <%= html_import_tag 'my_component' %>
19
19
  ```
20
20
 
21
+ ### Optimized JavaScript
22
+
23
+ If you'd like the scripts in your HTML bundles to be combined, minified using Uglifier, and data-src encoded for performance:
24
+
25
+ ```ruby
26
+ # In an initializer or somewhere on rails load
27
+ WebComponentsRails.optimize_scripts = true
28
+ ```
29
+
21
30
  ## Building
22
31
 
23
32
  After adding new features or fixes, please update the version in version.rb, and then tag the repo appropriately:
@@ -0,0 +1,81 @@
1
+ require 'securerandom'
2
+ require 'uglifier'
3
+
4
+ # Compresses HTML bundles
5
+ class WebComponentsRails::HTMLBundleProcessor
6
+
7
+ VERSION = '1'
8
+
9
+ def self.instance
10
+ @instance ||= new
11
+ end
12
+
13
+ def self.call(input)
14
+ instance.call(input)
15
+ end
16
+
17
+ def self.cache_key
18
+ instance.cache_key
19
+ end
20
+
21
+ attr_reader :cache_key
22
+
23
+ def initialize(options = {})
24
+ @cache_key = [self.class.name, VERSION, options, WebComponentsRails.optimize_scripts].freeze
25
+ end
26
+
27
+ def call(input)
28
+ # Sprockets::Environment for looking up assets, etc.
29
+ @environment = input[:environment]
30
+ @context = @environment.context_class.new(input)
31
+ @data = input[:data]
32
+
33
+ @data = process_bundle(@data)
34
+
35
+ @context.metadata.merge(data: @data)
36
+ end
37
+
38
+
39
+ protected
40
+
41
+ def process_bundle(html)
42
+ # Don't do anything if we have optimization off
43
+ return html unless !!WebComponentsRails.optimize_scripts
44
+
45
+ doc = Nokogiri::HTML5.fragment(html)
46
+
47
+ combined_js = ''
48
+
49
+ doc.css('script:not([src])').map do |script|
50
+ combined_js << script.content
51
+ combined_js << "\n"
52
+ script.remove
53
+ end
54
+
55
+ combined_script_tag = optimized_script_tag(doc, combined_js)
56
+
57
+ body = doc.at_css('html body')
58
+ if body
59
+ body << combined_script_tag
60
+ else
61
+ doc << combined_script_tag
62
+ end
63
+
64
+ WebComponentsRails::HTMLImportProcessor.doc_to_html(doc)
65
+ end
66
+
67
+ def optimized_script_tag(doc, raw_js)
68
+ combined_script_tag = Nokogiri::XML::Element.new('script', doc)
69
+
70
+ # Assume uglifier is fine with defaults for minification
71
+ minified_js = Uglifier.compile(raw_js)
72
+
73
+ # Data-URI encode the JS (helps a lot in browsers like IE)
74
+ inlined_js = 'data:text/javascript;base64,'
75
+ inlined_js << Base64.strict_encode64(minified_js).gsub('=', '%3D')
76
+ combined_script_tag['src'] = inlined_js
77
+
78
+ combined_script_tag
79
+ end
80
+
81
+ end
@@ -20,6 +20,29 @@ class WebComponentsRails::HTMLImportProcessor
20
20
  instance.cache_key
21
21
  end
22
22
 
23
+ def self.doc_to_html(doc)
24
+ # Nokogiri/Nokogumbo are hard-coded to URI-escape certain attributes (src, href, action, and a[name]),
25
+ # so we have to put in placeholders, and fix the values in the HTML string output afterwards
26
+ # This doesn't work so well with framework-specific syntax (eg. <foo src="{{bar}}">)
27
+ placeholder_mapping = {}
28
+ %w(src href action).each do |name|
29
+ doc.css("[#{name}]").each do |node|
30
+ # The placeholders are just random strings
31
+ placeholder = SecureRandom.hex(40)
32
+ attr = node.attributes[name]
33
+ placeholder_mapping[placeholder] = attr.value
34
+ attr.value = placeholder
35
+ end
36
+ end
37
+ new_html = doc.to_html
38
+ placeholder_mapping.each do |placeholder, value|
39
+ new_html.sub!(placeholder, value)
40
+ end
41
+
42
+ new_html
43
+ end
44
+
45
+
23
46
  attr_reader :cache_key
24
47
 
25
48
  def initialize(options = {})
@@ -112,23 +135,7 @@ class WebComponentsRails::HTMLImportProcessor
112
135
  end
113
136
  end
114
137
 
115
- # Nokogiri/Nokogumbo are hard-coded to URI-escape certain attributes (src, href, action, and a[name]),
116
- # so we have to put in placeholders, and fix the values in the HTML string output afterwards
117
- # This doesn't work so well with framework-specific syntax (eg. <foo src="{{bar}}">)
118
- placeholder_mapping = {}
119
- %w(src href action).each do |name|
120
- doc.css("[#{name}]").each do |node|
121
- # The placeholders are just random strings
122
- placeholder = SecureRandom.hex(40)
123
- attr = node.attributes[name]
124
- placeholder_mapping[placeholder] = attr.value
125
- attr.value = placeholder
126
- end
127
- end
128
- new_html = doc.to_html
129
- placeholder_mapping.each do |placeholder, value|
130
- new_html.sub!(placeholder, value)
131
- end
138
+ new_html = self.class.doc_to_html(doc)
132
139
 
133
140
  [new_html, dependencies]
134
141
  end
@@ -21,7 +21,8 @@ class WebComponentsRails::Railtie < Rails::Railtie
21
21
  env.register_mime_type 'text/html', extensions: ['.html', '.haml']
22
22
  env.register_preprocessor 'text/html', Sprockets::DirectiveProcessor
23
23
  env.register_preprocessor 'text/html', WebComponentsRails::HTMLImportProcessor
24
- env.register_bundle_processor 'text/html', ::Sprockets::Bundle
24
+ env.register_bundle_processor 'text/html', Sprockets::Bundle
25
+ env.register_bundle_processor 'text/html', WebComponentsRails::HTMLBundleProcessor
25
26
  end
26
27
  end
27
28
  end
@@ -1,3 +1,3 @@
1
1
  module WebComponentsRails
2
- VERSION = '2.0.0'
2
+ VERSION = '2.1.2'
3
3
  end
@@ -1,10 +1,15 @@
1
+ require 'active_support'
1
2
  require 'nokogumbo'
2
3
  require 'sprockets'
3
4
 
4
5
  module WebComponentsRails
6
+
7
+ mattr_accessor :optimize_scripts
8
+
5
9
  end
6
10
 
7
11
  require 'web_components_rails/asset_tag_helper'
12
+ require 'web_components_rails/html_bundle_processor'
8
13
  require 'web_components_rails/html_import_processor'
9
14
  require 'web_components_rails/railtie'
10
15
  require 'web_components_rails/version'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: web_components_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Botelho
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-07 00:00:00.000000000 Z
11
+ date: 2017-05-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogumbo
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: 2.0.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: uglifier
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 2.0.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 2.0.0
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rspec
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -82,6 +96,7 @@ files:
82
96
  - README.md
83
97
  - lib/web_components_rails.rb
84
98
  - lib/web_components_rails/asset_tag_helper.rb
99
+ - lib/web_components_rails/html_bundle_processor.rb
85
100
  - lib/web_components_rails/html_import_processor.rb
86
101
  - lib/web_components_rails/railtie.rb
87
102
  - lib/web_components_rails/version.rb
@@ -104,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
119
  version: '0'
105
120
  requirements: []
106
121
  rubyforge_project:
107
- rubygems_version: 2.6.8
122
+ rubygems_version: 2.4.8
108
123
  signing_key:
109
124
  specification_version: 4
110
125
  summary: Web components utils for rails