@gkd-kit/docs 0.0.1712589933696 → 0.0.1712590077974

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/.vitepress/dist/404.html +4 -4
  2. package/.vitepress/dist/api/index.html +7 -7
  3. package/.vitepress/dist/api/interfaces/RawApp.html +7 -7
  4. package/.vitepress/dist/api/interfaces/RawAppGroup.html +9 -9
  5. package/.vitepress/dist/api/interfaces/RawAppRule.html +9 -9
  6. package/.vitepress/dist/api/interfaces/RawAppRuleProps.html +7 -7
  7. package/.vitepress/dist/api/interfaces/RawCategory.html +8 -8
  8. package/.vitepress/dist/api/interfaces/RawCommonProps.html +9 -9
  9. package/.vitepress/dist/api/interfaces/RawGlobalApp.html +7 -7
  10. package/.vitepress/dist/api/interfaces/RawGlobalGroup.html +9 -9
  11. package/.vitepress/dist/api/interfaces/RawGlobalRule.html +10 -10
  12. package/.vitepress/dist/api/interfaces/RawGlobalRuleProps.html +7 -7
  13. package/.vitepress/dist/api/interfaces/RawGroupProps.html +9 -9
  14. package/.vitepress/dist/api/interfaces/RawRuleProps.html +9 -9
  15. package/.vitepress/dist/api/interfaces/RawSubscription.html +7 -7
  16. package/.vitepress/dist/api/type-aliases/IArray.html +7 -7
  17. package/.vitepress/dist/api/type-aliases/Integer.html +7 -7
  18. package/.vitepress/dist/api/type-aliases/Position.html +7 -7
  19. package/.vitepress/dist/assets/{api_interfaces_RawAppGroup.md.Bo2sL2Zf.js → api_interfaces_RawAppGroup.md.nX0G82BC.js} +2 -2
  20. package/.vitepress/dist/assets/{api_interfaces_RawAppGroup.md.Bo2sL2Zf.lean.js → api_interfaces_RawAppGroup.md.nX0G82BC.lean.js} +1 -1
  21. package/.vitepress/dist/assets/api_interfaces_RawAppRule.md.BPv2zRDa.js +1 -0
  22. package/.vitepress/dist/assets/api_interfaces_RawAppRule.md.BPv2zRDa.lean.js +1 -0
  23. package/.vitepress/dist/assets/{api_interfaces_RawCategory.md.psJBk0ms.js → api_interfaces_RawCategory.md.DK1yDPGA.js} +1 -1
  24. package/.vitepress/dist/assets/{api_interfaces_RawCategory.md.psJBk0ms.lean.js → api_interfaces_RawCategory.md.DK1yDPGA.lean.js} +1 -1
  25. package/.vitepress/dist/assets/{api_interfaces_RawCommonProps.md.BOv3Yx6D.js → api_interfaces_RawCommonProps.md.c_LLCWlK.js} +2 -2
  26. package/.vitepress/dist/assets/{api_interfaces_RawCommonProps.md.BOv3Yx6D.lean.js → api_interfaces_RawCommonProps.md.c_LLCWlK.lean.js} +1 -1
  27. package/.vitepress/dist/assets/{api_interfaces_RawGlobalGroup.md.CxETt-IX.js → api_interfaces_RawGlobalGroup.md.B4o6m4az.js} +2 -2
  28. package/.vitepress/dist/assets/{api_interfaces_RawGlobalGroup.md.CxETt-IX.lean.js → api_interfaces_RawGlobalGroup.md.B4o6m4az.lean.js} +1 -1
  29. package/.vitepress/dist/assets/api_interfaces_RawGlobalRule.md.Dg3YMeTm.js +1 -0
  30. package/.vitepress/dist/assets/{api_interfaces_RawGlobalRule.md.K7xnq5lZ.lean.js → api_interfaces_RawGlobalRule.md.Dg3YMeTm.lean.js} +1 -1
  31. package/.vitepress/dist/assets/{api_interfaces_RawGroupProps.md.CKrmfUDM.js → api_interfaces_RawGroupProps.md.DhOnPYHR.js} +2 -2
  32. package/.vitepress/dist/assets/{api_interfaces_RawGroupProps.md.CKrmfUDM.lean.js → api_interfaces_RawGroupProps.md.DhOnPYHR.lean.js} +1 -1
  33. package/.vitepress/dist/assets/api_interfaces_RawRuleProps.md.BUiz9Dp-.js +1 -0
  34. package/.vitepress/dist/assets/api_interfaces_RawRuleProps.md.BUiz9Dp-.lean.js +1 -0
  35. package/.vitepress/dist/assets/{app.isHrDGYm.js → app.C9H9sb0y.js} +1 -1
  36. package/.vitepress/dist/assets/chunks/@localSearchIndexroot.BBNQ6Sy5.js +1 -0
  37. package/.vitepress/dist/assets/chunks/{VPLocalSearchBox.DySba6hR.js → VPLocalSearchBox.DX5vvfvx.js} +2 -2
  38. package/.vitepress/dist/assets/chunks/{theme.D1mwCZPr.js → theme.DcasFoF1.js} +1 -1
  39. package/.vitepress/dist/assets/{faq_index.md.Dh42oLEK.js → faq_index.md.uOgR2pYy.js} +1 -1
  40. package/.vitepress/dist/assets/{faq_index.md.Dh42oLEK.lean.js → faq_index.md.uOgR2pYy.lean.js} +1 -1
  41. package/.vitepress/dist/assets/{guide_index.md.CHrOMi1R.js → guide_index.md.CavA236s.js} +1 -1
  42. package/.vitepress/dist/assets/{guide_index.md.CHrOMi1R.lean.js → guide_index.md.CavA236s.lean.js} +1 -1
  43. package/.vitepress/dist/assets/{index.md.DNHAIuob.js → index.md.DlE8g58f.js} +1 -1
  44. package/.vitepress/dist/assets/{index.md.DNHAIuob.lean.js → index.md.DlE8g58f.lean.js} +1 -1
  45. package/.vitepress/dist/assets/{selector_index.md.HTLTYpYj.js → selector_index.md.qyBCvjhM.js} +1 -1
  46. package/.vitepress/dist/assets/{selector_index.md.HTLTYpYj.lean.js → selector_index.md.qyBCvjhM.lean.js} +1 -1
  47. package/.vitepress/dist/assets/style.D-Wlrp80.css +1 -1
  48. package/.vitepress/dist/assets/{subscription_index.md.B7A1WsXV.js → subscription_index.md.DOqrMFT_.js} +1 -1
  49. package/.vitepress/dist/assets/{subscription_index.md.B7A1WsXV.lean.js → subscription_index.md.DOqrMFT_.lean.js} +1 -1
  50. package/.vitepress/dist/faq/index.html +8 -8
  51. package/.vitepress/dist/guide/index.html +8 -8
  52. package/.vitepress/dist/hashmap.json +1 -1
  53. package/.vitepress/dist/index.html +7 -7
  54. package/.vitepress/dist/selector/index.html +8 -8
  55. package/.vitepress/dist/subscription/index.html +8 -8
  56. package/package.json +1 -1
  57. package/.vitepress/dist/assets/api_interfaces_RawAppRule.md.q-PROiVC.js +0 -1
  58. package/.vitepress/dist/assets/api_interfaces_RawAppRule.md.q-PROiVC.lean.js +0 -1
  59. package/.vitepress/dist/assets/api_interfaces_RawGlobalRule.md.K7xnq5lZ.js +0 -1
  60. package/.vitepress/dist/assets/api_interfaces_RawRuleProps.md.DGOKgjP5.js +0 -1
  61. package/.vitepress/dist/assets/api_interfaces_RawRuleProps.md.DGOKgjP5.lean.js +0 -1
  62. package/.vitepress/dist/assets/chunks/@localSearchIndexroot.B0W6cM3u.js +0 -1
@@ -6,20 +6,20 @@
6
6
  <title>高级选择器 | GKD</title>
7
7
  <meta name="description" content="自定义屏幕点击应用">
8
8
  <meta name="generator" content="VitePress v1.0.2">
9
- <link rel="preload stylesheet" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712589933696/files/.vitepress/dist/assets/style.D-Wlrp80.css" as="style">
9
+ <link rel="preload stylesheet" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712590077974/files/.vitepress/dist/assets/style.D-Wlrp80.css" as="style">
10
10
 
11
- <script type="module" src="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712589933696/files/.vitepress/dist/assets/app.isHrDGYm.js"></script>
12
- <link rel="preload" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712589933696/files/.vitepress/dist/assets/inter-roman-latin.Bu8hRsVA.woff2" as="font" type="font/woff2" crossorigin>
13
- <link rel="modulepreload" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712589933696/files/.vitepress/dist/assets/chunks/framework.Bcl8tzUy.js">
14
- <link rel="modulepreload" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712589933696/files/.vitepress/dist/assets/chunks/theme.D1mwCZPr.js">
15
- <link rel="modulepreload" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712589933696/files/.vitepress/dist/assets/selector_index.md.HTLTYpYj.lean.js">
11
+ <script type="module" src="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712590077974/files/.vitepress/dist/assets/app.C9H9sb0y.js"></script>
12
+ <link rel="preload" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712590077974/files/.vitepress/dist/assets/inter-roman-latin.Bu8hRsVA.woff2" as="font" type="font/woff2" crossorigin>
13
+ <link rel="modulepreload" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712590077974/files/.vitepress/dist/assets/chunks/framework.Bcl8tzUy.js">
14
+ <link rel="modulepreload" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712590077974/files/.vitepress/dist/assets/chunks/theme.DcasFoF1.js">
15
+ <link rel="modulepreload" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712590077974/files/.vitepress/dist/assets/selector_index.md.qyBCvjhM.lean.js">
16
16
  <link rel="icon" type="image/svg+xml" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1706371840771/files/.vitepress/dist/logo.svg">
17
17
  <script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
18
18
  <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
19
19
  </head>
20
20
  <body>
