Skip to content

Commit e3c9b4e

Browse files
committed
Convert img:srcset to require, similar to img:src
1 parent 21fb818 commit e3c9b4e

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

lib/template-compiler/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ var beautify = require('js-beautify').js_beautify
55
var transpile = require('vue-template-es2015-compiler')
66
var hotReloadAPIPath = normalize.dep('vue-hot-reload-api')
77
var transformRequire = require('./modules/transform-require')
8+
var transformSrcset = require('./modules/transform-srcset')
89

910
module.exports = function (html) {
1011
this.cacheable()
@@ -13,7 +14,7 @@ module.exports = function (html) {
1314
var vueOptions = this.options.__vueOptions__ || {}
1415
var options = loaderUtils.getOptions(this) || {}
1516

16-
var defaultModules = [transformRequire(options.transformToRequire)]
17+
var defaultModules = [transformRequire(options.transformToRequire), transformSrcset()]
1718
var userModules = vueOptions.compilerModules || options.compilerModules
1819
// for HappyPack cross-process use cases
1920
if (typeof userModules === 'string') {
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// vue compiler module for transforming `img:srcset` to a number of `require`s
2+
3+
module.exports = function () {
4+
return {
5+
postTransformNode: node => {
6+
transform(node)
7+
}
8+
}
9+
}
10+
11+
function transform (node) {
12+
if (node.tag === 'img' && node.attrs) {
13+
node.attrs.forEach(attr => {
14+
if (attr.name === 'srcset') {
15+
// same logic as in transform-require.js
16+
var value = attr.value
17+
var isStatic = value.charAt(0) === '"' && value.charAt(value.length - 1) === '"'
18+
if (!isStatic) {
19+
return
20+
}
21+
22+
// http://w3c.github.io/html/semantics-embedded-content.html#ref-for-image-candidate-string-5
23+
24+
const spaceCharacters = /[ \t\n\f\r]+/
25+
26+
const imageCandidates = value.substr(1, value.length - 2).split(',').map(s => {
27+
const [url, descriptor] = s.trim().split(spaceCharacters, 2)
28+
return { require: urlToRequire(url), descriptor: descriptor }
29+
})
30+
31+
let code = ''
32+
imageCandidates.forEach((o, i, a) => {
33+
code += o.require + ' + " ' + o.descriptor + (i < a.length - 1 ? ',' : '') + '"'
34+
})
35+
36+
attr.value = code
37+
}
38+
})
39+
}
40+
}
41+
42+
function urlToRequire (url) {
43+
// same logic as in transform-require.js
44+
var firstChar = url.charAt(0)
45+
if (firstChar === '.' || firstChar === '~') {
46+
if (firstChar === '~') {
47+
var secondChar = url.charAt(1)
48+
url = '"' + url.slice(secondChar === '/' ? 2 : 1)
49+
}
50+
return 'require("' + url + '")'
51+
}
52+
}

0 commit comments

Comments
 (0)