16
16
from docutils import core , nodes
17
17
from docutils .parsers .rst import roles
18
18
19
- from .schema import Schema , Value , Classifier , Classif
19
+ from .schema import Schema , Value , Indexer , Category
20
20
21
21
logger = logging .getLogger (__name__ )
22
22
@@ -29,22 +29,24 @@ class AnyIndex(Index):
29
29
domain : Domain # for type hint
30
30
schema : Schema
31
31
field : str | None = None
32
- classifier : Classifier
32
+ indexer : Indexer
33
33
34
34
@classmethod
35
35
def derive (
36
- cls , schema : Schema , field : str | None , classifier : Classifier
36
+ cls , schema : Schema , field : str | None , indexer : Indexer
37
37
) -> type ['AnyIndex' ]:
38
38
"""Generate an AnyIndex child class for indexing object."""
39
39
# TODO: add Indexer.name
40
40
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 () } '
44
44
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
+ )
48
50
return type (
49
51
typ ,
50
52
(cls ,),
@@ -54,7 +56,7 @@ def derive(
54
56
'shortname' : 'references' ,
55
57
'schema' : schema ,
56
58
'field' : field ,
57
- 'classifier ' : classifier ,
59
+ 'indexer ' : indexer ,
58
60
},
59
61
)
60
62
@@ -64,11 +66,11 @@ def generate(
64
66
"""Override parent method."""
65
67
66
68
# 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 ]]] = {}
69
71
# 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 ]]]] = {}
72
74
73
75
objrefs = sorted (self .domain .data ['references' ].items ())
74
76
for (objtype , objfield , objref ), objids in objrefs :
@@ -77,57 +79,57 @@ def generate(
77
79
if self .field and objfield != self .field :
78
80
continue
79
81
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
+ )
88
90
else :
89
- dualidx .setdefault (category , {}).setdefault (entry , {}).setdefault (
90
- catelog , set ()
91
+ dualidx .setdefault (main , {}).setdefault (sub , {}).setdefault (
92
+ category , set ()
91
93
).update (objids )
92
94
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 ):
97
99
for objid in objids :
98
- entry = self ._generate_index_entry (objid , docnames , category )
100
+ entry = self ._generate_index_entry (objid , docnames , main )
99
101
if entry is None :
100
102
continue
101
103
index_entries .append (entry )
102
104
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 ):
108
110
for objid in objids :
109
111
entry = self ._generate_index_entry (objid , docnames , subentry )
110
112
if entry is None :
111
113
continue
112
114
index_entries .append (entry )
113
115
114
- # sort by category, and map classif -> str
116
+ # sort by category, and map category -> str
115
117
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 )
118
120
]
119
121
120
122
return sorted_content , False
121
123
122
124
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
124
126
) -> IndexEntry | None :
125
127
docname , anchor , obj = self .domain .data ['objects' ][self .schema .objtype , objid ]
126
128
if ignore_docnames and docname not in ignore_docnames :
127
129
return None
128
130
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 ''
131
133
objcont = self .schema .content_of (obj )
132
134
if isinstance (objcont , str ):
133
135
desc = objcont
@@ -148,16 +150,17 @@ def _generate_index_entry(
148
150
desc , # description for the entry
149
151
)
150
152
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
152
155
return IndexEntry (
153
- category .leaf , category .index_entry_subtype , '' , '' , '' , '' , ''
156
+ category .sub , category .index_entry_subtype () , '' , '' , '' , '' , ''
154
157
)
155
158
156
159
_T = TypeVar ('_T' )
157
160
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 ])
161
164
162
165
163
166
def strip_rst_markups (rst : str ) -> str :
0 commit comments