21
- <div id="app"><div class="Layout" data-v-d0085ce6><!--[--><!--]--><!--[--><span tabindex="-1" data-v-d3aadc39></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-d3aadc39> Skip to content </a><!--]--><!----><header class="VPNav" data-v-d0085ce6 data-v-5ec5ca5c><div class="VPNavBar has-sidebar top" data-v-5ec5ca5c data-v-39e7f2a9><div class="wrapper" data-v-39e7f2a9><div class="container" data-v-39e7f2a9><div class="title" data-v-39e7f2a9><div class="VPNavBarTitle has-sidebar" data-v-39e7f2a9 data-v-d50d1d75><a class="title" href="/" data-v-d50d1d75><!--[--><!--]--><!--[--><img class="VPImage logo" src="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1706371840771/files/.vitepress/dist/logo.svg" alt data-v-e09d8138><!--]--><span data-v-d50d1d75>GKD</span><!--[--><!--]--></a></div></div><div class="content" data-v-39e7f2a9><div class="content-body" data-v-39e7f2a9><!--[--><!--]--><div class="VPNavBarSearch search" data-v-39e7f2a9><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-39e7f2a9 data-v-1693b6ce><span id="main-nav-aria-label" class="visually-hidden" data-v-1693b6ce>Main Navigation</span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/" tabindex="0" data-v-1693b6ce data-v-d477abf7><!--[--><span data-v-d477abf7>首页</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/api/" tabindex="0" data-v-1693b6ce data-v-d477abf7><!--[--><span data-v-d477abf7>API</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-39e7f2a9 data-v-a237e58e><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="Switch to dark theme" aria-checked="false" data-v-a237e58e data-v-9440a62d data-v-77bcae13><span class="check" data-v-77bcae13><span class="icon" data-v-77bcae13><!--[--><span class="vpi-sun sun" data-v-9440a62d></span><span class="vpi-moon moon" data-v-9440a62d></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-39e7f2a9 data-v-c2784eac data-v-76ae07fa><!--[--><a class="VPSocialLink no-icon" href="https://github.com/gkd-kit" aria-label="github" target="_blank" rel="noopener" data-v-76ae07fa data-v-d10fa6ef><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-39e7f2a9 data-v-f4289192 data-v-fa7e0d62><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-fa7e0d62><span class="vpi-more-horizontal icon" data-v-fa7e0d62></span></button><div class="menu" data-v-fa7e0d62><div class="VPMenu" data-v-fa7e0d62 data-v-c22257eb><!----><!--[--><!--[--><!----><div class="group" data-v-f4289192><div class="item appearance" data-v-f4289192><p class="label" data-v-f4289192>外观</p><div class="appearance-action" data-v-f4289192><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="Switch to dark theme" aria-checked="false" data-v-f4289192 data-v-9440a62d data-v-77bcae13><span class="check" data-v-77bcae13><span class="icon" data-v-77bcae13><!--[--><span class="vpi-sun sun" data-v-9440a62d></span><span class="vpi-moon moon" data-v-9440a62d></span><!--]--></span></span></button></div></div></div><div class="group" data-v-f4289192><div class="item social-links" data-v-f4289192><div class="VPSocialLinks social-links-list" data-v-f4289192 data-v-76ae07fa><!--[--><a class="VPSocialLink no-icon" href="https://github.com/gkd-kit" aria-label="github" target="_blank" rel="noopener" data-v-76ae07fa data-v-d10fa6ef><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-39e7f2a9 data-v-1a7dd30b><span class="container" data-v-1a7dd30b><span class="top" data-v-1a7dd30b></span><span class="middle" data-v-1a7dd30b></span><span class="bottom" data-v-1a7dd30b></span></span></button></div></div></div></div><div class="divider" data-v-39e7f2a9><div class="divider-line" data-v-39e7f2a9></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-d0085ce6 data-v-8c6e8cff><div class="container" data-v-8c6e8cff><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-8c6e8cff><span class="vpi-align-left menu-icon" data-v-8c6e8cff></span><span class="menu-text" data-v-8c6e8cff>归档</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-8c6e8cff data-v-2fd582e7><button data-v-2fd582e7>返回顶部</button><!----></div></div></div><aside class="VPSidebar" data-v-d0085ce6 data-v-d0dd6ccf><div class="curtain" data-v-d0dd6ccf></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-d0dd6ccf><span class="visually-hidden" id="sidebar-aria-label" data-v-d0dd6ccf> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="group" data-v-d0dd6ccf><section class="VPSidebarItem level-0 has-active" data-v-d0dd6ccf data-v-e8aee483><div class="item" role="button" tabindex="0" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><h2 class="text" data-v-e8aee483>指引</h2><!----></div><div class="items" data-v-e8aee483><!--[--><div class="VPSidebarItem level-1 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/guide/" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>开始使用</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/selector/" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>高级选择器</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/subscription/" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>订阅规则</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/faq/" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>疑难解答</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-d0dd6ccf><section class="VPSidebarItem level-0 collapsible collapsed is-link" data-v-d0dd6ccf data-v-e8aee483><div class="item" tabindex="0" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/" data-v-e8aee483><!--[--><h2 class="text" data-v-e8aee483>API</h2><!--]--></a><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e8aee483><span class="vpi-chevron-right caret-icon" data-v-e8aee483></span></div></div><div class="items" data-v-e8aee483><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-e8aee483><div class="item" role="button" tabindex="0" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><h3 class="text" data-v-e8aee483>Interfaces</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e8aee483><span class="vpi-chevron-right caret-icon" data-v-e8aee483></span></div></div><div class="items" data-v-e8aee483><!--[--><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawSubscription.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawSubscription</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawApp.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawApp</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawGlobalGroup.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawGlobalGroup</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawCategory.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawCategory</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawAppRule.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawAppRule</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawAppGroup.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawAppGroup</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawGlobalRule.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawGlobalRule</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawGlobalApp.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawGlobalApp</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawCommonProps.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawCommonProps</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawRuleProps.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawRuleProps</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawGroupProps.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawGroupProps</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawAppRuleProps.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawAppRuleProps</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawGlobalRuleProps.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawGlobalRuleProps</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-e8aee483><div class="item" role="button" tabindex="0" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><h3 class="text" data-v-e8aee483>Type Aliases</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e8aee483><span class="vpi-chevron-right caret-icon" data-v-e8aee483></span></div></div><div class="items" data-v-e8aee483><!--[--><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/type-aliases/Position.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>Position</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/type-aliases/IArray.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>IArray</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/type-aliases/Integer.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>Integer</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-d0085ce6 data-v-7613fc8b><div class="VPDoc has-sidebar has-aside" data-v-7613fc8b data-v-e201152b><!--[--><!--]--><div class="container" data-v-e201152b><div class="aside" data-v-e201152b><div class="aside-curtain" data-v-e201152b></div><div class="aside-container" data-v-e201152b><div class="aside-content" data-v-e201152b><div class="VPDocAside" data-v-e201152b data-v-a0201846><!--[--><!--]--><!--[--><!--]--><div class="VPDocAsideOutline" role="navigation" data-v-a0201846 data-v-08a513a1><div class="content" data-v-08a513a1><div class="outline-marker" data-v-08a513a1></div><div class="outline-title" role="heading" aria-level="2" data-v-08a513a1>导航栏</div><nav aria-labelledby="doc-outline-aria-label" data-v-08a513a1><span class="visually-hidden" id="doc-outline-aria-label" data-v-08a513a1> Table of Contents for current page </span><ul class="VPDocOutlineItem root" data-v-08a513a1 data-v-6ae2edf2><!--[--><!--]--></ul></nav></div></div><!--[--><!--]--><div class="spacer" data-v-a0201846></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e201152b><div class="content-container" data-v-e201152b><!--[--><!--]--><main class="main" data-v-e201152b><div style="position:relative;" class="vp-doc _selector_" data-v-e201152b><div><h1 id="title" tabindex="-1">高级选择器 <a class="header-anchor" href="#title" aria-label="Permalink to &quot;高级选择器 {#title}&quot;">​</a></h1><p>一个类似 CSS 选择器的高级选择器, 能联系节点上下文信息, 更容易也更精确找到目标节点</p><h2 id="why" tabindex="-1">为什么需要选择器 <a class="header-anchor" href="#why" aria-label="Permalink to &quot;为什么需要选择器 {#why}&quot;">​</a></h2><p>我们的目的是查询获取屏幕上的某个节点, 最简单的情况下, 目标节点已经有唯一的 id/text 标识</p><p>这时只需要配置 id/text 就能简单执行点击, 但实际情况很多节点都缺失了这些信息, 无法简单查询获取</p><p>节点还存在很多额外信息没有被利用到, 节点所有属性可以在 <a href="https://i.gkd.li/i/14045424" target="_blank" rel="noreferrer">快照-14045424</a> 的属性面板看到</p><p>另一种常见的情况是节点没有有效属性, 这时我们需要根据周围的节点去定位</p><p>选择器就是为了解决这些问题而开发的, 下面是对选择器的详细介绍</p><h2 id="syntax" tabindex="-1">语法 <a class="header-anchor" href="#syntax" aria-label="Permalink to &quot;语法 {#syntax}&quot;">​</a></h2><p>与 CSS 类似, 一个选择器由 属性选择器 和 关系选择器 交叉组成, 并且开头末尾必须是 属性选择器</p><p>示例 <code>div > img</code> 的结构是 <code>属性选择器 关系选择器 属性选择器</code>, 它表示选择父节点是 <code>div</code> 的 <code>img</code> 节点, 这与 <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/Child_combinator" target="_blank" rel="noreferrer">相同 CSS 语法</a> 语义一致</p><p>另外 属性选择器 和 关系选择器 之间必须<strong>强制</strong>用 空白字符(空格/换行/回车/制表) 隔开</p><p>即 <code>div>img</code> 非法, 必须写成 <code>div > img</code></p><p>下面分别介绍 <a href="#attr">属性选择器</a> 和 <a href="#connect">关系选择器</a></p><h2 id="attr" tabindex="-1">属性选择器 <a class="header-anchor" href="#attr" aria-label="Permalink to &quot;属性选择器 {#attr}&quot;">​</a></h2><p>它和 CSS 语法的 属性选择器很相似, 但更强大, 如下是一个示例</p><p><code>@TextView[a=1][b^='2'][c*='a'||d.length>7&&e=false]</code></p><p><code>@</code> 表示选择此节点, 一条规则最后属性选择器 <code>@</code> 生效, 如果没有 <code>@</code>, 取最后一个属性选择器</p><p><code>TextView</code> 代表节点的 name 属性, 而且与 CSS 相似, <code>*</code> 表示匹配任意属性</p><p>由于该选择器主要用于 Android 平台, 节点的 name 都是 java 类如 android.text.TextView 这种形式</p><p>为了方便书写规则, 上述 <code>TextView</code> 等价 <code>[name='TextView'||name$='.TextView']</code></p><p><code>[]</code> 内部是一个 逻辑表达式/布尔表达式</p><ul><li>逻辑表达式 -> <code>name='TextView'||name$='.TextView'</code></li><li>布尔表达式 -> <code>name='TextView'</code></li></ul><p>逻辑表达式 有两个操作符 <code>||</code> 和 <code>&&</code>. <code>&&</code> 优先级更高, 即 <code>[a>1||b>1&&c>1||d>1]</code> 等价于 <code>[a>1||(b>1&&c>1)||d>1]</code></p><p>并列的 <code>[]</code> 视为使用 <code>&&</code> 的逻辑表达式, 即 <code>[a=1][b=1]</code> 等价于 <code>[a=1&&b=1]</code></p><p>布尔表达式 由 <a href="#attr-name">属性名</a> <a href="#attr-operator">操作符</a> <a href="#attr-value">值</a> 顺序构成</p><h3 id="attr-name" tabindex="-1">属性名 <a class="header-anchor" href="#attr-name" aria-label="Permalink to &quot;属性名 {#attr-name}&quot;">​</a></h3><p>正则匹配 <code>^[_a-zA-Z][a-zA-Z0-9_]*(\.[_a-zA-Z][a-zA-Z0-9_]*)*$</code> 的字符串</p><p>类似合法变量名 <code>a</code>/<code>a.length</code>, 下面可输入属性名测试否是合法</p><div class="vp-raw"><div><input placeholder="请输入属性名测试是否合法" type="text" value class="flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50"><div mt-4px class="color-red opacity-0">非法属性名❌</div></div></div><h3 id="attr-operator" tabindex="-1">操作符 <a class="header-anchor" href="#attr-operator" aria-label="Permalink to &quot;操作符 {#attr-operator}&quot;">​</a></h3><table><thead><tr><th style="text-align:center;">操作符</th><th style="text-align:center;">名称</th><th style="text-align:center;">说明</th></tr></thead><tbody><tr><td style="text-align:center;">=</td><td style="text-align:center;">equal</td><td style="text-align:center;"></td></tr><tr><td style="text-align:center;">!=</td><td style="text-align:center;">notEqual</td><td style="text-align:center;"></td></tr><tr><td style="text-align:center;">></td><td style="text-align:center;">more</td><td style="text-align:center;"></td></tr><tr><td style="text-align:center;">>=</td><td style="text-align:center;">moreEqual</td><td style="text-align:center;"></td></tr><tr><td style="text-align:center;"><</td><td style="text-align:center;">less</td><td style="text-align:center;"></td></tr><tr><td style="text-align:center;"><=</td><td style="text-align:center;">lessEqual</td><td style="text-align:center;"></td></tr><tr><td style="text-align:center;">^=</td><td style="text-align:center;">startsWith</td><td style="text-align:center;">以...开头</td></tr><tr><td style="text-align:center;">!^=</td><td style="text-align:center;">notStartsWith</td><td style="text-align:center;">不以...开头</td></tr><tr><td style="text-align:center;">*=</td><td style="text-align:center;">contains</td><td style="text-align:center;">包含...</td></tr><tr><td style="text-align:center;">!^=</td><td style="text-align:center;">notContains</td><td style="text-align:center;">不包含...</td></tr><tr><td style="text-align:center;">$=</td><td style="text-align:center;">endsWith</td><td style="text-align:center;">以...结尾</td></tr><tr><td style="text-align:center;">!$=</td><td style="text-align:center;">notEndsWith</td><td style="text-align:center;">不以...结尾</td></tr><tr><td style="text-align:center;">~=</td><td style="text-align:center;">matches</td><td style="text-align:center;">正则匹配...</td></tr><tr><td style="text-align:center;">!~=</td><td style="text-align:center;">notMatches</td><td style="text-align:center;">正则不匹配...</td></tr></tbody></table><p>附加说明: <code>matches</code>/<code>notMatches</code> 要求 值 必须是合法的 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html" target="_blank" rel="noreferrer">Java/Kotlin 正则表达式</a>, 否则提示语法错误</p><h3 id="attr-value" tabindex="-1">值 <a class="header-anchor" href="#attr-value" aria-label="Permalink to &quot;值 {#attr-value}&quot;">​</a></h3><p>值: 4 种类型, <code>null</code>, <code>boolean</code>, <code>string</code>, <code>int</code></p><ul><li>null</li><li>boolean 使用 <code>true</code>/<code>false</code></li><li>int 匹配 <code>^-?[0-9]$</code>, 即10进制自然数, 示例 <code>-1</code>,<code>0</code>,<code>1</code></li><li>string 使用 ' ` " 之一成对包裹, 内部字符转义使用 <code>\</code><br> 所有的转义字符示例 <code>\\</code>, <code>\'</code>, <code>\"</code>, <code>\`</code>, <code>\n</code>, <code>\r</code>, <code>\t</code>, <code>\b</code>, <code>\xfF</code>, <code>\uffFF</code><br> 不支持多行字符, 处于 <code>[0, 0x1F]</code> 的控制字符必须使用转义字符表示</li></ul><p>操作符只能使用在对应的类型的值, 比如 <code>a>''</code> 类型不匹配, 将提示 <code>非法类型</code>/<code>非法选择器</code></p><p>下面表格中 <code>-</code> 表示类型不匹配</p><table><thead><tr><th style="text-align:center;"></th><th style="text-align:center;">null</th><th style="text-align:center;">boolean</th><th style="text-align:center;">int</th><th style="text-align:center;">string</th></tr></thead><tbody><tr><td style="text-align:center;">=</td><td style="text-align:center;">✔</td><td style="text-align:center;">✔</td><td style="text-align:center;">✔</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">!=</td><td style="text-align:center;">✔</td><td style="text-align:center;">✔</td><td style="text-align:center;">✔</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">></td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td><td style="text-align:center;">-</td></tr><tr><td style="text-align:center;">>=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td><td style="text-align:center;">-</td></tr><tr><td style="text-align:center;"><</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td><td style="text-align:center;">-</td></tr><tr><td style="text-align:center;"><=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td><td style="text-align:center;">-</td></tr><tr><td style="text-align:center;">^=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">!^=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">*=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">!*=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">$=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">!$=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">~=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">!~=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td></tr></tbody></table><p>除 <code>=</code>/<code>!=</code> 以外的操作符, 当节点属性是 <code>null</code> 如 a>0 当 a 是 <code>null</code> 时返回 <code>false</code></p><h2 id="connect" tabindex="-1">关系选择器 <a class="header-anchor" href="#connect" aria-label="Permalink to &quot;关系选择器 {#connect}&quot;">​</a></h2><p>关系选择器 由 关系操作符 和 关系表达式 构成, 用于连接两个属性选择器</p><p>简单示例: <code>div > a</code>, 它 表示/约束 两个节点之间的关系, 下面介绍 <a href="#connect-operator">关系操作符</a> 和 <a href="#connect-exp">关系表达式</a></p><h3 id="connect-exp" tabindex="-1">关系表达式 <a class="header-anchor" href="#connect-exp" aria-label="Permalink to &quot;关系表达式 {#connect-exp}&quot;">​</a></h3><p>关系表达式 表示查找节点的范围, 有两种</p><ul><li>元组表达式 <code>(a1,a2,a3,a_n)</code>, 其中 a1, a2, a3, a_n 是常量有序递增正整数, 示例 <code>(1)</code>, <code>(2,3,5)</code></li><li>多项式表达式 <code>(an+b)</code>, 其中 a 和 b 是常量整数, 它是元组表达式的另一种表示, 这个元组的数字满足集合 <code>{an+b|an+b>=1,n>=1}</code> 如果集合为空集则表达式非法<br> 当 a<=0 时, 它具有等价的元组表达式<br> 示例 <code>(-n+4)</code> 等价于 <code>(1,2,3)</code><br> 示例 <code>(-3n+10)</code> 等价于 <code>(1,4,7)</code><br> 当 a>0 时, 它表示无限的元组表达式<br> 示例 <code>(n)</code>, 它表示 <code>(1,2,3,...)</code> 一个无限的元组<br> 示例 <code>(2n-1)</code>, 它表示 <code>(1,3,5,...)</code> 一个无限的元组</li></ul><h3 id="connect-operator" tabindex="-1">关系操作符 <a class="header-anchor" href="#connect-operator" aria-label="Permalink to &quot;关系操作符 {#connect-operator}&quot;">​</a></h3><p>关系操作符 表示查找节点的方向, 有 5 种关系操作符, <code>+</code>, <code>-</code>, <code>></code>, <code><</code>, <code><<</code></p><table><thead><tr><th style="text-align:center;">操作符</th><th style="text-align:center;">名称</th><th style="text-align:center;">图例</th><th style="text-align:center;">选择器</th></tr></thead><tbody><tr><td style="text-align:center;">+</td><td style="text-align:center;">前置兄弟节点</td><td style="text-align:center;"><img src="https://registry.npmmirror.com/@gkd-kit/assets/0.0.4/files/assets/0020.png" alt="image" width="250"></td><td style="text-align:center;"><a href="https://i.gkd.li/i/14045424?gkd=KiArIFtfaWQ9MzNd" target="_blank" rel="noreferrer">* + [_id=33]</a></td></tr><tr><td style="text-align:center;">-</td><td style="text-align:center;">后置兄弟节点</td><td style="text-align:center;"><img src="https://registry.npmmirror.com/@gkd-kit/assets/0.0.4/files/assets/0021.png" alt="image" width="250"></td><td style="text-align:center;"><a href="https://i.gkd.li/i/14045424?gkd=KiAtIFtfaWQ9MzJd" target="_blank" rel="noreferrer">* - [_id=32]</a></td></tr><tr><td style="text-align:center;">></td><td style="text-align:center;">祖先节点</td><td style="text-align:center;"><img src="https://registry.npmmirror.com/@gkd-kit/assets/0.0.4/files/assets/0022.png" alt="image" width="250"></td><td style="text-align:center;"><a href="https://i.gkd.li/i/14045424?gkd=KiA-IFtfaWQ9OTBd" target="_blank" rel="noreferrer">* > [_id=90]</a></td></tr><tr><td style="text-align:center;"><</td><td style="text-align:center;">直接子节点</td><td style="text-align:center;"><img src="https://registry.npmmirror.com/@gkd-kit/assets/0.0.4/files/assets/0023.png" alt="image" width="250"></td><td style="text-align:center;"><a href="https://i.gkd.li/i/14045424?gkd=KiA8IFtfaWQ9ODld" target="_blank" rel="noreferrer">* < [_id=89]</a></td></tr><tr><td style="text-align:center;"><<</td><td style="text-align:center;">子孙节点(深度先序)</td><td style="text-align:center;"><img src="https://registry.npmmirror.com/@gkd-kit/assets/0.0.4/files/assets/0024.png" alt="image" width="250"></td><td style="text-align:center;"><a href="https://i.gkd.li/i/14045424?gkd=KiA8PDIgW19pZD0yOV0" target="_blank" rel="noreferrer">* <<2 [_id=29]</a></td></tr></tbody></table><p>将 关系操作符 和 关系表达式 连接起来就得到了 关系选择器</p><p><code>A +(a1,a2,a3,a_n) B</code> : A 是 B 的前置兄弟节点, 并且 A.index 满足 B.index-(a_m), 其中 a_m 是元组的任意一个数字</p><p><code>A -(a1,a2,a3,a_n) B</code> : A 是 B 的后置兄弟节点, 并且 A.index 满足 B.index+(a_m)</p><p><code>A >(a1,a2,a3,a_n) B</code> : A 是 B 的祖先节点, 并且 A.depth 满足 B.depth-(a_m), 根节点的 depth=0</p><p><code>A <(a1,a2,a3,a_n) B</code> : A 是 B 的直接子节点, 并且 A.index 满足 a_m-1</p><p><code>A <<(a1,a2,a3,a_n) B</code> : A 是 B 的子孙节点, 并且 A.order 满足 a_m-1, A.order 是深度优先先序遍历的索引</p><h3 id="connect-shortcut" tabindex="-1">表达式简写 <a class="header-anchor" href="#connect-shortcut" aria-label="Permalink to &quot;表达式简写 {#connect-shortcut}&quot;">​</a></h3><p>一般情况下, 并不需要写严格完整的表达式, 使用简化写法更方便快捷</p><p>下面是一些特殊情况下的简写表示</p><p>当 a=0 或 b=0 时, 括号可以省略, 以 <code>+</code> 为例</p><ul><li><code>A +(3n+0) B</code> -> <code>A +(3n) B</code> -> <code>A +3n B</code></li><li><code>A +(0n+3) B</code> -> <code>A +(+3) B</code> -> <code>A +3 B</code></li></ul><p>当 a=0 且 b=1 时, an+b 可以省略, 以 <code>+</code> 为例</p><ul><li><code>A +(0n+1) B</code> -> <code>A + B</code></li></ul><p>此外 <code>A + B</code>,<code>A > B</code> 都与等价的 CSS 语法语义相同</p><p>当 a=1 且 b=0 且操作符是 <code>></code>, 可以进一步简写, 比如</p><ul><li><code>A >(1n+0) B</code> -> <code>A >n B</code> -> <code>A B</code></li></ul><p>这与等价的 CSS 语法语义相同</p><h2 id="example" tabindex="-1">示例 <a class="header-anchor" href="#example" aria-label="Permalink to &quot;示例 {#example}&quot;">​</a></h2><div class="language-txt vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>@LinearLayout > TextView[id=`com.byted.pangle:id/tt_item_tv`][text=`不感兴趣`]</span></span></code></pre></div><p>选择器从末尾开始查找, 首先找到 id=`com.byted.pangle:id/tt_item_tv` 和 text=`不感兴趣` 的 TextView, 并且父节点是 LinearLayout 的节点</p><p>此时我们得到两个节点 [LinearLayout, TextView] 根据 <code>@</code> 知道目标节点是 LinearLayout</p><p>实际上它与</p><div class="language-txt vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>TextView[id=`com.byted.pangle:id/tt_item_tv`][text=`不感兴趣`] <n LinearLayout</span></span></code></pre></div><p>的目标匹配节点是等价的, 但是在查询算法时间复杂度上, 后者更慢</p><p>如下是网页无障碍快照审查工具, 使用它的搜索框的选择器查询可以实时测试编写的选择器</p><ul><li><a href="https://i.gkd.li/i/14045424" target="_blank" rel="noreferrer">https://i.gkd.li/i/14045424</a></li><li><a href="https://i.gkd.li/i/14034770" target="_blank" rel="noreferrer">https://i.gkd.li/i/14034770</a></li><li><a href="https://i.gkd.li/i/14031920" target="_blank" rel="noreferrer">https://i.gkd.li/i/14031920</a></li><li><a href="https://i.gkd.li/i/14018243" target="_blank" rel="noreferrer">https://i.gkd.li/i/14018243</a></li><li><a href="https://i.gkd.li/i/14011298" target="_blank" rel="noreferrer">https://i.gkd.li/i/14011298</a></li><li><a href="https://i.gkd.li/i/13999908" target="_blank" rel="noreferrer">https://i.gkd.li/i/13999908</a></li></ul><h2 id="note" tabindex="-1">一些注意 <a class="header-anchor" href="#note" aria-label="Permalink to &quot;一些注意 {#note}&quot;">​</a></h2><h3 id="regex-optimization" tabindex="-1">正则表达式优化 <a class="header-anchor" href="#regex-optimization" aria-label="Permalink to &quot;正则表达式优化 {#regex-optimization}&quot;">​</a></h3><p>对 <code>matches</code>/<code>notMatches</code> 的优化: 如果正则表达式满足下面的条件, 选择器将使用内置的简单的函数匹配, 而不是真正地去运行一个正则表达式</p><ul><li><code>[text~="(?is)abc.*"]</code> -> <code>startsWith('abc', ignoreCase = true)</code></li><li><code>[text~="(?is).*abc.*"]</code> -> <code>contains('abc', ignoreCase = true)</code></li><li><code>[text~="(?is).*abc"]</code> -> <code>endsWith('abc', ignoreCase = true)</code></li><li><code>[text!~="(?is)abc.*"]</code> -> <code>notStartsWith('abc', ignoreCase = true)</code></li><li><code>[text!~="(?is).*abc.*"]</code> -> <code>notContains('abc', ignoreCase = true)</code></li><li><code>[text!~="(?is).*abc"]</code> -> <code>notEndsWith('abc', ignoreCase = true)</code></li></ul><p>上面的 <code>abc</code> 指代不包含 <code>\^$.?*|+()[]{}</code> 这类特殊正则字符的任意字符串, 如 <code>ikun</code> 符合, <code>ikun?</code> 不符合</p><p>简单来说就是如果你只想忽略大小写去简单匹配或不匹配一些字符, 那么直接使用上面的格式</p><h3 id="regex-multiplatform" tabindex="-1">正则表达式一致性 <a class="header-anchor" href="#regex-multiplatform" aria-label="Permalink to &quot;正则表达式一致性 {#regex-multiplatform}&quot;">​</a></h3><p>由于 选择器 需要同时满足 浏览器/Js(审查工具), Android/Java(GKD) 运行, 而这两个平台的正则表达式的底层实现和语法表示略有不同</p><p>因此为了在 Js 端实现和 Java 一致的正则表达式规范, 网页审查工具借助 <a href="https://kotlinlang.org/docs/wasm-overview.html" target="_blank" rel="noreferrer">Kotlin Wasm</a> 将正则表达式的 matches 函数接口编译为 wasm 提供给 Js 调用</p><p>Kotlin Wasm 需要你的浏览器支持 <a href="https://developer.chrome.com/blog/wasmgc?hl=zh-cn" target="_blank" rel="noreferrer">WasmGC</a>, 也就是版本需要满足下列条件</p><p><img src="https://registry.npmmirror.com/@gkd-kit/assets/0.0.4/files/assets/0025.png" alt="image"></p><p>如果你的浏览器版本不满足, 正则表达式将自动回退到 Js 端实现, 以下是在 Js 端使用正则表达式需要注意的地方</p><p>比如上面的正则表达式优化例子中开头的 <code>(?is)</code> 是 Java 正则表达式的 inline flags 语法, 但实际上 Js 并不支持这样写, 只是选择器内部做了一些兼容让它支持</p><p>并且选择器的 Js 端只兼容在开头的 flags, 在内部的 flags 不支持, 此外 Java 和 Js 支持的 flags 也有不同, 某些特殊的表达式也表现也不一致</p><p>总之不要使用太过复杂(多复杂我也不知道)的正则表达式, 某些正则表达式有可能在审查工具上匹配, 但是在 GKD 上不匹配</p><p>如果你能确保正则表达式在 Js 和 Java/Kotlin 的匹配行为一致, 那就没问题</p><p>总之两种情况</p><ul><li>高版本浏览器可以使用 <strong>完整一致</strong> 的正则表达式</li><li>低版本浏览器使用 <strong>小范围不完整不一致</strong> 的正则表达式</li></ul><p>如果你的选择器没有使用正则表达式则不用关心此问题</p></div></div></main><footer class="VPDocFooter" data-v-e201152b data-v-dfb87554><!--[--><!--]--><div class="edit-info" data-v-dfb87554><div class="edit-link" data-v-dfb87554><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/gkd-kit/docs/edit/main/selector/index.md" target="_blank" rel="noreferrer" data-v-dfb87554><!--[--><span class="vpi-square-pen edit-link-icon" data-v-dfb87554></span> 为此页提供修改建议<!--]--></a></div><div class="last-updated" data-v-dfb87554><p class="VPLastUpdated" data-v-dfb87554 data-v-2d0af941>最后更新于: <time datetime="2024-04-08T15:25:09.000Z" data-v-2d0af941></time></p></div></div><nav class="prev-next" data-v-dfb87554><div class="pager" data-v-dfb87554><a class="VPLink link pager-link prev" href="/guide/" data-v-dfb87554><!--[--><span class="desc" data-v-dfb87554>上一篇</span><span class="title" data-v-dfb87554>开始使用</span><!--]--></a></div><div class="pager" data-v-dfb87554><a class="VPLink link pager-link next" href="/subscription/" data-v-dfb87554><!--[--><span class="desc" data-v-dfb87554>下一篇</span><span class="title" data-v-dfb87554>订阅规则</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-d0085ce6 data-v-072b42b0><div class="container" data-v-072b42b0><p class="message" data-v-072b42b0>Released under the GPL-v3 License.</p><p class="copyright" data-v-072b42b0>Copyright © 2024 GKD. All rights reserved</p></div></footer><!--[--><!--]--></div></div>
22
- <script>window.__VP_HASH_MAP__=JSON.parse("{\"api_interfaces_rawcommonprops.md\":\"BOv3Yx6D\",\"api_interfaces_rawappruleprops.md\":\"DJVBTuke\",\"index.md\":\"DNHAIuob\",\"api_type-aliases_position.md\":\"cxzEzEfi\",\"subscription_index.md\":\"B7A1WsXV\",\"api_interfaces_rawappgroup.md\":\"Bo2sL2Zf\",\"api_interfaces_rawruleprops.md\":\"DGOKgjP5\",\"api_index.md\":\"BLyCzWrW\",\"api_type-aliases_integer.md\":\"E2XTp3us\",\"api_interfaces_rawglobalapp.md\":\"DHdLTQYb\",\"selector_index.md\":\"HTLTYpYj\",\"api_type-aliases_iarray.md\":\"Bmv7quci\",\"faq_index.md\":\"Dh42oLEK\",\"api_interfaces_rawglobalrule.md\":\"K7xnq5lZ\",\"api_interfaces_rawsubscription.md\":\"CHLCr6qU\",\"api_interfaces_rawgroupprops.md\":\"CKrmfUDM\",\"api_interfaces_rawapp.md\":\"DF99smhh\",\"guide_index.md\":\"CHrOMi1R\",\"api_interfaces_rawglobalgroup.md\":\"CxETt-IX\",\"api_interfaces_rawapprule.md\":\"q-PROiVC\",\"api_interfaces_rawcategory.md\":\"psJBk0ms\",\"api_interfaces_rawglobalruleprops.md\":\"Caem0_zG\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"GKD\",\"description\":\"自定义屏幕点击应用\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"https://registry.npmmirror.com/@gkd-kit/docs/0.0.1706371840771/files/.vitepress/dist/logo.svg\",\"lastUpdatedText\":\"最后更新于\",\"outline\":\"deep\",\"docFooter\":{\"prev\":\"上一篇\",\"next\":\"下一篇\"},\"returnToTopLabel\":\"返回顶部\",\"outlineTitle\":\"导航栏\",\"darkModeSwitchLabel\":\"外观\",\"sidebarMenuLabel\":\"归档\",\"nav\":[{\"text\":\"首页\",\"link\":\"/\"},{\"text\":\"API\",\"link\":\"/api/\"}],\"sidebar\":[{\"text\":\"指引\",\"items\":[{\"text\":\"开始使用\",\"link\":\"/guide/\"},{\"text\":\"高级选择器\",\"link\":\"/selector/\"},{\"text\":\"订阅规则\",\"link\":\"/subscription/\"},{\"text\":\"疑难解答\",\"link\":\"/faq/\"}]},{\"text\":\"API\",\"link\":\"/api/\",\"collapsed\":true,\"items\":[{\"text\":\"Interfaces\",\"collapsed\":true,\"items\":[{\"text\":\"RawSubscription\",\"link\":\"/api/interfaces/RawSubscription.md\"},{\"text\":\"RawApp\",\"link\":\"/api/interfaces/RawApp.md\"},{\"text\":\"RawGlobalGroup\",\"link\":\"/api/interfaces/RawGlobalGroup.md\"},{\"text\":\"RawCategory\",\"link\":\"/api/interfaces/RawCategory.md\"},{\"text\":\"RawAppRule\",\"link\":\"/api/interfaces/RawAppRule.md\"},{\"text\":\"RawAppGroup\",\"link\":\"/api/interfaces/RawAppGroup.md\"},{\"text\":\"RawGlobalRule\",\"link\":\"/api/interfaces/RawGlobalRule.md\"},{\"text\":\"RawGlobalApp\",\"link\":\"/api/interfaces/RawGlobalApp.md\"},{\"text\":\"RawCommonProps\",\"link\":\"/api/interfaces/RawCommonProps.md\"},{\"text\":\"RawRuleProps\",\"link\":\"/api/interfaces/RawRuleProps.md\"},{\"text\":\"RawGroupProps\",\"link\":\"/api/interfaces/RawGroupProps.md\"},{\"text\":\"RawAppRuleProps\",\"link\":\"/api/interfaces/RawAppRuleProps.md\"},{\"text\":\"RawGlobalRuleProps\",\"link\":\"/api/interfaces/RawGlobalRuleProps.md\"}]},{\"text\":\"Type Aliases\",\"collapsed\":true,\"items\":[{\"text\":\"Position\",\"link\":\"/api/type-aliases/Position.md\"},{\"text\":\"IArray\",\"link\":\"/api/type-aliases/IArray.md\"},{\"text\":\"Integer\",\"link\":\"/api/type-aliases/Integer.md\"}]}]}],\"editLink\":{\"pattern\":\"https://github.com/gkd-kit/docs/edit/main/:path\",\"text\":\"为此页提供修改建议\"},\"search\":{\"provider\":\"local\"},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/gkd-kit\"}],\"footer\":{\"message\":\"Released under the GPL-v3 License.\",\"copyright\":\"Copyright © 2024 GKD. All rights reserved\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
21
+ <div id="app"><div class="Layout" data-v-d0085ce6><!--[--><!--]--><!--[--><span tabindex="-1" data-v-d3aadc39></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-d3aadc39> Skip to content </a><!--]--><!----><header class="VPNav" data-v-d0085ce6 data-v-5ec5ca5c><div class="VPNavBar has-sidebar top" data-v-5ec5ca5c data-v-39e7f2a9><div class="wrapper" data-v-39e7f2a9><div class="container" data-v-39e7f2a9><div class="title" data-v-39e7f2a9><div class="VPNavBarTitle has-sidebar" data-v-39e7f2a9 data-v-d50d1d75><a class="title" href="/" data-v-d50d1d75><!--[--><!--]--><!--[--><img class="VPImage logo" src="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1706371840771/files/.vitepress/dist/logo.svg" alt data-v-e09d8138><!--]--><span data-v-d50d1d75>GKD</span><!--[--><!--]--></a></div></div><div class="content" data-v-39e7f2a9><div class="content-body" data-v-39e7f2a9><!--[--><!--]--><div class="VPNavBarSearch search" data-v-39e7f2a9><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-39e7f2a9 data-v-1693b6ce><span id="main-nav-aria-label" class="visually-hidden" data-v-1693b6ce>Main Navigation</span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/" tabindex="0" data-v-1693b6ce data-v-d477abf7><!--[--><span data-v-d477abf7>首页</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/api/" tabindex="0" data-v-1693b6ce data-v-d477abf7><!--[--><span data-v-d477abf7>API</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-39e7f2a9 data-v-a237e58e><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="Switch to dark theme" aria-checked="false" data-v-a237e58e data-v-9440a62d data-v-77bcae13><span class="check" data-v-77bcae13><span class="icon" data-v-77bcae13><!--[--><span class="vpi-sun sun" data-v-9440a62d></span><span class="vpi-moon moon" data-v-9440a62d></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-39e7f2a9 data-v-c2784eac data-v-76ae07fa><!--[--><a class="VPSocialLink no-icon" href="https://github.com/gkd-kit" aria-label="github" target="_blank" rel="noopener" data-v-76ae07fa data-v-d10fa6ef><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-39e7f2a9 data-v-f4289192 data-v-fa7e0d62><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-fa7e0d62><span class="vpi-more-horizontal icon" data-v-fa7e0d62></span></button><div class="menu" data-v-fa7e0d62><div class="VPMenu" data-v-fa7e0d62 data-v-c22257eb><!----><!--[--><!--[--><!----><div class="group" data-v-f4289192><div class="item appearance" data-v-f4289192><p class="label" data-v-f4289192>外观</p><div class="appearance-action" data-v-f4289192><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="Switch to dark theme" aria-checked="false" data-v-f4289192 data-v-9440a62d data-v-77bcae13><span class="check" data-v-77bcae13><span class="icon" data-v-77bcae13><!--[--><span class="vpi-sun sun" data-v-9440a62d></span><span class="vpi-moon moon" data-v-9440a62d></span><!--]--></span></span></button></div></div></div><div class="group" data-v-f4289192><div class="item social-links" data-v-f4289192><div class="VPSocialLinks social-links-list" data-v-f4289192 data-v-76ae07fa><!--[--><a class="VPSocialLink no-icon" href="https://github.com/gkd-kit" aria-label="github" target="_blank" rel="noopener" data-v-76ae07fa data-v-d10fa6ef><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-39e7f2a9 data-v-1a7dd30b><span class="container" data-v-1a7dd30b><span class="top" data-v-1a7dd30b></span><span class="middle" data-v-1a7dd30b></span><span class="bottom" data-v-1a7dd30b></span></span></button></div></div></div></div><div class="divider" data-v-39e7f2a9><div class="divider-line" data-v-39e7f2a9></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-d0085ce6 data-v-8c6e8cff><div class="container" data-v-8c6e8cff><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-8c6e8cff><span class="vpi-align-left menu-icon" data-v-8c6e8cff></span><span class="menu-text" data-v-8c6e8cff>归档</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-8c6e8cff data-v-2fd582e7><button data-v-2fd582e7>返回顶部</button><!----></div></div></div><aside class="VPSidebar" data-v-d0085ce6 data-v-d0dd6ccf><div class="curtain" data-v-d0dd6ccf></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-d0dd6ccf><span class="visually-hidden" id="sidebar-aria-label" data-v-d0dd6ccf> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="group" data-v-d0dd6ccf><section class="VPSidebarItem level-0 has-active" data-v-d0dd6ccf data-v-e8aee483><div class="item" role="button" tabindex="0" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><h2 class="text" data-v-e8aee483>指引</h2><!----></div><div class="items" data-v-e8aee483><!--[--><div class="VPSidebarItem level-1 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/guide/" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>开始使用</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/selector/" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>高级选择器</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/subscription/" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>订阅规则</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/faq/" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>疑难解答</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-d0dd6ccf><section class="VPSidebarItem level-0 collapsible collapsed is-link" data-v-d0dd6ccf data-v-e8aee483><div class="item" tabindex="0" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/" data-v-e8aee483><!--[--><h2 class="text" data-v-e8aee483>API</h2><!--]--></a><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e8aee483><span class="vpi-chevron-right caret-icon" data-v-e8aee483></span></div></div><div class="items" data-v-e8aee483><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-e8aee483><div class="item" role="button" tabindex="0" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><h3 class="text" data-v-e8aee483>Interfaces</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e8aee483><span class="vpi-chevron-right caret-icon" data-v-e8aee483></span></div></div><div class="items" data-v-e8aee483><!--[--><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawSubscription.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawSubscription</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawApp.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawApp</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawGlobalGroup.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawGlobalGroup</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawCategory.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawCategory</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawAppRule.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawAppRule</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawAppGroup.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawAppGroup</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawGlobalRule.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawGlobalRule</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawGlobalApp.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawGlobalApp</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawCommonProps.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawCommonProps</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawRuleProps.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawRuleProps</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawGroupProps.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawGroupProps</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawAppRuleProps.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawAppRuleProps</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/interfaces/RawGlobalRuleProps.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>RawGlobalRuleProps</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-e8aee483><div class="item" role="button" tabindex="0" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><h3 class="text" data-v-e8aee483>Type Aliases</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-e8aee483><span class="vpi-chevron-right caret-icon" data-v-e8aee483></span></div></div><div class="items" data-v-e8aee483><!--[--><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/type-aliases/Position.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>Position</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/type-aliases/IArray.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>IArray</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-e8aee483><div class="item" data-v-e8aee483><div class="indicator" data-v-e8aee483></div><a class="VPLink link link" href="/api/type-aliases/Integer.html" data-v-e8aee483><!--[--><p class="text" data-v-e8aee483>Integer</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-d0085ce6 data-v-7613fc8b><div class="VPDoc has-sidebar has-aside" data-v-7613fc8b data-v-e201152b><!--[--><!--]--><div class="container" data-v-e201152b><div class="aside" data-v-e201152b><div class="aside-curtain" data-v-e201152b></div><div class="aside-container" data-v-e201152b><div class="aside-content" data-v-e201152b><div class="VPDocAside" data-v-e201152b data-v-a0201846><!--[--><!--]--><!--[--><!--]--><div class="VPDocAsideOutline" role="navigation" data-v-a0201846 data-v-08a513a1><div class="content" data-v-08a513a1><div class="outline-marker" data-v-08a513a1></div><div class="outline-title" role="heading" aria-level="2" data-v-08a513a1>导航栏</div><nav aria-labelledby="doc-outline-aria-label" data-v-08a513a1><span class="visually-hidden" id="doc-outline-aria-label" data-v-08a513a1> Table of Contents for current page </span><ul class="VPDocOutlineItem root" data-v-08a513a1 data-v-6ae2edf2><!--[--><!--]--></ul></nav></div></div><!--[--><!--]--><div class="spacer" data-v-a0201846></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e201152b><div class="content-container" data-v-e201152b><!--[--><!--]--><main class="main" data-v-e201152b><div style="position:relative;" class="vp-doc _selector_" data-v-e201152b><div><h1 id="title" tabindex="-1">高级选择器 <a class="header-anchor" href="#title" aria-label="Permalink to &quot;高级选择器 {#title}&quot;">​</a></h1><p>一个类似 CSS 选择器的高级选择器, 能联系节点上下文信息, 更容易也更精确找到目标节点</p><h2 id="why" tabindex="-1">为什么需要选择器 <a class="header-anchor" href="#why" aria-label="Permalink to &quot;为什么需要选择器 {#why}&quot;">​</a></h2><p>我们的目的是查询获取屏幕上的某个节点, 最简单的情况下, 目标节点已经有唯一的 id/text 标识</p><p>这时只需要配置 id/text 就能简单执行点击, 但实际情况很多节点都缺失了这些信息, 无法简单查询获取</p><p>节点还存在很多额外信息没有被利用到, 节点所有属性可以在 <a href="https://i.gkd.li/i/14045424" target="_blank" rel="noreferrer">快照-14045424</a> 的属性面板看到</p><p>另一种常见的情况是节点没有有效属性, 这时我们需要根据周围的节点去定位</p><p>选择器就是为了解决这些问题而开发的, 下面是对选择器的详细介绍</p><h2 id="syntax" tabindex="-1">语法 <a class="header-anchor" href="#syntax" aria-label="Permalink to &quot;语法 {#syntax}&quot;">​</a></h2><p>与 CSS 类似, 一个选择器由 属性选择器 和 关系选择器 交叉组成, 并且开头末尾必须是 属性选择器</p><p>示例 <code>div > img</code> 的结构是 <code>属性选择器 关系选择器 属性选择器</code>, 它表示选择父节点是 <code>div</code> 的 <code>img</code> 节点, 这与 <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/Child_combinator" target="_blank" rel="noreferrer">相同 CSS 语法</a> 语义一致</p><p>另外 属性选择器 和 关系选择器 之间必须<strong>强制</strong>用 空白字符(空格/换行/回车/制表) 隔开</p><p>即 <code>div>img</code> 非法, 必须写成 <code>div > img</code></p><p>下面分别介绍 <a href="#attr">属性选择器</a> 和 <a href="#connect">关系选择器</a></p><h2 id="attr" tabindex="-1">属性选择器 <a class="header-anchor" href="#attr" aria-label="Permalink to &quot;属性选择器 {#attr}&quot;">​</a></h2><p>它和 CSS 语法的 属性选择器很相似, 但更强大, 如下是一个示例</p><p><code>@TextView[a=1][b^='2'][c*='a'||d.length>7&&e=false]</code></p><p><code>@</code> 表示选择此节点, 一条规则最后属性选择器 <code>@</code> 生效, 如果没有 <code>@</code>, 取最后一个属性选择器</p><p><code>TextView</code> 代表节点的 name 属性, 而且与 CSS 相似, <code>*</code> 表示匹配任意属性</p><p>由于该选择器主要用于 Android 平台, 节点的 name 都是 java 类如 android.text.TextView 这种形式</p><p>为了方便书写规则, 上述 <code>TextView</code> 等价 <code>[name='TextView'||name$='.TextView']</code></p><p><code>[]</code> 内部是一个 逻辑表达式/布尔表达式</p><ul><li>逻辑表达式 -> <code>name='TextView'||name$='.TextView'</code></li><li>布尔表达式 -> <code>name='TextView'</code></li></ul><p>逻辑表达式 有两个操作符 <code>||</code> 和 <code>&&</code>. <code>&&</code> 优先级更高, 即 <code>[a>1||b>1&&c>1||d>1]</code> 等价于 <code>[a>1||(b>1&&c>1)||d>1]</code></p><p>并列的 <code>[]</code> 视为使用 <code>&&</code> 的逻辑表达式, 即 <code>[a=1][b=1]</code> 等价于 <code>[a=1&&b=1]</code></p><p>布尔表达式 由 <a href="#attr-name">属性名</a> <a href="#attr-operator">操作符</a> <a href="#attr-value">值</a> 顺序构成</p><h3 id="attr-name" tabindex="-1">属性名 <a class="header-anchor" href="#attr-name" aria-label="Permalink to &quot;属性名 {#attr-name}&quot;">​</a></h3><p>正则匹配 <code>^[_a-zA-Z][a-zA-Z0-9_]*(\.[_a-zA-Z][a-zA-Z0-9_]*)*$</code> 的字符串</p><p>类似合法变量名 <code>a</code>/<code>a.length</code>, 下面可输入属性名测试否是合法</p><div class="vp-raw"><div><input placeholder="请输入属性名测试是否合法" type="text" value class="flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50"><div mt-4px class="color-red opacity-0">非法属性名❌</div></div></div><h3 id="attr-operator" tabindex="-1">操作符 <a class="header-anchor" href="#attr-operator" aria-label="Permalink to &quot;操作符 {#attr-operator}&quot;">​</a></h3><table><thead><tr><th style="text-align:center;">操作符</th><th style="text-align:center;">名称</th><th style="text-align:center;">说明</th></tr></thead><tbody><tr><td style="text-align:center;">=</td><td style="text-align:center;">equal</td><td style="text-align:center;"></td></tr><tr><td style="text-align:center;">!=</td><td style="text-align:center;">notEqual</td><td style="text-align:center;"></td></tr><tr><td style="text-align:center;">></td><td style="text-align:center;">more</td><td style="text-align:center;"></td></tr><tr><td style="text-align:center;">>=</td><td style="text-align:center;">moreEqual</td><td style="text-align:center;"></td></tr><tr><td style="text-align:center;"><</td><td style="text-align:center;">less</td><td style="text-align:center;"></td></tr><tr><td style="text-align:center;"><=</td><td style="text-align:center;">lessEqual</td><td style="text-align:center;"></td></tr><tr><td style="text-align:center;">^=</td><td style="text-align:center;">startsWith</td><td style="text-align:center;">以...开头</td></tr><tr><td style="text-align:center;">!^=</td><td style="text-align:center;">notStartsWith</td><td style="text-align:center;">不以...开头</td></tr><tr><td style="text-align:center;">*=</td><td style="text-align:center;">contains</td><td style="text-align:center;">包含...</td></tr><tr><td style="text-align:center;">!^=</td><td style="text-align:center;">notContains</td><td style="text-align:center;">不包含...</td></tr><tr><td style="text-align:center;">$=</td><td style="text-align:center;">endsWith</td><td style="text-align:center;">以...结尾</td></tr><tr><td style="text-align:center;">!$=</td><td style="text-align:center;">notEndsWith</td><td style="text-align:center;">不以...结尾</td></tr><tr><td style="text-align:center;">~=</td><td style="text-align:center;">matches</td><td style="text-align:center;">正则匹配...</td></tr><tr><td style="text-align:center;">!~=</td><td style="text-align:center;">notMatches</td><td style="text-align:center;">正则不匹配...</td></tr></tbody></table><p>附加说明: <code>matches</code>/<code>notMatches</code> 要求 值 必须是合法的 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html" target="_blank" rel="noreferrer">Java/Kotlin 正则表达式</a>, 否则提示语法错误</p><h3 id="attr-value" tabindex="-1">值 <a class="header-anchor" href="#attr-value" aria-label="Permalink to &quot;值 {#attr-value}&quot;">​</a></h3><p>值: 4 种类型, <code>null</code>, <code>boolean</code>, <code>string</code>, <code>int</code></p><ul><li>null</li><li>boolean 使用 <code>true</code>/<code>false</code></li><li>int 匹配 <code>^-?[0-9]$</code>, 即10进制自然数, 示例 <code>-1</code>,<code>0</code>,<code>1</code></li><li>string 使用 ' ` " 之一成对包裹, 内部字符转义使用 <code>\</code><br> 所有的转义字符示例 <code>\\</code>, <code>\'</code>, <code>\"</code>, <code>\`</code>, <code>\n</code>, <code>\r</code>, <code>\t</code>, <code>\b</code>, <code>\xfF</code>, <code>\uffFF</code><br> 不支持多行字符, 处于 <code>[0, 0x1F]</code> 的控制字符必须使用转义字符表示</li></ul><p>操作符只能使用在对应的类型的值, 比如 <code>a>''</code> 类型不匹配, 将提示 <code>非法类型</code>/<code>非法选择器</code></p><p>下面表格中 <code>-</code> 表示类型不匹配</p><table><thead><tr><th style="text-align:center;"></th><th style="text-align:center;">null</th><th style="text-align:center;">boolean</th><th style="text-align:center;">int</th><th style="text-align:center;">string</th></tr></thead><tbody><tr><td style="text-align:center;">=</td><td style="text-align:center;">✔</td><td style="text-align:center;">✔</td><td style="text-align:center;">✔</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">!=</td><td style="text-align:center;">✔</td><td style="text-align:center;">✔</td><td style="text-align:center;">✔</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">></td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td><td style="text-align:center;">-</td></tr><tr><td style="text-align:center;">>=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td><td style="text-align:center;">-</td></tr><tr><td style="text-align:center;"><</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td><td style="text-align:center;">-</td></tr><tr><td style="text-align:center;"><=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td><td style="text-align:center;">-</td></tr><tr><td style="text-align:center;">^=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">!^=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">*=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">!*=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">$=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">!$=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">~=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td></tr><tr><td style="text-align:center;">!~=</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">-</td><td style="text-align:center;">✔</td></tr></tbody></table><p>除 <code>=</code>/<code>!=</code> 以外的操作符, 当节点属性是 <code>null</code> 如 a>0 当 a 是 <code>null</code> 时返回 <code>false</code></p><h2 id="connect" tabindex="-1">关系选择器 <a class="header-anchor" href="#connect" aria-label="Permalink to &quot;关系选择器 {#connect}&quot;">​</a></h2><p>关系选择器 由 关系操作符 和 关系表达式 构成, 用于连接两个属性选择器</p><p>简单示例: <code>div > a</code>, 它 表示/约束 两个节点之间的关系, 下面介绍 <a href="#connect-operator">关系操作符</a> 和 <a href="#connect-exp">关系表达式</a></p><h3 id="connect-exp" tabindex="-1">关系表达式 <a class="header-anchor" href="#connect-exp" aria-label="Permalink to &quot;关系表达式 {#connect-exp}&quot;">​</a></h3><p>关系表达式 表示查找节点的范围, 有两种</p><ul><li>元组表达式 <code>(a1,a2,a3,a_n)</code>, 其中 a1, a2, a3, a_n 是常量有序递增正整数, 示例 <code>(1)</code>, <code>(2,3,5)</code></li><li>多项式表达式 <code>(an+b)</code>, 其中 a 和 b 是常量整数, 它是元组表达式的另一种表示, 这个元组的数字满足集合 <code>{an+b|an+b>=1,n>=1}</code> 如果集合为空集则表达式非法<br> 当 a<=0 时, 它具有等价的元组表达式<br> 示例 <code>(-n+4)</code> 等价于 <code>(1,2,3)</code><br> 示例 <code>(-3n+10)</code> 等价于 <code>(1,4,7)</code><br> 当 a>0 时, 它表示无限的元组表达式<br> 示例 <code>(n)</code>, 它表示 <code>(1,2,3,...)</code> 一个无限的元组<br> 示例 <code>(2n-1)</code>, 它表示 <code>(1,3,5,...)</code> 一个无限的元组</li></ul><h3 id="connect-operator" tabindex="-1">关系操作符 <a class="header-anchor" href="#connect-operator" aria-label="Permalink to &quot;关系操作符 {#connect-operator}&quot;">​</a></h3><p>关系操作符 表示查找节点的方向, 有 5 种关系操作符, <code>+</code>, <code>-</code>, <code>></code>, <code><</code>, <code><<</code></p><table><thead><tr><th style="text-align:center;">操作符</th><th style="text-align:center;">名称</th><th style="text-align:center;">图例</th><th style="text-align:center;">选择器</th></tr></thead><tbody><tr><td style="text-align:center;">+</td><td style="text-align:center;">前置兄弟节点</td><td style="text-align:center;"><img src="https://registry.npmmirror.com/@gkd-kit/assets/0.0.4/files/assets/0020.png" alt="image" width="250"></td><td style="text-align:center;"><a href="https://i.gkd.li/i/14045424?gkd=KiArIFtfaWQ9MzNd" target="_blank" rel="noreferrer">* + [_id=33]</a></td></tr><tr><td style="text-align:center;">-</td><td style="text-align:center;">后置兄弟节点</td><td style="text-align:center;"><img src="https://registry.npmmirror.com/@gkd-kit/assets/0.0.4/files/assets/0021.png" alt="image" width="250"></td><td style="text-align:center;"><a href="https://i.gkd.li/i/14045424?gkd=KiAtIFtfaWQ9MzJd" target="_blank" rel="noreferrer">* - [_id=32]</a></td></tr><tr><td style="text-align:center;">></td><td style="text-align:center;">祖先节点</td><td style="text-align:center;"><img src="https://registry.npmmirror.com/@gkd-kit/assets/0.0.4/files/assets/0022.png" alt="image" width="250"></td><td style="text-align:center;"><a href="https://i.gkd.li/i/14045424?gkd=KiA-IFtfaWQ9OTBd" target="_blank" rel="noreferrer">* > [_id=90]</a></td></tr><tr><td style="text-align:center;"><</td><td style="text-align:center;">直接子节点</td><td style="text-align:center;"><img src="https://registry.npmmirror.com/@gkd-kit/assets/0.0.4/files/assets/0023.png" alt="image" width="250"></td><td style="text-align:center;"><a href="https://i.gkd.li/i/14045424?gkd=KiA8IFtfaWQ9ODld" target="_blank" rel="noreferrer">* < [_id=89]</a></td></tr><tr><td style="text-align:center;"><<</td><td style="text-align:center;">子孙节点(深度先序)</td><td style="text-align:center;"><img src="https://registry.npmmirror.com/@gkd-kit/assets/0.0.4/files/assets/0024.png" alt="image" width="250"></td><td style="text-align:center;"><a href="https://i.gkd.li/i/14045424?gkd=KiA8PDIgW19pZD0yOV0" target="_blank" rel="noreferrer">* <<2 [_id=29]</a></td></tr></tbody></table><p>将 关系操作符 和 关系表达式 连接起来就得到了 关系选择器</p><p><code>A +(a1,a2,a3,a_n) B</code> : A 是 B 的前置兄弟节点, 并且 A.index 满足 B.index-(a_m), 其中 a_m 是元组的任意一个数字</p><p><code>A -(a1,a2,a3,a_n) B</code> : A 是 B 的后置兄弟节点, 并且 A.index 满足 B.index+(a_m)</p><p><code>A >(a1,a2,a3,a_n) B</code> : A 是 B 的祖先节点, 并且 A.depth 满足 B.depth-(a_m), 根节点的 depth=0</p><p><code>A <(a1,a2,a3,a_n) B</code> : A 是 B 的直接子节点, 并且 A.index 满足 a_m-1</p><p><code>A <<(a1,a2,a3,a_n) B</code> : A 是 B 的子孙节点, 并且 A.order 满足 a_m-1, A.order 是深度优先先序遍历的索引</p><h3 id="connect-shortcut" tabindex="-1">表达式简写 <a class="header-anchor" href="#connect-shortcut" aria-label="Permalink to &quot;表达式简写 {#connect-shortcut}&quot;">​</a></h3><p>一般情况下, 并不需要写严格完整的表达式, 使用简化写法更方便快捷</p><p>下面是一些特殊情况下的简写表示</p><p>当 a=0 或 b=0 时, 括号可以省略, 以 <code>+</code> 为例</p><ul><li><code>A +(3n+0) B</code> -> <code>A +(3n) B</code> -> <code>A +3n B</code></li><li><code>A +(0n+3) B</code> -> <code>A +(+3) B</code> -> <code>A +3 B</code></li></ul><p>当 a=0 且 b=1 时, an+b 可以省略, 以 <code>+</code> 为例</p><ul><li><code>A +(0n+1) B</code> -> <code>A + B</code></li></ul><p>此外 <code>A + B</code>,<code>A > B</code> 都与等价的 CSS 语法语义相同</p><p>当 a=1 且 b=0 且操作符是 <code>></code>, 可以进一步简写, 比如</p><ul><li><code>A >(1n+0) B</code> -> <code>A >n B</code> -> <code>A B</code></li></ul><p>这与等价的 CSS 语法语义相同</p><h2 id="example" tabindex="-1">示例 <a class="header-anchor" href="#example" aria-label="Permalink to &quot;示例 {#example}&quot;">​</a></h2><div class="language-txt vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>@LinearLayout > TextView[id=`com.byted.pangle:id/tt_item_tv`][text=`不感兴趣`]</span></span></code></pre></div><p>选择器从末尾开始查找, 首先找到 id=`com.byted.pangle:id/tt_item_tv` 和 text=`不感兴趣` 的 TextView, 并且父节点是 LinearLayout 的节点</p><p>此时我们得到两个节点 [LinearLayout, TextView] 根据 <code>@</code> 知道目标节点是 LinearLayout</p><p>实际上它与</p><div class="language-txt vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>TextView[id=`com.byted.pangle:id/tt_item_tv`][text=`不感兴趣`] <n LinearLayout</span></span></code></pre></div><p>的目标匹配节点是等价的, 但是在查询算法时间复杂度上, 后者更慢</p><p>如下是网页无障碍快照审查工具, 使用它的搜索框的选择器查询可以实时测试编写的选择器</p><ul><li><a href="https://i.gkd.li/i/14045424" target="_blank" rel="noreferrer">https://i.gkd.li/i/14045424</a></li><li><a href="https://i.gkd.li/i/14034770" target="_blank" rel="noreferrer">https://i.gkd.li/i/14034770</a></li><li><a href="https://i.gkd.li/i/14031920" target="_blank" rel="noreferrer">https://i.gkd.li/i/14031920</a></li><li><a href="https://i.gkd.li/i/14018243" target="_blank" rel="noreferrer">https://i.gkd.li/i/14018243</a></li><li><a href="https://i.gkd.li/i/14011298" target="_blank" rel="noreferrer">https://i.gkd.li/i/14011298</a></li><li><a href="https://i.gkd.li/i/13999908" target="_blank" rel="noreferrer">https://i.gkd.li/i/13999908</a></li></ul><h2 id="note" tabindex="-1">一些注意 <a class="header-anchor" href="#note" aria-label="Permalink to &quot;一些注意 {#note}&quot;">​</a></h2><h3 id="regex-optimization" tabindex="-1">正则表达式优化 <a class="header-anchor" href="#regex-optimization" aria-label="Permalink to &quot;正则表达式优化 {#regex-optimization}&quot;">​</a></h3><p>对 <code>matches</code>/<code>notMatches</code> 的优化: 如果正则表达式满足下面的条件, 选择器将使用内置的简单的函数匹配, 而不是真正地去运行一个正则表达式</p><ul><li><code>[text~="(?is)abc.*"]</code> -> <code>startsWith('abc', ignoreCase = true)</code></li><li><code>[text~="(?is).*abc.*"]</code> -> <code>contains('abc', ignoreCase = true)</code></li><li><code>[text~="(?is).*abc"]</code> -> <code>endsWith('abc', ignoreCase = true)</code></li><li><code>[text!~="(?is)abc.*"]</code> -> <code>notStartsWith('abc', ignoreCase = true)</code></li><li><code>[text!~="(?is).*abc.*"]</code> -> <code>notContains('abc', ignoreCase = true)</code></li><li><code>[text!~="(?is).*abc"]</code> -> <code>notEndsWith('abc', ignoreCase = true)</code></li></ul><p>上面的 <code>abc</code> 指代不包含 <code>\^$.?*|+()[]{}</code> 这类特殊正则字符的任意字符串, 如 <code>ikun</code> 符合, <code>ikun?</code> 不符合</p><p>简单来说就是如果你只想忽略大小写去简单匹配或不匹配一些字符, 那么直接使用上面的格式</p><h3 id="regex-multiplatform" tabindex="-1">正则表达式一致性 <a class="header-anchor" href="#regex-multiplatform" aria-label="Permalink to &quot;正则表达式一致性 {#regex-multiplatform}&quot;">​</a></h3><p>由于 选择器 需要同时满足 浏览器/Js(审查工具), Android/Java(GKD) 运行, 而这两个平台的正则表达式的底层实现和语法表示略有不同</p><p>因此为了在 Js 端实现和 Java 一致的正则表达式规范, 网页审查工具借助 <a href="https://kotlinlang.org/docs/wasm-overview.html" target="_blank" rel="noreferrer">Kotlin Wasm</a> 将正则表达式的 matches 函数接口编译为 wasm 提供给 Js 调用</p><p>Kotlin Wasm 需要你的浏览器支持 <a href="https://developer.chrome.com/blog/wasmgc?hl=zh-cn" target="_blank" rel="noreferrer">WasmGC</a>, 也就是版本需要满足下列条件</p><p><img src="https://registry.npmmirror.com/@gkd-kit/assets/0.0.4/files/assets/0025.png" alt="image"></p><p>如果你的浏览器版本不满足, 正则表达式将自动回退到 Js 端实现, 以下是在 Js 端使用正则表达式需要注意的地方</p><p>比如上面的正则表达式优化例子中开头的 <code>(?is)</code> 是 Java 正则表达式的 inline flags 语法, 但实际上 Js 并不支持这样写, 只是选择器内部做了一些兼容让它支持</p><p>并且选择器的 Js 端只兼容在开头的 flags, 在内部的 flags 不支持, 此外 Java 和 Js 支持的 flags 也有不同, 某些特殊的表达式也表现也不一致</p><p>总之不要使用太过复杂(多复杂我也不知道)的正则表达式, 某些正则表达式有可能在审查工具上匹配, 但是在 GKD 上不匹配</p><p>如果你能确保正则表达式在 Js 和 Java/Kotlin 的匹配行为一致, 那就没问题</p><p>总之两种情况</p><ul><li>高版本浏览器可以使用 <strong>完整一致</strong> 的正则表达式</li><li>低版本浏览器使用 <strong>小范围不完整不一致</strong> 的正则表达式</li></ul><p>如果你的选择器没有使用正则表达式则不用关心此问题</p></div></div></main><footer class="VPDocFooter" data-v-e201152b data-v-dfb87554><!--[--><!--]--><div class="edit-info" data-v-dfb87554><div class="edit-link" data-v-dfb87554><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/gkd-kit/docs/edit/main/selector/index.md" target="_blank" rel="noreferrer" data-v-dfb87554><!--[--><span class="vpi-square-pen edit-link-icon" data-v-dfb87554></span> 为此页提供修改建议<!--]--></a></div><div class="last-updated" data-v-dfb87554><p class="VPLastUpdated" data-v-dfb87554 data-v-2d0af941>最后更新于: <time datetime="2024-04-08T15:27:08.000Z" data-v-2d0af941></time></p></div></div><nav class="prev-next" data-v-dfb87554><div class="pager" data-v-dfb87554><a class="VPLink link pager-link prev" href="/guide/" data-v-dfb87554><!--[--><span class="desc" data-v-dfb87554>上一篇</span><span class="title" data-v-dfb87554>开始使用</span><!--]--></a></div><div class="pager" data-v-dfb87554><a class="VPLink link pager-link next" href="/subscription/" data-v-dfb87554><!--[--><span class="desc" data-v-dfb87554>下一篇</span><span class="title" data-v-dfb87554>订阅规则</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-d0085ce6 data-v-072b42b0><div class="container" data-v-072b42b0><p class="message" data-v-072b42b0>Released under the GPL-v3 License.</p><p class="copyright" data-v-072b42b0>Copyright © 2024 GKD. All rights reserved</p></div></footer><!--[--><!--]--></div></div>
22
+ <script>window.__VP_HASH_MAP__=JSON.parse("{\"api_interfaces_rawsubscription.md\":\"CHLCr6qU\",\"api_interfaces_rawapp.md\":\"DF99smhh\",\"api_interfaces_rawglobalgroup.md\":\"B4o6m4az\",\"api_type-aliases_integer.md\":\"E2XTp3us\",\"selector_index.md\":\"qyBCvjhM\",\"api_interfaces_rawglobalapp.md\":\"DHdLTQYb\",\"api_interfaces_rawgroupprops.md\":\"DhOnPYHR\",\"api_interfaces_rawglobalrule.md\":\"Dg3YMeTm\",\"api_index.md\":\"BLyCzWrW\",\"api_type-aliases_iarray.md\":\"Bmv7quci\",\"api_interfaces_rawapprule.md\":\"BPv2zRDa\",\"guide_index.md\":\"CavA236s\",\"api_interfaces_rawglobalruleprops.md\":\"Caem0_zG\",\"api_interfaces_rawappruleprops.md\":\"DJVBTuke\",\"api_interfaces_rawcategory.md\":\"DK1yDPGA\",\"api_interfaces_rawruleprops.md\":\"BUiz9Dp-\",\"api_type-aliases_position.md\":\"cxzEzEfi\",\"api_interfaces_rawappgroup.md\":\"nX0G82BC\",\"faq_index.md\":\"uOgR2pYy\",\"api_interfaces_rawcommonprops.md\":\"c_LLCWlK\",\"subscription_index.md\":\"DOqrMFT_\",\"index.md\":\"DlE8g58f\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"GKD\",\"description\":\"自定义屏幕点击应用\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"https://registry.npmmirror.com/@gkd-kit/docs/0.0.1706371840771/files/.vitepress/dist/logo.svg\",\"lastUpdatedText\":\"最后更新于\",\"outline\":\"deep\",\"docFooter\":{\"prev\":\"上一篇\",\"next\":\"下一篇\"},\"returnToTopLabel\":\"返回顶部\",\"outlineTitle\":\"导航栏\",\"darkModeSwitchLabel\":\"外观\",\"sidebarMenuLabel\":\"归档\",\"nav\":[{\"text\":\"首页\",\"link\":\"/\"},{\"text\":\"API\",\"link\":\"/api/\"}],\"sidebar\":[{\"text\":\"指引\",\"items\":[{\"text\":\"开始使用\",\"link\":\"/guide/\"},{\"text\":\"高级选择器\",\"link\":\"/selector/\"},{\"text\":\"订阅规则\",\"link\":\"/subscription/\"},{\"text\":\"疑难解答\",\"link\":\"/faq/\"}]},{\"text\":\"API\",\"link\":\"/api/\",\"collapsed\":true,\"items\":[{\"text\":\"Interfaces\",\"collapsed\":true,\"items\":[{\"text\":\"RawSubscription\",\"link\":\"/api/interfaces/RawSubscription.md\"},{\"text\":\"RawApp\",\"link\":\"/api/interfaces/RawApp.md\"},{\"text\":\"RawGlobalGroup\",\"link\":\"/api/interfaces/RawGlobalGroup.md\"},{\"text\":\"RawCategory\",\"link\":\"/api/interfaces/RawCategory.md\"},{\"text\":\"RawAppRule\",\"link\":\"/api/interfaces/RawAppRule.md\"},{\"text\":\"RawAppGroup\",\"link\":\"/api/interfaces/RawAppGroup.md\"},{\"text\":\"RawGlobalRule\",\"link\":\"/api/interfaces/RawGlobalRule.md\"},{\"text\":\"RawGlobalApp\",\"link\":\"/api/interfaces/RawGlobalApp.md\"},{\"text\":\"RawCommonProps\",\"link\":\"/api/interfaces/RawCommonProps.md\"},{\"text\":\"RawRuleProps\",\"link\":\"/api/interfaces/RawRuleProps.md\"},{\"text\":\"RawGroupProps\",\"link\":\"/api/interfaces/RawGroupProps.md\"},{\"text\":\"RawAppRuleProps\",\"link\":\"/api/interfaces/RawAppRuleProps.md\"},{\"text\":\"RawGlobalRuleProps\",\"link\":\"/api/interfaces/RawGlobalRuleProps.md\"}]},{\"text\":\"Type Aliases\",\"collapsed\":true,\"items\":[{\"text\":\"Position\",\"link\":\"/api/type-aliases/Position.md\"},{\"text\":\"IArray\",\"link\":\"/api/type-aliases/IArray.md\"},{\"text\":\"Integer\",\"link\":\"/api/type-aliases/Integer.md\"}]}]}],\"editLink\":{\"pattern\":\"https://github.com/gkd-kit/docs/edit/main/:path\",\"text\":\"为此页提供修改建议\"},\"search\":{\"provider\":\"local\"},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/gkd-kit\"}],\"footer\":{\"message\":\"Released under the GPL-v3 License.\",\"copyright\":\"Copyright © 2024 GKD. All rights reserved\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
23
23
 
24
24
  </body>
25
25
  </html>
@@ -6,13 +6,13 @@
6
6
  <title>订阅规则 | GKD</title>
7
7
  <meta name="description" content="自定义屏幕点击应用">
8
8
  <meta name="generator" content="VitePress v1.0.2">
9
- <link rel="preload stylesheet" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712589933696/files/.vitepress/dist/assets/style.D-Wlrp80.css" as="style">
9
+ <link rel="preload stylesheet" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712590077974/files/.vitepress/dist/assets/style.D-Wlrp80.css" as="style">
10
10
 
11
- <script type="module" src="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712589933696/files/.vitepress/dist/assets/app.isHrDGYm.js"></script>
12
- <link rel="preload" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712589933696/files/.vitepress/dist/assets/inter-roman-latin.Bu8hRsVA.woff2" as="font" type="font/woff2" crossorigin>
13
- <link rel="modulepreload" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712589933696/files/.vitepress/dist/assets/chunks/framework.Bcl8tzUy.js">
14
- <link rel="modulepreload" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712589933696/files/.vitepress/dist/assets/chunks/theme.D1mwCZPr.js">
15
- <link rel="modulepreload" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712589933696/files/.vitepress/dist/assets/subscription_index.md.B7A1WsXV.lean.js">
11
+ <script type="module" src="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712590077974/files/.vitepress/dist/assets/app.C9H9sb0y.js"></script>
12
+ <link rel="preload" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712590077974/files/.vitepress/dist/assets/inter-roman-latin.Bu8hRsVA.woff2" as="font" type="font/woff2" crossorigin>
13
+ <link rel="modulepreload" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712590077974/files/.vitepress/dist/assets/chunks/framework.Bcl8tzUy.js">
14
+ <link rel="modulepreload" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712590077974/files/.vitepress/dist/assets/chunks/theme.DcasFoF1.js">
15
+ <link rel="modulepreload" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1712590077974/files/.vitepress/dist/assets/subscription_index.md.DOqrMFT_.lean.js">
16
16
  <link rel="icon" type="image/svg+xml" href="https://registry.npmmirror.com/@gkd-kit/docs/0.0.1706371840771/files/.vitepress/dist/logo.svg">
17
17
  <script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
18
18
  <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
@@ -29,8 +29,8 @@
29
29
  <span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> categories</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [],</span></span>
30
30
  <span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> globalGroups</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [],</span></span>
31
31
  <span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> apps</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [],</span></span>
32
- <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>同时你也可以通过下面的链接来添加它</p><div class="language-txt vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>https://gist.github.com/lisonge/3f5693182ad4ef5e307be760dba22bcb/raw/gkd.json5</span></span></code></pre></div><p>上面配置的各项字段的说明注释可在 <a href="/api/interfaces/RawSubscription.html">API</a> 查看</p><p>TODO</p></div></div></main><footer class="VPDocFooter" data-v-e201152b data-v-dfb87554><!--[--><!--]--><div class="edit-info" data-v-dfb87554><div class="edit-link" data-v-dfb87554><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/gkd-kit/docs/edit/main/subscription/index.md" target="_blank" rel="noreferrer" data-v-dfb87554><!--[--><span class="vpi-square-pen edit-link-icon" data-v-dfb87554></span> 为此页提供修改建议<!--]--></a></div><div class="last-updated" data-v-dfb87554><p class="VPLastUpdated" data-v-dfb87554 data-v-2d0af941>最后更新于: <time datetime="2024-04-08T15:25:09.000Z" data-v-2d0af941></time></p></div></div><nav class="prev-next" data-v-dfb87554><div class="pager" data-v-dfb87554><a class="VPLink link pager-link prev" href="/selector/" data-v-dfb87554><!--[--><span class="desc" data-v-dfb87554>上一篇</span><span class="title" data-v-dfb87554>高级选择器</span><!--]--></a></div><div class="pager" data-v-dfb87554><a class="VPLink link pager-link next" href="/faq/" data-v-dfb87554><!--[--><span class="desc" data-v-dfb87554>下一篇</span><span class="title" data-v-dfb87554>疑难解答</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-d0085ce6 data-v-072b42b0><div class="container" data-v-072b42b0><p class="message" data-v-072b42b0>Released under the GPL-v3 License.</p><p class="copyright" data-v-072b42b0>Copyright © 2024 GKD. All rights reserved</p></div></footer><!--[--><!--]--></div></div>
33
- <script>window.__VP_HASH_MAP__=JSON.parse("{\"api_interfaces_rawcommonprops.md\":\"BOv3Yx6D\",\"api_interfaces_rawappruleprops.md\":\"DJVBTuke\",\"index.md\":\"DNHAIuob\",\"api_type-aliases_position.md\":\"cxzEzEfi\",\"subscription_index.md\":\"B7A1WsXV\",\"api_interfaces_rawappgroup.md\":\"Bo2sL2Zf\",\"api_interfaces_rawruleprops.md\":\"DGOKgjP5\",\"api_index.md\":\"BLyCzWrW\",\"api_type-aliases_integer.md\":\"E2XTp3us\",\"api_interfaces_rawglobalapp.md\":\"DHdLTQYb\",\"selector_index.md\":\"HTLTYpYj\",\"api_type-aliases_iarray.md\":\"Bmv7quci\",\"faq_index.md\":\"Dh42oLEK\",\"api_interfaces_rawglobalrule.md\":\"K7xnq5lZ\",\"api_interfaces_rawsubscription.md\":\"CHLCr6qU\",\"api_interfaces_rawgroupprops.md\":\"CKrmfUDM\",\"api_interfaces_rawapp.md\":\"DF99smhh\",\"guide_index.md\":\"CHrOMi1R\",\"api_interfaces_rawglobalgroup.md\":\"CxETt-IX\",\"api_interfaces_rawapprule.md\":\"q-PROiVC\",\"api_interfaces_rawcategory.md\":\"psJBk0ms\",\"api_interfaces_rawglobalruleprops.md\":\"Caem0_zG\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"GKD\",\"description\":\"自定义屏幕点击应用\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"https://registry.npmmirror.com/@gkd-kit/docs/0.0.1706371840771/files/.vitepress/dist/logo.svg\",\"lastUpdatedText\":\"最后更新于\",\"outline\":\"deep\",\"docFooter\":{\"prev\":\"上一篇\",\"next\":\"下一篇\"},\"returnToTopLabel\":\"返回顶部\",\"outlineTitle\":\"导航栏\",\"darkModeSwitchLabel\":\"外观\",\"sidebarMenuLabel\":\"归档\",\"nav\":[{\"text\":\"首页\",\"link\":\"/\"},{\"text\":\"API\",\"link\":\"/api/\"}],\"sidebar\":[{\"text\":\"指引\",\"items\":[{\"text\":\"开始使用\",\"link\":\"/guide/\"},{\"text\":\"高级选择器\",\"link\":\"/selector/\"},{\"text\":\"订阅规则\",\"link\":\"/subscription/\"},{\"text\":\"疑难解答\",\"link\":\"/faq/\"}]},{\"text\":\"API\",\"link\":\"/api/\",\"collapsed\":true,\"items\":[{\"text\":\"Interfaces\",\"collapsed\":true,\"items\":[{\"text\":\"RawSubscription\",\"link\":\"/api/interfaces/RawSubscription.md\"},{\"text\":\"RawApp\",\"link\":\"/api/interfaces/RawApp.md\"},{\"text\":\"RawGlobalGroup\",\"link\":\"/api/interfaces/RawGlobalGroup.md\"},{\"text\":\"RawCategory\",\"link\":\"/api/interfaces/RawCategory.md\"},{\"text\":\"RawAppRule\",\"link\":\"/api/interfaces/RawAppRule.md\"},{\"text\":\"RawAppGroup\",\"link\":\"/api/interfaces/RawAppGroup.md\"},{\"text\":\"RawGlobalRule\",\"link\":\"/api/interfaces/RawGlobalRule.md\"},{\"text\":\"RawGlobalApp\",\"link\":\"/api/interfaces/RawGlobalApp.md\"},{\"text\":\"RawCommonProps\",\"link\":\"/api/interfaces/RawCommonProps.md\"},{\"text\":\"RawRuleProps\",\"link\":\"/api/interfaces/RawRuleProps.md\"},{\"text\":\"RawGroupProps\",\"link\":\"/api/interfaces/RawGroupProps.md\"},{\"text\":\"RawAppRuleProps\",\"link\":\"/api/interfaces/RawAppRuleProps.md\"},{\"text\":\"RawGlobalRuleProps\",\"link\":\"/api/interfaces/RawGlobalRuleProps.md\"}]},{\"text\":\"Type Aliases\",\"collapsed\":true,\"items\":[{\"text\":\"Position\",\"link\":\"/api/type-aliases/Position.md\"},{\"text\":\"IArray\",\"link\":\"/api/type-aliases/IArray.md\"},{\"text\":\"Integer\",\"link\":\"/api/type-aliases/Integer.md\"}]}]}],\"editLink\":{\"pattern\":\"https://github.com/gkd-kit/docs/edit/main/:path\",\"text\":\"为此页提供修改建议\"},\"search\":{\"provider\":\"local\"},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/gkd-kit\"}],\"footer\":{\"message\":\"Released under the GPL-v3 License.\",\"copyright\":\"Copyright © 2024 GKD. All rights reserved\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
32
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>同时你也可以通过下面的链接来添加它</p><div class="language-txt vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span>https://gist.github.com/lisonge/3f5693182ad4ef5e307be760dba22bcb/raw/gkd.json5</span></span></code></pre></div><p>上面配置的各项字段的说明注释可在 <a href="/api/interfaces/RawSubscription.html">API</a> 查看</p><p>TODO</p></div></div></main><footer class="VPDocFooter" data-v-e201152b data-v-dfb87554><!--[--><!--]--><div class="edit-info" data-v-dfb87554><div class="edit-link" data-v-dfb87554><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/gkd-kit/docs/edit/main/subscription/index.md" target="_blank" rel="noreferrer" data-v-dfb87554><!--[--><span class="vpi-square-pen edit-link-icon" data-v-dfb87554></span> 为此页提供修改建议<!--]--></a></div><div class="last-updated" data-v-dfb87554><p class="VPLastUpdated" data-v-dfb87554 data-v-2d0af941>最后更新于: <time datetime="2024-04-08T15:27:08.000Z" data-v-2d0af941></time></p></div></div><nav class="prev-next" data-v-dfb87554><div class="pager" data-v-dfb87554><a class="VPLink link pager-link prev" href="/selector/" data-v-dfb87554><!--[--><span class="desc" data-v-dfb87554>上一篇</span><span class="title" data-v-dfb87554>高级选择器</span><!--]--></a></div><div class="pager" data-v-dfb87554><a class="VPLink link pager-link next" href="/faq/" data-v-dfb87554><!--[--><span class="desc" data-v-dfb87554>下一篇</span><span class="title" data-v-dfb87554>疑难解答</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-d0085ce6 data-v-072b42b0><div class="container" data-v-072b42b0><p class="message" data-v-072b42b0>Released under the GPL-v3 License.</p><p class="copyright" data-v-072b42b0>Copyright © 2024 GKD. All rights reserved</p></div></footer><!--[--><!--]--></div></div>
33
+ <script>window.__VP_HASH_MAP__=JSON.parse("{\"api_interfaces_rawsubscription.md\":\"CHLCr6qU\",\"api_interfaces_rawapp.md\":\"DF99smhh\",\"api_interfaces_rawglobalgroup.md\":\"B4o6m4az\",\"api_type-aliases_integer.md\":\"E2XTp3us\",\"selector_index.md\":\"qyBCvjhM\",\"api_interfaces_rawglobalapp.md\":\"DHdLTQYb\",\"api_interfaces_rawgroupprops.md\":\"DhOnPYHR\",\"api_interfaces_rawglobalrule.md\":\"Dg3YMeTm\",\"api_index.md\":\"BLyCzWrW\",\"api_type-aliases_iarray.md\":\"Bmv7quci\",\"api_interfaces_rawapprule.md\":\"BPv2zRDa\",\"guide_index.md\":\"CavA236s\",\"api_interfaces_rawglobalruleprops.md\":\"Caem0_zG\",\"api_interfaces_rawappruleprops.md\":\"DJVBTuke\",\"api_interfaces_rawcategory.md\":\"DK1yDPGA\",\"api_interfaces_rawruleprops.md\":\"BUiz9Dp-\",\"api_type-aliases_position.md\":\"cxzEzEfi\",\"api_interfaces_rawappgroup.md\":\"nX0G82BC\",\"faq_index.md\":\"uOgR2pYy\",\"api_interfaces_rawcommonprops.md\":\"c_LLCWlK\",\"subscription_index.md\":\"DOqrMFT_\",\"index.md\":\"DlE8g58f\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"GKD\",\"description\":\"自定义屏幕点击应用\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"https://registry.npmmirror.com/@gkd-kit/docs/0.0.1706371840771/files/.vitepress/dist/logo.svg\",\"lastUpdatedText\":\"最后更新于\",\"outline\":\"deep\",\"docFooter\":{\"prev\":\"上一篇\",\"next\":\"下一篇\"},\"returnToTopLabel\":\"返回顶部\",\"outlineTitle\":\"导航栏\",\"darkModeSwitchLabel\":\"外观\",\"sidebarMenuLabel\":\"归档\",\"nav\":[{\"text\":\"首页\",\"link\":\"/\"},{\"text\":\"API\",\"link\":\"/api/\"}],\"sidebar\":[{\"text\":\"指引\",\"items\":[{\"text\":\"开始使用\",\"link\":\"/guide/\"},{\"text\":\"高级选择器\",\"link\":\"/selector/\"},{\"text\":\"订阅规则\",\"link\":\"/subscription/\"},{\"text\":\"疑难解答\",\"link\":\"/faq/\"}]},{\"text\":\"API\",\"link\":\"/api/\",\"collapsed\":true,\"items\":[{\"text\":\"Interfaces\",\"collapsed\":true,\"items\":[{\"text\":\"RawSubscription\",\"link\":\"/api/interfaces/RawSubscription.md\"},{\"text\":\"RawApp\",\"link\":\"/api/interfaces/RawApp.md\"},{\"text\":\"RawGlobalGroup\",\"link\":\"/api/interfaces/RawGlobalGroup.md\"},{\"text\":\"RawCategory\",\"link\":\"/api/interfaces/RawCategory.md\"},{\"text\":\"RawAppRule\",\"link\":\"/api/interfaces/RawAppRule.md\"},{\"text\":\"RawAppGroup\",\"link\":\"/api/interfaces/RawAppGroup.md\"},{\"text\":\"RawGlobalRule\",\"link\":\"/api/interfaces/RawGlobalRule.md\"},{\"text\":\"RawGlobalApp\",\"link\":\"/api/interfaces/RawGlobalApp.md\"},{\"text\":\"RawCommonProps\",\"link\":\"/api/interfaces/RawCommonProps.md\"},{\"text\":\"RawRuleProps\",\"link\":\"/api/interfaces/RawRuleProps.md\"},{\"text\":\"RawGroupProps\",\"link\":\"/api/interfaces/RawGroupProps.md\"},{\"text\":\"RawAppRuleProps\",\"link\":\"/api/interfaces/RawAppRuleProps.md\"},{\"text\":\"RawGlobalRuleProps\",\"link\":\"/api/interfaces/RawGlobalRuleProps.md\"}]},{\"text\":\"Type Aliases\",\"collapsed\":true,\"items\":[{\"text\":\"Position\",\"link\":\"/api/type-aliases/Position.md\"},{\"text\":\"IArray\",\"link\":\"/api/type-aliases/IArray.md\"},{\"text\":\"Integer\",\"link\":\"/api/type-aliases/Integer.md\"}]}]}],\"editLink\":{\"pattern\":\"https://github.com/gkd-kit/docs/edit/main/:path\",\"text\":\"为此页提供修改建议\"},\"search\":{\"provider\":\"local\"},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/gkd-kit\"}],\"footer\":{\"message\":\"Released under the GPL-v3 License.\",\"copyright\":\"Copyright © 2024 GKD. All rights reserved\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
34
34
 
35
35
  </body>
36
36
  </html>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gkd-kit/docs",
3
3
  "author": "lisonge",
4
- "version": "0.0.1712589933696",
4
+ "version": "0.0.1712590077974",
5
5
  "type": "module",
6
6
  "publishConfig": {
7
7
  "access": "public",
@@ -1 +0,0 @@
1
- import{_ as e,c as a,o,a4 as t}from"./chunks/framework.Bcl8tzUy.js";const k=JSON.parse('{"title":"RawAppRule","description":"","frontmatter":{},"headers":[],"relativePath":"api/interfaces/RawAppRule.md","filePath":"api/interfaces/RawAppRule.md","lastUpdated":null}'),r={name:"api/interfaces/RawAppRule.md"},i=t('<h1 id="rawapprule" tabindex="-1">RawAppRule <a class="header-anchor" href="#rawapprule" aria-label="Permalink to &quot;RawAppRule&quot;">​</a></h1><p>应用规则</p><h2 id="extends" tabindex="-1">Extends <a class="header-anchor" href="#extends" aria-label="Permalink to &quot;Extends&quot;">​</a></h2><ul><li><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawAppRuleProps.html"><code>RawAppRuleProps</code></a></li></ul><h2 id="properties" tabindex="-1">Properties <a class="header-anchor" href="#properties" aria-label="Permalink to &quot;Properties&quot;">​</a></h2><h3 id="actioncd" tabindex="-1">actionCd? <a class="header-anchor" href="#actioncd" aria-label="Permalink to &quot;actionCd?&quot;">​</a></h3><blockquote><p><strong>actionCd</strong>?: <a href="./../type-aliases/Integer.html"><code>Integer</code></a></p></blockquote><p>单位: 毫秒</p><p>当前规则的冷却时间, 或者执行 action 最小间隔</p><h4 id="default" tabindex="-1">Default <a class="header-anchor" href="#default" aria-label="Permalink to &quot;Default&quot;">​</a></h4><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1000</span></span></code></pre></div><h4 id="inherited-from" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#actioncd"><code>actionCd</code></a></p><hr><h3 id="actiondelay" tabindex="-1">actionDelay? <a class="header-anchor" href="#actiondelay" aria-label="Permalink to &quot;actionDelay?&quot;">​</a></h3><blockquote><p><strong>actionDelay</strong>?: <a href="./../type-aliases/Integer.html"><code>Integer</code></a></p></blockquote><p>单位: 毫秒</p><p>延迟执行: 查询到节点-&gt;等待一段时间-&gt;再次查询到节点则执行对应 action</p><h4 id="inherited-from-1" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-1" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#actiondelay"><code>actionDelay</code></a></p><hr><h3 id="quickfind" tabindex="-1">quickFind? <a class="header-anchor" href="#quickfind" aria-label="Permalink to &quot;quickFind?&quot;">​</a></h3><blockquote><p><strong>quickFind</strong>?: <code>boolean</code></p></blockquote><p>如果开启, 此规则下的所有 <code>末尾属性选择器</code>的<code>第一个属性选择表达式</code>符合下面的结构之一的选择器 将使用快速查找</p><ul><li>[id=&#39;abc&#39;]</li><li>[vid=&#39;abc&#39;]</li><li>[text=&#39;abc&#39;]</li><li>[text^=&#39;abc&#39;]</li><li>[text*=&#39;abc&#39;]</li><li>[text$=&#39;abc&#39;]</li></ul><p>比如 <code>A &gt; B + C[id=&#39;x&#39;][childCount=2]</code> 符合, 但 <code>A &gt; B + C[childCount=2][id=&#39;x&#39;]</code> 不符合</p><p>它的底层原理是 跳过手动遍历所有节点 直接调用 <a href="https://developer.android.google.cn/reference/android/view/accessibility/AccessibilityNodeInfo#findAccessibilityNodeInfosByViewId(java.lang.String)" target="_blank" rel="noreferrer">findAccessibilityNodeInfosByViewId</a> / <a href="https://developer.android.google.cn/reference/android/view/accessibility/AccessibilityNodeInfo#findAccessibilityNodeInfosByText(java.lang.String)" target="_blank" rel="noreferrer">findAccessibilityNodeInfosByText</a> 得到可匹配节点</p><p>大多数情况下都能查询到, 在少数某些复杂结构下, 即使目标节点存在, 快速查询也不一定查询到</p><p>比如 <a href="https://github.com/gkd-kit/subscription/blob/1ae87452d287b558f58f9c4e4448a3190e212ca1/src/apps/com.zidongdianji.ts#L26" target="_blank" rel="noreferrer">Image &lt; @View + View &gt;2 [text*=&#39;广告&#39;]</a> 虽然符合快速查询的条件但是使用 <code>findAccessibilityNodeInfosByText(&quot;广告&quot;)</code> 并不能查询到节点</p><p>它是优点是快速, 因为遍历所有节点是一个耗时行为, 虽然多数情况下这种耗时较低</p><p>但是在某些软件比如 哔哩哔哩 的开屏广告在这种耗时下延迟可达 1-2s, 这也是导致 <a href="https://github.com/gkd-kit/gkd/issues/60" target="_blank" rel="noreferrer">gkd-kit/gkd#60</a> 的原因</p><p>如果你想对某个局部选择器关闭快速查找,只需要调整你的选择器的属性选择表达式的顺序使得它不符合快速查找的条件即可</p><h4 id="inherited-from-2" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-2" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#quickfind"><code>quickFind</code></a></p><hr><h3 id="matchdelay" tabindex="-1">matchDelay? <a class="header-anchor" href="#matchdelay" aria-label="Permalink to &quot;matchDelay?&quot;">​</a></h3><blockquote><p><strong>matchDelay</strong>?: <a href="./../type-aliases/Integer.html"><code>Integer</code></a></p></blockquote><p>单位: 毫秒</p><p>匹配延迟</p><p>规则准备匹配/或被唤醒时, 等待一段时间, 使此规则参与查询屏幕节点</p><h4 id="inherited-from-3" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-3" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#matchdelay"><code>matchDelay</code></a></p><hr><h3 id="matchtime" tabindex="-1">matchTime? <a class="header-anchor" href="#matchtime" aria-label="Permalink to &quot;matchTime?&quot;">​</a></h3><blockquote><p><strong>matchTime</strong>?: <a href="./../type-aliases/Integer.html"><code>Integer</code></a></p></blockquote><p>单位: 毫秒</p><p>规则匹配时间, 此规则参与查询屏幕节点时, 等待一段时间, 休眠此规则</p><p>例如某些应用的 开屏广告 的 activityId 容易误触/太广泛, 而开屏广告几乎只在应用切出来时出现, 设置一个有限匹配时间能避免后续的误触</p><h4 id="inherited-from-4" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-4" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#matchtime"><code>matchTime</code></a></p><hr><h3 id="actionmaximum" tabindex="-1">actionMaximum? <a class="header-anchor" href="#actionmaximum" aria-label="Permalink to &quot;actionMaximum?&quot;">​</a></h3><blockquote><p><strong>actionMaximum</strong>?: <a href="./../type-aliases/Integer.html"><code>Integer</code></a></p></blockquote><p>最大执行次数</p><p>规则的 action 被执行的最大次数, 达到最大次数时, 休眠此规则</p><p>功能类似 matchTime, 适用于只需要执行一次的: 开屏广告/更新弹窗/青少年弹窗 一类规则</p><p>当规则准备匹配/或被唤醒时, 将重新计算次数</p><h4 id="inherited-from-5" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-5" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#actionmaximum"><code>actionMaximum</code></a></p><hr><h3 id="resetmatch" tabindex="-1">resetMatch? <a class="header-anchor" href="#resetmatch" aria-label="Permalink to &quot;resetMatch?&quot;">​</a></h3><blockquote><p><strong>resetMatch</strong>?: <code>&quot;activity&quot;</code> | <code>&quot;app&quot;</code></p></blockquote><p>当规则因为 matchTime/actionMaximum 而休眠时, 如何唤醒此规则</p><h4 id="default-1" tabindex="-1">Default <a class="header-anchor" href="#default-1" aria-label="Permalink to &quot;Default&quot;">​</a></h4><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;activity&#39;</span></span></code></pre></div><h4 id="example" tabindex="-1">Example <a class="header-anchor" href="#example" aria-label="Permalink to &quot;Example&quot;">​</a></h4><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;activity&#39;</span></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 当 activity 刷新时, 唤醒规则</span></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 刷新 activity 并不代表 activityId 变化</span></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 如 哔哩哔哩视频播放页 底部点击推荐视频 进入另一个 视频播放页, 进入了新 activity 但是 activityId 并没有变化</span></span></code></pre></div><h4 id="example-1" tabindex="-1">Example <a class="header-anchor" href="#example-1" aria-label="Permalink to &quot;Example&quot;">​</a></h4><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;app&#39;</span></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 重新进入 app 时, 唤醒规则</span></span></code></pre></div><h4 id="inherited-from-6" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-6" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#resetmatch"><code>resetMatch</code></a></p><hr><h3 id="actioncdkey" tabindex="-1">actionCdKey? <a class="header-anchor" href="#actioncdkey" aria-label="Permalink to &quot;actionCdKey?&quot;">​</a></h3><blockquote><p><strong>actionCdKey</strong>?: <a href="./../type-aliases/Integer.html"><code>Integer</code></a></p></blockquote><p>与这个 key 的 rule 共享 cd</p><p>比如开屏广告可能需要多个 rule 去匹配, 当一个 rule 触发时, 其它 rule 的触发是无意义的</p><p>如果你对这个 key 的 rule 设置 actionCd=3000, 那么当这个 rule 和 本 rule 触发任意一个时, 在 3000毫秒 内两个 rule 都将进入 cd</p><h4 id="inherited-from-7" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-7" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#actioncdkey"><code>actionCdKey</code></a></p><hr><h3 id="actionmaximumkey" tabindex="-1">actionMaximumKey? <a class="header-anchor" href="#actionmaximumkey" aria-label="Permalink to &quot;actionMaximumKey?&quot;">​</a></h3><blockquote><p><strong>actionMaximumKey</strong>?: <a href="./../type-aliases/Integer.html"><code>Integer</code></a></p></blockquote><p>与这个 key 的 rule 共享次数</p><p>比如开屏广告可能需要多个 rule 去匹配, 当一个 rule 触发时, 其它 rule 的触发是无意义的</p><p>如果你对这个 key 的 rule 设置 actionMaximum=1, 那么当这个 rule 和 本 rule 触发任意一个时, 两个 rule 都将进入休眠</p><h4 id="inherited-from-8" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-8" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#actionmaximumkey"><code>actionMaximumKey</code></a></p><hr><h3 id="order" tabindex="-1">order? <a class="header-anchor" href="#order" aria-label="Permalink to &quot;order?&quot;">​</a></h3><blockquote><p><strong>order</strong>?: <a href="./../type-aliases/Integer.html"><code>Integer</code></a></p></blockquote><p>规则参与匹配的顺序, 数字越小越先匹配</p><p>如果两个规则 order 相同, 按照 groups 中的数组顺序匹配, app 类型规则顺序优先于 global 类型规则</p><p>属于不同订阅的规则按照订阅列表中顺序匹配, 长按订阅卡片可以拖动排序</p><h4 id="default-2" tabindex="-1">Default <a class="header-anchor" href="#default-2" aria-label="Permalink to &quot;Default&quot;">​</a></h4><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span></span></code></pre></div><h4 id="version" tabindex="-1">Version <a class="header-anchor" href="#version" aria-label="Permalink to &quot;Version&quot;">​</a></h4><p>1.7.0</p><h4 id="inherited-from-9" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-9" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#order"><code>order</code></a></p><hr><h3 id="forcedtime" tabindex="-1">forcedTime? <a class="header-anchor" href="#forcedtime" aria-label="Permalink to &quot;forcedTime?&quot;">​</a></h3><blockquote><p><strong>forcedTime</strong>?: <a href="./../type-aliases/Integer.html"><code>Integer</code></a></p></blockquote><p>单位: 毫秒</p><p>在开始匹配后的一段时间内, 不管界面没有通知变化, 主动使此规则参与屏幕查询</p><p>GKD 借助 <a href="https://developer.android.com/reference/android/accessibilityservice/AccessibilityService#onAccessibilityEvent(android.view.accessibility.AccessibilityEvent)" target="_blank" rel="noreferrer">onAccessibilityEvent</a> 感知界面变化</p><p>但是某些基于 flutter/webview 开发的应用/页面在变化时并不会通知系统去触发 onAccessibilityEvent, 但是屏幕上的节点信息确实产生变化</p><p>唯一的办法是在开始匹配的一定时间内主动查询屏幕节点</p><h4 id="version-1" tabindex="-1">Version <a class="header-anchor" href="#version-1" aria-label="Permalink to &quot;Version&quot;">​</a></h4><p>1.7.0</p><h4 id="inherited-from-10" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-10" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#forcedtime"><code>forcedTime</code></a></p><hr><h3 id="snapshoturls" tabindex="-1">snapshotUrls? <a class="header-anchor" href="#snapshoturls" aria-label="Permalink to &quot;snapshotUrls?&quot;">​</a></h3><blockquote><p><strong>snapshotUrls</strong>?: <a href="./../type-aliases/IArray.html"><code>IArray</code></a>&lt;<code>string</code>&gt;</p></blockquote><p>当前 规则/规则组 的快照链接, 增强订阅可维护性</p><h4 id="inherited-from-11" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-11" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#snapshoturls"><code>snapshotUrls</code></a></p><hr><h3 id="exampleurls" tabindex="-1">exampleUrls? <a class="header-anchor" href="#exampleurls" aria-label="Permalink to &quot;exampleUrls?&quot;">​</a></h3><blockquote><p><strong>exampleUrls</strong>?: <a href="./../type-aliases/IArray.html"><code>IArray</code></a>&lt;<code>string</code>&gt;</p></blockquote><p>当前 规则/规则组 的规则在手机上的运行示例, 支持 jpg/png/webp/gif</p><p>如果规则是多个规则组合起来的, 可以更好看懂规则到底在干啥, 比如 点击关闭按钮-选择关闭原因-确认关闭 这种广告用 gif 看着更清楚在干啥</p><h4 id="inherited-from-12" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-12" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#exampleurls"><code>exampleUrls</code></a></p><hr><h3 id="key" tabindex="-1">key? <a class="header-anchor" href="#key" aria-label="Permalink to &quot;key?&quot;">​</a></h3><blockquote><p><strong>key</strong>?: <a href="./../type-aliases/Integer.html"><code>Integer</code></a></p></blockquote><p>当前规则在列表中的唯一标识</p><p>key 没有顺序大小之分, 可以是任意数字</p><p>设置后不可更改, 否则造成点击记录错乱</p><h4 id="inherited-from-13" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-13" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#key"><code>key</code></a></p><hr><h3 id="name" tabindex="-1">name? <a class="header-anchor" href="#name" aria-label="Permalink to &quot;name?&quot;">​</a></h3><blockquote><p><strong>name</strong>?: <code>string</code></p></blockquote><p>规则名称</p><h4 id="inherited-from-14" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-14" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#name"><code>name</code></a></p><hr><h3 id="prekeys" tabindex="-1">preKeys? <a class="header-anchor" href="#prekeys" aria-label="Permalink to &quot;preKeys?&quot;">​</a></h3><blockquote><p><strong>preKeys</strong>?: <a href="./../type-aliases/IArray.html"><code>IArray</code></a>&lt;<a href="./../type-aliases/Integer.html"><code>Integer</code></a>&gt;</p></blockquote><p>要求当前列表里某个 key 刚刚执行</p><p>比如点击关闭按钮-选择关闭原因-确认关闭, key 分别是 1,2,3, preKeys 分别是 [],[1],[2]</p><p>那么 选择关闭原因 必须要求 比如点击关闭按钮 刚刚点击过才能执行, 确认关闭 也要求 选择关闭原因 刚刚点击过才执行</p><p>否则后面的规则不会触发, 也就是要求规则按顺序执行, 这是为了防止规则匹配范围太过广泛而误触</p><h4 id="inherited-from-15" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-15" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#prekeys"><code>preKeys</code></a></p><hr><h3 id="action" tabindex="-1">action? <a class="header-anchor" href="#action" aria-label="Permalink to &quot;action?&quot;">​</a></h3><blockquote><p><strong>action</strong>?: <code>&quot;click&quot;</code> | <code>&quot;clickNode&quot;</code> | <code>&quot;clickCenter&quot;</code> | <code>&quot;back&quot;</code> | <code>&quot;longClick&quot;</code> | <code>&quot;longClickNode&quot;</code> | <code>&quot;longClickCenter&quot;</code></p></blockquote><p>规则匹配后的操作行为</p><p>在 <a href="./RawRuleProps.html#position">position</a> 存在的情况下, action 的默认值为 <code>clickCenter</code></p><h4 id="example-2" tabindex="-1">Example <a class="header-anchor" href="#example-2" aria-label="Permalink to &quot;Example&quot;">​</a></h4><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">`click`</span></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 为默认值, 如果目标节点是 clickable 的, 则使用 `clickNode`, 反之使用 `clickCenter`</span></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 并且当 `clickNode` 事件没有被应用接收时, 则使用 `clickCenter`</span></span></code></pre></div><h4 id="example-3" tabindex="-1">Example <a class="header-anchor" href="#example-3" aria-label="Permalink to &quot;Example&quot;">​</a></h4><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">`clickNode`</span></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 向系统发起一个点击无障碍节点事件. 即使节点在屏幕外部/或者被其它节点遮挡,也依然能够正确触发点击目标节点</span></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 但是如果目标节点不是 clickable 的, 目标应用通常不响应这个点击事件, 也就是点击无效果</span></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 在极少数情况下, 即使节点是 clickable 的,应用显示接收但是不响应节点点击事件, 此时需要手动设置 `clickCenter`</span></span></code></pre></div><h4 id="example-4" tabindex="-1">Example <a class="header-anchor" href="#example-4" aria-label="Permalink to &quot;Example&quot;">​</a></h4><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">`clickCenter`</span></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 计算出此控件的中心的坐标并且如果这个坐标在屏幕内部,那么就向系统发起一个点击屏幕坐标事件</span></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 如果这个坐标不在屏幕内部, 当作未匹配</span></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 另外如果目标节点的位置被其它节点遮挡覆盖, 则会点击触发最上层的节点(可能不是目标节点)</span></span></code></pre></div><h4 id="example-5" tabindex="-1">Example <a class="header-anchor" href="#example-5" aria-label="Permalink to &quot;Example&quot;">​</a></h4><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">`back`</span></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 向系统发起一个返回事件, 相当于按下返回键</span></span></code></pre></div><h4 id="example-6" tabindex="-1">Example <a class="header-anchor" href="#example-6" aria-label="Permalink to &quot;Example&quot;">​</a></h4><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">`longClick`</span></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 如果目标节点是 longClickable 的, 则使用 `longClickNode`, 反之使用 `longClickCenter`</span></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 并且当 `longClickNode` 事件没有被应用接收时, 则使用 `longClickCenter`</span></span></code></pre></div><h4 id="example-7" tabindex="-1">Example <a class="header-anchor" href="#example-7" aria-label="Permalink to &quot;Example&quot;">​</a></h4><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">`longClickNode`</span></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 向系统发起一个长按无障碍节点事件,与 clickNode 类似</span></span></code></pre></div><h4 id="example-8" tabindex="-1">Example <a class="header-anchor" href="#example-8" aria-label="Permalink to &quot;Example&quot;">​</a></h4><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">`longClickCenter`</span></span>\n<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 与 clickCenter 类似, 长按时间为 400 毫秒</span></span></code></pre></div><h4 id="inherited-from-16" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-16" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#action"><code>action</code></a></p><hr><h3 id="position" tabindex="-1">position? <a class="header-anchor" href="#position" aria-label="Permalink to &quot;position?&quot;">​</a></h3><blockquote><p><strong>position</strong>?: <a href="./../type-aliases/Position.html"><code>Position</code></a></p></blockquote><p>在使用 clickCenter/longClickCenter 时的自定义点击位置</p><p>默认坐标为节点中心</p><p>如果计算出的坐标不在屏幕内部, 当作未匹配</p><p>在 position 存在的情况下, <a href="./RawRuleProps.html#action">action</a> 的默认值为 <code>clickCenter</code></p><h4 id="version-2" tabindex="-1">Version <a class="header-anchor" href="#version-2" aria-label="Permalink to &quot;Version&quot;">​</a></h4><p>1.7.0</p><h4 id="inherited-from-17" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-17" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#position"><code>position</code></a></p><hr><h3 id="matches" tabindex="-1">matches? <a class="header-anchor" href="#matches" aria-label="Permalink to &quot;matches?&quot;">​</a></h3><blockquote><p><strong>matches</strong>?: <a href="./../type-aliases/IArray.html"><code>IArray</code></a>&lt;<code>string</code>&gt;</p></blockquote><p>一个或者多个合法的 GKD 选择器, 如果每个选择器都能匹配上节点, 那么点击最后一个选择器的目标节点</p><h4 id="inherited-from-18" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-18" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#matches"><code>matches</code></a></p><hr><h3 id="excludematches" tabindex="-1">excludeMatches? <a class="header-anchor" href="#excludematches" aria-label="Permalink to &quot;excludeMatches?&quot;">​</a></h3><blockquote><p><strong>excludeMatches</strong>?: <a href="./../type-aliases/IArray.html"><code>IArray</code></a>&lt;<code>string</code>&gt;</p></blockquote><p>一个或者多个合法的 GKD 选择器, 如果存在一个选择器匹配上节点, 则停止匹配此规则</p><h4 id="inherited-from-19" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-19" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawRuleProps.html"><code>RawRuleProps</code></a>.<a href="./RawRuleProps.html#excludematches"><code>excludeMatches</code></a></p><hr><h3 id="activityids" tabindex="-1">activityIds? <a class="header-anchor" href="#activityids" aria-label="Permalink to &quot;activityIds?&quot;">​</a></h3><blockquote><p><strong>activityIds</strong>?: <a href="./../type-aliases/IArray.html"><code>IArray</code></a>&lt;<code>string</code>&gt;</p></blockquote><p>如果 设备界面Id startWith activityIds 的任意一项, 则匹配</p><p>如果要匹配所有界面: <code>undefined</code> (不填写) 或者 <code>[]</code> (避免使用上级属性)</p><h4 id="inherited-from-20" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-20" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawAppRuleProps.html"><code>RawAppRuleProps</code></a>.<a href="./RawAppRuleProps.html#activityids"><code>activityIds</code></a></p><hr><h3 id="excludeactivityids" tabindex="-1">excludeActivityIds? <a class="header-anchor" href="#excludeactivityids" aria-label="Permalink to &quot;excludeActivityIds?&quot;">​</a></h3><blockquote><p><strong>excludeActivityIds</strong>?: <a href="./../type-aliases/IArray.html"><code>IArray</code></a>&lt;<code>string</code>&gt;</p></blockquote><p>如果 设备界面Id startWith excludeActivityIds 的任意一项, 则排除匹配</p><p>优先级高于 activityIds</p><h4 id="inherited-from-21" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-21" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawAppRuleProps.html"><code>RawAppRuleProps</code></a>.<a href="./RawAppRuleProps.html#excludeactivityids"><code>excludeActivityIds</code></a></p><hr><h3 id="versionnames" tabindex="-1">versionNames? <a class="header-anchor" href="#versionnames" aria-label="Permalink to &quot;versionNames?&quot;">​</a></h3><blockquote><p><strong>versionNames</strong>?: <a href="./../type-aliases/IArray.html"><code>IArray</code></a>&lt;<code>string</code>&gt;</p></blockquote><p>如果应用版本名称包含在此列表中, 则匹配</p><h4 id="version-3" tabindex="-1">Version <a class="header-anchor" href="#version-3" aria-label="Permalink to &quot;Version&quot;">​</a></h4><p>1.7.0</p><h4 id="inherited-from-22" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-22" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawAppRuleProps.html"><code>RawAppRuleProps</code></a>.<a href="./RawAppRuleProps.html#versionnames"><code>versionNames</code></a></p><hr><h3 id="excludeversionnames" tabindex="-1">excludeVersionNames? <a class="header-anchor" href="#excludeversionnames" aria-label="Permalink to &quot;excludeVersionNames?&quot;">​</a></h3><blockquote><p><strong>excludeVersionNames</strong>?: <a href="./../type-aliases/IArray.html"><code>IArray</code></a>&lt;<code>string</code>&gt;</p></blockquote><p>如果应用版本名称包含在此列表中, 则排除匹配, 优先级高于 versionNames</p><h4 id="version-4" tabindex="-1">Version <a class="header-anchor" href="#version-4" aria-label="Permalink to &quot;Version&quot;">​</a></h4><p>1.7.0</p><h4 id="inherited-from-23" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-23" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawAppRuleProps.html"><code>RawAppRuleProps</code></a>.<a href="./RawAppRuleProps.html#excludeversionnames"><code>excludeVersionNames</code></a></p><hr><h3 id="versioncodes" tabindex="-1">versionCodes? <a class="header-anchor" href="#versioncodes" aria-label="Permalink to &quot;versionCodes?&quot;">​</a></h3><blockquote><p><strong>versionCodes</strong>?: <a href="./../type-aliases/IArray.html"><code>IArray</code></a>&lt;<a href="./../type-aliases/Integer.html"><code>Integer</code></a>&gt;</p></blockquote><p>如果应用版本代码包含在此列表中, 则匹配</p><h4 id="version-5" tabindex="-1">Version <a class="header-anchor" href="#version-5" aria-label="Permalink to &quot;Version&quot;">​</a></h4><p>1.7.0</p><h4 id="inherited-from-24" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-24" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawAppRuleProps.html"><code>RawAppRuleProps</code></a>.<a href="./RawAppRuleProps.html#versioncodes"><code>versionCodes</code></a></p><hr><h3 id="excludeversioncodes" tabindex="-1">excludeVersionCodes? <a class="header-anchor" href="#excludeversioncodes" aria-label="Permalink to &quot;excludeVersionCodes?&quot;">​</a></h3><blockquote><p><strong>excludeVersionCodes</strong>?: <a href="./../type-aliases/IArray.html"><code>IArray</code></a>&lt;<a href="./../type-aliases/Integer.html"><code>Integer</code></a>&gt;</p></blockquote><p>如果应用版本代码包含在此列表中, 则排除匹配, 优先级高于 versionCodes</p><h4 id="version-6" tabindex="-1">Version <a class="header-anchor" href="#version-6" aria-label="Permalink to &quot;Version&quot;">​</a></h4><p>1.7.0</p><h4 id="inherited-from-25" tabindex="-1">Inherited from <a class="header-anchor" href="#inherited-from-25" aria-label="Permalink to &quot;Inherited from&quot;">​</a></h4><p><a href="./RawAppRuleProps.html"><code>RawAppRuleProps</code></a>.<a href="./RawAppRuleProps.html#excludeversioncodes"><code>excludeVersionCodes</code></a></p>',237),s=[i];function l(n,h,d,c,p,u){return o(),a("div",null,s)}const f=e(r,[["render",l]]);export{k as __pageData,f as default};
@@ -1 +0,0 @@
1
- import{_ as e,c as a,o,a4 as t}from"./chunks/framework.Bcl8tzUy.js";const k=JSON.parse('{"title":"RawAppRule","description":"","frontmatter":{},"headers":[],"relativePath":"api/interfaces/RawAppRule.md","filePath":"api/interfaces/RawAppRule.md","lastUpdated":null}'),r={name:"api/interfaces/RawAppRule.md"},i=t("",237),s=[i];function l(n,h,d,c,p,u){return o(),a("div",null,s)}const f=e(r,[["render",l]]);export{k as __pageData,f as default};