Skip to content

Commit 8902468

Browse files
committed
Define style sheet as a rule instead of block contents
1 parent 41341a4 commit 8902468

File tree

9 files changed

+28
-27
lines changed

9 files changed

+28
-27
lines changed

lib/cssom/CSSFontFeatureValuesMap-impl.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { isFailure, isList } from '../utils/value.js'
44
import { parseBlockContents, parseCSSDeclaration } from '../parse/parser.js'
55
import root from '../rules/definitions.js'
66

7-
const features = root.rules.find(rule => rule.name === '@font-feature-values').value.rules
7+
const features = root.value.rules.find(rule => rule.name === '@font-feature-values').value.rules
88

99
/**
1010
* @see {@link https://drafts.csswg.org/css-fonts-4/#cssfontfeaturevaluesmap}

lib/cssom/CSSFontFeatureValuesRule-impl.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { parseBlockContents } from '../parse/parser.js'
66
import root from '../rules/definitions.js'
77
import { toIDLAttribute } from '../utils/string.js'
88

9-
const features = root.rules.find(rule => rule.name === '@font-feature-values').value.rules
9+
const features = root.value.rules.find(rule => rule.name === '@font-feature-values').value.rules
1010

1111
/**
1212
* @see {@link https://drafts.csswg.org/css-fonts-4/#cssfontfeaturevaluesrule}

lib/parse/arbitrary.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ function matchAnyValue(input, restricted, stops = []) {
5353
* @see {@link https://drafts.csswg.org/css-syntax-3/#typedef-block-contents}
5454
*/
5555
function matchBlockContents(node) {
56-
if (getRule(node)) {
57-
return parser.parseBlockContents(node.input, node)
56+
if (getRule(node).definition.name === '@sheet') {
57+
return parser.parseStyleSheet(node.input, node)
5858
}
59-
return parser.parseStyleSheet(node.input, node)
59+
return parser.parseBlockContents(node.input, node)
6060
}
6161

6262
/**

lib/parse/parser.js

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -213,10 +213,12 @@ function removeCSSRule(list, index) {
213213
* @returns {CSSRuleImpl|CSSFontFeatureValuesMapImpl}
214214
*/
215215
function createCSSRule(node, name, prelude, value) {
216+
const parentRule = getRule(node).value
217+
const parentStyleSheet = getRoot(node).value
216218
const properties = {
217219
name,
218-
parentRule: getRule(node)?.value,
219-
parentStyleSheet: getRoot(node).value,
220+
parentRule: parentRule === parentStyleSheet ? null : parentRule,
221+
parentStyleSheet,
220222
prelude,
221223
value,
222224
}
@@ -288,20 +290,19 @@ function getDeclarationDefinition(context, name) {
288290
* @returns {object|null}
289291
*/
290292
function getRuleDefinition(context, name, prelude, type) {
291-
const contextDefinition = context.definition.value ?? context.definition
292293
if (name) {
293294
name = `@${name}`
294295
const alias = compatibility.rules.aliases.get(name)
295296
if (alias) {
296297
name = alias
297298
}
298-
return contextDefinition.rules?.find(rule =>
299+
return context.definition.value.rules?.find(rule =>
299300
!rule.qualified
300301
&& (rule.name === name || rule.names?.includes(name))
301302
&& (rule.prelude ? true : prelude.length === 0)
302303
&& (rule.value ? 'block' : 'statement') === type)
303304
}
304-
return contextDefinition.rules?.find(rule => rule.qualified)
305+
return context.definition.value.rules?.find(rule => rule.qualified)
305306
}
306307

307308
/**
@@ -319,8 +320,7 @@ function createContext(value) {
319320
if (CSSRule.isImpl(value)) {
320321
const { parentRule, parentStyleSheet } = value
321322
const context = createContext(parentRule ?? parentStyleSheet)
322-
const contextDefinition = context.definition.value ?? context.definition
323-
const definition = contextDefinition.rules.find(definition => cssom[definition.cssom].isImpl(value))
323+
const definition = context.definition.value.rules.find(definition => cssom[definition.cssom].isImpl(value))
324324
return { ...context, context, definition, value }
325325
}
326326
if (CSSFontFeatureValuesMap.isImpl(value)) {
@@ -356,14 +356,13 @@ function createContext(value) {
356356
if (Array.isArray(value)) {
357357
return value.reduce(
358358
(context, name) => {
359-
const contextDefinition = context.definition.value ?? context.definition
360-
const definition = contextDefinition.rules.find(rule => rule.name === name)
359+
const definition = context.definition.value.rules.find(rule => rule.name === name)
361360
return { ...context, context, definition }
362361
},
363362
context)
364363
}
365364
// Assert: value is an Element
366-
const definition = root.rules.find(definition => definition.qualified)
365+
const definition = root.value.rules.find(definition => definition.qualified)
367366
return { ...context, context, definition }
368367
}
369368

@@ -933,7 +932,7 @@ function parseCSSArbitrarySubstitution(value, context) {
933932
if (value.types[0] !== '<function>') {
934933
return null
935934
}
936-
const { definition: { cascading, elemental } } = getRule(context) ?? { definition: {} }
935+
const { definition: { cascading, elemental } } = getRule(context)
937936
for (const { cascade, definition, element, name } of substitutions.arbitrary) {
938937
if (!elemental && (element || (cascade && !cascading))) {
939938
continue

lib/parse/postprocess.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -972,7 +972,8 @@ function postParseLineNames(names, node) {
972972
* @returns {string}
973973
*/
974974
function getMediaFeatureContextName(node) {
975-
return getFunctionName(node) ?? getRuleName(node) ?? '@media'
975+
const name = getFunctionName(node) ?? getRuleName(node)
976+
return name === '@sheet' ? '@media' : name
976977
}
977978

978979
/**

lib/rules/definitions.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -453,10 +453,12 @@ nestedGroupRuleNames.forEach(name => {
453453
}
454454
})
455455

456-
const styleSheet = {
457-
name: '<rule-list>',
458-
rules: topLevelRules,
459-
type: 'arbitrary',
456+
export default {
457+
name: '@sheet',
458+
type: 'rule',
459+
value: {
460+
name: '<rule-list>',
461+
rules: topLevelRules,
462+
type: 'arbitrary',
463+
},
460464
}
461-
462-
export default styleSheet

lib/utils/context.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ export const type = Symbol('context')
1010
*/
1111
export function enterContext(node, name) {
1212
const { context } = node
13-
const contextDefinition = getRule(node)?.definition.value ?? getRoot(node)
14-
const definition = contextDefinition.rules.find(rule => rule.name === name)
13+
const definition = getRule(node).definition.value.rules.find(rule => rule.name === name)
1514
return { ...context, context, definition }
1615
}
1716

scripts/extract.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1028,7 +1028,7 @@ function addRules(definitions = [], key) {
10281028
if (aliases.has(name) || mappings.has(name)) {
10291029
return
10301030
}
1031-
const rule = findRule(name, root.rules)
1031+
const rule = findRule(name, root.value.rules)
10321032
if (rule) {
10331033
if (reportErrors && value && isUpdatedRule(name, value, rule)) {
10341034
reportError(key, name, `${name} has a new definition`)

scripts/interface.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import root from '../lib/rules/definitions.js'
2121

2222
const targetDir = path.join(import.meta.dirname, '..', 'lib', 'cssom')
2323

24-
const { rules } = root
24+
const { value: { rules } } = root
2525
const fontFaceRule = rules.find(rule => rule.name === '@font-face')
2626
const functionRule = rules.find(rule => rule.name === '@function')
2727
const keyframeRule = rules.find(rule => rule.name === '@keyframes').value.rules.find(rule => rule.name === '@keyframe')

0 commit comments

Comments
 (0)