sassmagic 0.1.1 → 0.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.
- data/Readme.md +48 -0
- data/bin/sassmagic +1 -0
- data/lib/sassmagic/remote.rb +117 -0
- data/lib/sassmagic/reset.rb +5 -0
- data/lib/sassmagic/utils.rb +115 -58
- data/lib/sassmagic.rb +4 -1
- metadata +3 -2
data/Readme.md
CHANGED
@@ -0,0 +1,48 @@
|
|
1
|
+
### sassmagic
|
2
|
+
|
3
|
+
|
4
|
+
description:Sass extention tool
|
5
|
+
|
6
|
+
|
7
|
+
### install
|
8
|
+
|
9
|
+
|
10
|
+
sudo gem install sassmagic
|
11
|
+
|
12
|
+
|
13
|
+
### use
|
14
|
+
|
15
|
+
|
16
|
+
same to sass
|
17
|
+
|
18
|
+
|
19
|
+
### configuration
|
20
|
+
|
21
|
+
|
22
|
+
sassmagic.json 配置文件:
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
{
|
28
|
+
"isNeedPxToRem": true,
|
29
|
+
"browserDefaultFontSize": "75px",
|
30
|
+
"ignore": [
|
31
|
+
"1px",
|
32
|
+
"[data-dpr=",
|
33
|
+
"font-size"
|
34
|
+
],
|
35
|
+
"outputExtra": [
|
36
|
+
"1x",
|
37
|
+
"2x",
|
38
|
+
"3x"
|
39
|
+
],
|
40
|
+
"imageMaxSize": "5120",
|
41
|
+
"imageLoader": "imageuploader.js",
|
42
|
+
"imagesPath": {
|
43
|
+
},
|
44
|
+
"remote":[]
|
45
|
+
}
|
46
|
+
|
47
|
+
imageuploader.js
|
48
|
+
图片上传
|
data/bin/sassmagic
CHANGED
@@ -0,0 +1,117 @@
|
|
1
|
+
##used remote-sass
|
2
|
+
require 'net/http'
|
3
|
+
require 'time'
|
4
|
+
module RemoteSass
|
5
|
+
class << self
|
6
|
+
def location
|
7
|
+
@location
|
8
|
+
end
|
9
|
+
|
10
|
+
def location= location
|
11
|
+
@location = location
|
12
|
+
Sass.load_paths << Sass::Importers::HTTP.new(location)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
module Sass
|
17
|
+
module Importers
|
18
|
+
class HTTP < Base
|
19
|
+
def initialize root
|
20
|
+
@root = URI.parse root
|
21
|
+
|
22
|
+
unless scheme_allowed? @root
|
23
|
+
raise ArgumentError, "Absolute HTTP URIs only"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def find_relative uri, base, options
|
28
|
+
_find @root + base + uri, options
|
29
|
+
end
|
30
|
+
|
31
|
+
def find uri, options
|
32
|
+
_find @root + uri, options
|
33
|
+
end
|
34
|
+
|
35
|
+
def mtime uri, options
|
36
|
+
uri = URI.parse uri
|
37
|
+
return unless scheme_allowed? uri
|
38
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
39
|
+
response = http.head uri.request_uri
|
40
|
+
|
41
|
+
if response.is_a?(Net::HTTPOK) && response['Last-Modified']
|
42
|
+
Time.parse response['Last-Modified']
|
43
|
+
elsif response.is_a? Net::HTTPOK
|
44
|
+
# we must assume that it just changed
|
45
|
+
Time.now
|
46
|
+
else
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def key(uri, options)
|
53
|
+
[self.class.name, uri]
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_s
|
57
|
+
@root.to_s
|
58
|
+
end
|
59
|
+
|
60
|
+
protected
|
61
|
+
|
62
|
+
def extensions
|
63
|
+
{'.sass' => :sass, '.scss' => :scss}
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def scheme_allowed? uri
|
69
|
+
uri.absolute? && (uri.scheme == 'http' || uri.scheme == 'https')
|
70
|
+
end
|
71
|
+
|
72
|
+
def exists? uri
|
73
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
74
|
+
http.head(uri.request_uri).is_a? Net::HTTPOK
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def get_syntax uri
|
79
|
+
# determine the syntax being used
|
80
|
+
ext = File.extname uri.path
|
81
|
+
syntax = extensions[ext]
|
82
|
+
|
83
|
+
# this must not be the full path: try another
|
84
|
+
if syntax.nil?
|
85
|
+
ext, syntax = extensions.find do |possible_ext, possible_syntax|
|
86
|
+
new_uri = uri.dup
|
87
|
+
new_uri.path += possible_ext
|
88
|
+
exists? new_uri
|
89
|
+
end
|
90
|
+
return if syntax.nil?
|
91
|
+
uri.path += ext
|
92
|
+
end
|
93
|
+
syntax
|
94
|
+
end
|
95
|
+
|
96
|
+
def _find uri, options
|
97
|
+
raise ArgumentError, "Absolute HTTP URIs only" unless scheme_allowed? uri
|
98
|
+
|
99
|
+
syntax = get_syntax uri
|
100
|
+
|
101
|
+
# fetch the content
|
102
|
+
Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
|
103
|
+
# debugger
|
104
|
+
response = http.get uri.request_uri
|
105
|
+
response.value
|
106
|
+
|
107
|
+
options[:importer] = self
|
108
|
+
options[:filename] = uri.to_s
|
109
|
+
options[:syntax] = syntax
|
110
|
+
Sass::Engine.new response.body, options
|
111
|
+
end
|
112
|
+
# rescue
|
113
|
+
# nil
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
data/lib/sassmagic/reset.rb
CHANGED
@@ -146,6 +146,11 @@ module Sass
|
|
146
146
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
147
147
|
options = options.merge $configHash
|
148
148
|
css_filename = args.shift
|
149
|
+
#是否写入loadpath
|
150
|
+
if options.has_key?"remoteStylesheet"
|
151
|
+
RemoteSass.location = options["remoteStylesheet"]
|
152
|
+
end
|
153
|
+
#
|
149
154
|
# debugger
|
150
155
|
#是否需要额外输出样式表
|
151
156
|
if options.has_key?"outputExtra"
|
data/lib/sassmagic/utils.rb
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
## Licensed under the [MIT License](http://www.opensource.org/licenses/mit-license.php).
|
5
5
|
|
6
6
|
#env
|
7
|
+
# require 'tinypng'
|
7
8
|
module Sass::Script::Functions
|
8
9
|
|
9
10
|
# Returns the value of environment variable associated with the given name.
|
@@ -136,64 +137,70 @@ end
|
|
136
137
|
|
137
138
|
|
138
139
|
#inline_image 取图片base64编码
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
#
|
143
|
-
|
144
|
-
#
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
#
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
#
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
#
|
192
|
-
|
140
|
+
module Sass::Script::Functions
|
141
|
+
|
142
|
+
def inline_image(path, mime_type = nil)
|
143
|
+
# debugger
|
144
|
+
path = path.value
|
145
|
+
real_path = File.expand_path("#{File.dirname(options[:filename])}/#{path}")
|
146
|
+
inline_image_string(data(real_path), compute_mime_type(path, mime_type))
|
147
|
+
end
|
148
|
+
|
149
|
+
declare :inline_image, [], var_args: true, var_kwargs: true
|
150
|
+
|
151
|
+
protected
|
152
|
+
def inline_image_string(data, mime_type)
|
153
|
+
data = [data].flatten.pack('m').gsub("\n","")
|
154
|
+
url = "url(data:#{mime_type};base64,#{data})"
|
155
|
+
unquoted_string(url)
|
156
|
+
end
|
157
|
+
|
158
|
+
private
|
159
|
+
def compute_mime_type(path, mime_type = nil)
|
160
|
+
return mime_type.value if mime_type
|
161
|
+
case path
|
162
|
+
when /\.png$/i
|
163
|
+
'image/png'
|
164
|
+
when /\.jpe?g$/i
|
165
|
+
'image/jpeg'
|
166
|
+
when /\.gif$/i
|
167
|
+
'image/gif'
|
168
|
+
when /\.svg$/i
|
169
|
+
'image/svg+xml'
|
170
|
+
when /\.otf$/i
|
171
|
+
'font/opentype'
|
172
|
+
when /\.eot$/i
|
173
|
+
'application/vnd.ms-fontobject'
|
174
|
+
when /\.ttf$/i
|
175
|
+
'font/truetype'
|
176
|
+
when /\.woff$/i
|
177
|
+
'application/font-woff'
|
178
|
+
when /\.off$/i
|
179
|
+
'font/openfont'
|
180
|
+
when /\.([a-zA-Z]+)$/
|
181
|
+
"image/#{Regexp.last_match(1).downcase}"
|
182
|
+
else
|
183
|
+
raise Sass.logger.debug("A mime type could not be determined for #{path}, please specify one explicitly.")
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def data(real_path)
|
188
|
+
# debugger
|
189
|
+
if File.readable?(real_path)
|
190
|
+
File.open(real_path, "rb") {|io| io.read}
|
191
|
+
else
|
192
|
+
raise Sass.logger.debug("File not found or cannot be read: #{real_path}")
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
end
|
197
|
+
|
198
|
+
|
199
|
+
|
200
|
+
|
193
201
|
#url重写
|
194
202
|
module Sass::Script::Functions
|
195
|
-
|
196
|
-
# declare :inline_image, [], var_args: true, var_kwargs: true
|
203
|
+
|
197
204
|
FONT_TYPES = {
|
198
205
|
eot: 'embedded-opentype',
|
199
206
|
woff: 'woff',
|
@@ -235,6 +242,7 @@ module Sass::Script::Functions
|
|
235
242
|
# url('a.png', $base64: true) => url(data:image/png;base64,iVBORw...)
|
236
243
|
def url(*paths)
|
237
244
|
# debugger
|
245
|
+
$configHash ||= load_json(File.expand_path("#{File.dirname(options[:filename])}/sassmagic.json")) || Hash.new
|
238
246
|
kwargs = paths.last.is_a?(Hash) ? paths.pop : {}
|
239
247
|
raise Sass::SyntaxError, 'url() needs one path at least' if paths.empty?
|
240
248
|
|
@@ -242,7 +250,7 @@ module Sass::Script::Functions
|
|
242
250
|
ts = timestamp(kwargs['timestamp'])
|
243
251
|
|
244
252
|
paths = paths.map { |path| sass_to_ruby(path) }.flatten
|
245
|
-
.map { |path| to_url(path, encode, ts) }
|
253
|
+
.map { |path| compress_img(path);to_url(path, encode, ts) }
|
246
254
|
|
247
255
|
list(paths, :comma)
|
248
256
|
end
|
@@ -250,7 +258,54 @@ module Sass::Script::Functions
|
|
250
258
|
|
251
259
|
|
252
260
|
private
|
261
|
+
def compress_img(path)
|
262
|
+
#图片压缩
|
263
|
+
# debugger
|
264
|
+
# 未设置tinypngKye或者url图片,则不优化
|
265
|
+
if !$configHash.has_key?('tinypngKye') || path =~ /^(http:|https:)\/\//
|
266
|
+
return
|
267
|
+
end
|
268
|
+
output = path.gsub(/\.(png|jpg)$/,'_tinypng.\1')
|
269
|
+
if File.exist?(output)
|
270
|
+
path.gsub!(/\.(png|jpg)$/,'_tinypng.\1')
|
271
|
+
return
|
272
|
+
end
|
273
|
+
|
274
|
+
require "net/https"
|
275
|
+
require "uri"
|
276
|
+
|
277
|
+
key = $configHash['tinypngKye'] || ''
|
278
|
+
input = path
|
279
|
+
# real_path = File.expand_path("#{File.dirname(path)}/#{path}")
|
280
|
+
# output = "tiny-output.png"
|
253
281
|
|
282
|
+
uri = URI.parse("https://api.tinypng.com/shrink")
|
283
|
+
|
284
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
285
|
+
http.use_ssl = true
|
286
|
+
|
287
|
+
# Uncomment below if you have trouble validating our SSL certificate.
|
288
|
+
# Download cacert.pem from: http://curl.haxx.se/ca/cacert.pem
|
289
|
+
# http.ca_file = File.join(File.dirname(__FILE__), "cacert.pem")
|
290
|
+
|
291
|
+
request = Net::HTTP::Post.new(uri.request_uri)
|
292
|
+
request.basic_auth("api", key)
|
293
|
+
|
294
|
+
response = http.request(request, File.binread(input))
|
295
|
+
# debugger
|
296
|
+
if response.code == "201"
|
297
|
+
# Compression was successful, retrieve output from Location header.
|
298
|
+
# debugger
|
299
|
+
output = path
|
300
|
+
path.gsub!(/\.(png|jpg)$/,'_tinypng.\1')
|
301
|
+
# output['.png'] = '_tinypng.png'
|
302
|
+
# output['.jpg'] = '_tinypng.jpg'
|
303
|
+
File.binwrite(output, http.get(response["location"]).body)
|
304
|
+
else
|
305
|
+
# Something went wrong! You can parse the JSON body for details.
|
306
|
+
puts "Compression failed"
|
307
|
+
end
|
308
|
+
end
|
254
309
|
def timestamp(ts)
|
255
310
|
# no kwargs
|
256
311
|
if ts.nil?
|
@@ -277,7 +332,6 @@ module Sass::Script::Functions
|
|
277
332
|
def to_url(path, encode, ts)
|
278
333
|
output = "url(#{path})"
|
279
334
|
# debugger
|
280
|
-
$configHash = load_json(File.expand_path("#{File.dirname(options[:filename])}/sassmagic.json")) || Hash.new
|
281
335
|
if path.is_a?(String) && path =~ PATH_REGEX
|
282
336
|
|
283
337
|
path, ext, query, anchor = $1 + $2, $2[1..-1].downcase.to_sym, $3, $4
|
@@ -285,6 +339,8 @@ module Sass::Script::Functions
|
|
285
339
|
if MIME_TYPES.key? ext
|
286
340
|
# 网络地址
|
287
341
|
if path =~ /^(http:|https:)\/\//
|
342
|
+
# path = path.replace(/(http:\/\/)|(http:\/\/)/,'//')
|
343
|
+
path['http://'] = '//'
|
288
344
|
output = output_path(path, ext, query, anchor, ts)
|
289
345
|
else
|
290
346
|
if $configHash["imageMaxSize"]
|
@@ -342,6 +398,7 @@ module Sass::Script::Functions
|
|
342
398
|
if $configHash["imagesPath"].has_key?(File.expand_path("#{File.dirname(options[:filename])}/#{path}"))
|
343
399
|
return $configHash["imagesPath"][File.expand_path("#{File.dirname(options[:filename])}/#{path}")]
|
344
400
|
end
|
401
|
+
|
345
402
|
# 调用上传任务
|
346
403
|
# debugger
|
347
404
|
nodetask = $configHash["imageLoader"] || false
|
data/lib/sassmagic.rb
CHANGED
@@ -12,9 +12,12 @@ ENV['SASS_ENV'] ||= 'development'
|
|
12
12
|
# end
|
13
13
|
|
14
14
|
$:.unshift"#{File.dirname(__FILE__)}"
|
15
|
-
|
15
|
+
require 'debugger'
|
16
16
|
# debugger
|
17
17
|
# require 'sass'
|
18
18
|
require 'sassmagic/utils'
|
19
|
+
require 'sassmagic/remote'
|
19
20
|
require 'sassmagic/reset'
|
20
21
|
|
22
|
+
|
23
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sassmagic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
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: 2015-02-
|
12
|
+
date: 2015-02-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sass
|
@@ -41,6 +41,7 @@ extensions: []
|
|
41
41
|
extra_rdoc_files: []
|
42
42
|
files:
|
43
43
|
- bin/sassmagic
|
44
|
+
- lib/sassmagic/remote.rb
|
44
45
|
- lib/sassmagic/reset.rb
|
45
46
|
- lib/sassmagic/utils.rb
|
46
47
|
- lib/sassmagic.rb
|