@@ -26,6 +26,101 @@ israwtext(::MIME, x::AbstractString) = true
26
26
israwtext (:: MIME"text/plain" , x:: AbstractString ) = false
27
27
israwtext (:: MIME , x) = false
28
28
29
+
30
+ # Check mime bundle dict key type and convert to string keys for JSON
31
+ _format_mime_key (k:: String ) = k
32
+ _format_mime_key (k:: MIME ) = string (k)
33
+ _format_mime_key (k) = error (" MIME bundle keys should be instances of String or MIME" )
34
+ _format_mimebundle (d:: Dict{String} ) = d
35
+ _format_mimebundle (d:: AbstractDict ) = Dict (_format_mime_key (k) => v for (k, v) in pairs (d))
36
+
37
+ """
38
+ display_data(mime::Union{MIME, String}, data, metadata::AbstractDict=Dict())
39
+ display_data(mimebundle::AbstractDict, metadata::AbstractDict=Dict())
40
+
41
+ Publish encoded multimedia data to be displayed all Jupyter front ends.
42
+
43
+ This is a low-level function which acts as a direct interface to Jupyter's display system. It does
44
+ not perform any additional processing on the input data, use `display(::IJulia.InlineDisplay, x)` to
45
+ calculate and display the multimedia representation of an arbitrary object `x`.
46
+
47
+ In the Jupyter notebook/lab the data will be displayed in the output area of the cell being executed.
48
+ This will appear in addition to the display of the cell's execution result, if any. Multiple calls
49
+ to this function within the same cell will result in multiple displays within the same output area.
50
+
51
+ The first form of the function takes a single MIME type `mime` and encoded data `data`, which should
52
+ be one of the following:
53
+
54
+ * A string containing text data (e.g. for MIME types `text/html` or `application/javascript`) or
55
+ base64-encoded binary data (e.g. for `image/png`).
56
+ * Any other value which can be converted to a JSON string by `JSON.json`, including `JSON.JSONText`.
57
+
58
+ The second form of the function takes a MIME bundle, which is a dictionary containing multiple
59
+ representations of the data keyed by MIME type. The front end will automatically select the richest
60
+ supported type to display.
61
+
62
+ `metadata` is an additional JSON dictionary describing the output. See the
63
+ [jupyter client documentation](https://jupyter-client.readthedocs.io/en/latest/messaging.html#display-data)
64
+ for the keys used by IPython, notable ones are `width::Int` and `height::Int` to control the size
65
+ of displayed images. When using the second form of the function the argument should be a dictionary
66
+ of dictionaries keyed by MIME type.
67
+
68
+
69
+ # Examples
70
+
71
+ Displaying a MIME bundle containing rich text in three different formats (the front end
72
+ will select only the richest type to display):
73
+
74
+ ```julia
75
+ bundle = Dict(
76
+ "text/plain" => "text/plain: foo bar baz",
77
+ "text/html" => "<code>text/html</code>: foo <strong>bar</strong> <em>baz</em>",
78
+ "text/markdown" => "`text/markdown`: foo **bar** *baz*",
79
+ )
80
+
81
+ IJulia.display_data(bundle)
82
+ ```
83
+
84
+ Display each of these types individually:
85
+
86
+ ```julia
87
+ for (mime, data) in pairs(bundle)
88
+ IJulia.display_data(mime, data)
89
+ end
90
+ ```
91
+
92
+ Displaying base64-encoded PNG image data:
93
+
94
+ ```julia
95
+ using Base64
96
+
97
+ data = open(read, "example.png") # Array{UInt8}
98
+ data_enc = base64encode(data) # String
99
+
100
+ IJulia.display_data("image/png", data_enc)
101
+ ```
102
+
103
+ Adjust the size of the displayed image by passing a metadata dictionary:
104
+
105
+ ```julia
106
+ IJulia.display_data("image/png", data_enc, Dict("width" => 800, "height" => 600))
107
+ ```
108
+ """
109
+ function display_data (mimebundle:: AbstractDict , metadata:: AbstractDict = Dict ())
110
+ content = Dict (" data" => _format_mimebundle (mimebundle), " metadata" => _format_mimebundle (metadata))
111
+ flush_all () # so that previous stream output appears in order
112
+ send_ipython (publish[], msg_pub (execute_msg, " display_data" , content))
113
+ end
114
+
115
+ function display_data (mime:: Union{MIME, AbstractString} , data, metadata:: AbstractDict = Dict ())
116
+ mt = string (mime)
117
+ d = Dict {String, Any} (mt => data)
118
+ md = Dict {String, Any} (mt => metadata)
119
+ mt != " text/plain" && (d[" text/plain" ] = " Unable to display data with MIME type $mt " ) # Fallback
120
+ display_data (d, md)
121
+ end
122
+
123
+
29
124
InlineIOContext (io, KVs:: Pair... ) = IOContext (
30
125
io,
31
126
:limit => true , :color => true , :jupyter => true ,
0 commit comments