| ▲ | CSS as a Query Language(evdc.me) |
| 45 points by evnc 4 hours ago | 16 comments |
| |
|
| ▲ | k1m 3 hours ago | parent | next [-] |
| I find CSS selectors a lot easier to write than XPath. I recently gave a talk on how PHP's new DOM API makes working with HTML and CSS selectors natively very easy (previously you had to convert CSS to XPath).[1] It's a shame that because CSS is still primarily for browser use and styling, we don't get nice things like the ability to select based on text content like we can with XPath. My understanding is that this was proposed but didn't make it into the spec because it could lead to performance issues in a browser rendering context. [1] https://speakerdeck.com/keyvan/parsing-html-with-php-8-dot-4... |
| |
| ▲ | zerocrates 3 hours ago | parent [-] | | Yeah, querySelector/querySelectorAll are totally widespread in client-side, it's nice to finally have them in PHP's newer DOM. Definitely what people are used to doing. | | |
|
|
| ▲ | spookylukey 2 hours ago | parent | prev | next [-] |
| The project pyastgrep https://pyastgrep.readthedocs.io/en/latest/ can use CSS selectors as a query language for Python syntax (default is XPath). e.g.: pyastgrep --css 'Call > func > Name#main' |
| |
| ▲ | evnc 2 hours ago | parent [-] | | oh this is neat! Feels like exactly the sort of thing I was gesturing towards. Thanks :) |
|
|
| ▲ | duncanfwalker 3 hours ago | parent | prev | next [-] |
| Reminds me of seeing this presented at a conference years ago
https://github.com/braposo/graphql-css It was a joke but I really like the way it pointed out how we copy and reapply patterns in different contexts and that might enable unexpected things. |
| |
| ▲ | evnc 2 hours ago | parent [-] | | oh this is fun > we copy and reapply patterns in different contexts and that might enable unexpected things yeah, that's exactly what I am trying to do here. Mostly it doesn't go anywhere, but it's interesting for the hacker spirit within me :) |
|
|
| ▲ | efortis 3 hours ago | parent | prev | next [-] |
| Not sure I follow the scenario this would solve. For instance, currently you can conditionally change a parent based on its children. For example, this `pre` could either have 16px or 0px of padding. Zero when its direct child is a `code` element. pre {
padding: 16px;
&:has(> code) {
padding: 0;
}
}
|
| |
| ▲ | evnc 2 hours ago | parent | next [-] | | tbh, this started as a connection of two disparate ideas ("hey, this thing looks like this other thing"), and then just kind of explores it in different directions. I think the conclusion (which I may not have made clear enough) is less like "These are limitations of modern CSS which ought to be fixed" and more "Maybe a CSS-like syntax could be added to a Datalog-like system and that would be helpful for making it more accessible to more engineers, navigating tree-shaped data, etc" thanks for the feedback, anyway! | |
| ▲ | tadfisher 3 hours ago | parent | prev [-] | | The article describes a syntax for modifying the underlying data (adding new child elements or attributes to the DOM) for matching selectors, not resolving style changes in a single pass like you've shown. | | |
| ▲ | capitainenemo 2 hours ago | parent [-] | | I suspect they are replying to this part of the article:
"What you actually want to say is: “an element is effectively-dark if it has data-theme=”dark”, or if it has an effectively-dark ancestor with no effectively-light ancestor in between.” That’s a recursive relational definition. CSS cannot express it. CSSLog can:" The entire article doesn't seem to mention the existence of :has() which is rather surprising given how recently it was written. Not even in the footnotes. |
|
|
|
| ▲ | lostinplace 34 minutes ago | parent | prev | next [-] |
| Ummm... Isn't that just JQ? |
|
| ▲ | shevy-java an hour ago | parent | prev | next [-] |
| Hmmm. I kind of like CSS but I hate the creep-up of complexity. It's not that I don't understand the rationale - any programming
language offers more power than a non-programming language. But
I'd rather think here that something else could instead replace
all of HTML, CSS and JavaScript, rather than constantly wanting
to make everything more complex. I don't use most of the new
elements in HTML5, largely because I don't see the point in
using specialized tags for micro-describing a webpage. I succumbed
to the "it is a div-HTML tag and it has a unique ID"; that's what
I think mots of those containers actually really are. I even wanted
to have aliases to such IDs, simply to use as navigational href
intralink. [data-theme="dark"] [data-theme="light"] :focus {
outline-color: black;
}
And I also don't like this. It takes my brain too long
to process all of that. It is no longer elegant and simple.On the other hand: h2 {
color: red;
}
That is still simple. So ancestor(X, Y) :- parent(X, Y). means: “For all possible values of X and Y, X
is an ancestor of Y, if X is a parent of Y.”
See - I already don't want to have to think in such terms. What is the :- anyway, looks like a smiley. @container style(--theme: dark) {
.card { background: royalblue; color: white; }
}
I stopped there.I think this is a problem with CSS - too many people are
ruining it. It is strange to see how standards that used
to work, are degraded over time. |
| |
| ▲ | evnc an hour ago | parent [-] | | yeah I mean, to be clear, I'm less proposing "What if we add even more syntax and semantics to CSS" and more "what if we steal ideas from CSS, notice their similarity to logic / relational query languages, and use them to build something new". I probably could have articulated some of this better. eg this example: [data-theme="dark"] [data-theme="light"] :focus {
outline-color: black;
}
means, in English/pseudocode, roughly: "If you have an element X with attribute data-theme="dark", and X has a child Y with attribute data-theme="light", and Y is focused, then the outline-color of Y is black".so we could write this also as, e.g.: outline-color(Y, black) if
data-theme(X, "dark") and
parent(X, Y) and
data-theme(Y, "light") and
focused(Y)
that's Datalog, except I went ahead and replaced :- with "if" and "," with "and".if we want even more syntax sugar, we could do: Y.outline_color := black if
X.data-theme == dark and
Y.parent == X and
Y.data-theme == dark and
Y.focused
imagine `X.attr == val` <==> `attr(X, val)` as a kind of UFCS for Datalog to make it palatable to Regular Programmers, rightthe declaration and scope of these variables is implicit here; if you want something even more ALGOL-family, we could write forall Y {
Y.outline_color := black if
Y.data_theme == "dark" and
Y.focused and
Y.parent.data_theme == "light"
}
here we've explicitly introduced Y, and made one of our joins implicit, and it looks even more like Regular Programming now, except the Datalog engine (or equivalent) is kind of running all these loops for you, every time one of their dependencies changes, in an efficient way ... | | |
| ▲ | evnc 31 minutes ago | parent [-] | | one more, for completeness: SELECT 'black' AS outline_color
FROM elements parent
JOIN elements child ON parent.id = child.parent_id
WHERE parent.data_theme = 'light'
AND child.data_theme = 'dark'
AND child.focused = true
there's a lot of ways to express the same thing! it's interesting to notice the connections between them, I think, and their strengths and weaknesses, e.g. I probably wouldn't want to write my whole design system in SQL, but since it's relational queries over the elements structure and properties, you could. |
|
|
|
| ▲ | securityTalent 2 hours ago | parent | prev [-] |
| Nice |