22==========
33"""
44
5+ import os
56from dataclasses import dataclass , field
67from pathlib import Path
78
89from jinja2 import Template
910from lsp_tree_sitter .completer import PackageSearcher
10- from platformdirs import user_config_path
11+ from marisa_trie import Trie
12+ from platformdirs import user_cache_dir , user_config_path
1113from pyalpm import DB , Handle , Package
1214from tree_sitter import Node
1315
@@ -19,6 +21,15 @@ def get_template(name: str = "PKGBUILD.md.jinja") -> Template:
1921 return Template (path .read_text ())
2022
2123
24+ def get_trie () -> Trie | None :
25+ path = os .path .join (user_cache_dir ("paru" ), "packages.aur" )
26+ if not os .path .exists (path ):
27+ return
28+ with open (path ) as f :
29+ lines = f .readlines ()
30+ return Trie (lines )
31+
32+
2233@dataclass
2334class PacmanSearcher (PackageSearcher ):
2435 label : str = "package.PKGBUILD"
@@ -30,11 +41,11 @@ class PacmanSearcher(PackageSearcher):
3041 "provides" ,
3142 "replaces" ,
3243 )
33- url_template : str = "https://archlinux.org/packages/{}"
3444 template : Template = field (default_factory = get_template )
3545 db : DB = field (
3646 default_factory = lambda : Handle ("." , "/var/lib/pacman" ).get_localdb ()
3747 )
48+ trie : Trie | None = field (default_factory = get_trie )
3849
3950 def __call__ (self , node : Node | None ) -> bool :
4051 node = node .parent if node and node .type == "string_content" else node
@@ -52,26 +63,41 @@ def get_pkgs(self, name: str) -> list[Package]:
5263 return pkgs
5364
5465 def has_package (self , name : str ) -> bool :
55- return self .get_pkgs (name ) != []
66+ if self .get_pkgs (name ):
67+ return True
68+ if self .trie :
69+ return name in self .trie .keys (name )
70+ return False
5671
5772 def get_package_url (self , name : str ) -> str :
58- return self .url_template .format (name )
73+ if self .get_pkgs (name ):
74+ return f"https://archlinux.org/packages/{ name } "
75+ return f"https://aur.archlinux.org/packages/{ name } "
5976
6077 def get_package_version (self , name : str ) -> str :
78+ if not self .get_pkgs (name ):
79+ return ""
6180 pkg = self .get_pkgs (name )[0 ]
6281 version = pkg .version
6382 if pkg .name != name :
6483 version = pkg .name + " " + version
6584 return version
6685
6786 def get_package_names (self , name : str ) -> dict [str , str ]:
68- return {
87+ names = {
6988 pkg .name : self .template .render (pkg = pkg )
7089 for pkg in self .db .search (name )
7190 if pkg .name .startswith (name )
7291 }
92+ if self .trie :
93+ for pkg in self .trie .keys (name ):
94+ if pkg not in names :
95+ names [pkg ] = ""
96+ return names
7397
7498 def get_package_document (self , name : str ) -> str :
99+ if not self .get_pkgs (name ):
100+ return ""
75101 docs = []
76102 for pkg in self .get_pkgs (name ):
77103 docs += [self .template .render (pkg = pkg )]
0 commit comments