-
Notifications
You must be signed in to change notification settings - Fork 82
Expand file tree
/
Copy pathinline-css.js
More file actions
85 lines (69 loc) · 2.01 KB
/
inline-css.js
File metadata and controls
85 lines (69 loc) · 2.01 KB
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
'use strict';
var parseCSS = require('css-rules'),
cheerio = require('cheerio'),
pseudoCheck = require('./pseudoCheck'),
handleRule = require('./handleRule'),
flatten = require('flatten'),
setStyleAttrs = require('./setStyleAttrs'),
setHeightAttrs = require('./setHeightAttrs'),
setWidthAttrs = require('./setWidthAttrs'),
setCenterAttrs = require('./setCenterAttrs'),
removeClassId = require('./removeClassId'),
setTableAttrs = require('./setTableAttrs'),
pick = require('object.pick');
module.exports = function (html, css, options) {
var opts = options || {},
rules,
editedElements = [],
$ = cheerio.load(html, pick(opts, [
'xmlMode',
'decodeEntities',
'lowerCaseTags',
'lowerCaseAttributeNames',
'recognizeCDATA',
'recognizeSelfClosing'
]));
try {
rules = parseCSS(css);
} catch (err) {
throw new Error(err);
}
rules.forEach(function (rule) {
var el,
ignoredPseudos;
ignoredPseudos = pseudoCheck(rule);
if (ignoredPseudos) {
return false;
}
try {
el = handleRule(rule, $);
editedElements.push(el);
} catch (err) {
// skip invalid selector
return false;
}
});
// flatten array if nested
editedElements = flatten(editedElements);
editedElements.forEach(function (el) {
setStyleAttrs(el, $);
if (opts.applyWidthAttributes) {
setWidthAttrs(el, $);
}
if (opts.applyHeightAttributes) {
setHeightAttrs(el, $);
}
if (opts.applyCenterAttributes) {
setCenterAttrs(el, $);
}
if (opts.removeHtmlSelectors) {
removeClassId(el, $);
}
});
if (opts.applyTableAttributes) {
$('table').each(function (index, el) {
setTableAttrs(el, $);
});
}
return $.html();
};