// Tag selectors
rewriter.on('p', handler);
// Class selectors
rewriter.on('p.red', handler);
// ID selectors
rewriter.on('h1#header', handler);
// Attribute selectors
rewriter.on('p[data-test]', handler); // Has attribute
rewriter.on('p[data-test="one"]', handler); // Exact match
rewriter.on('p[data-test="one" i]', handler); // Case-insensitive
rewriter.on('p[data-test="one" s]', handler); // Case-sensitive
rewriter.on('p[data-test~="two"]', handler); // Word match
rewriter.on('p[data-test^="a"]', handler); // Starts with
rewriter.on('p[data-test$="1"]', handler); // Ends with
rewriter.on('p[data-test*="b"]', handler); // Contains
rewriter.on('p[data-test|="a"]', handler); // Dash-separated
// Combinators
rewriter.on('div span', handler); // Descendant
rewriter.on('div > span', handler); // Direct child
// Pseudo-classes
rewriter.on('p:nth-child(2)', handler);
rewriter.on('p:first-child', handler);
rewriter.on('p:nth-of-type(2)', handler);
rewriter.on('p:first-of-type', handler);
rewriter.on('p:not(:first-child)', handler);
// Universal selector
rewriter.on('*', handler);