-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
119 lines (93 loc) · 3.04 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/* jshint node:true,esnext:true */
'use strict';
var through2 = require('through2');
var gutil = require('gulp-util');
var PluginError = gutil.PluginError;
var extend = require('extend');
var path = require('path');
var parseFilePath = require('parse-filepath');
var util = require('util');
var PLUGIN_NAME = 'gulp-indexify';
function isString(s) {
if (s === undefined || s === null) return false;
return s.constructor === String;
}
module.exports = function(options) {
options = extend(false, {
fileExtension: '.html',
rewriteRelativeUrls: true
}, options);
var fileExtensionArray = options.fileExtension;
if (!util.isArray(fileExtensionArray) && isString(fileExtensionArray)) {
fileExtensionArray = [fileExtensionArray];
}
return through2.obj(function(file, enc, callback) {
if (file.isNull()) {
return callback();
}
if (gutil.isStream(file)) {
this.emit('error',
new PluginError(PLUGIN_NAME, 'Streams not currently supported'));
return callback();
}
var originalFilePath = file.path;
var parsedPathObj = parseFilePath(originalFilePath);
if (-1 === fileExtensionArray.indexOf(parsedPathObj.extname)) {
/*
* Skip/pass-through files that don't match our extension
*/
return callback(null, file);
}
if ('index' === parsedPathObj.name) {
/*
* Skip/pass-through files which are already index files
*/
return callback(null, file);
}
file.path = path.join(
parsedPathObj.dirname,
parsedPathObj.name,
'index' + parsedPathObj.extname
);
gutil.log(PLUGIN_NAME, 'renaming',
gutil.colors.magenta(originalFilePath),
'to', gutil.colors.magenta(file.path));
if (options.rewriteRelativeUrls) {
var contents = file.contents.toString();
/*
* Match href="" and src="" URLs in the html
*/
var hrefSrcRegexp = new RegExp(
'(?:href|src)\s*=\s*["\'\\(]\\s*([\\w\\_\/\\.\\-]*\\.[a-zA-Z]+)([^\\)"\']*)\\s*[\\)"\']', 'gim');
/*
* Match srcset urls
*/
var srcsetRegexp = new RegExp('srcset\s*=\s*["\'\\(]\\s*([^"\'\>"]+)\\s*[\\)"\']', 'gim');
var absoluteUrlRegexp = /^(?:\/|https?\:\/\/)/;
/*
* rewrite relative urls with an extra .. to keep things working for references
* to other files
*/
contents = contents.replace(hrefSrcRegexp, function(content, filePath) {
if (!absoluteUrlRegexp.test(filePath)) {
content = content.replace(filePath, '../' + filePath);
}
return content;
});
contents = contents.replace(srcsetRegexp, function(content, srcSetValue) {
var pathArray = srcSetValue.split(','),
i = pathArray.length,
path;
while (i--) {
path = pathArray[i].trim();
if (!absoluteUrlRegexp.test(path)) {
content = content.replace(path, '../' + path);
}
}
return content;
});
file.contents = new Buffer(contents);
}
return callback(null, file);
});
};