##// END OF EJS Templates
Notebook does not support displaying JSON
Thomas Kluyver -
Show More
@@ -1,532 +1,534 b''
1 1 # -*- coding: utf-8 -*-
2 2 """Top-level display functions for displaying object in different formats.
3 3
4 4 Authors:
5 5
6 6 * Brian Granger
7 7 """
8 8
9 9 #-----------------------------------------------------------------------------
10 10 # Copyright (C) 2008-2011 The IPython Development Team
11 11 #
12 12 # Distributed under the terms of the BSD License. The full license is in
13 13 # the file COPYING, distributed as part of this software.
14 14 #-----------------------------------------------------------------------------
15 15
16 16 #-----------------------------------------------------------------------------
17 17 # Imports
18 18 #-----------------------------------------------------------------------------
19 19
20 20 from __future__ import print_function
21 21
22 22 from xml.dom import minidom
23 23
24 24 from .displaypub import (
25 25 publish_pretty, publish_html,
26 26 publish_latex, publish_svg,
27 27 publish_png, publish_json,
28 28 publish_javascript, publish_jpeg
29 29 )
30 30
31 31 #-----------------------------------------------------------------------------
32 32 # Main functions
33 33 #-----------------------------------------------------------------------------
34 34
35 35 def display(*objs, **kwargs):
36 36 """Display a Python object in all frontends.
37 37
38 38 By default all representations will be computed and sent to the frontends.
39 39 Frontends can decide which representation is used and how.
40 40
41 41 Parameters
42 42 ----------
43 43 objs : tuple of objects
44 44 The Python objects to display.
45 45 include : list or tuple, optional
46 46 A list of format type strings (MIME types) to include in the
47 47 format data dict. If this is set *only* the format types included
48 48 in this list will be computed.
49 49 exclude : list or tuple, optional
50 50 A list of format type string (MIME types) to exclue in the format
51 51 data dict. If this is set all format types will be computed,
52 52 except for those included in this argument.
53 53 """
54 54 include = kwargs.get('include')
55 55 exclude = kwargs.get('exclude')
56 56
57 57 from IPython.core.interactiveshell import InteractiveShell
58 58 inst = InteractiveShell.instance()
59 59 format = inst.display_formatter.format
60 60 publish = inst.display_pub.publish
61 61
62 62 for obj in objs:
63 63 format_dict = format(obj, include=include, exclude=exclude)
64 64 publish('IPython.core.display.display', format_dict)
65 65
66 66
67 67 def display_pretty(*objs, **kwargs):
68 68 """Display the pretty (default) representation of an object.
69 69
70 70 Parameters
71 71 ----------
72 72 objs : tuple of objects
73 73 The Python objects to display, or if raw=True raw text data to
74 74 display.
75 75 raw : bool
76 76 Are the data objects raw data or Python objects that need to be
77 77 formatted before display? [default: False]
78 78 """
79 79 raw = kwargs.pop('raw',False)
80 80 if raw:
81 81 for obj in objs:
82 82 publish_pretty(obj)
83 83 else:
84 84 display(*objs, include=['text/plain'])
85 85
86 86
87 87 def display_html(*objs, **kwargs):
88 88 """Display the HTML representation of an object.
89 89
90 90 Parameters
91 91 ----------
92 92 objs : tuple of objects
93 93 The Python objects to display, or if raw=True raw HTML data to
94 94 display.
95 95 raw : bool
96 96 Are the data objects raw data or Python objects that need to be
97 97 formatted before display? [default: False]
98 98 """
99 99 raw = kwargs.pop('raw',False)
100 100 if raw:
101 101 for obj in objs:
102 102 publish_html(obj)
103 103 else:
104 104 display(*objs, include=['text/plain','text/html'])
105 105
106 106
107 107 def display_svg(*objs, **kwargs):
108 108 """Display the SVG representation of an object.
109 109
110 110 Parameters
111 111 ----------
112 112 objs : tuple of objects
113 113 The Python objects to display, or if raw=True raw svg data to
114 114 display.
115 115 raw : bool
116 116 Are the data objects raw data or Python objects that need to be
117 117 formatted before display? [default: False]
118 118 """
119 119 raw = kwargs.pop('raw',False)
120 120 if raw:
121 121 for obj in objs:
122 122 publish_svg(obj)
123 123 else:
124 124 display(*objs, include=['text/plain','image/svg+xml'])
125 125
126 126
127 127 def display_png(*objs, **kwargs):
128 128 """Display the PNG representation of an object.
129 129
130 130 Parameters
131 131 ----------
132 132 objs : tuple of objects
133 133 The Python objects to display, or if raw=True raw png data to
134 134 display.
135 135 raw : bool
136 136 Are the data objects raw data or Python objects that need to be
137 137 formatted before display? [default: False]
138 138 """
139 139 raw = kwargs.pop('raw',False)
140 140 if raw:
141 141 for obj in objs:
142 142 publish_png(obj)
143 143 else:
144 144 display(*objs, include=['text/plain','image/png'])
145 145
146 146
147 147 def display_jpeg(*objs, **kwargs):
148 148 """Display the JPEG representation of an object.
149 149
150 150 Parameters
151 151 ----------
152 152 objs : tuple of objects
153 153 The Python objects to display, or if raw=True raw JPEG data to
154 154 display.
155 155 raw : bool
156 156 Are the data objects raw data or Python objects that need to be
157 157 formatted before display? [default: False]
158 158 """
159 159 raw = kwargs.pop('raw',False)
160 160 if raw:
161 161 for obj in objs:
162 162 publish_jpeg(obj)
163 163 else:
164 164 display(*objs, include=['text/plain','image/jpeg'])
165 165
166 166
167 167 def display_latex(*objs, **kwargs):
168 168 """Display the LaTeX representation of an object.
169 169
170 170 Parameters
171 171 ----------
172 172 objs : tuple of objects
173 173 The Python objects to display, or if raw=True raw latex data to
174 174 display.
175 175 raw : bool
176 176 Are the data objects raw data or Python objects that need to be
177 177 formatted before display? [default: False]
178 178 """
179 179 raw = kwargs.pop('raw',False)
180 180 if raw:
181 181 for obj in objs:
182 182 publish_latex(obj)
183 183 else:
184 184 display(*objs, include=['text/plain','text/latex'])
185 185
186 186
187 187 def display_json(*objs, **kwargs):
188 188 """Display the JSON representation of an object.
189
190 Note that not many frontends support displaying JSON.
189 191
190 192 Parameters
191 193 ----------
192 194 objs : tuple of objects
193 195 The Python objects to display, or if raw=True raw json data to
194 196 display.
195 197 raw : bool
196 198 Are the data objects raw data or Python objects that need to be
197 199 formatted before display? [default: False]
198 200 """
199 201 raw = kwargs.pop('raw',False)
200 202 if raw:
201 203 for obj in objs:
202 204 publish_json(obj)
203 205 else:
204 206 display(*objs, include=['text/plain','application/json'])
205 207
206 208
207 209 def display_javascript(*objs, **kwargs):
208 210 """Display the Javascript representation of an object.
209 211
210 212 Parameters
211 213 ----------
212 214 objs : tuple of objects
213 215 The Python objects to display, or if raw=True raw javascript data to
214 216 display.
215 217 raw : bool
216 218 Are the data objects raw data or Python objects that need to be
217 219 formatted before display? [default: False]
218 220 """
219 221 raw = kwargs.pop('raw',False)
220 222 if raw:
221 223 for obj in objs:
222 224 publish_javascript(obj)
223 225 else:
224 226 display(*objs, include=['text/plain','application/javascript'])
225 227
226 228 #-----------------------------------------------------------------------------
227 229 # Smart classes
228 230 #-----------------------------------------------------------------------------
229 231
230 232
231 233 class DisplayObject(object):
232 234 """An object that wraps data to be displayed."""
233 235
234 236 _read_flags = 'r'
235 237
236 238 def __init__(self, data=None, url=None, filename=None):
237 239 """Create a display object given raw data.
238 240
239 241 When this object is returned by an expression or passed to the
240 242 display function, it will result in the data being displayed
241 243 in the frontend. The MIME type of the data should match the
242 244 subclasses used, so the Png subclass should be used for 'image/png'
243 245 data. If the data is a URL, the data will first be downloaded
244 246 and then displayed. If
245 247
246 248 Parameters
247 249 ----------
248 250 data : unicode, str or bytes
249 251 The raw data or a URL to download the data from.
250 252 url : unicode
251 253 A URL to download the data from.
252 254 filename : unicode
253 255 Path to a local file to load the data from.
254 256 """
255 257 if data is not None and data.startswith('http'):
256 258 self.url = data
257 259 self.filename = None
258 260 self.data = None
259 261 else:
260 262 self.data = data
261 263 self.url = url
262 264 self.filename = None if filename is None else unicode(filename)
263 265 self.reload()
264 266
265 267 def reload(self):
266 268 """Reload the raw data from file or URL."""
267 269 if self.filename is not None:
268 270 with open(self.filename, self._read_flags) as f:
269 271 self.data = f.read()
270 272 elif self.url is not None:
271 273 try:
272 274 import urllib2
273 275 response = urllib2.urlopen(self.url)
274 276 self.data = response.read()
275 277 # extract encoding from header, if there is one:
276 278 encoding = None
277 279 for sub in response.headers['content-type'].split(';'):
278 280 sub = sub.strip()
279 281 if sub.startswith('charset'):
280 282 encoding = sub.split('=')[-1].strip()
281 283 break
282 284 # decode data, if an encoding was specified
283 285 if encoding:
284 286 self.data = self.data.decode(encoding, 'replace')
285 287 except:
286 288 self.data = None
287 289
288 290 class Pretty(DisplayObject):
289 291
290 292 def _repr_pretty_(self):
291 293 return self.data
292 294
293 295
294 296 class HTML(DisplayObject):
295 297
296 298 def _repr_html_(self):
297 299 return self.data
298 300
299 301
300 302 class Math(DisplayObject):
301 303
302 304 def _repr_latex_(self):
303 305 s = self.data.strip('$')
304 306 return "$$%s$$" % s
305 307
306 308
307 309 class Latex(DisplayObject):
308 310
309 311 def _repr_latex_(self):
310 312 return self.data
311 313
312 314
313 315 class SVG(DisplayObject):
314 316
315 317 # wrap data in a property, which extracts the <svg> tag, discarding
316 318 # document headers
317 319 _data = None
318 320
319 321 @property
320 322 def data(self):
321 323 return self._data
322 324
323 325 @data.setter
324 326 def data(self, svg):
325 327 if svg is None:
326 328 self._data = None
327 329 return
328 330 # parse into dom object
329 331 x = minidom.parseString(svg)
330 332 # get svg tag (should be 1)
331 333 found_svg = x.getElementsByTagName('svg')
332 334 if found_svg:
333 335 svg = found_svg[0].toxml()
334 336 else:
335 337 # fallback on the input, trust the user
336 338 # but this is probably an error.
337 339 pass
338 340 self._data = svg
339 341
340 342 def _repr_svg_(self):
341 343 return self.data
342 344
343 345
344 346 class JSON(DisplayObject):
345 347
346 348 def _repr_json_(self):
347 349 return self.data
348 350
349 351 css_t = """$("head").append($("<link/>").attr({
350 352 rel: "stylesheet",
351 353 type: "text/css",
352 354 href: "%s"
353 355 }));
354 356 """
355 357
356 358 lib_t1 = """$.getScript("%s", function () {
357 359 """
358 360 lib_t2 = """});
359 361 """
360 362
361 363 class Javascript(DisplayObject):
362 364
363 365 def __init__(self, data=None, url=None, filename=None, lib=None, css=None):
364 366 """Create a Javascript display object given raw data.
365 367
366 368 When this object is returned by an expression or passed to the
367 369 display function, it will result in the data being displayed
368 370 in the frontend. If the data is a URL, the data will first be
369 371 downloaded and then displayed.
370 372
371 373 In the Notebook, the containing element will be available as `element`,
372 374 and jQuery will be available. The output area starts hidden, so if
373 375 the js appends content to `element` that should be visible, then
374 376 it must call `container.show()` to unhide the area.
375 377
376 378 Parameters
377 379 ----------
378 380 data : unicode, str or bytes
379 381 The Javascript source code or a URL to download it from.
380 382 url : unicode
381 383 A URL to download the data from.
382 384 filename : unicode
383 385 Path to a local file to load the data from.
384 386 lib : list or str
385 387 A sequence of Javascript library URLs to load asynchronously before
386 388 running the source code. The full URLs of the libraries should
387 389 be given. A single Javascript library URL can also be given as a
388 390 string.
389 391 css: : list or str
390 392 A sequence of css files to load before running the source code.
391 393 The full URLs of the css files should be give. A single css URL
392 394 can also be given as a string.
393 395 """
394 396 if isinstance(lib, basestring):
395 397 lib = [lib]
396 398 elif lib is None:
397 399 lib = []
398 400 if isinstance(css, basestring):
399 401 css = [css]
400 402 elif css is None:
401 403 css = []
402 404 if not isinstance(lib, (list,tuple)):
403 405 raise TypeError('expected sequence, got: %r' % lib)
404 406 if not isinstance(css, (list,tuple)):
405 407 raise TypeError('expected sequence, got: %r' % css)
406 408 self.lib = lib
407 409 self.css = css
408 410 super(Javascript, self).__init__(data=data, url=url, filename=filename)
409 411
410 412 def _repr_javascript_(self):
411 413 r = ''
412 414 for c in self.css:
413 415 r += css_t % c
414 416 for l in self.lib:
415 417 r += lib_t1 % l
416 418 r += self.data
417 419 r += lib_t2*len(self.lib)
418 420 return r
419 421
420 422
421 423 class Image(DisplayObject):
422 424
423 425 _read_flags = 'rb'
424 426
425 427 def __init__(self, data=None, url=None, filename=None, format=u'png', embed=None):
426 428 """Create a display an PNG/JPEG image given raw data.
427 429
428 430 When this object is returned by an expression or passed to the
429 431 display function, it will result in the image being displayed
430 432 in the frontend.
431 433
432 434 Parameters
433 435 ----------
434 436 data : unicode, str or bytes
435 437 The raw data or a URL to download the data from.
436 438 url : unicode
437 439 A URL to download the data from.
438 440 filename : unicode
439 441 Path to a local file to load the data from.
440 442 format : unicode
441 443 The format of the image data (png/jpeg/jpg). If a filename or URL is given
442 444 for format will be inferred from the filename extension.
443 445 embed : bool
444 446 Should the image data be embedded using a data URI (True) or be
445 447 loaded using an <img> tag. Set this to True if you want the image
446 448 to be viewable later with no internet connection in the notebook.
447 449
448 450 Default is `True`, unless the keyword argument `url` is set, then
449 451 default value is `False`.
450 452
451 453 Note that QtConsole is not able to display images if `embed` is set to `False`
452 454
453 455 Examples
454 456 --------
455 457 # embed implicitly True, works in qtconsole and notebook
456 458 Image('http://www.google.fr/images/srpr/logo3w.png')
457 459
458 460 # embed implicitly False, does not works in qtconsole but works in notebook if
459 461 # internet connection available
460 462 Image(url='http://www.google.fr/images/srpr/logo3w.png')
461 463
462 464 """
463 465 if filename is not None:
464 466 ext = self._find_ext(filename)
465 467 elif url is not None:
466 468 ext = self._find_ext(url)
467 469 elif data.startswith('http'):
468 470 ext = self._find_ext(data)
469 471 else:
470 472 ext = None
471 473 if ext is not None:
472 474 if ext == u'jpg' or ext == u'jpeg':
473 475 format = u'jpeg'
474 476 if ext == u'png':
475 477 format = u'png'
476 478 self.format = unicode(format).lower()
477 479 self.embed = embed if embed is not None else (url is None)
478 480 super(Image, self).__init__(data=data, url=url, filename=filename)
479 481
480 482 def reload(self):
481 483 """Reload the raw data from file or URL."""
482 484 if self.embed:
483 485 super(Image,self).reload()
484 486
485 487 def _repr_html_(self):
486 488 if not self.embed:
487 489 return u'<img src="%s" />' % self.url
488 490
489 491 def _repr_png_(self):
490 492 if self.embed and self.format == u'png':
491 493 return self.data
492 494
493 495 def _repr_jpeg_(self):
494 496 if self.embed and (self.format == u'jpeg' or self.format == u'jpg'):
495 497 return self.data
496 498
497 499 def _find_ext(self, s):
498 500 return unicode(s.split('.')[-1].lower())
499 501
500 502
501 503 def clear_output(stdout=True, stderr=True, other=True):
502 504 """Clear the output of the current cell receiving output.
503 505
504 506 Optionally, each of stdout/stderr or other non-stream data (e.g. anything
505 507 produced by display()) can be excluded from the clear event.
506 508
507 509 By default, everything is cleared.
508 510
509 511 Parameters
510 512 ----------
511 513 stdout : bool [default: True]
512 514 Whether to clear stdout.
513 515 stderr : bool [default: True]
514 516 Whether to clear stderr.
515 517 other : bool [default: True]
516 518 Whether to clear everything else that is not stdout/stderr
517 519 (e.g. figures,images,HTML, any result of display()).
518 520 """
519 521 from IPython.core.interactiveshell import InteractiveShell
520 522 if InteractiveShell.initialized():
521 523 InteractiveShell.instance().display_pub.clear_output(
522 524 stdout=stdout, stderr=stderr, other=other,
523 525 )
524 526 else:
525 527 from IPython.utils import io
526 528 if stdout:
527 529 print('\033[2K\r', file=io.stdout, end='')
528 530 io.stdout.flush()
529 531 if stderr:
530 532 print('\033[2K\r', file=io.stderr, end='')
531 533 io.stderr.flush()
532 534
@@ -1,44 +1,44 b''
1 1 .. _integrating:
2 2
3 3 =====================================
4 4 Integrating your objects with IPython
5 5 =====================================
6 6
7 7 Tab completion
8 8 ==============
9 9
10 10 To change the attributes displayed by tab-completing your object, define a
11 11 ``__dir__(self)`` method for it. For more details, see the documentation of the
12 12 built-in `dir() function <http://docs.python.org/library/functions.html#dir>`_.
13 13
14 14 Rich display
15 15 ============
16 16
17 17 The notebook and the Qt console can display richer representations of objects.
18 18 To use this, you can define any of a number of ``_repr_*_()`` methods. Note that
19 19 these are surrounded by single, not double underscores.
20 20
21 21 Both the notebook and the Qt console can display ``svg``, ``png`` and ``jpeg``
22 22 representations. The notebook can also display ``html``, ``javascript``,
23 ``json`` and ``latex``. If the methods don't exist, or return ``None``, it falls
23 and ``latex``. If the methods don't exist, or return ``None``, it falls
24 24 back to a standard ``repr()``.
25 25
26 26 For example::
27 27
28 28 class Shout(object):
29 29 def __init__(self, text):
30 30 self.text = text
31 31
32 32 def _repr_html_(self):
33 33 return "<h1>" + self.text + "</h1>"
34 34
35 35 Custom exception tracebacks
36 36 ===========================
37 37
38 38 Rarely, you might want to display a different traceback with an exception -
39 39 IPython's own parallel computing framework does this to display errors from the
40 40 engines. To do this, define a ``_render_traceback_(self)`` method which returns
41 41 a list of strings, each containing one line of the traceback.
42 42
43 43 Please be conservative in using this feature; by replacing the default traceback
44 44 you may hide important information from the user.
General Comments 0
You need to be logged in to leave comments. Login now