This package is nowhere near finished - in fact not even started. Please don't try to use it yet!
I'm struggling to find a real-world use for this package, so I'm pausing development.
This package attempts to implement a dialect of CSS Selectors that can be used to easily select nodes in a Go syntax tree. Specifically, the Decorated Syntax Tree defined by github.com/dave/dst.
| Name | Example |
|---|---|
| Node | Ident in Ident |
| Interface | Expr |
| Field | Body in FuncLit |
| Definition | foo in Field.Names*, ImportSpec.Name, ValueSpec.Names**, TypeSpec.Name, FuncDecl.Name, File.Name, AssignStmt.Lhs*** |
| Reference | foo in Ident.Name |
| Package | foo.bar/baz in Ident.Path |
* Field.Names - all names are applied to the Field
** ValueSpec.Names - all names are applied to the ValueSpec node, and each name is applied to it's corresponding Expr node in Values
*** AssignStmt.Lhs - only when AssignStmt.Tok == token.DEFINE, all names are applied to the AssignStmt node, and each name is applied to it's corresponding Expr node in Rhs
| Implemented | Selector | Example | Example description |
|---|---|---|---|
| ☐ | .field |
.Fun |
Selects all child nodes in the field Fun |
| ☐ | #name |
#main |
Selects all nodes that define the name main |
| ☐ | node |
CallExpr |
Selects all CallExpr nodes |
| ☐ | interface |
Expr |
Selects all nodes that satisfy the Expr interface |
| ☐ | node,node |
CallExpr, Ident |
Selects all CallExpr nodes and all Ident nodes |
| ☐ | node node |
CallExpr Ident |
Selects all Ident nodes inside CallExpr nodes |
| ☐ | node>node |
CallExpr > Ident |
Selects all Ident nodes where the parent is a CallExpr node |
func main() {
foo, bar := 1 + 1, 2 + 2
}
type T struct {
i, j int
}FuncDecl#main Expr#foo BinaryExpr -> 1 + 1
#T #i.Type -> int
| Proposed | Implemented | Selector | Example | Example description |
|---|---|---|---|---|
| ☒ | ☐ | .class |
.intro |
Selects all elements with class="intro" |
| ☒ | ☐ | #id |
#firstname |
Selects the element with id="firstname" |
| ☐ | ☐ | * |
* |
Selects all elements |
| ☒ | ☐ | element |
p |
Selects all <p> elements |
| ☒ | ☐ | element,element |
div, p |
Selects all <div> elements and all <p> elements |
| ☒ | ☐ | element element |
div p |
Selects all <p> elements inside <div> elements |
| ☒ | ☐ | element>element |
div > p |
Selects all <p> elements where the parent is a <div> element |
| ☐ | ☐ | element+element |
div + p |
Selects all <p> elements that are placed immediately after <div> elements |
| ☐ | ☐ | element1~element2 |
p ~ ul |
Selects every <ul> element that are preceded by a <p> element |
| ☐ | ☐ | [attribute] |
[target] |
Selects all elements with a target attribute |
| ☐ | ☐ | [attribute=value] |
[target=_blank] |
Selects all elements with target="_blank" |
| ☐ | ☐ | [attribute~=value] |
[title~=flower] |
Selects all elements with a title attribute containing the word "flower" |
| ☐ | ☐ | `[attribute | =value]` | `[lang |
| ☐ | ☐ | [attribute^=value] |
a[href^="https"] |
Selects every <a> element whose href attribute value begins with "https" |
| ☐ | ☐ | [attribute$=value] |
a[href$=".pdf"] |
Selects every <a> element whose href attribute value ends with ".pdf" |
| ☐ | ☐ | [attribute*=value] |
a[href*="w3schools"] |
Selects every <a> element whose href attribute value contains the substring "w3schools" |
| ☐ | ☐ | :active |
a:active |
Selects the active link |
| ☐ | ☐ | ::after |
p::after |
Insert something after the content of each <p> element |
| ☐ | ☐ | ::before |
p::before |
Insert something before the content of each <p> element |
| ☐ | ☐ | :checked |
input:checked |
Selects every checked <input> element |
| ☐ | ☐ | :default |
input:default |
Selects the default <input> element |
| ☐ | ☐ | :disabled |
input:disabled |
Selects every disabled <input> element |
| ☐ | ☐ | :empty |
p:empty |
Selects every <p> element that has no children (including text nodes) |
| ☐ | ☐ | :enabled |
input:enabled |
Selects every enabled <input> element |
| ☐ | ☐ | :first-child |
p:first-child |
Selects every <p> element that is the first child of its parent |
| ☐ | ☐ | ::first-letter |
p::first-letter |
Selects the first letter of every <p> element |
| ☐ | ☐ | ::first-line |
p::first-line |
Selects the first line of every <p> element |
| ☐ | ☐ | :first-of-type |
p:first-of-type |
Selects every <p> element that is the first <p> element of its parent |
| ☐ | ☐ | :focus |
input:focus |
Selects the input element which has focus |
| ☐ | ☐ | :hover |
a:hover |
Selects links on mouse over |
| ☐ | ☐ | :in-range |
input:in-range |
Selects input elements with a value within a specified range |
| ☐ | ☐ | :indeterminate |
input:indeterminate |
Selects input elements that are in an indeterminate state |
| ☐ | ☐ | :invalid |
input:invalid |
Selects all input elements with an invalid value |
| ☐ | ☐ | :lang(language) |
p:lang(it) |
Selects every <p> element with a lang attribute equal to "it" (Italian) |
| ☐ | ☐ | :last-child |
p:last-child |
Selects every <p> element that is the last child of its parent |
| ☐ | ☐ | :last-of-type |
p:last-of-type |
Selects every <p> element that is the last <p> element of its parent |
| ☐ | ☐ | :link |
a:link |
Selects all unvisited links |
| ☐ | ☐ | :not(selector) |
:not(p) |
Selects every element that is not a <p> element |
| ☐ | ☐ | :nth-child(n) |
p:nth-child(2) |
Selects every <p> element that is the second child of its parent |
| ☐ | ☐ | :nth-last-child(n) |
p:nth-last-child(2) |
Selects every <p> element that is the second child of its parent, counting from the last child |
| ☐ | ☐ | :nth-last-of-type(n) |
p:nth-last-of-type(2) |
Selects every <p> element that is the second <p> element of its parent, counting from the last child |
| ☐ | ☐ | :nth-of-type(n) |
p:nth-of-type(2) |
Selects every <p> element that is the second <p> element of its parent |
| ☐ | ☐ | :only-of-type |
p:only-of-type |
Selects every <p> element that is the only <p> element of its parent |
| ☐ | ☐ | :only-child |
p:only-child |
Selects every <p> element that is the only child of its parent |
| ☐ | ☐ | :optional |
input:optional |
Selects input elements with no "required" attribute |
| ☐ | ☐ | :out-of-range |
input:out-of-range |
Selects input elements with a value outside a specified range |
| ☐ | ☐ | ::placeholder |
input::placeholder |
Selects input elements with placeholder text |
| ☐ | ☐ | :read-only |
input:read-only |
Selects input elements with the "readonly" attribute specified |
| ☐ | ☐ | :read-write |
input:read-write |
Selects input elements with the "readonly" attribute NOT specified |
| ☐ | ☐ | :required |
input:required |
Selects input elements with the "required" attribute specified |
| ☐ | ☐ | :root |
:root |
Selects the document's root element |
| ☐ | ☐ | ::selection |
::selection |
Selects the portion of an element that is selected by a user |
| ☐ | ☐ | :target |
#news:target |
Selects the current active #news element (clicked on a URL containing that anchor name) |
| ☐ | ☐ | :valid |
input:valid |
Selects all input elements with a valid value |
| ☐ | ☐ | :visited |
a:visited |
Selects all visited links |