Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/aweary/rst-selector-parser
A CSS selector-based parser for React Standard Tree (RST) traversal.
https://github.com/aweary/rst-selector-parser
Last synced: 7 days ago
JSON representation
A CSS selector-based parser for React Standard Tree (RST) traversal.
- Host: GitHub
- URL: https://github.com/aweary/rst-selector-parser
- Owner: aweary
- License: other
- Created: 2017-08-18T22:09:35.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2023-01-12T09:05:59.000Z (almost 2 years ago)
- Last Synced: 2024-12-09T22:22:46.903Z (17 days ago)
- Language: JavaScript
- Homepage:
- Size: 416 KB
- Stars: 19
- Watchers: 3
- Forks: 6
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# rst-selector-parser
This is a fork of [scalpel](https://github.com/gajus/scalpel/) intended for use with [enzyme](https://github.com/airbnb/enzyme/) for traversing
a React Standard Tree (RST) using [CSS selectors](https://www.w3.org/TR/css3-selectors/), with minor divergences.* [Usage](#usage)
* [Token types](#token-types)
* [Fields](#fields)
* [`adjacentSiblingCombinator`](#adjacentsiblingcombinator)
* [`attributePresenceSelector`](#attributepresenceselector)
* [`attributeValueSelector`](#attributevalueselector)
* [`childCombinator`](#childcombinator)
* [`classSelector`](#classselector)
* [`descendantCombinator`](#descendantcombinator)
* [`generalSiblingCombinator`](#generalsiblingcombinator)
* [`idSelector`](#idselector)
* [`pseudoClassSelector`](#pseudoclassselector)
* [`pseudoElementSelector`](#pseudoelementselector)
* [`typeSelector`](#typeselector)
* [`universalSelector`](#universalselector)
* [Development](#development)## Usage
```js
import {
createGenerator,
createParser
} from 'rst-selector-parser';const generator = createGenerator();
const parser = createParser();const tokens: Array = parser.parse('.foo.bar');
// [
// {
// type: 'selector',
// body: [
// {
// type: 'classSelector',
// name: 'foo'
// },
// {
// type: 'classSelector',
// name: 'bar'
// }
// ]
// }
// ]const selector: string = generator.generate(token);
// .foo.bar
```
> Note:
>
> For programmatic type definitions, refer to [`./src/types.js`](./src/types.js).## Token types
|Type|Description|Example|
|---|---|---|
|[`adjacentSiblingCombinator`](#adjacentsiblingcombinator)|An [adjacent sibling combinator](https://www.w3.org/TR/css3-selectors/#adjacent-sibling-combinators).|`.baz0 + .baz1`|
|[`attributePresenceSelector`](#attributepresenceselector)|An [attribute presence selector](https://www.w3.org/TR/css3-selectors/#attribute-selectors).|`[qux]`|
|[`attributeValueSelector`](#attributevalueselector)|An [attribute value selector](https://www.w3.org/TR/css3-selectors/#attribute-selectors).|`[qux=val]`, `[qux~=val]`|
|[`childCombinator`](#childcombinator)|A [child combinator](https://www.w3.org/TR/css3-selectors/#child-combinators).|`.baz0 > .baz1`|
|[`classSelector`](#classselector)|A [class selector](https://www.w3.org/TR/css3-selectors/#class-html).|`.baz`|
|[`descendantCombinator`](#descendantcombinator)|A [descendant combinator](https://www.w3.org/TR/css3-selectors/#descendant-combinators).|`.baz0 .baz1`|
|[`generalSiblingCombinator`](#generalsiblingcombinator)|A [general sibling combinator](https://www.w3.org/TR/css3-selectors/#general-sibling-combinators).|`.baz0 ~ .baz1`|
|[`idSelector`](#idselector)|An [ID selector](https://www.w3.org/TR/css3-selectors/#id-selectors)|`#bar`|
|[`pseudoClassSelector`](#pseudoclassselector)|A [pseudo-class selector](https://www.w3.org/TR/css3-selectors/#pseudo-classes).|`:corge`, `:corge()`, `:corge(val0, 'val1', "val2")`|
|[`pseudoElementSelector`](#pseudoelementselector)|A [pseudo-element selector](https://www.w3.org/TR/css3-selectors/#pseudo-elements).|`::grault`|
|[`typeSelector`](#typeselector)|A [type selector](https://www.w3.org/TR/css3-selectors/#type-selectors).|`foo`|
|[`universalSelector`](#universalselector)|A [universal selector](https://www.w3.org/TR/css3-selectors/#universal-selector).|`*`|## Fields
Tokens have fields that describe additional information about the token. Fields are [token type](#token-types) specific.
### `adjacentSiblingCombinator`
|Name|Description|Example|
|---|---|---|
|`type`|Name of the token type.|"adjacentSiblingCombinator"|### `attributePresenceSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the element attribute.|"qux" in `[qux]`|
|`type`|Name of the token type.|"attributePresenceSelector"|### `attributeValueSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the element attribute.|"qux" in `[qux]`|
|`operator`|Operator of the expression.|"\*=" in `[qux*=val]`|
|`type`|Name of the token type.|"attributeValueSelector"|
|`value`|Value of the expression.|"val" in `[qux=val]`|### `childCombinator`
|Name|Description|Example|
|---|---|---|
|`type`|Name of the token type.|"childCombinator"|### `classSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Class name.|"baz" in `.baz[qux]`|
|`type`|Name of the token type.|"classSelector"|### `descendantCombinator`
|Name|Description|Example|
|---|---|---|
|`type`|Name of the token type.|"descendantCombinator"|### `generalSiblingCombinator`
|Name|Description|Example|
|---|---|---|
|`type`|Name of the token type.|"generalSiblingCombinator"|### `idSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the ID.|"bar" in `#bar:corge()`|
|`type`|Name of the token type.|"idSelector"|### `pseudoClassSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the pseudo-class.|"corge" in `#bar:corge()`|
|`parameters`|Array of parameter values.|"var0", "var1" and "var2" in `:corge(var0, 'var1', "var2")`|
|`type`|Name of the token type.|"pseudoClassSelector"|### `pseudoElementSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the pseudo-element.|"grault" in `#bar::grault`|
|`type`|Name of the token type.|"pseudoElementSelector"|### `typeSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the node.|"foo" in `foo#bar.baz`|
|`type`|Name of the token type.|"typeSelector"|### `universalSelector`
|Name|Description|Example|
|---|---|---|
|`type`|Name of the token type.|"universalSelector"|## Development
```bash
git pull [email protected]:gajus/scalpel.git
cd ./scalpel
npm install
npm run test
```The parser grammar is in the [`./src/grammar.ne`](./src/grammar.ne) file. After making changes to the parser grammar, you need to compile the parser using `npm run compile-grammar` command.
> Note:
>
> This parser could be extended to support the entire CSS grammar.
> I don't have such a use case. However, should you want to add new grammar, [raise an issue](https://github.com/gajus/scalpel/issues/new).* [Usage](#usage)
* [Token types](#token-types)
* [Fields](#fields)
* [`adjacentSiblingCombinator`](#adjacentsiblingcombinator)
* [`attributePresenceSelector`](#attributepresenceselector)
* [`attributeValueSelector`](#attributevalueselector)
* [`childCombinator`](#childcombinator)
* [`classSelector`](#classselector)
* [`descendantCombinator`](#descendantcombinator)
* [`generalSiblingCombinator`](#generalsiblingcombinator)
* [`idSelector`](#idselector)
* [`pseudoClassSelector`](#pseudoclassselector)
* [`pseudoElementSelector`](#pseudoelementselector)
* [`typeSelector`](#typeselector)
* [`universalSelector`](#universalselector)
* [Development](#development)## Usage
```js
import {
createGenerator,
createParser
} from 'scalpel';const generator = createGenerator();
const parser = createParser();const tokens: Array = parser.parse('.foo.bar');
// [
// {
// type: 'selector',
// body: [
// {
// type: 'classSelector',
// name: 'foo'
// },
// {
// type: 'classSelector',
// name: 'bar'
// }
// ]
// }
// ]const selector: string = generator.generate(token);
// .foo.bar
```
> Note:
>
> For programmatic type definitions, refer to [`./src/types.js`](./src/types.js).## Token types
|Type|Description|Example|
|---|---|---|
|[`adjacentSiblingCombinator`](#adjacentsiblingcombinator)|An [adjacent sibling combinator](https://www.w3.org/TR/css3-selectors/#adjacent-sibling-combinators).|`.baz0 + .baz1`|
|[`attributePresenceSelector`](#attributepresenceselector)|An [attribute presence selector](https://www.w3.org/TR/css3-selectors/#attribute-selectors).|`[qux]`|
|[`attributeValueSelector`](#attributevalueselector)|An [attribute value selector](https://www.w3.org/TR/css3-selectors/#attribute-selectors).|`[qux=val]`, `[qux~=val]`|
|[`childCombinator`](#childcombinator)|A [child combinator](https://www.w3.org/TR/css3-selectors/#child-combinators).|`.baz0 > .baz1`|
|[`classSelector`](#classselector)|A [class selector](https://www.w3.org/TR/css3-selectors/#class-html).|`.baz`|
|[`descendantCombinator`](#descendantcombinator)|A [descendant combinator](https://www.w3.org/TR/css3-selectors/#descendant-combinators).|`.baz0 .baz1`|
|[`generalSiblingCombinator`](#generalsiblingcombinator)|A [general sibling combinator](https://www.w3.org/TR/css3-selectors/#general-sibling-combinators).|`.baz0 ~ .baz1`|
|[`idSelector`](#idselector)|An [ID selector](https://www.w3.org/TR/css3-selectors/#id-selectors)|`#bar`|
|[`pseudoClassSelector`](#pseudoclassselector)|A [pseudo-class selector](https://www.w3.org/TR/css3-selectors/#pseudo-classes).|`:corge`, `:corge()`, `:corge(val0, 'val1', "val2")`|
|[`pseudoElementSelector`](#pseudoelementselector)|A [pseudo-element selector](https://www.w3.org/TR/css3-selectors/#pseudo-elements).|`::grault`|
|[`typeSelector`](#typeselector)|A [type selector](https://www.w3.org/TR/css3-selectors/#type-selectors).|`foo`|
|[`universalSelector`](#universalselector)|A [universal selector](https://www.w3.org/TR/css3-selectors/#universal-selector).|`*`|## Fields
Tokens have fields that describe additional information about the token. Fields are [token type](#token-types) specific.
### `adjacentSiblingCombinator`
|Name|Description|Example|
|---|---|---|
|`type`|Name of the token type.|"adjacentSiblingCombinator"|### `attributePresenceSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the element attribute.|"qux" in `[qux]`|
|`type`|Name of the token type.|"attributePresenceSelector"|### `attributeValueSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the element attribute.|"qux" in `[qux]`|
|`operator`|Operator of the expression.|"\*=" in `[qux*=val]`|
|`type`|Name of the token type.|"attributeValueSelector"|
|`value`|Value of the expression.|"val" in `[qux=val]`|### `childCombinator`
|Name|Description|Example|
|---|---|---|
|`type`|Name of the token type.|"childCombinator"|### `classSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Class name.|"baz" in `.baz[qux]`|
|`type`|Name of the token type.|"classSelector"|### `descendantCombinator`
|Name|Description|Example|
|---|---|---|
|`type`|Name of the token type.|"descendantCombinator"|### `generalSiblingCombinator`
|Name|Description|Example|
|---|---|---|
|`type`|Name of the token type.|"generalSiblingCombinator"|### `idSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the ID.|"bar" in `#bar:corge()`|
|`type`|Name of the token type.|"idSelector"|### `pseudoClassSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the pseudo-class.|"corge" in `#bar:corge()`|
|`parameters`|Array of parameter values.|"var0", "var1" and "var2" in `:corge(var0, 'var1', "var2")`|
|`type`|Name of the token type.|"pseudoClassSelector"|### `pseudoElementSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the pseudo-element.|"grault" in `#bar::grault`|
|`type`|Name of the token type.|"pseudoElementSelector"|### `typeSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the node.|"foo" in `foo#bar.baz`|
|`type`|Name of the token type.|"typeSelector"|### `universalSelector`
|Name|Description|Example|
|---|---|---|
|`type`|Name of the token type.|"universalSelector"|## Development
```bash
git pull [email protected]:gajus/scalpel.git
cd ./scalpel
npm install
npm run test
```The parser grammar is in the [`./src/grammar.ne`](./src/grammar.ne) file. After making changes to the parser grammar, you need to compile the parser using `npm run compile-grammar` command.
> Note:
>
> This parser could be extended to support the entire CSS grammar.
> I don't have such a use case. However, should you want to add new grammar, [raise an issue](https://github.com/gajus/scalpel/issues/new).* [Usage](#usage)
* [Token types](#token-types)
* [Fields](#fields)
* [`adjacentSiblingCombinator`](#adjacentsiblingcombinator)
* [`attributePresenceSelector`](#attributepresenceselector)
* [`attributeValueSelector`](#attributevalueselector)
* [`childCombinator`](#childcombinator)
* [`classSelector`](#classselector)
* [`descendantCombinator`](#descendantcombinator)
* [`generalSiblingCombinator`](#generalsiblingcombinator)
* [`idSelector`](#idselector)
* [`pseudoClassSelector`](#pseudoclassselector)
* [`pseudoElementSelector`](#pseudoelementselector)
* [`typeSelector`](#typeselector)
* [`universalSelector`](#universalselector)
* [Development](#development)## Usage
```js
import {
createGenerator,
createParser
} from 'scalpel';const generator = createGenerator();
const parser = createParser();const tokens: Array = parser.parse('.foo.bar');
// [
// {
// type: 'selector',
// body: [
// {
// type: 'classSelector',
// name: 'foo'
// },
// {
// type: 'classSelector',
// name: 'bar'
// }
// ]
// }
// ]const selector: string = generator.generate(token);
// .foo.bar
```
> Note:
>
> For programmatic type definitions, refer to [`./src/types.js`](./src/types.js).## Token types
|Type|Description|Example|
|---|---|---|
|[`adjacentSiblingCombinator`](#adjacentsiblingcombinator)|An [adjacent sibling combinator](https://www.w3.org/TR/css3-selectors/#adjacent-sibling-combinators).|`.baz0 + .baz1`|
|[`attributePresenceSelector`](#attributepresenceselector)|An [attribute presence selector](https://www.w3.org/TR/css3-selectors/#attribute-selectors).|`[qux]`|
|[`attributeValueSelector`](#attributevalueselector)|An [attribute value selector](https://www.w3.org/TR/css3-selectors/#attribute-selectors).|`[qux=val]`, `[qux~=val]`|
|[`childCombinator`](#childcombinator)|A [child combinator](https://www.w3.org/TR/css3-selectors/#child-combinators).|`.baz0 > .baz1`|
|[`classSelector`](#classselector)|A [class selector](https://www.w3.org/TR/css3-selectors/#class-html).|`.baz`|
|[`descendantCombinator`](#descendantcombinator)|A [descendant combinator](https://www.w3.org/TR/css3-selectors/#descendant-combinators).|`.baz0 .baz1`|
|[`generalSiblingCombinator`](#generalsiblingcombinator)|A [general sibling combinator](https://www.w3.org/TR/css3-selectors/#general-sibling-combinators).|`.baz0 ~ .baz1`|
|[`idSelector`](#idselector)|An [ID selector](https://www.w3.org/TR/css3-selectors/#id-selectors)|`#bar`|
|[`pseudoClassSelector`](#pseudoclassselector)|A [pseudo-class selector](https://www.w3.org/TR/css3-selectors/#pseudo-classes).|`:corge`, `:corge()`, `:corge(val0, 'val1', "val2")`|
|[`pseudoElementSelector`](#pseudoelementselector)|A [pseudo-element selector](https://www.w3.org/TR/css3-selectors/#pseudo-elements).|`::grault`|
|[`typeSelector`](#typeselector)|A [type selector](https://www.w3.org/TR/css3-selectors/#type-selectors).|`foo`|
|[`universalSelector`](#universalselector)|A [universal selector](https://www.w3.org/TR/css3-selectors/#universal-selector).|`*`|## Fields
Tokens have fields that describe additional information about the token. Fields are [token type](#token-types) specific.
### `adjacentSiblingCombinator`
|Name|Description|Example|
|---|---|---|
|`type`|Name of the token type.|"adjacentSiblingCombinator"|### `attributePresenceSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the element attribute.|"qux" in `[qux]`|
|`type`|Name of the token type.|"attributePresenceSelector"|### `attributeValueSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the element attribute.|"qux" in `[qux]`|
|`operator`|Operator of the expression.|"\*=" in `[qux*=val]`|
|`type`|Name of the token type.|"attributeValueSelector"|
|`value`|Value of the expression.|"val" in `[qux=val]`|### `childCombinator`
|Name|Description|Example|
|---|---|---|
|`type`|Name of the token type.|"childCombinator"|### `classSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Class name.|"baz" in `.baz[qux]`|
|`type`|Name of the token type.|"classSelector"|### `descendantCombinator`
|Name|Description|Example|
|---|---|---|
|`type`|Name of the token type.|"descendantCombinator"|### `generalSiblingCombinator`
|Name|Description|Example|
|---|---|---|
|`type`|Name of the token type.|"generalSiblingCombinator"|### `idSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the ID.|"bar" in `#bar:corge()`|
|`type`|Name of the token type.|"idSelector"|### `pseudoClassSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the pseudo-class.|"corge" in `#bar:corge()`|
|`parameters`|Array of parameter values.|"var0", "var1" and "var2" in `:corge(var0, 'var1', "var2")`|
|`type`|Name of the token type.|"pseudoClassSelector"|### `pseudoElementSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the pseudo-element.|"grault" in `#bar::grault`|
|`type`|Name of the token type.|"pseudoElementSelector"|### `typeSelector`
|Name|Description|Example|
|---|---|---|
|`name`|Name of the node.|"foo" in `foo#bar.baz`|
|`type`|Name of the token type.|"typeSelector"|### `universalSelector`
|Name|Description|Example|
|---|---|---|
|`type`|Name of the token type.|"universalSelector"|## Development
```bash
git pull [email protected]:gajus/scalpel.git
cd ./scalpel
npm install
npm run test
```The parser grammar is in the [`./src/grammar.ne`](./src/grammar.ne) file. After making changes to the parser grammar, you need to compile the parser using `npm run compile-grammar` command.