##// END OF EJS Templates
preserve priority of user-registered per-mime renderers...
Min RK -
Show More
@@ -1,1031 +1,1040 b''
1 1 # -*- coding: utf-8 -*-
2 2 """Display formatters.
3 3
4 4 Inheritance diagram:
5 5
6 6 .. inheritance-diagram:: IPython.core.formatters
7 7 :parts: 3
8 8 """
9 9
10 10 # Copyright (c) IPython Development Team.
11 11 # Distributed under the terms of the Modified BSD License.
12 12
13 13 import abc
14 14 import json
15 15 import sys
16 16 import traceback
17 17 import warnings
18 18 from io import StringIO
19 19
20 20 from decorator import decorator
21 21
22 22 from traitlets.config.configurable import Configurable
23 23 from IPython.core.getipython import get_ipython
24 24 from IPython.utils.sentinel import Sentinel
25 25 from IPython.utils.dir2 import get_real_method
26 26 from IPython.lib import pretty
27 27 from traitlets import (
28 28 Bool, Dict, Integer, Unicode, CUnicode, ObjectName, List,
29 29 ForwardDeclaredInstance,
30 30 default, observe,
31 31 )
32 32
33 33
34 34 class DisplayFormatter(Configurable):
35 35
36 36 active_types = List(Unicode(),
37 37 help="""List of currently active mime-types to display.
38 38 You can use this to set a white-list for formats to display.
39 39
40 40 Most users will not need to change this value.
41 41 """).tag(config=True)
42 42
43 43 @default('active_types')
44 44 def _active_types_default(self):
45 45 return self.format_types
46 46
47 47 @observe('active_types')
48 48 def _active_types_changed(self, change):
49 49 for key, formatter in self.formatters.items():
50 50 if key in change['new']:
51 51 formatter.enabled = True
52 52 else:
53 53 formatter.enabled = False
54 54
55 55 ipython_display_formatter = ForwardDeclaredInstance('FormatterABC')
56 56 @default('ipython_display_formatter')
57 57 def _default_formatter(self):
58 58 return IPythonDisplayFormatter(parent=self)
59 59
60 60 mimebundle_formatter = ForwardDeclaredInstance('FormatterABC')
61 61 @default('mimebundle_formatter')
62 62 def _default_mime_formatter(self):
63 63 return MimeBundleFormatter(parent=self)
64 64
65 65 # A dict of formatter whose keys are format types (MIME types) and whose
66 66 # values are subclasses of BaseFormatter.
67 67 formatters = Dict()
68 68 @default('formatters')
69 69 def _formatters_default(self):
70 70 """Activate the default formatters."""
71 71 formatter_classes = [
72 72 PlainTextFormatter,
73 73 HTMLFormatter,
74 74 MarkdownFormatter,
75 75 SVGFormatter,
76 76 PNGFormatter,
77 77 PDFFormatter,
78 78 JPEGFormatter,
79 79 LatexFormatter,
80 80 JSONFormatter,
81 81 JavascriptFormatter
82 82 ]
83 83 d = {}
84 84 for cls in formatter_classes:
85 85 f = cls(parent=self)
86 86 d[f.format_type] = f
87 87 return d
88 88
89 89 def format(self, obj, include=None, exclude=None):
90 90 """Return a format data dict for an object.
91 91
92 92 By default all format types will be computed.
93 93
94 94 The following MIME types are usually implemented:
95 95
96 96 * text/plain
97 97 * text/html
98 98 * text/markdown
99 99 * text/latex
100 100 * application/json
101 101 * application/javascript
102 102 * application/pdf
103 103 * image/png
104 104 * image/jpeg
105 105 * image/svg+xml
106 106
107 107 Parameters
108 108 ----------
109 109 obj : object
110 110 The Python object whose format data will be computed.
111 111 include : list, tuple or set; optional
112 112 A list of format type strings (MIME types) to include in the
113 113 format data dict. If this is set *only* the format types included
114 114 in this list will be computed.
115 115 exclude : list, tuple or set; optional
116 116 A list of format type string (MIME types) to exclude in the format
117 117 data dict. If this is set all format types will be computed,
118 118 except for those included in this argument.
119 119 Mimetypes present in exclude will take precedence over the ones in include
120 120
121 121 Returns
122 122 -------
123 123 (format_dict, metadata_dict) : tuple of two dicts
124 124
125 125 format_dict is a dictionary of key/value pairs, one of each format that was
126 126 generated for the object. The keys are the format types, which
127 127 will usually be MIME type strings and the values and JSON'able
128 128 data structure containing the raw data for the representation in
129 129 that format.
130 130
131 131 metadata_dict is a dictionary of metadata about each mime-type output.
132 132 Its keys will be a strict subset of the keys in format_dict.
133 133
134 134 Notes
135 135 -----
136 136
137 137 If an object implement `_repr_mimebundle_` as well as various
138 138 `_repr_*_`, the data returned by `_repr_mimebundle_` will take
139 139 precedence and the corresponding `_repr_*_` for this mimetype will
140 140 not be called.
141 141
142 142 """
143 143 format_dict = {}
144 144 md_dict = {}
145 145
146 146 if self.ipython_display_formatter(obj):
147 147 # object handled itself, don't proceed
148 148 return {}, {}
149 149
150 150 format_dict, md_dict = self.mimebundle_formatter(obj, include=include, exclude=exclude)
151 151
152 152 if format_dict or md_dict:
153 153 if include:
154 154 format_dict = {k:v for k,v in format_dict.items() if k in include}
155 155 md_dict = {k:v for k,v in md_dict.items() if k in include}
156 156 if exclude:
157 157 format_dict = {k:v for k,v in format_dict.items() if k not in exclude}
158 158 md_dict = {k:v for k,v in md_dict.items() if k not in exclude}
159 159
160 160 for format_type, formatter in self.formatters.items():
161 161 if format_type in format_dict:
162 # already got it from mimebundle, don't render again
163 continue
162 # already got it from mimebundle, maybe don't render again.
163 # exception: manually registered per-mime renderer
164 # check priority:
165 # 1. user-registered per-mime formatter
166 # 2. mime-bundle (user-registered or repr method)
167 # 3. default per-mime formatter (e.g. repr method)
168 try:
169 formatter.lookup(obj)
170 except KeyError:
171 # no special formatter, use mime-bundle-provided value
172 continue
164 173 if include and format_type not in include:
165 174 continue
166 175 if exclude and format_type in exclude:
167 176 continue
168 177
169 178 md = None
170 179 try:
171 180 data = formatter(obj)
172 181 except:
173 182 # FIXME: log the exception
174 183 raise
175 184
176 185 # formatters can return raw data or (data, metadata)
177 186 if isinstance(data, tuple) and len(data) == 2:
178 187 data, md = data
179 188
180 189 if data is not None:
181 190 format_dict[format_type] = data
182 191 if md is not None:
183 192 md_dict[format_type] = md
184 193 return format_dict, md_dict
185 194
186 195 @property
187 196 def format_types(self):
188 197 """Return the format types (MIME types) of the active formatters."""
189 198 return list(self.formatters.keys())
190 199
191 200
192 201 #-----------------------------------------------------------------------------
193 202 # Formatters for specific format types (text, html, svg, etc.)
194 203 #-----------------------------------------------------------------------------
195 204
196 205
197 206 def _safe_repr(obj):
198 207 """Try to return a repr of an object
199 208
200 209 always returns a string, at least.
201 210 """
202 211 try:
203 212 return repr(obj)
204 213 except Exception as e:
205 214 return "un-repr-able object (%r)" % e
206 215
207 216
208 217 class FormatterWarning(UserWarning):
209 218 """Warning class for errors in formatters"""
210 219
211 220 @decorator
212 221 def catch_format_error(method, self, *args, **kwargs):
213 222 """show traceback on failed format call"""
214 223 try:
215 224 r = method(self, *args, **kwargs)
216 225 except NotImplementedError:
217 226 # don't warn on NotImplementedErrors
218 227 return None
219 228 except Exception:
220 229 exc_info = sys.exc_info()
221 230 ip = get_ipython()
222 231 if ip is not None:
223 232 ip.showtraceback(exc_info)
224 233 else:
225 234 traceback.print_exception(*exc_info)
226 235 return None
227 236 return self._check_return(r, args[0])
228 237
229 238
230 239 class FormatterABC(metaclass=abc.ABCMeta):
231 240 """ Abstract base class for Formatters.
232 241
233 242 A formatter is a callable class that is responsible for computing the
234 243 raw format data for a particular format type (MIME type). For example,
235 244 an HTML formatter would have a format type of `text/html` and would return
236 245 the HTML representation of the object when called.
237 246 """
238 247
239 248 # The format type of the data returned, usually a MIME type.
240 249 format_type = 'text/plain'
241 250
242 251 # Is the formatter enabled...
243 252 enabled = True
244 253
245 254 @abc.abstractmethod
246 255 def __call__(self, obj):
247 256 """Return a JSON'able representation of the object.
248 257
249 258 If the object cannot be formatted by this formatter,
250 259 warn and return None.
251 260 """
252 261 return repr(obj)
253 262
254 263
255 264 def _mod_name_key(typ):
256 265 """Return a (__module__, __name__) tuple for a type.
257 266
258 267 Used as key in Formatter.deferred_printers.
259 268 """
260 269 module = getattr(typ, '__module__', None)
261 270 name = getattr(typ, '__name__', None)
262 271 return (module, name)
263 272
264 273
265 274 def _get_type(obj):
266 275 """Return the type of an instance (old and new-style)"""
267 276 return getattr(obj, '__class__', None) or type(obj)
268 277
269 278
270 279 _raise_key_error = Sentinel('_raise_key_error', __name__,
271 280 """
272 281 Special value to raise a KeyError
273 282
274 283 Raise KeyError in `BaseFormatter.pop` if passed as the default value to `pop`
275 284 """)
276 285
277 286
278 287 class BaseFormatter(Configurable):
279 288 """A base formatter class that is configurable.
280 289
281 290 This formatter should usually be used as the base class of all formatters.
282 291 It is a traited :class:`Configurable` class and includes an extensible
283 292 API for users to determine how their objects are formatted. The following
284 293 logic is used to find a function to format an given object.
285 294
286 295 1. The object is introspected to see if it has a method with the name
287 296 :attr:`print_method`. If is does, that object is passed to that method
288 297 for formatting.
289 298 2. If no print method is found, three internal dictionaries are consulted
290 299 to find print method: :attr:`singleton_printers`, :attr:`type_printers`
291 300 and :attr:`deferred_printers`.
292 301
293 302 Users should use these dictionaries to register functions that will be
294 303 used to compute the format data for their objects (if those objects don't
295 304 have the special print methods). The easiest way of using these
296 305 dictionaries is through the :meth:`for_type` and :meth:`for_type_by_name`
297 306 methods.
298 307
299 308 If no function/callable is found to compute the format data, ``None`` is
300 309 returned and this format type is not used.
301 310 """
302 311
303 312 format_type = Unicode('text/plain')
304 313 _return_type = str
305 314
306 315 enabled = Bool(True).tag(config=True)
307 316
308 317 print_method = ObjectName('__repr__')
309 318
310 319 # The singleton printers.
311 320 # Maps the IDs of the builtin singleton objects to the format functions.
312 321 singleton_printers = Dict().tag(config=True)
313 322
314 323 # The type-specific printers.
315 324 # Map type objects to the format functions.
316 325 type_printers = Dict().tag(config=True)
317 326
318 327 # The deferred-import type-specific printers.
319 328 # Map (modulename, classname) pairs to the format functions.
320 329 deferred_printers = Dict().tag(config=True)
321 330
322 331 @catch_format_error
323 332 def __call__(self, obj):
324 333 """Compute the format for an object."""
325 334 if self.enabled:
326 335 # lookup registered printer
327 336 try:
328 337 printer = self.lookup(obj)
329 338 except KeyError:
330 339 pass
331 340 else:
332 341 return printer(obj)
333 342 # Finally look for special method names
334 343 method = get_real_method(obj, self.print_method)
335 344 if method is not None:
336 345 return method()
337 346 return None
338 347 else:
339 348 return None
340 349
341 350 def __contains__(self, typ):
342 351 """map in to lookup_by_type"""
343 352 try:
344 353 self.lookup_by_type(typ)
345 354 except KeyError:
346 355 return False
347 356 else:
348 357 return True
349 358
350 359 def _check_return(self, r, obj):
351 360 """Check that a return value is appropriate
352 361
353 362 Return the value if so, None otherwise, warning if invalid.
354 363 """
355 364 if r is None or isinstance(r, self._return_type) or \
356 365 (isinstance(r, tuple) and r and isinstance(r[0], self._return_type)):
357 366 return r
358 367 else:
359 368 warnings.warn(
360 369 "%s formatter returned invalid type %s (expected %s) for object: %s" % \
361 370 (self.format_type, type(r), self._return_type, _safe_repr(obj)),
362 371 FormatterWarning
363 372 )
364 373
365 374 def lookup(self, obj):
366 375 """Look up the formatter for a given instance.
367 376
368 377 Parameters
369 378 ----------
370 379 obj : object instance
371 380
372 381 Returns
373 382 -------
374 383 f : callable
375 384 The registered formatting callable for the type.
376 385
377 386 Raises
378 387 ------
379 388 KeyError if the type has not been registered.
380 389 """
381 390 # look for singleton first
382 391 obj_id = id(obj)
383 392 if obj_id in self.singleton_printers:
384 393 return self.singleton_printers[obj_id]
385 394 # then lookup by type
386 395 return self.lookup_by_type(_get_type(obj))
387 396
388 397 def lookup_by_type(self, typ):
389 398 """Look up the registered formatter for a type.
390 399
391 400 Parameters
392 401 ----------
393 402 typ : type or '__module__.__name__' string for a type
394 403
395 404 Returns
396 405 -------
397 406 f : callable
398 407 The registered formatting callable for the type.
399 408
400 409 Raises
401 410 ------
402 411 KeyError if the type has not been registered.
403 412 """
404 413 if isinstance(typ, str):
405 414 typ_key = tuple(typ.rsplit('.',1))
406 415 if typ_key not in self.deferred_printers:
407 416 # We may have it cached in the type map. We will have to
408 417 # iterate over all of the types to check.
409 418 for cls in self.type_printers:
410 419 if _mod_name_key(cls) == typ_key:
411 420 return self.type_printers[cls]
412 421 else:
413 422 return self.deferred_printers[typ_key]
414 423 else:
415 424 for cls in pretty._get_mro(typ):
416 425 if cls in self.type_printers or self._in_deferred_types(cls):
417 426 return self.type_printers[cls]
418 427
419 428 # If we have reached here, the lookup failed.
420 429 raise KeyError("No registered printer for {0!r}".format(typ))
421 430
422 431 def for_type(self, typ, func=None):
423 432 """Add a format function for a given type.
424 433
425 434 Parameters
426 435 -----------
427 436 typ : type or '__module__.__name__' string for a type
428 437 The class of the object that will be formatted using `func`.
429 438 func : callable
430 439 A callable for computing the format data.
431 440 `func` will be called with the object to be formatted,
432 441 and will return the raw data in this formatter's format.
433 442 Subclasses may use a different call signature for the
434 443 `func` argument.
435 444
436 445 If `func` is None or not specified, there will be no change,
437 446 only returning the current value.
438 447
439 448 Returns
440 449 -------
441 450 oldfunc : callable
442 451 The currently registered callable.
443 452 If you are registering a new formatter,
444 453 this will be the previous value (to enable restoring later).
445 454 """
446 455 # if string given, interpret as 'pkg.module.class_name'
447 456 if isinstance(typ, str):
448 457 type_module, type_name = typ.rsplit('.', 1)
449 458 return self.for_type_by_name(type_module, type_name, func)
450 459
451 460 try:
452 461 oldfunc = self.lookup_by_type(typ)
453 462 except KeyError:
454 463 oldfunc = None
455 464
456 465 if func is not None:
457 466 self.type_printers[typ] = func
458 467
459 468 return oldfunc
460 469
461 470 def for_type_by_name(self, type_module, type_name, func=None):
462 471 """Add a format function for a type specified by the full dotted
463 472 module and name of the type, rather than the type of the object.
464 473
465 474 Parameters
466 475 ----------
467 476 type_module : str
468 477 The full dotted name of the module the type is defined in, like
469 478 ``numpy``.
470 479 type_name : str
471 480 The name of the type (the class name), like ``dtype``
472 481 func : callable
473 482 A callable for computing the format data.
474 483 `func` will be called with the object to be formatted,
475 484 and will return the raw data in this formatter's format.
476 485 Subclasses may use a different call signature for the
477 486 `func` argument.
478 487
479 488 If `func` is None or unspecified, there will be no change,
480 489 only returning the current value.
481 490
482 491 Returns
483 492 -------
484 493 oldfunc : callable
485 494 The currently registered callable.
486 495 If you are registering a new formatter,
487 496 this will be the previous value (to enable restoring later).
488 497 """
489 498 key = (type_module, type_name)
490 499
491 500 try:
492 501 oldfunc = self.lookup_by_type("%s.%s" % key)
493 502 except KeyError:
494 503 oldfunc = None
495 504
496 505 if func is not None:
497 506 self.deferred_printers[key] = func
498 507 return oldfunc
499 508
500 509 def pop(self, typ, default=_raise_key_error):
501 510 """Pop a formatter for the given type.
502 511
503 512 Parameters
504 513 ----------
505 514 typ : type or '__module__.__name__' string for a type
506 515 default : object
507 516 value to be returned if no formatter is registered for typ.
508 517
509 518 Returns
510 519 -------
511 520 obj : object
512 521 The last registered object for the type.
513 522
514 523 Raises
515 524 ------
516 525 KeyError if the type is not registered and default is not specified.
517 526 """
518 527
519 528 if isinstance(typ, str):
520 529 typ_key = tuple(typ.rsplit('.',1))
521 530 if typ_key not in self.deferred_printers:
522 531 # We may have it cached in the type map. We will have to
523 532 # iterate over all of the types to check.
524 533 for cls in self.type_printers:
525 534 if _mod_name_key(cls) == typ_key:
526 535 old = self.type_printers.pop(cls)
527 536 break
528 537 else:
529 538 old = default
530 539 else:
531 540 old = self.deferred_printers.pop(typ_key)
532 541 else:
533 542 if typ in self.type_printers:
534 543 old = self.type_printers.pop(typ)
535 544 else:
536 545 old = self.deferred_printers.pop(_mod_name_key(typ), default)
537 546 if old is _raise_key_error:
538 547 raise KeyError("No registered value for {0!r}".format(typ))
539 548 return old
540 549
541 550 def _in_deferred_types(self, cls):
542 551 """
543 552 Check if the given class is specified in the deferred type registry.
544 553
545 554 Successful matches will be moved to the regular type registry for future use.
546 555 """
547 556 mod = getattr(cls, '__module__', None)
548 557 name = getattr(cls, '__name__', None)
549 558 key = (mod, name)
550 559 if key in self.deferred_printers:
551 560 # Move the printer over to the regular registry.
552 561 printer = self.deferred_printers.pop(key)
553 562 self.type_printers[cls] = printer
554 563 return True
555 564 return False
556 565
557 566
558 567 class PlainTextFormatter(BaseFormatter):
559 568 """The default pretty-printer.
560 569
561 570 This uses :mod:`IPython.lib.pretty` to compute the format data of
562 571 the object. If the object cannot be pretty printed, :func:`repr` is used.
563 572 See the documentation of :mod:`IPython.lib.pretty` for details on
564 573 how to write pretty printers. Here is a simple example::
565 574
566 575 def dtype_pprinter(obj, p, cycle):
567 576 if cycle:
568 577 return p.text('dtype(...)')
569 578 if hasattr(obj, 'fields'):
570 579 if obj.fields is None:
571 580 p.text(repr(obj))
572 581 else:
573 582 p.begin_group(7, 'dtype([')
574 583 for i, field in enumerate(obj.descr):
575 584 if i > 0:
576 585 p.text(',')
577 586 p.breakable()
578 587 p.pretty(field)
579 588 p.end_group(7, '])')
580 589 """
581 590
582 591 # The format type of data returned.
583 592 format_type = Unicode('text/plain')
584 593
585 594 # This subclass ignores this attribute as it always need to return
586 595 # something.
587 596 enabled = Bool(True).tag(config=False)
588 597
589 598 max_seq_length = Integer(pretty.MAX_SEQ_LENGTH,
590 599 help="""Truncate large collections (lists, dicts, tuples, sets) to this size.
591 600
592 601 Set to 0 to disable truncation.
593 602 """
594 603 ).tag(config=True)
595 604
596 605 # Look for a _repr_pretty_ methods to use for pretty printing.
597 606 print_method = ObjectName('_repr_pretty_')
598 607
599 608 # Whether to pretty-print or not.
600 609 pprint = Bool(True).tag(config=True)
601 610
602 611 # Whether to be verbose or not.
603 612 verbose = Bool(False).tag(config=True)
604 613
605 614 # The maximum width.
606 615 max_width = Integer(79).tag(config=True)
607 616
608 617 # The newline character.
609 618 newline = Unicode('\n').tag(config=True)
610 619
611 620 # format-string for pprinting floats
612 621 float_format = Unicode('%r')
613 622 # setter for float precision, either int or direct format-string
614 623 float_precision = CUnicode('').tag(config=True)
615 624
616 625 @observe('float_precision')
617 626 def _float_precision_changed(self, change):
618 627 """float_precision changed, set float_format accordingly.
619 628
620 629 float_precision can be set by int or str.
621 630 This will set float_format, after interpreting input.
622 631 If numpy has been imported, numpy print precision will also be set.
623 632
624 633 integer `n` sets format to '%.nf', otherwise, format set directly.
625 634
626 635 An empty string returns to defaults (repr for float, 8 for numpy).
627 636
628 637 This parameter can be set via the '%precision' magic.
629 638 """
630 639
631 640 new = change['new']
632 641 if '%' in new:
633 642 # got explicit format string
634 643 fmt = new
635 644 try:
636 645 fmt%3.14159
637 646 except Exception:
638 647 raise ValueError("Precision must be int or format string, not %r"%new)
639 648 elif new:
640 649 # otherwise, should be an int
641 650 try:
642 651 i = int(new)
643 652 assert i >= 0
644 653 except ValueError:
645 654 raise ValueError("Precision must be int or format string, not %r"%new)
646 655 except AssertionError:
647 656 raise ValueError("int precision must be non-negative, not %r"%i)
648 657
649 658 fmt = '%%.%if'%i
650 659 if 'numpy' in sys.modules:
651 660 # set numpy precision if it has been imported
652 661 import numpy
653 662 numpy.set_printoptions(precision=i)
654 663 else:
655 664 # default back to repr
656 665 fmt = '%r'
657 666 if 'numpy' in sys.modules:
658 667 import numpy
659 668 # numpy default is 8
660 669 numpy.set_printoptions(precision=8)
661 670 self.float_format = fmt
662 671
663 672 # Use the default pretty printers from IPython.lib.pretty.
664 673 @default('singleton_printers')
665 674 def _singleton_printers_default(self):
666 675 return pretty._singleton_pprinters.copy()
667 676
668 677 @default('type_printers')
669 678 def _type_printers_default(self):
670 679 d = pretty._type_pprinters.copy()
671 680 d[float] = lambda obj,p,cycle: p.text(self.float_format%obj)
672 681 return d
673 682
674 683 @default('deferred_printers')
675 684 def _deferred_printers_default(self):
676 685 return pretty._deferred_type_pprinters.copy()
677 686
678 687 #### FormatterABC interface ####
679 688
680 689 @catch_format_error
681 690 def __call__(self, obj):
682 691 """Compute the pretty representation of the object."""
683 692 if not self.pprint:
684 693 return repr(obj)
685 694 else:
686 695 stream = StringIO()
687 696 printer = pretty.RepresentationPrinter(stream, self.verbose,
688 697 self.max_width, self.newline,
689 698 max_seq_length=self.max_seq_length,
690 699 singleton_pprinters=self.singleton_printers,
691 700 type_pprinters=self.type_printers,
692 701 deferred_pprinters=self.deferred_printers)
693 702 printer.pretty(obj)
694 703 printer.flush()
695 704 return stream.getvalue()
696 705
697 706
698 707 class HTMLFormatter(BaseFormatter):
699 708 """An HTML formatter.
700 709
701 710 To define the callables that compute the HTML representation of your
702 711 objects, define a :meth:`_repr_html_` method or use the :meth:`for_type`
703 712 or :meth:`for_type_by_name` methods to register functions that handle
704 713 this.
705 714
706 715 The return value of this formatter should be a valid HTML snippet that
707 716 could be injected into an existing DOM. It should *not* include the
708 717 ```<html>`` or ```<body>`` tags.
709 718 """
710 719 format_type = Unicode('text/html')
711 720
712 721 print_method = ObjectName('_repr_html_')
713 722
714 723
715 724 class MarkdownFormatter(BaseFormatter):
716 725 """A Markdown formatter.
717 726
718 727 To define the callables that compute the Markdown representation of your
719 728 objects, define a :meth:`_repr_markdown_` method or use the :meth:`for_type`
720 729 or :meth:`for_type_by_name` methods to register functions that handle
721 730 this.
722 731
723 732 The return value of this formatter should be a valid Markdown.
724 733 """
725 734 format_type = Unicode('text/markdown')
726 735
727 736 print_method = ObjectName('_repr_markdown_')
728 737
729 738 class SVGFormatter(BaseFormatter):
730 739 """An SVG formatter.
731 740
732 741 To define the callables that compute the SVG representation of your
733 742 objects, define a :meth:`_repr_svg_` method or use the :meth:`for_type`
734 743 or :meth:`for_type_by_name` methods to register functions that handle
735 744 this.
736 745
737 746 The return value of this formatter should be valid SVG enclosed in
738 747 ```<svg>``` tags, that could be injected into an existing DOM. It should
739 748 *not* include the ```<html>`` or ```<body>`` tags.
740 749 """
741 750 format_type = Unicode('image/svg+xml')
742 751
743 752 print_method = ObjectName('_repr_svg_')
744 753
745 754
746 755 class PNGFormatter(BaseFormatter):
747 756 """A PNG formatter.
748 757
749 758 To define the callables that compute the PNG representation of your
750 759 objects, define a :meth:`_repr_png_` method or use the :meth:`for_type`
751 760 or :meth:`for_type_by_name` methods to register functions that handle
752 761 this.
753 762
754 763 The return value of this formatter should be raw PNG data, *not*
755 764 base64 encoded.
756 765 """
757 766 format_type = Unicode('image/png')
758 767
759 768 print_method = ObjectName('_repr_png_')
760 769
761 770 _return_type = (bytes, str)
762 771
763 772
764 773 class JPEGFormatter(BaseFormatter):
765 774 """A JPEG formatter.
766 775
767 776 To define the callables that compute the JPEG representation of your
768 777 objects, define a :meth:`_repr_jpeg_` method or use the :meth:`for_type`
769 778 or :meth:`for_type_by_name` methods to register functions that handle
770 779 this.
771 780
772 781 The return value of this formatter should be raw JPEG data, *not*
773 782 base64 encoded.
774 783 """
775 784 format_type = Unicode('image/jpeg')
776 785
777 786 print_method = ObjectName('_repr_jpeg_')
778 787
779 788 _return_type = (bytes, str)
780 789
781 790
782 791 class LatexFormatter(BaseFormatter):
783 792 """A LaTeX formatter.
784 793
785 794 To define the callables that compute the LaTeX representation of your
786 795 objects, define a :meth:`_repr_latex_` method or use the :meth:`for_type`
787 796 or :meth:`for_type_by_name` methods to register functions that handle
788 797 this.
789 798
790 799 The return value of this formatter should be a valid LaTeX equation,
791 800 enclosed in either ```$```, ```$$``` or another LaTeX equation
792 801 environment.
793 802 """
794 803 format_type = Unicode('text/latex')
795 804
796 805 print_method = ObjectName('_repr_latex_')
797 806
798 807
799 808 class JSONFormatter(BaseFormatter):
800 809 """A JSON string formatter.
801 810
802 811 To define the callables that compute the JSONable representation of
803 812 your objects, define a :meth:`_repr_json_` method or use the :meth:`for_type`
804 813 or :meth:`for_type_by_name` methods to register functions that handle
805 814 this.
806 815
807 816 The return value of this formatter should be a JSONable list or dict.
808 817 JSON scalars (None, number, string) are not allowed, only dict or list containers.
809 818 """
810 819 format_type = Unicode('application/json')
811 820 _return_type = (list, dict)
812 821
813 822 print_method = ObjectName('_repr_json_')
814 823
815 824 def _check_return(self, r, obj):
816 825 """Check that a return value is appropriate
817 826
818 827 Return the value if so, None otherwise, warning if invalid.
819 828 """
820 829 if r is None:
821 830 return
822 831 md = None
823 832 if isinstance(r, tuple):
824 833 # unpack data, metadata tuple for type checking on first element
825 834 r, md = r
826 835
827 836 # handle deprecated JSON-as-string form from IPython < 3
828 837 if isinstance(r, str):
829 838 warnings.warn("JSON expects JSONable list/dict containers, not JSON strings",
830 839 FormatterWarning)
831 840 r = json.loads(r)
832 841
833 842 if md is not None:
834 843 # put the tuple back together
835 844 r = (r, md)
836 845 return super(JSONFormatter, self)._check_return(r, obj)
837 846
838 847
839 848 class JavascriptFormatter(BaseFormatter):
840 849 """A Javascript formatter.
841 850
842 851 To define the callables that compute the Javascript representation of
843 852 your objects, define a :meth:`_repr_javascript_` method or use the
844 853 :meth:`for_type` or :meth:`for_type_by_name` methods to register functions
845 854 that handle this.
846 855
847 856 The return value of this formatter should be valid Javascript code and
848 857 should *not* be enclosed in ```<script>``` tags.
849 858 """
850 859 format_type = Unicode('application/javascript')
851 860
852 861 print_method = ObjectName('_repr_javascript_')
853 862
854 863
855 864 class PDFFormatter(BaseFormatter):
856 865 """A PDF formatter.
857 866
858 867 To define the callables that compute the PDF representation of your
859 868 objects, define a :meth:`_repr_pdf_` method or use the :meth:`for_type`
860 869 or :meth:`for_type_by_name` methods to register functions that handle
861 870 this.
862 871
863 872 The return value of this formatter should be raw PDF data, *not*
864 873 base64 encoded.
865 874 """
866 875 format_type = Unicode('application/pdf')
867 876
868 877 print_method = ObjectName('_repr_pdf_')
869 878
870 879 _return_type = (bytes, str)
871 880
872 881 class IPythonDisplayFormatter(BaseFormatter):
873 882 """An escape-hatch Formatter for objects that know how to display themselves.
874 883
875 884 To define the callables that compute the representation of your
876 885 objects, define a :meth:`_ipython_display_` method or use the :meth:`for_type`
877 886 or :meth:`for_type_by_name` methods to register functions that handle
878 887 this. Unlike mime-type displays, this method should not return anything,
879 888 instead calling any appropriate display methods itself.
880 889
881 890 This display formatter has highest priority.
882 891 If it fires, no other display formatter will be called.
883 892
884 893 Prior to IPython 6.1, `_ipython_display_` was the only way to display custom mime-types
885 894 without registering a new Formatter.
886 895
887 896 IPython 6.1 introduces `_repr_mimebundle_` for displaying custom mime-types,
888 897 so `_ipython_display_` should only be used for objects that require unusual
889 898 display patterns, such as multiple display calls.
890 899 """
891 900 print_method = ObjectName('_ipython_display_')
892 901 _return_type = (type(None), bool)
893 902
894 903 @catch_format_error
895 904 def __call__(self, obj):
896 905 """Compute the format for an object."""
897 906 if self.enabled:
898 907 # lookup registered printer
899 908 try:
900 909 printer = self.lookup(obj)
901 910 except KeyError:
902 911 pass
903 912 else:
904 913 printer(obj)
905 914 return True
906 915 # Finally look for special method names
907 916 method = get_real_method(obj, self.print_method)
908 917 if method is not None:
909 918 method()
910 919 return True
911 920
912 921
913 922 class MimeBundleFormatter(BaseFormatter):
914 923 """A Formatter for arbitrary mime-types.
915 924
916 925 Unlike other `_repr_<mimetype>_` methods,
917 926 `_repr_mimebundle_` should return mime-bundle data,
918 927 either the mime-keyed `data` dictionary or the tuple `(data, metadata)`.
919 928 Any mime-type is valid.
920 929
921 930 To define the callables that compute the mime-bundle representation of your
922 931 objects, define a :meth:`_repr_mimebundle_` method or use the :meth:`for_type`
923 932 or :meth:`for_type_by_name` methods to register functions that handle
924 933 this.
925 934
926 935 .. versionadded:: 6.1
927 936 """
928 937 print_method = ObjectName('_repr_mimebundle_')
929 938 _return_type = dict
930 939
931 940 def _check_return(self, r, obj):
932 941 r = super(MimeBundleFormatter, self)._check_return(r, obj)
933 942 # always return (data, metadata):
934 943 if r is None:
935 944 return {}, {}
936 945 if not isinstance(r, tuple):
937 946 return r, {}
938 947 return r
939 948
940 949 @catch_format_error
941 950 def __call__(self, obj, include=None, exclude=None):
942 951 """Compute the format for an object.
943 952
944 953 Identical to parent's method but we pass extra parameters to the method.
945 954
946 955 Unlike other _repr_*_ `_repr_mimebundle_` should allow extra kwargs, in
947 956 particular `include` and `exclude`.
948 957 """
949 958 if self.enabled:
950 959 # lookup registered printer
951 960 try:
952 961 printer = self.lookup(obj)
953 962 except KeyError:
954 963 pass
955 964 else:
956 965 return printer(obj)
957 966 # Finally look for special method names
958 967 method = get_real_method(obj, self.print_method)
959 968
960 969 if method is not None:
961 970 d = {}
962 971 d['include'] = include
963 972 d['exclude'] = exclude
964 973 return method(**d)
965 974 return None
966 975 else:
967 976 return None
968 977
969 978
970 979 FormatterABC.register(BaseFormatter)
971 980 FormatterABC.register(PlainTextFormatter)
972 981 FormatterABC.register(HTMLFormatter)
973 982 FormatterABC.register(MarkdownFormatter)
974 983 FormatterABC.register(SVGFormatter)
975 984 FormatterABC.register(PNGFormatter)
976 985 FormatterABC.register(PDFFormatter)
977 986 FormatterABC.register(JPEGFormatter)
978 987 FormatterABC.register(LatexFormatter)
979 988 FormatterABC.register(JSONFormatter)
980 989 FormatterABC.register(JavascriptFormatter)
981 990 FormatterABC.register(IPythonDisplayFormatter)
982 991 FormatterABC.register(MimeBundleFormatter)
983 992
984 993
985 994 def format_display_data(obj, include=None, exclude=None):
986 995 """Return a format data dict for an object.
987 996
988 997 By default all format types will be computed.
989 998
990 999 The following MIME types are currently implemented:
991 1000
992 1001 * text/plain
993 1002 * text/html
994 1003 * text/markdown
995 1004 * text/latex
996 1005 * application/json
997 1006 * application/javascript
998 1007 * application/pdf
999 1008 * image/png
1000 1009 * image/jpeg
1001 1010 * image/svg+xml
1002 1011
1003 1012 Parameters
1004 1013 ----------
1005 1014 obj : object
1006 1015 The Python object whose format data will be computed.
1007 1016
1008 1017 Returns
1009 1018 -------
1010 1019 format_dict : dict
1011 1020 A dictionary of key/value pairs, one or each format that was
1012 1021 generated for the object. The keys are the format types, which
1013 1022 will usually be MIME type strings and the values and JSON'able
1014 1023 data structure containing the raw data for the representation in
1015 1024 that format.
1016 1025 include : list or tuple, optional
1017 1026 A list of format type strings (MIME types) to include in the
1018 1027 format data dict. If this is set *only* the format types included
1019 1028 in this list will be computed.
1020 1029 exclude : list or tuple, optional
1021 1030 A list of format type string (MIME types) to exclue in the format
1022 1031 data dict. If this is set all format types will be computed,
1023 1032 except for those included in this argument.
1024 1033 """
1025 1034 from IPython.core.interactiveshell import InteractiveShell
1026 1035
1027 1036 return InteractiveShell.instance().display_formatter.format(
1028 1037 obj,
1029 1038 include,
1030 1039 exclude
1031 1040 )
General Comments 0
You need to be logged in to leave comments. Login now