2
2
3
3
"""
4
4
5
- from sphinx .domains import Domain
5
+ from sphinx .domains import Domain , Index , IndexEntry
6
6
from sphinx .util .logging import getLogger
7
7
from sphinx .util .docutils import SphinxDirective
8
8
from sphinx .errors import ExtensionError
14
14
from typing import List
15
15
from fnmatch import fnmatch
16
16
import re
17
+ from collections .abc import Iterable
18
+ from collections import defaultdict
17
19
18
20
__version__ = "0.4dev"
19
21
@@ -66,7 +68,8 @@ def run(self):
66
68
page_tags .extend (
67
69
[_normalize_tag (tag ) for tag in "," .join (self .content ).split ("," )]
68
70
)
69
- # Remove empty elements from page_tags (can happen after _normalize_tag())
71
+ # Remove empty elements from page_tags
72
+ # (can happen after _normalize_tag())
70
73
page_tags = list (filter (None , page_tags ))
71
74
72
75
global_tags = self .env .get_domain ("tags" )
@@ -104,6 +107,9 @@ def run(self):
104
107
if not count == len (page_tags ):
105
108
result += nodes .inline (text = tag_separator )
106
109
110
+ td = self .env .get_domain ("tags" )
111
+ td .add_tagpage (self .env .docname , page_tags )
112
+
107
113
return [result ]
108
114
109
115
def _get_plaintext_node (
@@ -146,6 +152,33 @@ def _get_tag_color(self, tag: str) -> str:
146
152
return "primary"
147
153
148
154
155
+ class PagesIndex (Index ):
156
+ """A custom index that creates a pages matrix."""
157
+
158
+ name = "tagpage"
159
+ localname = "Page Index"
160
+ shortname = "TagPage"
161
+
162
+ def generate (
163
+ self , docnames : Iterable [str ] | None = None
164
+ ) -> tuple [list [tuple [str , list [IndexEntry ]]], bool ]:
165
+ content = defaultdict (list )
166
+
167
+ # sort the list of pages
168
+ pages = sorted (self .domain .get_objects (), key = lambda page : page [0 ])
169
+
170
+ # name, subtype, docname, anchor, extra, qualifier, description
171
+
172
+ for _name , dispname , typ , docname , anchor , _priority in pages :
173
+ content [dispname [0 ].lower ()].append (
174
+ (dispname , 0 , docname , anchor , docname , "" , typ )
175
+ )
176
+
177
+ # convert the dict to the sorted list of tuples expected
178
+
179
+ return sorted (content .items ()), True
180
+
181
+
149
182
class TagsDomain (Domain ):
150
183
151
184
name = "tags"
@@ -157,12 +190,15 @@ class TagsDomain(Domain):
157
190
"tags" : TagLinks ,
158
191
}
159
192
193
+ indices = [PagesIndex ]
194
+
160
195
# The values defined in initial_data will be copied to
161
196
# env.domaindata[domain_name] as the initial data of the domain, and domain
162
197
# instances can access it via self.data.
163
198
initial_data = {
164
- "tags" : [],
165
- "entries" : {},
199
+ "tags" : [], # list of tags
200
+ "entries" : {}, # list of pages with tags
201
+ "pages" : [], # list of tag pages
166
202
}
167
203
168
204
def get_full_qualified_name (self , node ):
@@ -186,6 +222,17 @@ def add_tag(self, tagname, page):
186
222
# name, dispname, type, docname, anchor, priority
187
223
self .data ["tags" ].append ((tagname , tagname , "Tag" , page , anchor , 0 ))
188
224
225
+ def add_tagpage (self , docname , tags ):
226
+ """Add a new page of tags to domain"""
227
+ name = f"tagpage.{ docname } "
228
+ anchor = f"tagpage-{ docname } "
229
+
230
+ print (f"{ self .data ['tags' ]= } " )
231
+ # name, dispname, type, docname, anchor, priority
232
+ self .data ["pages" ].append (
233
+ (name , docname , "TagPage" , self .env .docname , anchor , 0 )
234
+ )
235
+
189
236
190
237
def create_file (
191
238
app ,
@@ -346,7 +393,7 @@ def update_tags(app):
346
393
os .remove (os .path .join (app .srcdir , tags_output_dir , file ))
347
394
348
395
# Create pages for each tag
349
- global_tags = env .get_domain ("tags" ).data ["entries" ]
396
+ global_tags = app . env .get_domain ("tags" ).data ["entries" ]
350
397
logger .info (f"Global tags: { global_tags = } " , color = "green" )
351
398
352
399
for tag in global_tags .items ():
@@ -408,7 +455,7 @@ def setup(app):
408
455
# Update tags
409
456
# Tags should be updated after sphinx-gallery is generated, on
410
457
# builder-inited
411
- app .connect ("source-read " , update_tags )
458
+ app .connect ("builder-inited " , update_tags )
412
459
app .add_directive ("tags" , TagLinks )
413
460
app .add_domain (TagsDomain )
414
461
0 commit comments