mjml-parser-xml
Advanced tools
Comparing version 4.0.0-alpha.2 to 4.0.0-alpha.3
@@ -8,3 +8,4 @@ 'use strict'; | ||
exports.decodeAttributes = decodeAttributes; | ||
var regexAttributes = new RegExp('([^\\s]*="|\')([^"|\']*)("|\')', 'g'); | ||
var regexTag = /<([^>])*>/gmi; | ||
var regexAttributes = /([^\s]*="|')([^"|']*)("|')/gmi; | ||
@@ -19,7 +20,9 @@ function parseAttributes(input) { | ||
return input.replace(regexAttributes, function (match, beforeAttr, attrVal, afterAttr) { | ||
var newAttrVal = attrVal.replace(/.*&([^a]|$).*/g, replaceAttrVal); | ||
newAttrVal = encodeURIComponent(attrVal); | ||
return input.replace(regexTag, function (match) { | ||
return match.replace(regexAttributes, function (m, beforeAttr, attrVal, afterAttr) { | ||
var newAttrVal = attrVal.replace(/.*&([^a]|$).*/g, replaceAttrVal); | ||
newAttrVal = encodeURIComponent(attrVal); | ||
return '' + beforeAttr + newAttrVal + afterAttr; | ||
return '' + beforeAttr + newAttrVal + afterAttr; | ||
}); | ||
}); | ||
@@ -29,7 +32,9 @@ } | ||
function decodeAttributes(input) { | ||
return input.replace(regexAttributes, function (match, beforeAttr, attrVal, afterAttr) { | ||
var newAttrVal = decodeURIComponent(attrVal); | ||
return input.replace(regexTag, function (match) { | ||
return match.replace(regexAttributes, function (match, beforeAttr, attrVal, afterAttr) { | ||
var newAttrVal = decodeURIComponent(attrVal); | ||
return '' + beforeAttr + newAttrVal + afterAttr; | ||
return '' + beforeAttr + newAttrVal + afterAttr; | ||
}); | ||
}); | ||
} |
@@ -8,5 +8,5 @@ 'use strict'; | ||
var _lodash = require('lodash'); | ||
var _forEach = require('lodash/forEach'); | ||
var _lodash2 = _interopRequireDefault(_lodash); | ||
var _forEach2 = _interopRequireDefault(_forEach); | ||
@@ -20,5 +20,5 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
if (node.children) { | ||
_lodash2.default.forEach(node.children, setEmptyAttributes); | ||
(0, _forEach2.default)(node.children, setEmptyAttributes); | ||
} | ||
} | ||
module.exports = exports['default']; |
133
lib/index.js
@@ -9,8 +9,4 @@ 'use strict'; | ||
exports.default = parseXML; | ||
exports.default = MJMLParser; | ||
var _lodash = require('lodash'); | ||
var _lodash2 = _interopRequireDefault(_lodash); | ||
var _htmlparser = require('htmlparser2'); | ||
@@ -28,2 +24,6 @@ | ||
var _find = require('lodash/find'); | ||
var _find2 = _interopRequireDefault(_find); | ||
var _mapValues = require('lodash/mapValues'); | ||
@@ -33,4 +33,22 @@ | ||
var _mjmlCore = require('mjml-core'); | ||
var _path = require('path'); | ||
var _path2 = _interopRequireDefault(_path); | ||
var _fs = require('fs'); | ||
var _fs2 = _interopRequireDefault(_fs); | ||
var _filter = require('lodash/fp/filter'); | ||
var _filter2 = _interopRequireDefault(_filter); | ||
var _map = require('lodash/fp/map'); | ||
var _map2 = _interopRequireDefault(_map); | ||
var _flow = require('lodash/fp/flow'); | ||
var _flow2 = _interopRequireDefault(_flow); | ||
var _parseAttributes = require('./helpers/parseAttributes'); | ||
@@ -58,2 +76,4 @@ | ||
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } | ||
var indexesForNewLine = function indexesForNewLine(xml) { | ||
@@ -70,18 +90,24 @@ var regex = /\n/gi; | ||
function parseXML(xml) { | ||
function MJMLParser(xml) { | ||
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; | ||
var _options$addEmptyAttr = options.addEmptyAttributes, | ||
addEmptyAttributes = _options$addEmptyAttr === undefined ? true : _options$addEmptyAttr, | ||
_options$CDATASection = options.CDATASections, | ||
CDATASections = _options$CDATASection === undefined ? _lodash2.default.chain(_extends({}, _mjmlCore.components.head, _mjmlCore.components.body)).filter(function (component) { | ||
return component.prototype.endingTag; | ||
}).map(function (component) { | ||
return component.getName(); | ||
}).value() : _options$CDATASection, | ||
_options$components = options.components, | ||
components = _options$components === undefined ? {} : _options$components, | ||
_options$convertBoole = options.convertBooleans, | ||
convertBooleans = _options$convertBoole === undefined ? true : _options$convertBoole, | ||
_options$keepComments = options.keepComments, | ||
keepComments = _options$keepComments === undefined ? true : _options$keepComments; | ||
keepComments = _options$keepComments === undefined ? true : _options$keepComments, | ||
_options$filePath = options.filePath, | ||
filePath = _options$filePath === undefined ? '.' : _options$filePath; | ||
var CDATASections = (0, _flow2.default)((0, _filter2.default)(function (component) { | ||
return component.endingTag; | ||
}), (0, _map2.default)(function (component) { | ||
return component.getTagName(); | ||
}))(_extends({}, components)); | ||
var cwd = filePath ? _path2.default.dirname(filePath) : process.cwd(); | ||
var safeXml = xml; | ||
@@ -94,5 +120,71 @@ | ||
var cur = null; | ||
var inInclude = false; | ||
var findTag = function findTag(tagName, tree) { | ||
return (0, _find2.default)(tree.children, { tagName: tagName }); | ||
}; | ||
var lineIndexes = indexesForNewLine(safeXml); | ||
var handleInclude = function handleInclude(file, line) { | ||
var partialPath = _path2.default.resolve(cwd, file); | ||
var content = void 0; | ||
try { | ||
content = _fs2.default.readFileSync(partialPath, 'utf8'); | ||
} catch (e) { | ||
var newNode = { | ||
line: line, | ||
file: file, | ||
absoluteFilePath: _path2.default.resolve(cwd, filePath), | ||
parent: cur, | ||
tagName: 'mj-raw', | ||
content: '<!-- mj-include fails with file : ' + file + ' at ' + partialPath + ' -->', | ||
children: [] | ||
}; | ||
cur.children.push(newNode); | ||
cur = newNode; | ||
return; | ||
} | ||
content = content.indexOf('<mjml>') == -1 ? '<mjml><mj-body>' + content + '</mj-body></mjml>' : content; | ||
var partialMjml = parseXML(content, _extends({}, options, { filePath: partialPath })); | ||
var bindToTree = function bindToTree(children) { | ||
var tree = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : cur; | ||
return children.map(function (c) { | ||
return _extends({}, c, { parent: tree }); | ||
}); | ||
}; | ||
if (partialMjml.tagName != 'mjml') { | ||
return; | ||
} | ||
var body = findTag('mj-body', partialMjml); | ||
var head = findTag('mj-head', partialMjml); | ||
if (body) { | ||
cur.children = [].concat(_toConsumableArray(cur.children), _toConsumableArray(bindToTree(body.children))); | ||
} | ||
if (head) { | ||
var curHead = findTag('mj-head', mjml); | ||
if (!curHead) { | ||
mjml.children.push({ | ||
file: filePath, | ||
absoluteFilePath: _path2.default.resolve(cwd, filePath), | ||
parent: mjml, | ||
tagName: 'mj-head', | ||
children: [] | ||
}); | ||
curHead = findTag('mj-head', mjml); | ||
} | ||
curHead.children = [].concat(_toConsumableArray(curHead.children), _toConsumableArray(bindToTree(head.children, curHead))); | ||
} | ||
}; | ||
var parser = new _htmlparser2.default.Parser({ | ||
@@ -104,2 +196,8 @@ onopentag: function onopentag(name, attrs) { | ||
if (name == 'mj-include') { | ||
inInclude = true; | ||
return handleInclude(decodeURIComponent(attrs.path), line); | ||
} | ||
if (convertBooleans) { | ||
@@ -115,2 +213,4 @@ // "true" and "false" will be converted to bools | ||
var newNode = { | ||
file: filePath, | ||
absoluteFilePath: _path2.default.resolve(cwd, filePath), | ||
line: line, | ||
@@ -132,2 +232,7 @@ parent: cur, | ||
onclosetag: function onclosetag() { | ||
if (inInclude) { | ||
inInclude = false; | ||
return; | ||
} | ||
cur = cur && cur.parent || null; | ||
@@ -134,0 +239,0 @@ }, |
{ | ||
"name": "mjml-parser-xml", | ||
"description": "mjml-parser-xml", | ||
"version": "4.0.0-alpha.2", | ||
"version": "4.0.0-alpha.3", | ||
"main": "lib/index.js", | ||
@@ -21,5 +21,4 @@ "repository": { | ||
"htmlparser2": "^3.9.2", | ||
"lodash": "^4.17.2", | ||
"mjml-core": "^4.0.0-alpha.2" | ||
"lodash": "^4.17.2" | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
2
310
15803
1
- Removedmjml-core@^4.0.0-alpha.2
- Removed@babel/runtime@7.25.7(transitive)
- Removed@isaacs/cliui@8.0.2(transitive)
- Removed@one-ini/wasm@0.1.1(transitive)
- Removed@pkgjs/parseargs@0.11.0(transitive)
- Removedabbrev@2.0.0(transitive)
- Removedansi-colors@4.1.3(transitive)
- Removedansi-regex@5.0.16.1.0(transitive)
- Removedansi-styles@4.3.06.2.1(transitive)
- Removedbalanced-match@1.0.2(transitive)
- Removedboolbase@1.0.0(transitive)
- Removedbrace-expansion@2.0.1(transitive)
- Removedcamel-case@3.0.0(transitive)
- Removedcheerio@1.0.0-rc.12(transitive)
- Removedcheerio-select@2.1.0(transitive)
- Removedclean-css@4.2.4(transitive)
- Removedcliui@8.0.1(transitive)
- Removedcolor-convert@2.0.1(transitive)
- Removedcolor-name@1.1.4(transitive)
- Removedcommander@10.0.12.20.36.2.1(transitive)
- Removedconfig-chain@1.1.13(transitive)
- Removedcross-spawn@7.0.3(transitive)
- Removedcss-select@5.1.0(transitive)
- Removedcss-what@6.1.0(transitive)
- Removeddetect-node@2.1.0(transitive)
- Removeddom-serializer@1.4.12.0.0(transitive)
- Removeddomhandler@3.3.04.3.15.0.3(transitive)
- Removeddomutils@2.8.03.1.0(transitive)
- Removedeastasianwidth@0.2.0(transitive)
- Removededitorconfig@1.0.4(transitive)
- Removedemoji-regex@8.0.09.2.2(transitive)
- Removedentities@4.5.0(transitive)
- Removedescalade@3.2.0(transitive)
- Removedescape-goat@3.0.0(transitive)
- Removedforeground-child@3.3.0(transitive)
- Removedget-caller-file@2.0.5(transitive)
- Removedglob@10.4.5(transitive)
- Removedhe@1.2.0(transitive)
- Removedhtml-minifier@4.0.0(transitive)
- Removedhtmlparser2@5.0.18.0.29.1.0(transitive)
- Removedini@1.3.8(transitive)
- Removedis-fullwidth-code-point@3.0.0(transitive)
- Removedisexe@2.0.0(transitive)
- Removedjackspeak@3.4.3(transitive)
- Removedjs-beautify@1.15.1(transitive)
- Removedjs-cookie@3.0.5(transitive)
- Removedjuice@10.0.1(transitive)
- Removedlower-case@1.1.4(transitive)
- Removedlru-cache@10.4.3(transitive)
- Removedmensch@0.3.4(transitive)
- Removedmime@2.6.0(transitive)
- Removedminimatch@9.0.19.0.5(transitive)
- Removedminipass@7.1.2(transitive)
- Removedmjml-core@4.15.3(transitive)
- Removedmjml-migrate@4.15.3(transitive)
- Removedmjml-parser-xml@4.15.3(transitive)
- Removedmjml-validator@4.15.3(transitive)
- Removedno-case@2.3.2(transitive)
- Removednode-fetch@2.7.0(transitive)
- Removednopt@7.2.1(transitive)
- Removednth-check@2.1.1(transitive)
- Removedpackage-json-from-dist@1.0.1(transitive)
- Removedparam-case@2.1.1(transitive)
- Removedparse5@7.1.2(transitive)
- Removedparse5-htmlparser2-tree-adapter@7.0.0(transitive)
- Removedpath-key@3.1.1(transitive)
- Removedpath-scurry@1.11.1(transitive)
- Removedproto-list@1.2.4(transitive)
- Removedregenerator-runtime@0.14.1(transitive)
- Removedrelateurl@0.2.7(transitive)
- Removedrequire-directory@2.1.1(transitive)
- Removedsemver@7.6.3(transitive)
- Removedshebang-command@2.0.0(transitive)
- Removedshebang-regex@3.0.0(transitive)
- Removedsignal-exit@4.1.0(transitive)
- Removedslick@1.12.2(transitive)
- Removedsource-map@0.6.1(transitive)
- Removedstring-width@4.2.35.1.2(transitive)
- Removedstrip-ansi@6.0.17.1.0(transitive)
- Removedtr46@0.0.3(transitive)
- Removeduglify-js@3.19.3(transitive)
- Removedupper-case@1.1.3(transitive)
- Removedvalid-data-url@3.0.1(transitive)
- Removedweb-resource-inliner@6.0.1(transitive)
- Removedwebidl-conversions@3.0.1(transitive)
- Removedwhatwg-url@5.0.0(transitive)
- Removedwhich@2.0.2(transitive)
- Removedwrap-ansi@7.0.08.1.0(transitive)
- Removedy18n@5.0.8(transitive)
- Removedyargs@17.7.2(transitive)
- Removedyargs-parser@21.1.1(transitive)