OpenTermsArchive / engine

Tracks contractual documents and exposes changes to the terms of online services.
https://opentermsarchive.org
European Union Public License 1.2
111 stars 30 forks source link

Support `:has()` pseudo-selector #1106

Open MattiSG opened 1 week ago

MattiSG commented 1 week ago

For some complex documents layout, the :has() CSS4 relational selector can prove very useful. However, using it in a declaration yields the following error:

Extract failed: unknown pseudo-class selector ':has(>[name=contact-points-for-competent-authorities-in-eu-countries]'

From the following tentative declaration:

```json { "name": "Telegram", "documents": { "Privacy Policy": { "fetch": "https://telegram.org/privacy", "select": ".tl_page_container" }, "Terms of Service": { "fetch": "https://telegram.org/tos", "select": ".tl_page_container" }, "Developer Terms": { "fetch": "https://core.telegram.org/api/terms", "select": "#dev_page_content_wrap", "remove": ".breadcrumb" }, "Imprint": { "fetch": "https://telegram.org/faq?setln=en", "select": [ { "startBefore": "h4:has(> [name=q-who-are-the-people-behind-telegram])", "endBefore": "h4:has(> [name=q-who-are-the-people-behind-telegram]) + h4" }, { "startBefore": "h4:has(> [name=q-where-is-telegram-based])", "endBefore": "h4:has(> [name=q-where-is-telegram-based]) + h4" } ] }, "Vulnerability Disclosure Policy": { "fetch": "https://core.telegram.org/bug-bounty", "select": ".dev_page" }, "Community Guidelines": { "fetch": "https://telegram.org/tos/eu-dsa?setln=en", "select": ".tl_page_container", "remove": [ { "startBefore": "h4:has(> [name=contact-points-for-competent-authorities-in-eu-countries])", "endBefore": "h4:has(> [name=contact-points-for-competent-authorities-in-eu-countries]) + h4" }, { "startBefore": "h4:has(> [name=average-monthly-active-recipients-of-service-in-the-eu])", "endBefore": "h4:has(> [name=average-monthly-active-recipients-of-service-in-the-eu]) + h4" } ] }, "Law Enforcement Guidelines": { "combine": [ { "fetch": "https://telegram.org/tos/eu-dsa?setln=en", "select": [ { "startBefore": "h4:has(> [name=contact-points-for-competent-authorities-in-eu-countries]", "endBefore": "h4:has(> [name=contact-points-for-competent-authorities-in-eu-countries]) + h4" } ] }, { "fetch": "https://telegram.org/faq?setln=en", "select": [ { "startBefore": "h4:has(> [name=q-do-you-process-data-requests])", "endBefore": "h4:has(> [name=q-do-you-process-data-requests]) + h4" } ] } ] }, "Copyright Claims Policy": { "fetch": "https://telegram.org/faq?setln=en", "select": [ { "startBefore": "h4:has(> [name=q-a-bot-or-channel-is-infringing-on-my-copyright-what-do-i-do])", "endBefore": "h4:has(> [name=q-a-bot-or-channel-is-infringing-on-my-copyright-what-do-i-do]) + h4" } ] }, "Single Sign-On Policy": { "fetch": "https://telegram.org/faq?setln=en", "select": [ { "startBefore": "h4:has(> [name=passport])", "endBefore": "h4:has(> [name=passport]) + h4" } ] }, "Complaints Policy": { "fetch": "https://telegram.org/faq?setln=en", "select": [ { "startBefore": "h4:has(> [name=q-do-you-process-take-down-requests-from-third-parties])", "endBefore": "h4:has(> [name=q-do-you-process-take-down-requests-from-third-parties]) + h4" } ] } } } ```