{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# IPerl display demo\n",
"\n",
"author: Zaki Mughal\n",
"\n",
"date: 2015-02-09\n",
"\n",
"This notebook demonstrates how to use the *rich display system* in IPerl and how it can be extended on the fly.\n",
"\n",
"All data that is displayed implements a `Displayable` role. This role requires a method called `iperl_data_representations` that returns a HashRef of different representations of the data where the keys are the MIME type of the data (e.g., `text/html`) and values are the strings that contain the bytestream for that MIME type. For example, with PNG, we have"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[0m[\n",
" \u001b[97m[0] \u001b[0m\"\u001b[93mimage/png\u001b[0m\",\n",
" \u001b[97m[1] \u001b[0m\"\u001b[93mtext/html\u001b[0m\",\n",
" \u001b[97m[2] \u001b[0m\"\u001b[93mtext/plain\u001b[0m\"\n",
"]\n"
]
},
{
"data": {
"image/png": "PNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000 \u0000\u0000\u0000 \b\u0003\u0000\u0000\u0000D¤Æ\u0000\u0000\u0000\u0004gAMA\u0000\u0001 1è_\u0000\u0000\u0000 cHRM\u0000\u0000z&\u0000\u0000\u0000\u0000ú\u0000\u0000\u0000è\u0000\u0000u0\u0000\u0000ê`\u0000\u0000:\u0000\u0000\u0017pºQ<\u0000\u0000\u0002âPLTEö°ÞÿuäÿÅ\rÿkêÿ5ÿÿ1ÀIÿÖþ&4ÿ±4à2þ\u001cÿÿ\u000etQÿ#Å\u0003ÓÈ\u0001lÿÎ-ÿ^¥þ>bOÿw3ÿXþ\u000bÿ.c$ÿÿÄsÿÌÿ§ÿ=ÿ»ÿÑæ\u001bÿÿÊÿ;\u001dYÿ½\u0018Çÿ\u001f\\z<ÿûûüäÿ\u000e\u001eÿÿµHâþA(ÿÿ¨Ü-ÿÿ\u001cI\u0013¾`ÿ¨%ÿÑ\u0011ÿ{ÿKRÿÙ~\u0000\u001doÿà\u0015ý÷ü\u001d¸àÿµÿÞê|ÄÿðüüdüàâqjÿÁÚÝÝõú`î\u001eÿ¥¦ÿÒÉÿä+ÿ_ö\u0003p´5ÿ\u001fÿèÆÿÍ]ÿÿg+Üþÿ\u0013=dâþ\u000eýëEÿ¾ÿcC=ÿÈÎíÊÿ\u0014ÂÿKÿ& \u001aÿüÎÿ0Òÿ3\u00177ÿ£\u0000cÿ½þÿúàÿÿ\u0019,\u000fÿ°\tÿ\u0010ÿG\u0014Òþ6ÿ\u001dÇ«Îÿï¼ÿáfÿÈÚ×úñÿâûÿúýûüã\u0002YÿLÿ\u0014\u001fÿ\u000fÿàþýÔÿÐÿqLý\u0017ÙÉÿÿÀ\u001dÿàÿJ\u0013ÿ{AÁÿúûü<ñýö»Þÿpñÿ,~ÿ\u001e!ÿa¢ÿ1³ÿ\fÿÊ\u0018ÿX\u0014óý\tÿ]eÿ®Gÿþ\n>õÞíÿL¯;\u0001[úý¬@ÿïþ]ÿ~Tÿ´Êÿôý<ÿã\u0016§ÿeÿÈ9\u0003ÆO¥ÿìðþÿ)fý\t·ªûëÿ²ÿË¢ÿ\u000fö4©º÷þÿ
®ã\u0004æ£ÿfÿÿo\u0019âÿXÿãÿîAÿe=ÿ6&ÿÜ^ÿ\u001bþ?Õ)ÿ gÿÐÿáâúþêçKT!¹ÿÒiÿýÖ¿ÿkÉÿ¯ÿºÿðòKÿ ÿÇ{ýñ|Sÿêÿè\u001eÿÿÿiÿCÿ¨/ÿ\u001bÿ5^eüõÿÄÿMuÿ@~ÿrÿs\u000eÿ>ªÿ\u001boÿ¢ã£Ýÿ?@ÿ¯3ÿ¶'óý\u001aÿ0|ÿÝÿ{ÑÿO%?ÿð|öþÿ{S ÿ9\u0000ÄÿÖOÿU¦ïÿõ¯Áÿÿ\u001a>ÿÛ/Wÿ¦ÿ\u0014ÿíÿLbÿÚÿ¶zäÿçâãì\u0001¤þ\nY+ÿ´¹¸ÃÚÿÒÿïÿкÿ+À\u0013Jª\u0000\u0000\u0002¯IDATxc8B\u00000\u0010ÀËÛmÊÞ\\Ü\n4»ºRR®¯÷Â¥ ¹¥#åúõ´*ì\n\\kjZÜÜî]OÛhMÁ$£\u001a]Ýun¢ëù6n¼¼\rSUrn°È:Ñõ\u001b\u000b¶a(`\b\u000eîé\u0011YwôhsáâÅÑñh\n\\å7OÚ¿ßÛ{ÊÑ£[BCWÇ£*U¬±yÿ~\u0017§5¾Üú5T]Ý\u0016EÁ£$çÍW¦vwk^a\\±\",:ÚÂâðAd\u00059IÎW\n45ãdªV
UO·8\\Y¹\u0006IÁ¤\u000f²³¤$ã\u0016.lk¶zõôÃzz\u0010\n\fÁ\n$\u0015\\\\öîöÉÖöÁ\u0003Ácz\u0017Îí)øÜnh\b4CÁÅÊkÚ'\u000f¸]¸pnÕ.¨µíOM^Ýàȱr-e8qÍ\u0003¯_¾¼°jÕ[» \nN\u0006l\u0000)±Àæs6SÆÄE\u0007^¿~YP\u0016tKQQÑ\u000e¬àö\u000bÏÛNÞX»À&ûѶ]\u0016I¯¼{7(31s+HÁ\u0017×\nî¬]jSR·okVÖ©e+O\u0016\u0016>áç×{bß\u0011ÎÎkõ'ïܼtéÜ>¹¬/_N-[&$\u0004T\"®â×+¼a)P^ËßÿMe#ÎS>B\u000fÏ93oÊûÞÓr\fS}}µü÷TT<¾tIçæÍFþþóQQÇyyß¿W±\u0006ºáMjjmí=\u0015Ï\u001dvîtrÚ´mIx8PÚ=ÿô<°7ßìØQ[;çùs{¨ü'bbîù\u0002 ÍJ9³h½\u000777wyùüùï\u0004b·§ç!bÓ²G骪¹ùòr l¬õ[$gÉcföL\u001b,ϯ\u001c\u001bË®ªëÌÌb´µUïß¿o:a\u0002ûÛ#èáÈãÙ³õ'\u0000e?ªaHÓC£cÈÇ\u001f15Ã\u0013-^\u0000\u0000ñ\u0001k4¥³Ã3\u0000\u0000\u0000\u0000IEND®B`",
"text/html": [
""
],
"text/plain": [
"[PNG image]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"use v5.16;\n",
"use DDP; # Data::Printer\n",
"\n",
"my $png_display = Devel::IPerl::Display::PNG->new( \"http://www.libpng.org/pub/png/PngSuite/ccwn3p08.png\" );\n",
"\n",
"say &np( [ keys %{ $png_display->iperl_data_representations } ] );\n",
"\n",
"$png_display;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice that I just displayed that PNG by just putting the `$png_display` variable at the end? That's because any displayable is automatically displayed if it is at the end of a cell.\n",
"\n",
"But there's a problem: I don't want to type or remember `Devel::IPerl::Display::PNG` every time I want to load up a PNG.\n",
"\n",
"Instead, you can just call the helper method `IPerl->png()` and you'll get the same result."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "PNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000 \u0000\u0000\u0000 \b\u0003\u0000\u0000\u0000D¤Æ\u0000\u0000\u0000\u0004gAMA\u0000\u0001 1è_\u0000\u0000\u0000 cHRM\u0000\u0000z&\u0000\u0000\u0000\u0000ú\u0000\u0000\u0000è\u0000\u0000u0\u0000\u0000ê`\u0000\u0000:\u0000\u0000\u0017pºQ<\u0000\u0000\u0002âPLTEö°ÞÿuäÿÅ\rÿkêÿ5ÿÿ1ÀIÿÖþ&4ÿ±4à2þ\u001cÿÿ\u000etQÿ#Å\u0003ÓÈ\u0001lÿÎ-ÿ^¥þ>bOÿw3ÿXþ\u000bÿ.c$ÿÿÄsÿÌÿ§ÿ=ÿ»ÿÑæ\u001bÿÿÊÿ;\u001dYÿ½\u0018Çÿ\u001f\\z<ÿûûüäÿ\u000e\u001eÿÿµHâþA(ÿÿ¨Ü-ÿÿ\u001cI\u0013¾`ÿ¨%ÿÑ\u0011ÿ{ÿKRÿÙ~\u0000\u001doÿà\u0015ý÷ü\u001d¸àÿµÿÞê|ÄÿðüüdüàâqjÿÁÚÝÝõú`î\u001eÿ¥¦ÿÒÉÿä+ÿ_ö\u0003p´5ÿ\u001fÿèÆÿÍ]ÿÿg+Üþÿ\u0013=dâþ\u000eýëEÿ¾ÿcC=ÿÈÎíÊÿ\u0014ÂÿKÿ& \u001aÿüÎÿ0Òÿ3\u00177ÿ£\u0000cÿ½þÿúàÿÿ\u0019,\u000fÿ°\tÿ\u0010ÿG\u0014Òþ6ÿ\u001dÇ«Îÿï¼ÿáfÿÈÚ×úñÿâûÿúýûüã\u0002YÿLÿ\u0014\u001fÿ\u000fÿàþýÔÿÐÿqLý\u0017ÙÉÿÿÀ\u001dÿàÿJ\u0013ÿ{AÁÿúûü<ñýö»Þÿpñÿ,~ÿ\u001e!ÿa¢ÿ1³ÿ\fÿÊ\u0018ÿX\u0014óý\tÿ]eÿ®Gÿþ\n>õÞíÿL¯;\u0001[úý¬@ÿïþ]ÿ~Tÿ´Êÿôý<ÿã\u0016§ÿeÿÈ9\u0003ÆO¥ÿìðþÿ)fý\t·ªûëÿ²ÿË¢ÿ\u000fö4©º÷þÿ
®ã\u0004æ£ÿfÿÿo\u0019âÿXÿãÿîAÿe=ÿ6&ÿÜ^ÿ\u001bþ?Õ)ÿ gÿÐÿáâúþêçKT!¹ÿÒiÿýÖ¿ÿkÉÿ¯ÿºÿðòKÿ ÿÇ{ýñ|Sÿêÿè\u001eÿÿÿiÿCÿ¨/ÿ\u001bÿ5^eüõÿÄÿMuÿ@~ÿrÿs\u000eÿ>ªÿ\u001boÿ¢ã£Ýÿ?@ÿ¯3ÿ¶'óý\u001aÿ0|ÿÝÿ{ÑÿO%?ÿð|öþÿ{S ÿ9\u0000ÄÿÖOÿU¦ïÿõ¯Áÿÿ\u001a>ÿÛ/Wÿ¦ÿ\u0014ÿíÿLbÿÚÿ¶zäÿçâãì\u0001¤þ\nY+ÿ´¹¸ÃÚÿÒÿïÿкÿ+À\u0013Jª\u0000\u0000\u0002¯IDATxc8B\u00000\u0010ÀËÛmÊÞ\\Ü\n4»ºRR®¯÷Â¥ ¹¥#åúõ´*ì\n\\kjZÜÜî]OÛhMÁ$£\u001a]Ýun¢ëù6n¼¼\rSUrn°È:Ñõ\u001b\u000b¶a(`\b\u000eîé\u0011YwôhsáâÅÑñh\n\\å7OÚ¿ßÛ{ÊÑ£[BCWÇ£*U¬±yÿ~\u0017§5¾Üú5T]Ý\u0016EÁ£$çÍW¦vwk^a\\±\",:ÚÂâðAd\u00059IÎW\n45ãdªV
UO·8\\Y¹\u0006IÁ¤\u000f²³¤$ã\u0016.lk¶zõôÃzz\u0010\n\fÁ\n$\u0015\\\\öîöÉÖöÁ\u0003Ácz\u0017Îí)øÜnh\b4CÁÅÊkÚ'\u000f¸]¸pnÕ.¨µíOM^Ýàȱr-e8qÍ\u0003¯_¾¼°jÕ[» \nN\u0006l\u0000)±Àæs6SÆÄE\u0007^¿~YP\u0016tKQQÑ\u000e¬àö\u000bÏÛNÞX»À&ûѶ]\u0016I¯¼{7(31s+HÁ\u0017×\nî¬]jSR·okVÖ©e+O\u0016\u0016>áç×{bß\u0011ÎÎkõ'ïܼtéÜ>¹¬/_N-[&$\u0004T\"®â×+¼a)P^ËßÿMe#ÎS>B\u000fÏ93oÊûÞÓr\fS}}µü÷TT<¾tIçæÍFþþóQQÇyyß¿W±\u0006ºáMjjmí=\u0015Ï\u001dvîtrÚ´mIx8PÚ=ÿô<°7ßìØQ[;çùs{¨ü'bbîù\u0002 ÍJ9³h½\u000777wyùüùï\u0004b·§ç!bÓ²G骪¹ùòr l¬õ[$gÉcföL\u001b,ϯ\u001c\u001bË®ªëÌÌb´µUïß¿o:a\u0002ûÛ#èáÈãÙ³õ'\u0000e?ªaHÓC£cÈÇ\u001f15Ã\u0013-^\u0000\u0000ñ\u0001k4¥³Ã3\u0000\u0000\u0000\u0000IEND®B`",
"text/html": [
""
],
"text/plain": [
"[PNG image]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"IPerl->png( \"http://www.libpng.org/pub/png/PngSuite/ccwn3p08.png\" );"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are other `Displayable`s too. For example, let's load up an `