Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
T
Tetras Lab UNL demos
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
UNL
Tetras Lab UNL demos
Commits
8e7d80ad
Commit
8e7d80ad
authored
3 years ago
by
David Rouquet
Browse files
Options
Downloads
Patches
Plain Diff
Téléverser un nouveau fichier
parent
5fb93ea6
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
unsel_dashboard.ipynb
+648
-0
648 additions, 0 deletions
unsel_dashboard.ipynb
with
648 additions
and
0 deletions
unsel_dashboard.ipynb
0 → 100644
+
648
−
0
View file @
8e7d80ad
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "160ab8ab-091e-4b00-b63a-c3746c71c540",
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
"(function(root) {\n",
" function now() {\n",
" return new Date();\n",
" }\n",
"\n",
" var force = true;\n",
"\n",
" if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n",
" root._bokeh_onload_callbacks = [];\n",
" root._bokeh_is_loading = undefined;\n",
" }\n",
"\n",
" if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n",
" root._bokeh_timeout = Date.now() + 5000;\n",
" root._bokeh_failed_load = false;\n",
" }\n",
"\n",
" function run_callbacks() {\n",
" try {\n",
" root._bokeh_onload_callbacks.forEach(function(callback) {\n",
" if (callback != null)\n",
" callback();\n",
" });\n",
" } finally {\n",
" delete root._bokeh_onload_callbacks\n",
" }\n",
" console.debug(\"Bokeh: all callbacks have finished\");\n",
" }\n",
"\n",
" function load_libs(css_urls, js_urls, js_modules, callback) {\n",
" if (css_urls == null) css_urls = [];\n",
" if (js_urls == null) js_urls = [];\n",
" if (js_modules == null) js_modules = [];\n",
"\n",
" root._bokeh_onload_callbacks.push(callback);\n",
" if (root._bokeh_is_loading > 0) {\n",
" console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n",
" return null;\n",
" }\n",
" if (js_urls.length === 0 && js_modules.length === 0) {\n",
" run_callbacks();\n",
" return null;\n",
" }\n",
" console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
" root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length;\n",
"\n",
" function on_load() {\n",
" root._bokeh_is_loading--;\n",
" if (root._bokeh_is_loading === 0) {\n",
" console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n",
" run_callbacks()\n",
" }\n",
" }\n",
"\n",
" function on_error() {\n",
" console.error(\"failed to load \" + url);\n",
" }\n",
"\n",
" for (var i = 0; i < css_urls.length; i++) {\n",
" var url = css_urls[i];\n",
" const element = document.createElement(\"link\");\n",
" element.onload = on_load;\n",
" element.onerror = on_error;\n",
" element.rel = \"stylesheet\";\n",
" element.type = \"text/css\";\n",
" element.href = url;\n",
" console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n",
" document.body.appendChild(element);\n",
" }\n",
"\n",
" var skip = [];\n",
" if (window.requirejs) {\n",
" window.requirejs.config({'paths': {'tabulator': 'https://unpkg.com/tabulator-tables@4.9.3/dist/js/tabulator'}});\n",
" require([\"tabulator\"], function(Tabulator,) {\n",
" window.Tabulator = Tabulator;\n",
" })\n",
" }\n",
" if (((window['tabulator'] !== undefined) && (!(window['tabulator'] instanceof HTMLElement))) || window.requirejs) {\n",
" var urls = ['https://unpkg.com/tabulator-tables@4.9.3/dist/js/tabulator.js', 'https://unpkg.com/moment@2.27.0/moment.js'];\n",
" for (var i = 0; i < urls.length; i++) {\n",
" skip.push(urls[i])\n",
" }\n",
" }\n",
" for (var i = 0; i < js_urls.length; i++) {\n",
" var url = js_urls[i];\n",
" if (skip.indexOf(url) >= 0) { on_load(); continue; }\n",
" var element = document.createElement('script');\n",
" element.onload = on_load;\n",
" element.onerror = on_error;\n",
" element.async = false;\n",
" element.src = url;\n",
" console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
" document.head.appendChild(element);\n",
" }\n",
" for (var i = 0; i < js_modules.length; i++) {\n",
" var url = js_modules[i];\n",
" if (skip.indexOf(url) >= 0) { on_load(); continue; }\n",
" var element = document.createElement('script');\n",
" element.onload = on_load;\n",
" element.onerror = on_error;\n",
" element.async = false;\n",
" element.src = url;\n",
" element.type = \"module\";\n",
" console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
" document.head.appendChild(element);\n",
" }\n",
" if (!js_urls.length && !js_modules.length) {\n",
" on_load()\n",
" }\n",
" };\n",
"\n",
" function inject_raw_css(css) {\n",
" const element = document.createElement(\"style\");\n",
" element.appendChild(document.createTextNode(css));\n",
" document.body.appendChild(element);\n",
" }\n",
"\n",
" var js_urls = [\"https://unpkg.com/tabulator-tables@4.9.3/dist/js/tabulator.js\", \"https://unpkg.com/moment@2.27.0/moment.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.2.min.js\", \"https://unpkg.com/@holoviz/panel@^0.11.3/dist/panel.min.js\"];\n",
" var js_modules = [];\n",
" var css_urls = [\"https://unpkg.com/tabulator-tables@4.9.3/dist/css/tabulator_simple.min.css\", \"https://unpkg.com/@holoviz/panel@0.11.3/dist/css/widgets.css\", \"https://unpkg.com/@holoviz/panel@0.11.3/dist/css/card.css\", \"https://unpkg.com/@holoviz/panel@0.11.3/dist/css/dataframe.css\", \"https://unpkg.com/@holoviz/panel@0.11.3/dist/css/alerts.css\", \"https://unpkg.com/@holoviz/panel@0.11.3/dist/css/loading.css\", \"https://unpkg.com/@holoviz/panel@0.11.3/dist/css/markdown.css\", \"https://unpkg.com/@holoviz/panel@0.11.3/dist/css/json.css\"];\n",
" var inline_js = [\n",
" function(Bokeh) {\n",
" inject_raw_css(\"\\n .bk.pn-loading.arcs:before {\\n background-image: url(\\\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBzdHlsZT0ibWFyZ2luOiBhdXRvOyBiYWNrZ3JvdW5kOiBub25lOyBkaXNwbGF5OiBibG9jazsgc2hhcGUtcmVuZGVyaW5nOiBhdXRvOyIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIj4gIDxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjMyIiBzdHJva2Utd2lkdGg9IjgiIHN0cm9rZT0iI2MzYzNjMyIgc3Ryb2tlLWRhc2hhcnJheT0iNTAuMjY1NDgyNDU3NDM2NjkgNTAuMjY1NDgyNDU3NDM2NjkiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+ICAgIDxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9InRyYW5zZm9ybSIgdHlwZT0icm90YXRlIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgZHVyPSIxcyIga2V5VGltZXM9IjA7MSIgdmFsdWVzPSIwIDUwIDUwOzM2MCA1MCA1MCI+PC9hbmltYXRlVHJhbnNmb3JtPiAgPC9jaXJjbGU+PC9zdmc+\\\")\\n }\\n \");\n",
" },\n",
" function(Bokeh) {\n",
" Bokeh.set_log_level(\"info\");\n",
" },\n",
" function(Bokeh) {} // ensure no trailing comma for IE\n",
" ];\n",
"\n",
" function run_inline_js() {\n",
" if ((root.Bokeh !== undefined) || (force === true)) {\n",
" for (var i = 0; i < inline_js.length; i++) {\n",
" inline_js[i].call(root, root.Bokeh);\n",
" }} else if (Date.now() < root._bokeh_timeout) {\n",
" setTimeout(run_inline_js, 100);\n",
" } else if (!root._bokeh_failed_load) {\n",
" console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
" root._bokeh_failed_load = true;\n",
" }\n",
" }\n",
"\n",
" if (root._bokeh_is_loading === 0) {\n",
" console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n",
" run_inline_js();\n",
" } else {\n",
" load_libs(css_urls, js_urls, js_modules, function() {\n",
" console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n",
" run_inline_js();\n",
" });\n",
" }\n",
"}(window));"
],
"application/vnd.holoviews_load.v0+json": "\n(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, js_modules, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls.length === 0 && js_modules.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n var skip = [];\n if (window.requirejs) {\n window.requirejs.config({'paths': {'tabulator': 'https://unpkg.com/tabulator-tables@4.9.3/dist/js/tabulator'}});\n require([\"tabulator\"], function(Tabulator,) {\n window.Tabulator = Tabulator;\n })\n }\n if (((window['tabulator'] !== undefined) && (!(window['tabulator'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://unpkg.com/tabulator-tables@4.9.3/dist/js/tabulator.js', 'https://unpkg.com/moment@2.27.0/moment.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n }\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n if (skip.indexOf(url) >= 0) { on_load(); continue; }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (var i = 0; i < js_modules.length; i++) {\n var url = js_modules[i];\n if (skip.indexOf(url) >= 0) { on_load(); continue; }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n var js_urls = [\"https://unpkg.com/tabulator-tables@4.9.3/dist/js/tabulator.js\", \"https://unpkg.com/moment@2.27.0/moment.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.2.min.js\", \"https://unpkg.com/@holoviz/panel@^0.11.3/dist/panel.min.js\"];\n var js_modules = [];\n var css_urls = [\"https://unpkg.com/tabulator-tables@4.9.3/dist/css/tabulator_simple.min.css\", \"https://unpkg.com/@holoviz/panel@0.11.3/dist/css/widgets.css\", \"https://unpkg.com/@holoviz/panel@0.11.3/dist/css/card.css\", \"https://unpkg.com/@holoviz/panel@0.11.3/dist/css/dataframe.css\", \"https://unpkg.com/@holoviz/panel@0.11.3/dist/css/alerts.css\", \"https://unpkg.com/@holoviz/panel@0.11.3/dist/css/loading.css\", \"https://unpkg.com/@holoviz/panel@0.11.3/dist/css/markdown.css\", \"https://unpkg.com/@holoviz/panel@0.11.3/dist/css/json.css\"];\n var inline_js = [\n function(Bokeh) {\n inject_raw_css(\"\\n .bk.pn-loading.arcs:before {\\n background-image: url(\\\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBzdHlsZT0ibWFyZ2luOiBhdXRvOyBiYWNrZ3JvdW5kOiBub25lOyBkaXNwbGF5OiBibG9jazsgc2hhcGUtcmVuZGVyaW5nOiBhdXRvOyIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIj4gIDxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjMyIiBzdHJva2Utd2lkdGg9IjgiIHN0cm9rZT0iI2MzYzNjMyIgc3Ryb2tlLWRhc2hhcnJheT0iNTAuMjY1NDgyNDU3NDM2NjkgNTAuMjY1NDgyNDU3NDM2NjkiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+ICAgIDxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9InRyYW5zZm9ybSIgdHlwZT0icm90YXRlIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgZHVyPSIxcyIga2V5VGltZXM9IjA7MSIgdmFsdWVzPSIwIDUwIDUwOzM2MCA1MCA1MCI+PC9hbmltYXRlVHJhbnNmb3JtPiAgPC9jaXJjbGU+PC9zdmc+\\\")\\n }\\n \");\n },\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n function(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, js_modules, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));"
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
"if ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n",
" window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n",
"}\n",
"\n",
"\n",
" function JupyterCommManager() {\n",
" }\n",
"\n",
" JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n",
" if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n",
" var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n",
" comm_manager.register_target(comm_id, function(comm) {\n",
" comm.on_msg(msg_handler);\n",
" });\n",
" } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n",
" window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n",
" comm.onMsg = msg_handler;\n",
" });\n",
" } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n",
" google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n",
" var messages = comm.messages[Symbol.asyncIterator]();\n",
" function processIteratorResult(result) {\n",
" var message = result.value;\n",
" console.log(message)\n",
" var content = {data: message.data, comm_id};\n",
" var buffers = []\n",
" for (var buffer of message.buffers || []) {\n",
" buffers.push(new DataView(buffer))\n",
" }\n",
" var metadata = message.metadata || {};\n",
" var msg = {content, buffers, metadata}\n",
" msg_handler(msg);\n",
" return messages.next().then(processIteratorResult);\n",
" }\n",
" return messages.next().then(processIteratorResult);\n",
" })\n",
" }\n",
" }\n",
"\n",
" JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n",
" if (comm_id in window.PyViz.comms) {\n",
" return window.PyViz.comms[comm_id];\n",
" } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n",
" var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n",
" var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n",
" if (msg_handler) {\n",
" comm.on_msg(msg_handler);\n",
" }\n",
" } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n",
" var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n",
" comm.open();\n",
" if (msg_handler) {\n",
" comm.onMsg = msg_handler;\n",
" }\n",
" } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n",
" var comm_promise = google.colab.kernel.comms.open(comm_id)\n",
" comm_promise.then((comm) => {\n",
" window.PyViz.comms[comm_id] = comm;\n",
" if (msg_handler) {\n",
" var messages = comm.messages[Symbol.asyncIterator]();\n",
" function processIteratorResult(result) {\n",
" var message = result.value;\n",
" var content = {data: message.data};\n",
" var metadata = message.metadata || {comm_id};\n",
" var msg = {content, metadata}\n",
" msg_handler(msg);\n",
" return messages.next().then(processIteratorResult);\n",
" }\n",
" return messages.next().then(processIteratorResult);\n",
" }\n",
" }) \n",
" var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n",
" return comm_promise.then((comm) => {\n",
" comm.send(data, metadata, buffers, disposeOnDone);\n",
" });\n",
" };\n",
" var comm = {\n",
" send: sendClosure\n",
" };\n",
" }\n",
" window.PyViz.comms[comm_id] = comm;\n",
" return comm;\n",
" }\n",
" window.PyViz.comm_manager = new JupyterCommManager();\n",
" \n",
"\n",
"\n",
"var JS_MIME_TYPE = 'application/javascript';\n",
"var HTML_MIME_TYPE = 'text/html';\n",
"var EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\n",
"var CLASS_NAME = 'output';\n",
"\n",
"/**\n",
" * Render data to the DOM node\n",
" */\n",
"function render(props, node) {\n",
" var div = document.createElement(\"div\");\n",
" var script = document.createElement(\"script\");\n",
" node.appendChild(div);\n",
" node.appendChild(script);\n",
"}\n",
"\n",
"/**\n",
" * Handle when a new output is added\n",
" */\n",
"function handle_add_output(event, handle) {\n",
" var output_area = handle.output_area;\n",
" var output = handle.output;\n",
" if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n",
" return\n",
" }\n",
" var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n",
" var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n",
" if (id !== undefined) {\n",
" var nchildren = toinsert.length;\n",
" var html_node = toinsert[nchildren-1].children[0];\n",
" html_node.innerHTML = output.data[HTML_MIME_TYPE];\n",
" var scripts = [];\n",
" var nodelist = html_node.querySelectorAll(\"script\");\n",
" for (var i in nodelist) {\n",
" if (nodelist.hasOwnProperty(i)) {\n",
" scripts.push(nodelist[i])\n",
" }\n",
" }\n",
"\n",
" scripts.forEach( function (oldScript) {\n",
" var newScript = document.createElement(\"script\");\n",
" var attrs = [];\n",
" var nodemap = oldScript.attributes;\n",
" for (var j in nodemap) {\n",
" if (nodemap.hasOwnProperty(j)) {\n",
" attrs.push(nodemap[j])\n",
" }\n",
" }\n",
" attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n",
" newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n",
" oldScript.parentNode.replaceChild(newScript, oldScript);\n",
" });\n",
" if (JS_MIME_TYPE in output.data) {\n",
" toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n",
" }\n",
" output_area._hv_plot_id = id;\n",
" if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n",
" window.PyViz.plot_index[id] = Bokeh.index[id];\n",
" } else {\n",
" window.PyViz.plot_index[id] = null;\n",
" }\n",
" } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n",
" var bk_div = document.createElement(\"div\");\n",
" bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n",
" var script_attrs = bk_div.children[0].attributes;\n",
" for (var i = 0; i < script_attrs.length; i++) {\n",
" toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n",
" }\n",
" // store reference to server id on output_area\n",
" output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n",
" }\n",
"}\n",
"\n",
"/**\n",
" * Handle when an output is cleared or removed\n",
" */\n",
"function handle_clear_output(event, handle) {\n",
" var id = handle.cell.output_area._hv_plot_id;\n",
" var server_id = handle.cell.output_area._bokeh_server_id;\n",
" if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n",
" var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n",
" if (server_id !== null) {\n",
" comm.send({event_type: 'server_delete', 'id': server_id});\n",
" return;\n",
" } else if (comm !== null) {\n",
" comm.send({event_type: 'delete', 'id': id});\n",
" }\n",
" delete PyViz.plot_index[id];\n",
" if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n",
" var doc = window.Bokeh.index[id].model.document\n",
" doc.clear();\n",
" const i = window.Bokeh.documents.indexOf(doc);\n",
" if (i > -1) {\n",
" window.Bokeh.documents.splice(i, 1);\n",
" }\n",
" }\n",
"}\n",
"\n",
"/**\n",
" * Handle kernel restart event\n",
" */\n",
"function handle_kernel_cleanup(event, handle) {\n",
" delete PyViz.comms[\"hv-extension-comm\"];\n",
" window.PyViz.plot_index = {}\n",
"}\n",
"\n",
"/**\n",
" * Handle update_display_data messages\n",
" */\n",
"function handle_update_output(event, handle) {\n",
" handle_clear_output(event, {cell: {output_area: handle.output_area}})\n",
" handle_add_output(event, handle)\n",
"}\n",
"\n",
"function register_renderer(events, OutputArea) {\n",
" function append_mime(data, metadata, element) {\n",
" // create a DOM node to render to\n",
" var toinsert = this.create_output_subarea(\n",
" metadata,\n",
" CLASS_NAME,\n",
" EXEC_MIME_TYPE\n",
" );\n",
" this.keyboard_manager.register_events(toinsert);\n",
" // Render to node\n",
" var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n",
" render(props, toinsert[0]);\n",
" element.append(toinsert);\n",
" return toinsert\n",
" }\n",
"\n",
" events.on('output_added.OutputArea', handle_add_output);\n",
" events.on('output_updated.OutputArea', handle_update_output);\n",
" events.on('clear_output.CodeCell', handle_clear_output);\n",
" events.on('delete.Cell', handle_clear_output);\n",
" events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n",
"\n",
" OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n",
" safe: true,\n",
" index: 0\n",
" });\n",
"}\n",
"\n",
"if (window.Jupyter !== undefined) {\n",
" try {\n",
" var events = require('base/js/events');\n",
" var OutputArea = require('notebook/js/outputarea').OutputArea;\n",
" if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n",
" register_renderer(events, OutputArea);\n",
" }\n",
" } catch(err) {\n",
" }\n",
"}\n"
],
"application/vnd.holoviews_load.v0+json": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n console.log(message)\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n comm.open();\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n }) \n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import panel as pn\n",
"import param\n",
"from glob import glob\n",
"import base64\n",
"import re\n",
"import requests\n",
"from subprocess import Popen, PIPE, STDOUT\n",
"import html\n",
"from cairosvg import svg2png\n",
"pn.extension(comms='ipywidgets')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "ca43f1f2-42ef-4355-a2e2-e27351a51b96",
"metadata": {},
"outputs": [],
"source": [
"storeBase = 'store/CCTP-SRSA-IP-20210831/'\n",
"\n",
"def unl2dotWeb(unldata) :\n",
" data={'unl': unldata, 'outputs':['dot', 'svg', 'rdf']}\n",
" try:\n",
" r = requests.post('https://unl.demo.tetras-libre.fr/unl2rdf', data=data)\n",
" except Exception as e:\n",
" return 'Error calling https://unl.demo.tetras-libre.fr/unl2rdf : \"{error}\"'.format(error=e)\n",
" html=r.text\n",
" # On utilise une regex au lieu de parser le html car ce dernier est mal formé\n",
" regexSvg = re.compile('<svg.*svg>',re.MULTILINE|re.DOTALL)\n",
" regexRdf = re.compile(\"<code id='rdf' class='collapse show'>(.*?)</code>\",re.MULTILINE|re.DOTALL)\n",
" try : \n",
" svg = regexSvg.search(html).group()\n",
" rdf = regexRdf.search(html).group(1) \n",
" except Exception as e :\n",
" svg = ''\n",
" rdf = ''\n",
" print(e)\n",
" return(svg, rdf)\n",
"\n",
"def writeUnlFiles(unlStr, storePrefix):\n",
" srsaRef = selectDir.value\n",
" with open(storePrefix+'.unl','w') as unlFile:\n",
" unlFile.write(unlStr)\n",
" unlFile.close()\n",
" # Send UNL code to https://unl.demo.tetras-libre.fr/unl2rdf to get SVG and RDF\n",
" svg, rdf = unl2dotWeb(unlStr)\n",
" rdf = html.unescape(rdf)\n",
" with open(storePrefix+'.svg','w') as svgFile:\n",
" svgFile.write(svg)\n",
" svgFile.close()\n",
" with open(storePrefix+'.ttl','w') as rdfFile:\n",
" rdfFile.write(rdf)\n",
" rdfFile.close()\n",
" # Convert svg to png and write to a file\n",
" svg2png(bytestring=svg, write_to=storePrefix+'.png')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "c65dbb6f-480e-429e-b3b9-569759ec3b67",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "61b8de64d9a444408641cbfe49c4f089",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"BokehModel(combine_events=True, render_bundle={'docs_json': {'5655cbcb-db50-45d6-a5e1-0dbb63ee7c9d': {'defs': …"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pathList = glob(storeBase+'*')\n",
"dirList = sorted([x.split('/')[-1] for x in pathList])\n",
"saveButtonClicks = 0\n",
" \n",
"selectDir = pn.widgets.Select(name='Exigence : ', options=dirList, width = 300)\n",
"dir_selector = dict(directory=selectDir)#, save=saveButton)\n",
"\n",
"def main_pane(directory):\n",
" pane_width = 1200\n",
" \n",
" saveButtonClicks = 0\n",
" saveButton = pn.widgets.Button(name='Enregistrer', button_type='success', width = 100)\n",
" saveButtonDic = dict(button=saveButton)\n",
" saveCommentButton = pn.widgets.Button(name='Enregistrer', button_type='success', width = 100)\n",
" \n",
" path = storeBase+directory+'/current/'\n",
" pathOrig = storeBase+directory+'/orig/'\n",
" svgPath = path+directory+'.svg'\n",
" pngPath = path+directory+'.png'\n",
" unlPath = path+directory+'.unl'\n",
" rdfPath = path+directory+'.ttl'\n",
" commentPath = path+directory+'.comments'\n",
" with open(commentPath) as commentFile:\n",
" commentStr = commentFile.read() \n",
" commentFile.close()\n",
" with open(unlPath) as unlFile:\n",
" unlStr = unlFile.read()\n",
" unlFile.close()\n",
" svgPathOrig = pathOrig+directory+'.svg'\n",
" pngPathOrig = pathOrig+directory+'.png'\n",
" unlPathOrig = pathOrig+directory+'.unl'\n",
" rdfPathOrig = pathOrig+directory+'.ttl'\n",
" with open(unlPathOrig) as unlFileOrig:\n",
" unlStrOrig = unlFileOrig.read()\n",
" unlFileOrig.close()\n",
" unlHtmlOrig = unlStrOrig.replace(\"\\n\",\"<br/>\")\n",
" if unlStrOrig == unlStr:\n",
" modIndicator = ''\n",
" else:\n",
" modIndicator = ' <u>modifié</u>'\n",
" regexFr = re.compile(\"{org:fr}\\n(.*?)\\n{/org}\",re.MULTILINE|re.DOTALL)\n",
" try:\n",
" frStr = regexFr.search(unlStr).group(1)\n",
" except AttributeError:\n",
" frStr = ''\n",
" regexEn = re.compile(\"{en}\\n(.*?)\\n{/en}\",re.MULTILINE|re.DOTALL)\n",
" try:\n",
" enStr = regexEn.search(unlStr).group(1) \n",
" except AttributeError:\n",
" enStr = ''\n",
" \n",
" unlOrig_html = pn.pane.HTML(unlHtmlOrig)\n",
" unl_input = pn.widgets.input.TextAreaInput(height=400)\n",
" unl_input.value = unlStr\n",
" comment_input = pn.widgets.input.TextAreaInput(height=300)\n",
" comment_input.value = commentStr\n",
" \n",
" downloadSvg = pn.widgets.FileDownload(sizing_mode='stretch_width', file=svgPath, embed=True, name='Télécharger le graphe en SVG :')\n",
" downloadPng = pn.widgets.FileDownload(sizing_mode='stretch_width', file=pngPath, embed=True, name='Télécharger le graphe en PNG :') \n",
" downloadRdf = pn.widgets.FileDownload(sizing_mode='stretch_width', file=rdfPath, embed=True, name='Télécharger le code UNL-RDF :')\n",
" downloadUnl = pn.widgets.FileDownload(sizing_mode='stretch_width', file=unlPath, embed=True, name='Télécharger le code UNL :')\n",
" \n",
" def compute_unl_graph_pane(button):\n",
" global saveButtonClicks\n",
" if saveButtonClicks != 0:\n",
" writeUnlFiles(unl_input.value, storeBase+selectDir.value+'/current/'+selectDir.value)\n",
" pane = pn.pane.PNG(pngPath, width = pane_width)\n",
" saveButtonClicks += 1\n",
" return(pane)\n",
" \n",
" unl_graph_pane = pn.interact(lambda button : compute_unl_graph_pane(button), **saveButtonDic)\n",
" \n",
" pane = pn.Column(\n",
" pn.pane.HTML(directory),\n",
" pn.pane.HTML('FR : '+frStr),\n",
" pn.pane.HTML('EN : '+enStr),\n",
" unl_graph_pane[1],\n",
" pn.Card(pn.Column(saveCommentButton, comment_input, width = pane_width),\n",
" header='**Commentaires** *(cliquer pour afficher)*', \n",
" collapsed=True, width = pane_width), \n",
" pn.Card(pn.Column(saveButton, unl_input, width = pane_width),\n",
" header='**Code UNL**'+modIndicator+' *(cliquer pour afficher)*', \n",
" collapsed=True, width = pane_width),\n",
" pn.Card(pn.Column(\n",
" unlOrig_html,\n",
" pn.Card(pn.pane.PNG(pngPath, width = pane_width-20), header = \"**Graphe d'origine**\", width=pane_width-10)\n",
" ), \n",
" header=\"**Code UNL d'origine** *(cliquer pour afficher)*\", \n",
" collapsed=True, width = pane_width),\n",
" pn.WidgetBox(\n",
" pn.Row(downloadPng, downloadSvg),\n",
" pn.Row(downloadUnl, downloadRdf),\n",
" width=pane_width,\n",
" ),\n",
" width=pane_width, \n",
" )\n",
" \n",
" def saveComments(event):\n",
" with open(commentPath, 'w') as commentFile:\n",
" commentFile.write(comment_input.value) \n",
" commentFile.close()\n",
" saveCommentButton.on_click(saveComments)\n",
" \n",
" return(pane)\n",
"\n",
"pane = pn.interact(lambda directory : main_pane(directory), **dir_selector)\n",
"pn.Row(\n",
" pn.layout.HSpacer(),\n",
" pn.Column(\n",
" selectDir,\n",
" pane[1],\n",
" ),\n",
" pn.layout.HSpacer(),\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5d4ec56e-d0bb-44c8-975b-49d409b6b160",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
%% Cell type:code id:160ab8ab-091e-4b00-b63a-c3746c71c540 tags:
```
python
import
panel
as
pn
import
param
from
glob
import
glob
import
base64
import
re
import
requests
from
subprocess
import
Popen
,
PIPE
,
STDOUT
import
html
from
cairosvg
import
svg2png
pn
.
extension
(
comms
=
'
ipywidgets
'
)
```
%% Output
%% Cell type:code id:ca43f1f2-42ef-4355-a2e2-e27351a51b96 tags:
```
python
storeBase
=
'
store/CCTP-SRSA-IP-20210831/
'
def
unl2dotWeb
(
unldata
)
:
data
=
{
'
unl
'
:
unldata
,
'
outputs
'
:[
'
dot
'
,
'
svg
'
,
'
rdf
'
]}
try
:
r
=
requests
.
post
(
'
https://unl.demo.tetras-libre.fr/unl2rdf
'
,
data
=
data
)
except
Exception
as
e
:
return
'
Error calling https://unl.demo.tetras-libre.fr/unl2rdf :
"
{error}
"'
.
format
(
error
=
e
)
html
=
r
.
text
# On utilise une regex au lieu de parser le html car ce dernier est mal formé
regexSvg
=
re
.
compile
(
'
<svg.*svg>
'
,
re
.
MULTILINE
|
re
.
DOTALL
)
regexRdf
=
re
.
compile
(
"
<code id=
'
rdf
'
class=
'
collapse show
'
>(.*?)</code>
"
,
re
.
MULTILINE
|
re
.
DOTALL
)
try
:
svg
=
regexSvg
.
search
(
html
).
group
()
rdf
=
regexRdf
.
search
(
html
).
group
(
1
)
except
Exception
as
e
:
svg
=
''
rdf
=
''
print
(
e
)
return
(
svg
,
rdf
)
def
writeUnlFiles
(
unlStr
,
storePrefix
):
srsaRef
=
selectDir
.
value
with
open
(
storePrefix
+
'
.unl
'
,
'
w
'
)
as
unlFile
:
unlFile
.
write
(
unlStr
)
unlFile
.
close
()
# Send UNL code to https://unl.demo.tetras-libre.fr/unl2rdf to get SVG and RDF
svg
,
rdf
=
unl2dotWeb
(
unlStr
)
rdf
=
html
.
unescape
(
rdf
)
with
open
(
storePrefix
+
'
.svg
'
,
'
w
'
)
as
svgFile
:
svgFile
.
write
(
svg
)
svgFile
.
close
()
with
open
(
storePrefix
+
'
.ttl
'
,
'
w
'
)
as
rdfFile
:
rdfFile
.
write
(
rdf
)
rdfFile
.
close
()
# Convert svg to png and write to a file
svg2png
(
bytestring
=
svg
,
write_to
=
storePrefix
+
'
.png
'
)
```
%% Cell type:code id:c65dbb6f-480e-429e-b3b9-569759ec3b67 tags:
```
python
pathList
=
glob
(
storeBase
+
'
*
'
)
dirList
=
sorted
([
x
.
split
(
'
/
'
)[
-
1
]
for
x
in
pathList
])
saveButtonClicks
=
0
selectDir
=
pn
.
widgets
.
Select
(
name
=
'
Exigence :
'
,
options
=
dirList
,
width
=
300
)
dir_selector
=
dict
(
directory
=
selectDir
)
#, save=saveButton)
def
main_pane
(
directory
):
pane_width
=
1200
saveButtonClicks
=
0
saveButton
=
pn
.
widgets
.
Button
(
name
=
'
Enregistrer
'
,
button_type
=
'
success
'
,
width
=
100
)
saveButtonDic
=
dict
(
button
=
saveButton
)
saveCommentButton
=
pn
.
widgets
.
Button
(
name
=
'
Enregistrer
'
,
button_type
=
'
success
'
,
width
=
100
)
path
=
storeBase
+
directory
+
'
/current/
'
pathOrig
=
storeBase
+
directory
+
'
/orig/
'
svgPath
=
path
+
directory
+
'
.svg
'
pngPath
=
path
+
directory
+
'
.png
'
unlPath
=
path
+
directory
+
'
.unl
'
rdfPath
=
path
+
directory
+
'
.ttl
'
commentPath
=
path
+
directory
+
'
.comments
'
with
open
(
commentPath
)
as
commentFile
:
commentStr
=
commentFile
.
read
()
commentFile
.
close
()
with
open
(
unlPath
)
as
unlFile
:
unlStr
=
unlFile
.
read
()
unlFile
.
close
()
svgPathOrig
=
pathOrig
+
directory
+
'
.svg
'
pngPathOrig
=
pathOrig
+
directory
+
'
.png
'
unlPathOrig
=
pathOrig
+
directory
+
'
.unl
'
rdfPathOrig
=
pathOrig
+
directory
+
'
.ttl
'
with
open
(
unlPathOrig
)
as
unlFileOrig
:
unlStrOrig
=
unlFileOrig
.
read
()
unlFileOrig
.
close
()
unlHtmlOrig
=
unlStrOrig
.
replace
(
"
\n
"
,
"
<br/>
"
)
if
unlStrOrig
==
unlStr
:
modIndicator
=
''
else
:
modIndicator
=
'
<u>modifié</u>
'
regexFr
=
re
.
compile
(
"
{org:fr}
\n
(.*?)
\n
{/org}
"
,
re
.
MULTILINE
|
re
.
DOTALL
)
try
:
frStr
=
regexFr
.
search
(
unlStr
).
group
(
1
)
except
AttributeError
:
frStr
=
''
regexEn
=
re
.
compile
(
"
{en}
\n
(.*?)
\n
{/en}
"
,
re
.
MULTILINE
|
re
.
DOTALL
)
try
:
enStr
=
regexEn
.
search
(
unlStr
).
group
(
1
)
except
AttributeError
:
enStr
=
''
unlOrig_html
=
pn
.
pane
.
HTML
(
unlHtmlOrig
)
unl_input
=
pn
.
widgets
.
input
.
TextAreaInput
(
height
=
400
)
unl_input
.
value
=
unlStr
comment_input
=
pn
.
widgets
.
input
.
TextAreaInput
(
height
=
300
)
comment_input
.
value
=
commentStr
downloadSvg
=
pn
.
widgets
.
FileDownload
(
sizing_mode
=
'
stretch_width
'
,
file
=
svgPath
,
embed
=
True
,
name
=
'
Télécharger le graphe en SVG :
'
)
downloadPng
=
pn
.
widgets
.
FileDownload
(
sizing_mode
=
'
stretch_width
'
,
file
=
pngPath
,
embed
=
True
,
name
=
'
Télécharger le graphe en PNG :
'
)
downloadRdf
=
pn
.
widgets
.
FileDownload
(
sizing_mode
=
'
stretch_width
'
,
file
=
rdfPath
,
embed
=
True
,
name
=
'
Télécharger le code UNL-RDF :
'
)
downloadUnl
=
pn
.
widgets
.
FileDownload
(
sizing_mode
=
'
stretch_width
'
,
file
=
unlPath
,
embed
=
True
,
name
=
'
Télécharger le code UNL :
'
)
def
compute_unl_graph_pane
(
button
):
global
saveButtonClicks
if
saveButtonClicks
!=
0
:
writeUnlFiles
(
unl_input
.
value
,
storeBase
+
selectDir
.
value
+
'
/current/
'
+
selectDir
.
value
)
pane
=
pn
.
pane
.
PNG
(
pngPath
,
width
=
pane_width
)
saveButtonClicks
+=
1
return
(
pane
)
unl_graph_pane
=
pn
.
interact
(
lambda
button
:
compute_unl_graph_pane
(
button
),
**
saveButtonDic
)
pane
=
pn
.
Column
(
pn
.
pane
.
HTML
(
directory
),
pn
.
pane
.
HTML
(
'
FR :
'
+
frStr
),
pn
.
pane
.
HTML
(
'
EN :
'
+
enStr
),
unl_graph_pane
[
1
],
pn
.
Card
(
pn
.
Column
(
saveCommentButton
,
comment_input
,
width
=
pane_width
),
header
=
'
**Commentaires** *(cliquer pour afficher)*
'
,
collapsed
=
True
,
width
=
pane_width
),
pn
.
Card
(
pn
.
Column
(
saveButton
,
unl_input
,
width
=
pane_width
),
header
=
'
**Code UNL**
'
+
modIndicator
+
'
*(cliquer pour afficher)*
'
,
collapsed
=
True
,
width
=
pane_width
),
pn
.
Card
(
pn
.
Column
(
unlOrig_html
,
pn
.
Card
(
pn
.
pane
.
PNG
(
pngPath
,
width
=
pane_width
-
20
),
header
=
"
**Graphe d
'
origine**
"
,
width
=
pane_width
-
10
)
),
header
=
"
**Code UNL d
'
origine** *(cliquer pour afficher)*
"
,
collapsed
=
True
,
width
=
pane_width
),
pn
.
WidgetBox
(
pn
.
Row
(
downloadPng
,
downloadSvg
),
pn
.
Row
(
downloadUnl
,
downloadRdf
),
width
=
pane_width
,
),
width
=
pane_width
,
)
def
saveComments
(
event
):
with
open
(
commentPath
,
'
w
'
)
as
commentFile
:
commentFile
.
write
(
comment_input
.
value
)
commentFile
.
close
()
saveCommentButton
.
on_click
(
saveComments
)
return
(
pane
)
pane
=
pn
.
interact
(
lambda
directory
:
main_pane
(
directory
),
**
dir_selector
)
pn
.
Row
(
pn
.
layout
.
HSpacer
(),
pn
.
Column
(
selectDir
,
pane
[
1
],
),
pn
.
layout
.
HSpacer
(),
)
```
%% Output
BokehModel(combine_events=True, render_bundle={'docs_json': {'5655cbcb-db50-45d6-a5e1-0dbb63ee7c9d': {'defs': …
%% Cell type:code id:5d4ec56e-d0bb-44c8-975b-49d409b6b160 tags:
```
python
```
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment