| |
| import postcssPlugin from '../../helpers/postcss_plugin' |
| |
| export const rootFontSizeCustomProp = '--marpit-root-font-size' |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| export const rootFontSize = postcssPlugin( |
| 'marpit-postcss-root-font-size', |
| () => (css, postcss) => |
| css.walkRules((rule) => { |
| const injectSelector = new Set() |
| |
| for (const selector of rule.selectors) { |
| |
| const parentSelectors = selector.split(/(\s+|\s*[>~+]\s*)/) |
| const targetSelector = parentSelectors.pop() |
| const delimiterMatched = targetSelector.match(/[.:#[]/) |
| const target = delimiterMatched |
| ? targetSelector.slice(0, delimiterMatched.index) |
| : targetSelector |
| |
| if (target === 'section' || target.endsWith('*') || target === '') { |
| |
| injectSelector.add( |
| [ |
| ...parentSelectors, |
| target === 'section' |
| ? 'section' |
| : ':marpit-container > :marpit-slide section', |
| delimiterMatched |
| ? targetSelector.slice(delimiterMatched.index) |
| : '', |
| ].join(''), |
| ) |
| } |
| } |
| |
| if (injectSelector.size === 0) return |
| |
| |
| const injectRule = postcss.rule({ |
| selectors: [...injectSelector.values()], |
| }) |
| |
| rule.walkDecls('font-size', (decl) => { |
| injectRule.append(decl.clone({ prop: rootFontSizeCustomProp })) |
| }) |
| |
| if (injectRule.nodes.length > 0) rule.parent.insertAfter(rule, injectRule) |
| }), |
| ) |
| |
| export default rootFontSize |