Skip to content

Instantly share code, notes, and snippets.

@apaleslimghost
Last active February 27, 2018 16:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save apaleslimghost/fc4ac0581e8fec423fe8f5e66c01849d to your computer and use it in GitHub Desktop.
Save apaleslimghost/fc4ac0581e8fec423fe8f5e66c01849d to your computer and use it in GitHub Desktop.
const {selectAll} = require('css-select');
const domhandlerHyperscriptReplace = require('@quarterto/domhandler-hyperscript-replace');
const {calculateSpecificity} = require('clear-cut');
const orderBy = require('lodash.orderby');
module.exports = ({Component, createElement} = require('react')) => (...transforms) => (dom, options) => {
const {replace, tree, getVNode} = domhandlerHyperscriptReplace(dom, {h: createElement});
const propsMap = new WeakMap();
const ordered = orderBy(transforms, ({selector}) => calculateSpecificity(selector), 'asc');
return Promise.all(
ordered.map(
transform => {
const els = selectAll(transform.selector, dom);
if(els.length) {
return Promise.all(
els.map(el =>
Promise.resolve(transform.preprocess({
el,
match: selector => selectAll(selector, el).map(getVNode),
original: Object.assign({}, getVNode(el)),
options,
__unsafeOriginal: getVNode(el),
})).then(
props => propsMap.set(el, props)
)
)
);
}
}
)
).then(() => {
ordered.forEach(
transform => replace(transform.selector, el => {
const props = propsMap.get(el);
if(props !== false) {
return createElement(
transform,
Object.assign({
options,
children: el.type === 'text'
? el.data
: (el.children || []).map(getVNode),
}, props)
);
}
})
);
return tree;
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment