treesitter 嵌套很深 child

treesitter get deeply nested child

我正在使用 treesitter 制作一个小脚本,它将提取 ORG 文件中的所有代码块,但前提是它们位于具有特定 属性 (:TANGLE:) 的标题下。

我能够进行此查询,该查询有效,但只找到紧邻 children 标题的代码块:

(section
    (property_drawer
        (property
            name: (expr) @prop_name (#eq? @prop_name "TANGLE")
            value: (value) @file
        )
    )
    (body
        (block
            contents: (contents) @code
        )
    )
)

它适用于此组织文件:

* Headline
  :PROPERTIES:
  :TANGLE: file.lua
  :END:
  
  #+begin_src lua
  print("test")
  #+end_src

但这个不是,因为代码块不直接在“标题 1”内:

* Headline 1
  :PROPERTIES:
  :TANGLE: file.lua
  :END:

** Headline 2
   
   #+begin_src lua
   print("test")
   #+end_src

有没有办法使用 treesitter 查询来获取嵌套在标题内任意深度的节点?[​​=14=]

我找不到任何方法来做到这一点,所以最后,我决定递归地进行深入搜索。

这是 neovim 的脚本,所以我使用了这些函数:

tsnode:iter_children() -- used in a for loop
tsnode:type() -- Check the node type
ts_utils.get_node_text() -- To get the text content of a node

我希望这对其他人也有帮助。