9
9
:license: Python license.
10
10
"""
11
11
12
- ISSUE_URI = 'http://bugs.python.org/issue%s'
13
- SOURCE_URI = 'http://hg.python.org/cpython/file/3.3/%s'
12
+ import re
13
+ import codecs
14
+ from os import path
15
+ from time import asctime
16
+ from pprint import pformat
17
+ from docutils .io import StringOutput
18
+ from docutils .parsers .rst import Directive
19
+ from docutils .utils import new_document
14
20
15
21
from docutils import nodes , utils
16
22
17
- import sphinx
23
+ from sphinx import addnodes
24
+ from sphinx .builders import Builder
18
25
from sphinx .util .nodes import split_explicit_title
19
- from sphinx .util .compat import Directive
20
26
from sphinx .writers .html import HTMLTranslator
27
+ from sphinx .writers .text import TextWriter
21
28
from sphinx .writers .latex import LaTeXTranslator
22
- from sphinx .locale import versionlabels
29
+ from sphinx .domains .python import PyModulelevel , PyClassmember
30
+
31
+ # Support for checking for suspicious markup
32
+
33
+ import suspicious
34
+
35
+
36
+ ISSUE_URI = 'https://bugs.python.org/issue%s'
37
+ SOURCE_URI = 'https://github.com/python/cpython/tree/3.3/%s'
23
38
24
39
# monkey-patch reST parser to disable alphabetic and roman enumerated lists
25
40
from docutils .parsers .rst .states import Body
28
43
Body .enum .converters ['lowerroman' ] = \
29
44
Body .enum .converters ['upperroman' ] = lambda x : None
30
45
31
- SPHINX11 = sphinx .__version__ [:3 ] < '1.2'
32
-
33
- if SPHINX11 :
34
- # monkey-patch HTML translator to give versionmodified paragraphs a class
35
- def new_visit_versionmodified (self , node ):
36
- self .body .append (self .starttag (node , 'p' , CLASS = node ['type' ]))
37
- text = versionlabels [node ['type' ]] % node ['version' ]
38
- if len (node ):
39
- text += ':'
40
- else :
41
- text += '.'
42
- self .body .append ('<span class="versionmodified">%s</span> ' % text )
43
- HTMLTranslator .visit_versionmodified = new_visit_versionmodified
44
-
45
46
# monkey-patch HTML and LaTeX translators to keep doctest blocks in the
46
47
# doctest docs themselves
47
48
orig_visit_literal_block = HTMLTranslator .visit_literal_block
49
+ orig_depart_literal_block = LaTeXTranslator .depart_literal_block
50
+
51
+
48
52
def new_visit_literal_block (self , node ):
49
53
meta = self .builder .env .metadata [self .builder .current_docname ]
50
54
old_trim_doctest_flags = self .highlighter .trim_doctest_flags
@@ -55,9 +59,7 @@ def new_visit_literal_block(self, node):
55
59
finally :
56
60
self .highlighter .trim_doctest_flags = old_trim_doctest_flags
57
61
58
- HTMLTranslator .visit_literal_block = new_visit_literal_block
59
62
60
- orig_depart_literal_block = LaTeXTranslator .depart_literal_block
61
63
def new_depart_literal_block (self , node ):
62
64
meta = self .builder .env .metadata [self .curfilestack [- 1 ]]
63
65
old_trim_doctest_flags = self .highlighter .trim_doctest_flags
@@ -68,8 +70,11 @@ def new_depart_literal_block(self, node):
68
70
finally :
69
71
self .highlighter .trim_doctest_flags = old_trim_doctest_flags
70
72
73
+
74
+ HTMLTranslator .visit_literal_block = new_visit_literal_block
71
75
LaTeXTranslator .depart_literal_block = new_depart_literal_block
72
76
77
+
73
78
# Support for marking up and linking to bugs.python.org issues
74
79
75
80
def issue_role (typ , rawtext , text , lineno , inliner , options = {}, content = []):
@@ -117,9 +122,6 @@ def run(self):
117
122
118
123
# Support for documenting decorators
119
124
120
- from sphinx import addnodes
121
- from sphinx .domains .python import PyModulelevel , PyClassmember
122
-
123
125
class PyDecoratorMixin (object ):
124
126
def handle_signature (self , sig , signode ):
125
127
ret = super (PyDecoratorMixin , self ).handle_signature (sig , signode )
@@ -129,18 +131,39 @@ def handle_signature(self, sig, signode):
129
131
def needs_arglist (self ):
130
132
return False
131
133
134
+
132
135
class PyDecoratorFunction (PyDecoratorMixin , PyModulelevel ):
133
136
def run (self ):
134
137
# a decorator function is a function after all
135
138
self .name = 'py:function'
136
139
return PyModulelevel .run (self )
137
140
141
+
138
142
class PyDecoratorMethod (PyDecoratorMixin , PyClassmember ):
139
143
def run (self ):
140
144
self .name = 'py:method'
141
145
return PyClassmember .run (self )
142
146
143
147
148
+ class PyCoroutineMixin (object ):
149
+ def handle_signature (self , sig , signode ):
150
+ ret = super (PyCoroutineMixin , self ).handle_signature (sig , signode )
151
+ signode .insert (0 , addnodes .desc_annotation ('coroutine ' , 'coroutine ' ))
152
+ return ret
153
+
154
+
155
+ class PyCoroutineFunction (PyCoroutineMixin , PyModulelevel ):
156
+ def run (self ):
157
+ self .name = 'py:function'
158
+ return PyModulelevel .run (self )
159
+
160
+
161
+ class PyCoroutineMethod (PyCoroutineMixin , PyClassmember ):
162
+ def run (self ):
163
+ self .name = 'py:method'
164
+ return PyClassmember .run (self )
165
+
166
+
144
167
# Support for documenting version of removal in deprecations
145
168
146
169
class DeprecatedRemoved (Directive ):
@@ -168,35 +191,31 @@ def run(self):
168
191
messages = []
169
192
if self .content :
170
193
self .state .nested_parse (self .content , self .content_offset , node )
194
+ if len (node ):
171
195
if isinstance (node [0 ], nodes .paragraph ) and node [0 ].rawsource :
172
196
content = nodes .inline (node [0 ].rawsource , translatable = True )
173
197
content .source = node [0 ].source
174
198
content .line = node [0 ].line
175
199
content += node [0 ].children
176
200
node [0 ].replace_self (nodes .paragraph ('' , '' , content ))
177
- if not SPHINX11 :
178
- node [0 ].insert (0 , nodes .inline ('' , '%s: ' % text ,
179
- classes = ['versionmodified' ]))
180
- elif not SPHINX11 :
201
+ node [0 ].insert (0 , nodes .inline ('' , '%s: ' % text ,
202
+ classes = ['versionmodified' ]))
203
+ else :
181
204
para = nodes .paragraph ('' , '' ,
182
- nodes .inline ('' , '%s.' % text , classes = ['versionmodified' ]))
205
+ nodes .inline ('' , '%s.' % text ,
206
+ classes = ['versionmodified' ]))
183
207
node .append (para )
184
208
env = self .state .document .settings .env
185
209
env .note_versionchange ('deprecated' , version [0 ], node , self .lineno )
186
210
return [node ] + messages
187
211
188
- # for Sphinx < 1.2
189
- versionlabels ['deprecated-removed' ] = DeprecatedRemoved ._label
190
-
191
212
192
213
# Support for including Misc/NEWS
193
214
194
- import re
195
- import codecs
196
-
197
215
issue_re = re .compile ('([Ii])ssue #([0-9]+)' )
198
216
whatsnew_re = re .compile (r"(?im)^what's new in (.*?)\??$" )
199
217
218
+
200
219
class MiscNews (Directive ):
201
220
has_content = False
202
221
required_arguments = 1
@@ -221,7 +240,7 @@ def run(self):
221
240
text = 'The NEWS file is not available.'
222
241
node = nodes .strong (text , text )
223
242
return [node ]
224
- content = issue_re .sub (r'`\1ssue #\2 <http ://bugs.python.org/\2>`__' ,
243
+ content = issue_re .sub (r'`\1ssue #\2 <https ://bugs.python.org/\2>`__' ,
225
244
content )
226
245
content = whatsnew_re .sub (r'\1' , content )
227
246
# remove first 3 lines as they are the main heading
@@ -250,15 +269,6 @@ def run(self):
250
269
'typesseq' , 'typesseq-mutable' , 'unary' , 'while' , 'with' , 'yield'
251
270
]
252
271
253
- from os import path
254
- from time import asctime
255
- from pprint import pformat
256
- from docutils .io import StringOutput
257
- from docutils .utils import new_document
258
-
259
- from sphinx .builders import Builder
260
- from sphinx .writers .text import TextWriter
261
-
262
272
263
273
class PydocTopicsBuilder (Builder ):
264
274
name = 'pydoc-topics'
@@ -286,29 +296,23 @@ def write(self, *ignored):
286
296
document .append (doctree .ids [labelid ])
287
297
destination = StringOutput (encoding = 'utf-8' )
288
298
writer .write (document , destination )
289
- self .topics [label ] = writer .output . encode ( 'utf-8' )
299
+ self .topics [label ] = writer .output
290
300
291
301
def finish (self ):
292
- f = open (path .join (self .outdir , 'topics.py' ), 'w ' )
302
+ f = open (path .join (self .outdir , 'topics.py' ), 'wb ' )
293
303
try :
294
- f .write ('# -*- coding: utf-8 -*-\n ' )
295
- f .write ('# Autogenerated by Sphinx on %s\n ' % asctime ())
296
- f .write ('topics = ' + pformat (self .topics ) + '\n ' )
304
+ f .write ('# -*- coding: utf-8 -*-\n ' . encode ( 'utf-8' ) )
305
+ f .write (( '# Autogenerated by Sphinx on %s\n ' % asctime ()). encode ( 'utf-8' ))
306
+ f .write (( 'topics = ' + pformat (self .topics ) + '\n ' ). encode ( 'utf-8' ) )
297
307
finally :
298
308
f .close ()
299
309
300
310
301
- # Support for checking for suspicious markup
302
-
303
- import suspicious
304
-
305
-
306
311
# Support for documenting Opcodes
307
312
308
- import re
309
-
310
313
opcode_sig_re = re .compile (r'(\w+(?:\+\d)?)(?:\s*\((.*)\))?' )
311
314
315
+
312
316
def parse_opcode_signature (env , sig , signode ):
313
317
"""Transform an opcode signature into RST nodes."""
314
318
m = opcode_sig_re .match (sig )
@@ -328,12 +332,13 @@ def parse_opcode_signature(env, sig, signode):
328
332
pdbcmd_sig_re = re .compile (r'([a-z()!]+)\s*(.*)' )
329
333
330
334
# later...
331
- #pdbargs_tokens_re = re.compile(r'''[a-zA-Z]+ | # identifiers
335
+ # pdbargs_tokens_re = re.compile(r'''[a-zA-Z]+ | # identifiers
332
336
# [.,:]+ | # punctuation
333
337
# [\[\]()] | # parens
334
338
# \s+ # whitespace
335
339
# ''', re.X)
336
340
341
+
337
342
def parse_pdb_command (env , sig , signode ):
338
343
"""Transform a pdb command signature into RST nodes."""
339
344
m = pdbcmd_sig_re .match (sig )
@@ -361,4 +366,7 @@ def setup(app):
361
366
app .add_description_unit ('2to3fixer' , '2to3fixer' , '%s (2to3 fixer)' )
362
367
app .add_directive_to_domain ('py' , 'decorator' , PyDecoratorFunction )
363
368
app .add_directive_to_domain ('py' , 'decoratormethod' , PyDecoratorMethod )
369
+ app .add_directive_to_domain ('py' , 'coroutinefunction' , PyCoroutineFunction )
370
+ app .add_directive_to_domain ('py' , 'coroutinemethod' , PyCoroutineMethod )
364
371
app .add_directive ('miscnews' , MiscNews )
372
+ return {'version' : '1.0' , 'parallel_read_safe' : True }
0 commit comments