"""The ``files`` directive.Renders a project layout as a file tree. The content is an ordinary nested list,so authors write plain Markdown or reStructuredText; a trailing ``/`` or thepresence of children marks an entry as a directory."""fromdocutilsimportnodesfromdocutils.parsers.rstimportDirective__all__=("setup_files",)def_entries(bullet_list:nodes.Element)->list[nodes.Element]:entries=[]foriteminbullet_list.children:ifnotisinstance(item,nodes.list_item):continuename=""children=Noneforchildinitem.children:ifisinstance(child,nodes.bullet_list):children=childelifnotnameandisinstance(child,(nodes.paragraph,nodes.Text)):name=child.astext().strip()ifnotname:continueis_folder=childrenisnotNoneorname.endswith("/")label=name.rstrip("/")entry=nodes.container(classes=["fd-folder-entry"ifis_folderelse"fd-file-entry"])entry+=nodes.inline(label,label,classes=["fd-entry-name"])ifchildrenisnotNone:nested=nodes.container(classes=["fd-files-children"])nested.extend(_entries(children))entry+=nestedentries.append(entry)returnentriesclassFilesDirective(Directive):"""Turn a nested list into a file tree."""has_content=Trueoptional_arguments=0final_argument_whitespace=Falsedefrun(self):parsed=nodes.Element()self.state.nested_parse(self.content,self.content_offset,parsed)tree=nodes.container(classes=["fd-files"])forchildinparsed.children:ifisinstance(child,nodes.bullet_list):tree.extend(_entries(child))ifnottree.children:return[self.state_machine.reporter.warning("`files` expects a nested list",line=self.lineno)]return[tree]