Merge pull request #235 from dumconstantin/master

[0.3] Make a configurable separator (default ':')
This commit is contained in:
Adam Wathan 2017-11-24 15:03:01 -05:00 committed by GitHub
commit 798d2ccd17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 48 additions and 30 deletions

View File

@ -1,7 +1,10 @@
import postcss from 'postcss'
import plugin from '../src/lib/substituteFocusableAtRules'
import config from '../defaultConfig.stub.js'
function run(input, opts = () => {}) {
const separator = config.options.separator
function run(input, opts = () => config) {
return postcss([plugin(opts)]).process(input)
}
@ -16,8 +19,8 @@ test('it adds a focusable variant to each nested class definition', () => {
const output = `
.banana { color: yellow; }
.chocolate { color: brown; }
.focus\\:banana:focus { color: yellow; }
.focus\\:chocolate:focus { color: brown; }
.focus${separator}banana:focus { color: yellow; }
.focus${separator}chocolate:focus { color: brown; }
`
return run(input).then(result => {

View File

@ -1,7 +1,10 @@
import postcss from 'postcss'
import plugin from '../src/lib/substituteHoverableAtRules'
import config from '../defaultConfig.stub.js'
function run(input, opts = () => {}) {
const separator = config.options.separator
function run(input, opts = () => config) {
return postcss([plugin(opts)]).process(input)
}
@ -16,8 +19,8 @@ test('it adds a hoverable variant to each nested class definition', () => {
const output = `
.banana { color: yellow; }
.chocolate { color: brown; }
.hover\\:banana:hover { color: yellow; }
.hover\\:chocolate:hover { color: brown; }
.hover${separator}banana:hover { color: yellow; }
.hover${separator}chocolate:hover { color: brown; }
`
return run(input).then(result => {

View File

@ -1,7 +1,10 @@
import postcss from 'postcss'
import plugin from '../src/lib/substituteVariantsAtRules'
import config from '../defaultConfig.stub.js'
function run(input, opts = () => {}) {
const separator = config.options.separator
function run(input, opts = () => config) {
return postcss([plugin(opts)]).process(input)
}
@ -16,8 +19,8 @@ test('it can generate hover variants', () => {
const output = `
.banana { color: yellow; }
.chocolate { color: brown; }
.hover\\:banana:hover { color: yellow; }
.hover\\:chocolate:hover { color: brown; }
.hover${separator}banana:hover { color: yellow; }
.hover${separator}chocolate:hover { color: brown; }
`
return run(input).then(result => {
@ -37,8 +40,8 @@ test('it can generate focus variants', () => {
const output = `
.banana { color: yellow; }
.chocolate { color: brown; }
.focus\\:banana:focus { color: yellow; }
.focus\\:chocolate:focus { color: brown; }
.focus${separator}banana:focus { color: yellow; }
.focus${separator}chocolate:focus { color: brown; }
`
return run(input).then(result => {
@ -58,10 +61,10 @@ test('it can generate hover and focus variants', () => {
const output = `
.banana { color: yellow; }
.chocolate { color: brown; }
.focus\\:banana:focus { color: yellow; }
.focus\\:chocolate:focus { color: brown; }
.hover\\:banana:hover { color: yellow; }
.hover\\:chocolate:hover { color: brown; }
.focus${separator}banana:focus { color: yellow; }
.focus${separator}chocolate:focus { color: brown; }
.hover${separator}banana:hover { color: yellow; }
.hover${separator}chocolate:hover { color: brown; }
`
return run(input).then(result => {
@ -82,10 +85,10 @@ test('it wraps the output in a responsive at-rule if responsive is included as a
@responsive {
.banana { color: yellow; }
.chocolate { color: brown; }
.focus\\:banana:focus { color: yellow; }
.focus\\:chocolate:focus { color: brown; }
.hover\\:banana:hover { color: yellow; }
.hover\\:chocolate:hover { color: brown; }
.focus${separator}banana:focus { color: yellow; }
.focus${separator}chocolate:focus { color: brown; }
.hover${separator}banana:hover { color: yellow; }
.hover${separator}chocolate:hover { color: brown; }
}
`

View File

@ -828,6 +828,7 @@ module.exports = {
options: {
prefix: '',
separator: '\\:',
important: false,
},

View File

@ -1,12 +1,13 @@
export default function() {
export default function(config) {
return function(css) {
const separator = config().options.separator
css.walkAtRules('focusable', atRule => {
const clonedRule = atRule.clone()
clonedRule.walkRules(rule => {
// Might be wise to error if the rule has multiple selectors,
// or weird compound selectors like .bg-blue>p>h1
rule.selector = `.focus\\:${rule.selector.slice(1)}:focus`
rule.selector = `.focus${separator}${rule.selector.slice(1)}:focus`
})
atRule.before(atRule.clone().nodes)

View File

@ -1,12 +1,13 @@
export default function() {
export default function(config) {
return function(css) {
const separator = config().options.separator
css.walkAtRules('hoverable', atRule => {
const clonedRule = atRule.clone()
clonedRule.walkRules(rule => {
// Might be wise to error if the rule has multiple selectors,
// or weird compound selectors like .bg-blue>p>h1
rule.selector = `.hover\\:${rule.selector.slice(1)}:hover`
rule.selector = `.hover${separator}${rule.selector.slice(1)}:hover`
})
atRule.before(atRule.clone().nodes)

View File

@ -6,6 +6,7 @@ import buildMediaQuery from '../util/buildMediaQuery'
export default function(config) {
return function(css) {
const screens = config().screens
const separator = config().options.separator
const responsiveRules = []
let finalRules = []
@ -25,7 +26,10 @@ export default function(config) {
mediaQuery.append(
responsiveRules.map(rule => {
const cloned = rule.clone()
cloned.selectors = _.map(rule.selectors, selector => `.${screen}\\:${selector.slice(1)}`)
cloned.selectors = _.map(
rule.selectors,
selector => `.${screen}${separator}${selector.slice(1)}`
)
return cloned
})
)

View File

@ -2,27 +2,29 @@ import _ from 'lodash'
import postcss from 'postcss'
const variantGenerators = {
hover: container => {
hover: (separator, container) => {
const cloned = container.clone()
cloned.walkRules(rule => {
rule.selector = `.hover\\:${rule.selector.slice(1)}:hover`
rule.selector = `.hover${separator}${rule.selector.slice(1)}:hover`
})
return cloned.nodes
},
focus: container => {
focus: (separator, container) => {
const cloned = container.clone()
cloned.walkRules(rule => {
rule.selector = `.focus\\:${rule.selector.slice(1)}:focus`
rule.selector = `.focus${separator}${rule.selector.slice(1)}:focus`
})
return cloned.nodes
},
}
export default function() {
export default function(config) {
const separator = config().options.separator
return function(css) {
css.walkAtRules('variants', atRule => {
const variants = postcss.list.comma(atRule.params)
@ -37,7 +39,7 @@ export default function() {
_.forEach(['focus', 'hover'], variant => {
if (variants.includes(variant)) {
atRule.before(variantGenerators[variant](atRule))
atRule.before(variantGenerators[variant](separator, atRule))
}
})