1616from docutils import core , nodes
1717from docutils .parsers .rst import roles
1818
19- from .schema import Schema , Value , Classifier , Classif
19+ from .schema import Schema , Value , Indexer , Category
2020
2121logger = logging .getLogger (__name__ )
2222
@@ -29,22 +29,24 @@ class AnyIndex(Index):
2929 domain : Domain # for type hint
3030 schema : Schema
3131 field : str | None = None
32- classifier : Classifier
32+ indexer : Indexer
3333
3434 @classmethod
3535 def derive (
36- cls , schema : Schema , field : str | None , classifier : Classifier
36+ cls , schema : Schema , field : str | None , indexer : Indexer
3737 ) -> type ['AnyIndex' ]:
3838 """Generate an AnyIndex child class for indexing object."""
3939 # TODO: add Indexer.name
4040 if field :
41- typ = f'Any{ schema .objtype .title ()} { field .title ()} Index '
42- name = schema .objtype + '.' + field # TOOD: objtype_and_objfield_to_reftype
43- localname = f'{ schema .objtype .title ()} { field .title ()} Reference Index'
41+ typ = f'Any{ schema .objtype .title ()} { field .title ()} IndexBy { indexer . name . title () } '
42+ name = schema .objtype + '.' + field + '.by-' + indexer . name # TODO: RefType
43+ localname = f'{ schema .objtype .title ()} { field .title ()} Reference Index by { indexer . name . title () } '
4444 else :
45- typ = f'Any{ schema .objtype .title ()} Index'
46- name = schema .objtype
47- localname = f'{ schema .objtype .title ()} Reference Index'
45+ typ = f'Any{ schema .objtype .title ()} IndexBy{ indexer .name .title ()} '
46+ name = schema .objtype + '.by-' + indexer .name # TODO: RefType
47+ localname = (
48+ f'{ schema .objtype .title ()} Reference Index by { indexer .name .title ()} '
49+ )
4850 return type (
4951 typ ,
5052 (cls ,),
@@ -54,7 +56,7 @@ def derive(
5456 'shortname' : 'references' ,
5557 'schema' : schema ,
5658 'field' : field ,
57- 'classifier ' : classifier ,
59+ 'indexer ' : indexer ,
5860 },
5961 )
6062
@@ -64,11 +66,11 @@ def generate(
6466 """Override parent method."""
6567
6668 # Single index for generating normal entries (subtype=0).
67- # Category (lv1) → Category (for ordering objids) → objids
68- singleidx : dict [Classif , dict [Classif , set [str ]]] = {}
69+ # Main Category → Extra (for ordering objids) → objids
70+ singleidx : dict [Category , dict [Category , set [str ]]] = {}
6971 # Dual index for generating entrie (subtype=1) and its sub-entries (subtype=2).
70- # Category (lv1) → Category (lv2) → Category (for ordering objids) → objids
71- dualidx : dict [Classif , dict [Classif , dict [Classif , set [str ]]]] = {}
72+ # Main category → Sub- Category → Extra (for ordering objids) → objids
73+ dualidx : dict [Category , dict [Category , dict [Category , set [str ]]]] = {}
7274
7375 objrefs = sorted (self .domain .data ['references' ].items ())
7476 for (objtype , objfield , objref ), objids in objrefs :
@@ -77,57 +79,57 @@ def generate(
7779 if self .field and objfield != self .field :
7880 continue
7981
80- # TODO: pass a real value
81- for catelog in self .classifier .classify (Value (objref )):
82- category = catelog . as_category ()
83- entry = catelog . as_entry ()
84- if entry is None :
85- singleidx .setdefault (category , {}).setdefault (
86- catelog , set ()
87- ). update ( objids )
82+ # TODO: pass a real Value
83+ for category in self .indexer .classify (Value (objref )):
84+ main = category . as_main ()
85+ sub = category . as_sub ()
86+ if sub is None :
87+ singleidx .setdefault (main , {}).setdefault ( category , set ()). update (
88+ objids
89+ )
8890 else :
89- dualidx .setdefault (category , {}).setdefault (entry , {}).setdefault (
90- catelog , set ()
91+ dualidx .setdefault (main , {}).setdefault (sub , {}).setdefault (
92+ category , set ()
9193 ).update (objids )
9294
93- content : dict [Classif , list [IndexEntry ]] = {} # category → entries
94- for category , entries in self ._sort_by_catelog (singleidx ):
95- index_entries = content .setdefault (category , [])
96- for category , objids in self ._sort_by_catelog (entries ):
95+ content : dict [Category , list [IndexEntry ]] = {} # category → entries
96+ for main , entries in self ._sort_by_category (singleidx ):
97+ index_entries = content .setdefault (main , [])
98+ for main , objids in self ._sort_by_category (entries ):
9799 for objid in objids :
98- entry = self ._generate_index_entry (objid , docnames , category )
100+ entry = self ._generate_index_entry (objid , docnames , main )
99101 if entry is None :
100102 continue
101103 index_entries .append (entry )
102104
103- for category , entries in self ._sort_by_catelog (dualidx ):
104- index_entries = content .setdefault (category , [])
105- for entry , subentries in self ._sort_by_catelog (entries ):
106- index_entries .append (self ._generate_empty_index_entry ( entry ))
107- for subentry , objids in self ._sort_by_catelog (subentries ):
105+ for main , entries in self ._sort_by_category (dualidx ):
106+ index_entries = content .setdefault (main , [])
107+ for sub , subentries in self ._sort_by_category (entries ):
108+ index_entries .append (self ._generate_subcategory_index_entry ( sub ))
109+ for subentry , objids in self ._sort_by_category (subentries ):
108110 for objid in objids :
109111 entry = self ._generate_index_entry (objid , docnames , subentry )
110112 if entry is None :
111113 continue
112114 index_entries .append (entry )
113115
114- # sort by category, and map classif -> str
116+ # sort by category, and map category -> str
115117 sorted_content = [
116- (classif . leaf , entries )
117- for classif , entries in self ._sort_by_catelog (content )
118+ (category . main , entries )
119+ for category , entries in self ._sort_by_category (content )
118120 ]
119121
120122 return sorted_content , False
121123
122124 def _generate_index_entry (
123- self , objid : str , ignore_docnames : Iterable [str ] | None , category : Classif
125+ self , objid : str , ignore_docnames : Iterable [str ] | None , category : Category
124126 ) -> IndexEntry | None :
125127 docname , anchor , obj = self .domain .data ['objects' ][self .schema .objtype , objid ]
126128 if ignore_docnames and docname not in ignore_docnames :
127129 return None
128130 name = self .schema .title_of (obj ) or objid
129- subtype = category .index_entry_subtype
130- extra = category .leaf
131+ subtype = category .index_entry_subtype ()
132+ extra = category .extra or ''
131133 objcont = self .schema .content_of (obj )
132134 if isinstance (objcont , str ):
133135 desc = objcont
@@ -148,16 +150,17 @@ def _generate_index_entry(
148150 desc , # description for the entry
149151 )
150152
151- def _generate_empty_index_entry (self , category : Classif ) -> IndexEntry :
153+ def _generate_subcategory_index_entry (self , category : Category ) -> IndexEntry :
154+ assert category .sub is not None
152155 return IndexEntry (
153- category .leaf , category .index_entry_subtype , '' , '' , '' , '' , ''
156+ category .sub , category .index_entry_subtype () , '' , '' , '' , '' , ''
154157 )
155158
156159 _T = TypeVar ('_T' )
157160
158- def _sort_by_catelog (self , d : dict [Classif , _T ]) -> list [tuple [Classif , _T ]]:
159- """Helper for sorting dict items by Category ."""
160- return self .classifier .sort (d .items (), lambda x : x [0 ])
161+ def _sort_by_category (self , d : dict [Category , _T ]) -> list [tuple [Category , _T ]]:
162+ """Helper for sorting dict items by classif ."""
163+ return self .indexer .sort (d .items (), lambda x : x [0 ])
161164
162165
163166def strip_rst_markups (rst : str ) -> str :
0 commit comments