|
sfcode
An Online Competing and Development Environment
|
cssesc to 3.0.0 (major)id and class selectorscssesc to 2.0.0 (major).To ease adoption of the v5.0 release, we have relaxed the node version check performed by npm at installation time to allow for node 4, which remains officially unsupported, but likely to continue working for the time being.
This release has BREAKING CHANGES that were required to fix regressions in 4.0.0 and to make the Combinator Node API consistent for all combinator types. Please read carefully.
.a .b) is stored in the AST has changed..a /for/ .b) are now properly parsed as a combinator./ was encountered have been fixed.v6.0.0.In prior releases, the value of a descendant combinator with multiple spaces included all the spaces.
.a .b: Extra spaces are now stored as space before.combinator.value === " "combinator.value === " " && combinator.spaces.before === " ".a /*comment*/.b: A comment at the end of the combinator causes extra space to become after space.combinator.value === " "combinator.raws.value === " /*comment/"combinator.value === " "combinator.spaces.after === " "combinator.raws.spaces.after === " /*comment*/".a<newline>.b: whitespace that doesn't start or end with a single space character is stored as a raw value.combinator.value === "\n"combinator.raws.value === undefinedcombinator.value === " "combinator.raws.value === "\n"Although, nonstandard and unlikely to ever become a standard, combinators like /deep/ and /for/ are now properly supported.
Because they've been taken off the standardization track, there is no spec-official name for combinators of the form /<ident>/. However, I talked to Tab Atkins and we agreed to call them "named combinators" so now they are called that.
Before this release such named combinators were parsed without intention and generated three nodes of type "tag" where the first and last nodes had a value of "/".
.a /for/ .b is parsed as a combinator.root.nodes[0].nodes[1].type === "tag"root.nodes[0].nodes[1].value === "/"root.nodes[0].nodes[1].type === "combinator"root.nodes[0].nodes[1].value === "/for/".a /F\6fR/ .b escapes are handled and uppercase is normalized.root.nodes[0].nodes[2].type === "tag"root.nodes[0].nodes[2].value === "F\\6fR"root.nodes[0].nodes[1].type === "combinator"root.nodes[0].nodes[1].value === "/for/"root.nodes[0].nodes[1].raws.value === "/F\\6fR/"A new API was added to look up a node based on the source location.
This release has BREAKING CHANGES that were required to fix bugs regarding values with escape sequences. Please read carefully.
bu\tton, .\31 00, #i\2764\FE0Fu, [attr="value is \"quoted""]</tt>
will parse respectively to the values <tt>button</tt>, <tt>100</tt>, <tt>iā¤ļøu</tt>, <tt>value is "quoted". The original escape sequences for these values can be found in the corresponding property name in node.raws. Where possible, deprecation warnings were added, but the nature of escape handling makes it impossible to detect what is escaped or not. Our expectation is that most users are neither expecting nor handling escape sequences in their use of this library, and so for them, this is a bug fix. Users who are taking care to handle escapes correctly can now update their code to remove the escape handling and let us do it for them.raws value is immediately updated. This can result in changes to the original escape format. Where the exact value of the escape sequence is important there are methods that allow both values to be set in conjunction. There are a number of new convenience methods for manipulating values that involve escapes, especially for attributes values where the quote mark is involved. See https://github.com/postcss/postcss-selector-parser/pull/133 for an extensive write-up on these changes.Upgrade/API Example
In 3.x there was no unescape handling and internal consistency of several properties was the caller's job to maintain. It was very easy for the developer to create a CSS file that did not parse correctly when some types of values were in use.
In 4.0 there is a convenient API for setting and mutating values that may need escaping. Especially for attributes.
attrNode.spaces and attrNode.raws since the 3.0.0 release.Attribute#offsetOf(part) to get the offset location of attribute parts like "operator" and "value". This is most often added to Attribute#sourceIndex for error reporting.process API is now async, and the sync API is now accessed through processSync instead.process() and processSync() now return a string instead of the Processor instance.ast() and astSync() methods have been added to the Processor. These return the Root node of the selectors after processing them.transform() and transformSync() methods have been added to the Processor. These return the value returned by the processor callback after processing the selectors.process, ast and transform (and their sync variants) now accept a postcss rule node. When provided, better errors are generated and selector processing is automatically set back to the rule selector (unless the updateSelector option is set to false.)The pattern of:
rule.selector = processor.process(rule.selector).result.toString();
is now:
processor.processSync(rule)
# 2.0.0
This release contains the following breaking changes:
eachInside iterators to walk. For example, eachTag is now walkTags, and eachInside is now walk.Node#removeSelf() to Node#remove().Container#remove() to Container#removeChild().Node#raw to Node#raws (thanks to @davidtheclark).& as the nesting selector, rather than a tag selector.#{foo}) as an id selector (thanks to @davidtheclark).and;
[data-attr="foo=bar"]) (thanks to @montmanu).quoted and raw.unquoted properties to attribute nodes (thanks to @davidtheclark).) and ] tokens when they had no opening pairs. Now postcss-selector-parser will throw when it encounters these lone tokens.# 1.3.2
str.charCodeAt(0) for compiled builds.String, to fix a crash on selectors such as foo:bar("test").Node#sourceIndex method (thanks to @davidtheclark).> combinator. The module will now no longer throw if a selector has a leading/trailing combinator node.@ tokens.replaceWith (thanks to @jonathantneal).insertAfter and insertBefore during iteration.clone and replaceWith methods to nodes.insertBefore and insertAfter to containers.each and eachInside.length getter and eachInside, map, reduce to the container class.eachComment).parser.id(opts) etc.next and prev to the node class.first and last getters to the container class.every and some iterators to the container class.empty alias for removeAll.index.nodes exclusively, and eliminates excessive nesting..\31\ 0.