diff --git a/README.md b/README.md index 7a05890..6f59d14 100644 --- a/README.md +++ b/README.md @@ -74,8 +74,8 @@ Niex notebooks support two types of cells: code and markdown. Markdown cells are used for human-readable text using the [Markdown format](https://www.markdownguide.org/basic-syntax/). Code cells are used to store & execute Elixir code. To use a code cell, simply populate the cell and execute it using -the "run" button. The cell output field will display the result of the execution. Cells must be explicity executed - -if you make changes to code that other cells are dependent on, you must explicitly +the "run" button (or the key combo command-retrun). The cell output field will display the result of the execution. +Cells must be explicity executed - if you make changes to code that other cells are dependent on, you must explicitly rerun those cell commands in order. #### Notebook & Interpreter State @@ -84,7 +84,7 @@ Like running an IEx session, Niex maintains an internal interpreter state that i of commands in the notebook**, and **is not saved in the notebook**. This means that when you open a saved notebook, you must execute each cell in order to restore internal state. -#### Asynchronous execution +#### Asynchronous execution & animation You can also display intermediate results for long-running code in cells. This allows you to create animations or updates for asynchronous processes. To render an intermediate result @@ -167,7 +167,6 @@ Sample notebook: - executed code is **not** sandboxed - see section below on arbitrary code execution - future work - add support for other media types -- future work - add support for Live components in cells - notebook format & details are subject to change ## WARNING: arbitrary code execution diff --git a/assets/js/niex.js b/assets/js/niex.js index 70c5590..abf9156 100644 --- a/assets/js/niex.js +++ b/assets/js/niex.js @@ -82,11 +82,11 @@ export const hooks = { NiexOutput: { mounted: function () { - if(this.el.attributes['data-type'].value != "html") + if(this.el.attributes['data-type'].value == "code ") this.el.innerHTML = Prism.highlight(this.el.innerText, Prism.languages.elixir, 'elixir'); }, updated: function () { - if(this.el.attributes['data-type'].value != "html") + if(this.el.attributes['data-type'].value == "code") this.el.innerHTML = Prism.highlight(this.el.innerText, Prism.languages.elixir, 'elixir'); } diff --git a/lib/niex_web/live/cells.ex b/lib/niex_web/live/cells.ex index ab96214..cde3593 100644 --- a/lib/niex_web/live/cells.ex +++ b/lib/niex_web/live/cells.ex @@ -106,12 +106,12 @@ defmodule NiexWeb.Cells do """ end - defp render_output(%{text: text, type: "html"}) do - # pre-rendered HTML - raw(text) + defp render_output(%{text: text, type: "code"}) do + text end defp render_output(%{text: text}) do - text + # pre-rendered HTML + raw(text) end end diff --git a/priv/static/js/app.js b/priv/static/js/app.js index 0784174..daf5ead 100644 --- a/priv/static/js/app.js +++ b/priv/static/js/app.js @@ -117,7 +117,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _css /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hooks\", function() { return hooks; });\n/* harmony import */ var _fortawesome_fontawesome_free_js_fontawesome__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @fortawesome/fontawesome-free/js/fontawesome */ \"./node_modules/@fortawesome/fontawesome-free/js/fontawesome.js\");\n/* harmony import */ var _fortawesome_fontawesome_free_js_fontawesome__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_fortawesome_fontawesome_free_js_fontawesome__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _fortawesome_fontawesome_free_js_solid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @fortawesome/fontawesome-free/js/solid */ \"./node_modules/@fortawesome/fontawesome-free/js/solid.js\");\n/* harmony import */ var _fortawesome_fontawesome_free_js_solid__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_fortawesome_fontawesome_free_js_solid__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prismjs_components_prism_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prismjs/components/prism-core */ \"./node_modules/prismjs/components/prism-core.js\");\n/* harmony import */ var prismjs_components_prism_core__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prismjs_components_prism_core__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prismjs_components_prism_elixir__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prismjs/components/prism-elixir */ \"./node_modules/prismjs/components/prism-elixir.js\");\n/* harmony import */ var prismjs_components_prism_elixir__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prismjs_components_prism_elixir__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prismjs_plugins_line_numbers_prism_line_numbers_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prismjs/plugins/line-numbers/prism-line-numbers.css */ \"./node_modules/prismjs/plugins/line-numbers/prism-line-numbers.css\");\n/* harmony import */ var prismjs_plugins_line_numbers_prism_line_numbers_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prismjs_plugins_line_numbers_prism_line_numbers_css__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var prismjs_plugins_line_numbers_prism_line_numbers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prismjs/plugins/line-numbers/prism-line-numbers */ \"./node_modules/prismjs/plugins/line-numbers/prism-line-numbers.js\");\n/* harmony import */ var prismjs_plugins_line_numbers_prism_line_numbers__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prismjs_plugins_line_numbers_prism_line_numbers__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var prismjs_themes_prism_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! prismjs/themes/prism.css */ \"./node_modules/prismjs/themes/prism.css\");\n/* harmony import */ var prismjs_themes_prism_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(prismjs_themes_prism_css__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var chartkick__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! chartkick */ \"./node_modules/chartkick/dist/chartkick.js\");\n/* harmony import */ var chartkick__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(chartkick__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var chart_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! chart.js */ \"./node_modules/chart.js/dist/Chart.js\");\n/* harmony import */ var chart_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(chart_js__WEBPACK_IMPORTED_MODULE_8__);\n\n\n\n\n\n\n\n\n\n\nvar resizeTextArea = function resizeTextArea(el) {\n el.style.height = \"5px\";\n el.style.height = el.scrollHeight + \"px\";\n};\n\nvar hooks = {\n NiexChart: {\n mounted: function mounted() {\n var data = JSON.parse(this.el.attributes['data-chart'].value);\n var f = chartkick__WEBPACK_IMPORTED_MODULE_7___default.a[data.type];\n var options = data.options || {};\n new f(this.el, data.data, options);\n },\n updated: function updated() {\n var data = JSON.parse(this.el.attributes['data-chart'].value);\n var f = chartkick__WEBPACK_IMPORTED_MODULE_7___default.a[data.type];\n var options = data.options || {};\n new f(this.el, data.data, options);\n }\n },\n NiexPage: {\n mounted: function mounted() {\n var _this = this;\n\n window.addEventListener(\"click\", function (e) {\n // any click not the child of a cell should blur\n if (!e.target.closest(\".cell\")) {\n _this.pushEvent(\"blur-cell\", {});\n }\n });\n window.addEventListener(\"keypress\", function (e) {\n if (e.code === \"KeyS\" && e.metaKey) {\n _this.pushEvent(\"save\", {});\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n if (e.code === \"KeyO\" && e.metaKey) {\n _this.pushEvent(\"open\", {});\n\n e.preventDefault();\n e.stopPropagation();\n }\n });\n }\n },\n NiexEditor: {\n mounted: function mounted() {\n this.el.addEventListener(\"input\", function (e) {\n return resizeTextArea(e.target);\n });\n resizeTextArea(this.el);\n },\n updated: function updated() {\n resizeTextArea(this.el);\n }\n },\n NiexCodeEditor: {\n mounted: function mounted() {\n this.el.addEventListener(\"input\", function (e) {\n return resizeTextArea(e.target);\n });\n resizeTextArea(this.el);\n this.el.addEventListener(\"keydown\", function (e) {\n if (e.metaKey && e.code === \"Enter\") {\n e.target.closest(\".content\").querySelector(\"button[class='run']\").click();\n }\n });\n },\n updated: function updated() {\n resizeTextArea(this.el);\n }\n },\n NiexOutput: {\n mounted: function mounted() {\n if (this.el.attributes['data-type'].value != \"html\") this.el.innerHTML = prismjs_components_prism_core__WEBPACK_IMPORTED_MODULE_2___default.a.highlight(this.el.innerText, prismjs_components_prism_core__WEBPACK_IMPORTED_MODULE_2___default.a.languages.elixir, 'elixir');\n },\n updated: function updated() {\n if (this.el.attributes['data-type'].value != \"html\") this.el.innerHTML = prismjs_components_prism_core__WEBPACK_IMPORTED_MODULE_2___default.a.highlight(this.el.innerText, prismjs_components_prism_core__WEBPACK_IMPORTED_MODULE_2___default.a.languages.elixir, 'elixir');\n }\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9qcy9uaWV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vanMvbmlleC5qcz9mMWJkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnQGZvcnRhd2Vzb21lL2ZvbnRhd2Vzb21lLWZyZWUvanMvZm9udGF3ZXNvbWUnXG5pbXBvcnQgJ0Bmb3J0YXdlc29tZS9mb250YXdlc29tZS1mcmVlL2pzL3NvbGlkJ1xuXG5pbXBvcnQgUHJpc20gZnJvbSAncHJpc21qcyc7XG5cbmltcG9ydCBDaGFydGtpY2sgZnJvbSBcImNoYXJ0a2lja1wiXG5pbXBvcnQgQ2hhcnRKUyBmcm9tIFwiY2hhcnQuanNcIlxuXG5jb25zdCByZXNpemVUZXh0QXJlYSA9IChlbCkgPT4ge1xuICAgIGVsLnN0eWxlLmhlaWdodCA9IFwiNXB4XCJcbiAgICBlbC5zdHlsZS5oZWlnaHQgPSAoZWwuc2Nyb2xsSGVpZ2h0KSArIFwicHhcIlxufVxuXG5leHBvcnQgY29uc3QgaG9va3MgPSB7XG4gICAgTmlleENoYXJ0OiB7XG4gICAgICAgIG1vdW50ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZSh0aGlzLmVsLmF0dHJpYnV0ZXNbJ2RhdGEtY2hhcnQnXS52YWx1ZSlcbiAgICAgICAgICAgIGxldCBmID0gQ2hhcnRraWNrW2RhdGEudHlwZV1cbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gZGF0YS5vcHRpb25zIHx8IHt9XG4gICAgICAgICAgICBuZXcgZih0aGlzLmVsLCBkYXRhLmRhdGEsIG9wdGlvbnMpXG4gICAgICAgIH0sXG4gICAgICAgIHVwZGF0ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZSh0aGlzLmVsLmF0dHJpYnV0ZXNbJ2RhdGEtY2hhcnQnXS52YWx1ZSlcbiAgICAgICAgICAgIGxldCBmID0gQ2hhcnRraWNrW2RhdGEudHlwZV1cbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gZGF0YS5vcHRpb25zIHx8IHt9XG4gICAgICAgICAgICBuZXcgZih0aGlzLmVsLCBkYXRhLmRhdGEsIG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgTmlleFBhZ2U6IHtcbiAgICAgICAgbW91bnRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGFueSBjbGljayBub3QgdGhlIGNoaWxkIG9mIGEgY2VsbCBzaG91bGQgYmx1clxuXG4gICAgICAgICAgICAgICAgaWYgKCFlLnRhcmdldC5jbG9zZXN0KFwiLmNlbGxcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoRXZlbnQoXCJibHVyLWNlbGxcIiwge30pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlwcmVzc1wiLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlLmNvZGUgPT09IFwiS2V5U1wiICYmIGUubWV0YUtleSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2hFdmVudChcInNhdmVcIiwge30pXG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gXCJLZXlPXCIgJiYgZS5tZXRhS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHVzaEV2ZW50KFwib3BlblwiLCB7fSlcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIE5pZXhFZGl0b3I6IHtcbiAgICAgICAgbW91bnRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZSA9PiByZXNpemVUZXh0QXJlYShlLnRhcmdldCkpO1xuICAgICAgICAgICAgcmVzaXplVGV4dEFyZWEodGhpcy5lbClcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmVzaXplVGV4dEFyZWEodGhpcy5lbClcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIE5pZXhDb2RlRWRpdG9yOiB7XG4gICAgICAgIG1vdW50ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGUgPT4gcmVzaXplVGV4dEFyZWEoZS50YXJnZXQpKTtcbiAgICAgICAgICAgIHJlc2l6ZVRleHRBcmVhKHRoaXMuZWwpXG5cbiAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZS5tZXRhS2V5ICYmIGUuY29kZSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LmNsb3Nlc3QoXCIuY29udGVudFwiKS5xdWVyeVNlbGVjdG9yKFwiYnV0dG9uW2NsYXNzPSdydW4nXVwiKS5jbGljaygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmVzaXplVGV4dEFyZWEodGhpcy5lbClcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBOaWV4T3V0cHV0OiB7XG4gICAgICAgIG1vdW50ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuZWwuYXR0cmlidXRlc1snZGF0YS10eXBlJ10udmFsdWUgIT0gXCJodG1sXCIpXG4gICAgICAgICAgICAgICAgdGhpcy5lbC5pbm5lckhUTUwgPSBQcmlzbS5oaWdobGlnaHQodGhpcy5lbC5pbm5lclRleHQsIFByaXNtLmxhbmd1YWdlcy5lbGl4aXIsICdlbGl4aXInKTtcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYodGhpcy5lbC5hdHRyaWJ1dGVzWydkYXRhLXR5cGUnXS52YWx1ZSAhPSBcImh0bWxcIilcbiAgICAgICAgICAgICAgICB0aGlzLmVsLmlubmVySFRNTCA9IFByaXNtLmhpZ2hsaWdodCh0aGlzLmVsLmlubmVyVGV4dCwgUHJpc20ubGFuZ3VhZ2VzLmVsaXhpciwgJ2VsaXhpcicpO1xuICAgICAgICB9XG5cbiAgICB9XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBOzs7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUFlQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdkJBO0FBMEJBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFXQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFiQTtBQWdCQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQVJBO0FBckVBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./js/niex.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hooks\", function() { return hooks; });\n/* harmony import */ var _fortawesome_fontawesome_free_js_fontawesome__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @fortawesome/fontawesome-free/js/fontawesome */ \"./node_modules/@fortawesome/fontawesome-free/js/fontawesome.js\");\n/* harmony import */ var _fortawesome_fontawesome_free_js_fontawesome__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_fortawesome_fontawesome_free_js_fontawesome__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _fortawesome_fontawesome_free_js_solid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @fortawesome/fontawesome-free/js/solid */ \"./node_modules/@fortawesome/fontawesome-free/js/solid.js\");\n/* harmony import */ var _fortawesome_fontawesome_free_js_solid__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_fortawesome_fontawesome_free_js_solid__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prismjs_components_prism_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prismjs/components/prism-core */ \"./node_modules/prismjs/components/prism-core.js\");\n/* harmony import */ var prismjs_components_prism_core__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prismjs_components_prism_core__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var prismjs_components_prism_elixir__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prismjs/components/prism-elixir */ \"./node_modules/prismjs/components/prism-elixir.js\");\n/* harmony import */ var prismjs_components_prism_elixir__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prismjs_components_prism_elixir__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var prismjs_plugins_line_numbers_prism_line_numbers_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prismjs/plugins/line-numbers/prism-line-numbers.css */ \"./node_modules/prismjs/plugins/line-numbers/prism-line-numbers.css\");\n/* harmony import */ var prismjs_plugins_line_numbers_prism_line_numbers_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prismjs_plugins_line_numbers_prism_line_numbers_css__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var prismjs_plugins_line_numbers_prism_line_numbers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prismjs/plugins/line-numbers/prism-line-numbers */ \"./node_modules/prismjs/plugins/line-numbers/prism-line-numbers.js\");\n/* harmony import */ var prismjs_plugins_line_numbers_prism_line_numbers__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prismjs_plugins_line_numbers_prism_line_numbers__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var prismjs_themes_prism_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! prismjs/themes/prism.css */ \"./node_modules/prismjs/themes/prism.css\");\n/* harmony import */ var prismjs_themes_prism_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(prismjs_themes_prism_css__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var chartkick__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! chartkick */ \"./node_modules/chartkick/dist/chartkick.js\");\n/* harmony import */ var chartkick__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(chartkick__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var chart_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! chart.js */ \"./node_modules/chart.js/dist/Chart.js\");\n/* harmony import */ var chart_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(chart_js__WEBPACK_IMPORTED_MODULE_8__);\n\n\n\n\n\n\n\n\n\n\nvar resizeTextArea = function resizeTextArea(el) {\n el.style.height = \"5px\";\n el.style.height = el.scrollHeight + \"px\";\n};\n\nvar hooks = {\n NiexChart: {\n mounted: function mounted() {\n var data = JSON.parse(this.el.attributes['data-chart'].value);\n var f = chartkick__WEBPACK_IMPORTED_MODULE_7___default.a[data.type];\n var options = data.options || {};\n new f(this.el, data.data, options);\n },\n updated: function updated() {\n var data = JSON.parse(this.el.attributes['data-chart'].value);\n var f = chartkick__WEBPACK_IMPORTED_MODULE_7___default.a[data.type];\n var options = data.options || {};\n new f(this.el, data.data, options);\n }\n },\n NiexPage: {\n mounted: function mounted() {\n var _this = this;\n\n window.addEventListener(\"click\", function (e) {\n // any click not the child of a cell should blur\n if (!e.target.closest(\".cell\")) {\n _this.pushEvent(\"blur-cell\", {});\n }\n });\n window.addEventListener(\"keypress\", function (e) {\n if (e.code === \"KeyS\" && e.metaKey) {\n _this.pushEvent(\"save\", {});\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n if (e.code === \"KeyO\" && e.metaKey) {\n _this.pushEvent(\"open\", {});\n\n e.preventDefault();\n e.stopPropagation();\n }\n });\n }\n },\n NiexEditor: {\n mounted: function mounted() {\n this.el.addEventListener(\"input\", function (e) {\n return resizeTextArea(e.target);\n });\n resizeTextArea(this.el);\n },\n updated: function updated() {\n resizeTextArea(this.el);\n }\n },\n NiexCodeEditor: {\n mounted: function mounted() {\n this.el.addEventListener(\"input\", function (e) {\n return resizeTextArea(e.target);\n });\n resizeTextArea(this.el);\n this.el.addEventListener(\"keydown\", function (e) {\n if (e.metaKey && e.code === \"Enter\") {\n e.target.closest(\".content\").querySelector(\"button[class='run']\").click();\n }\n });\n },\n updated: function updated() {\n resizeTextArea(this.el);\n }\n },\n NiexOutput: {\n mounted: function mounted() {\n if (this.el.attributes['data-type'].value == \"code \") this.el.innerHTML = prismjs_components_prism_core__WEBPACK_IMPORTED_MODULE_2___default.a.highlight(this.el.innerText, prismjs_components_prism_core__WEBPACK_IMPORTED_MODULE_2___default.a.languages.elixir, 'elixir');\n },\n updated: function updated() {\n if (this.el.attributes['data-type'].value == \"code\") this.el.innerHTML = prismjs_components_prism_core__WEBPACK_IMPORTED_MODULE_2___default.a.highlight(this.el.innerText, prismjs_components_prism_core__WEBPACK_IMPORTED_MODULE_2___default.a.languages.elixir, 'elixir');\n }\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9qcy9uaWV4LmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vanMvbmlleC5qcz9mMWJkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnQGZvcnRhd2Vzb21lL2ZvbnRhd2Vzb21lLWZyZWUvanMvZm9udGF3ZXNvbWUnXG5pbXBvcnQgJ0Bmb3J0YXdlc29tZS9mb250YXdlc29tZS1mcmVlL2pzL3NvbGlkJ1xuXG5pbXBvcnQgUHJpc20gZnJvbSAncHJpc21qcyc7XG5cbmltcG9ydCBDaGFydGtpY2sgZnJvbSBcImNoYXJ0a2lja1wiXG5pbXBvcnQgQ2hhcnRKUyBmcm9tIFwiY2hhcnQuanNcIlxuXG5jb25zdCByZXNpemVUZXh0QXJlYSA9IChlbCkgPT4ge1xuICAgIGVsLnN0eWxlLmhlaWdodCA9IFwiNXB4XCJcbiAgICBlbC5zdHlsZS5oZWlnaHQgPSAoZWwuc2Nyb2xsSGVpZ2h0KSArIFwicHhcIlxufVxuXG5leHBvcnQgY29uc3QgaG9va3MgPSB7XG4gICAgTmlleENoYXJ0OiB7XG4gICAgICAgIG1vdW50ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZSh0aGlzLmVsLmF0dHJpYnV0ZXNbJ2RhdGEtY2hhcnQnXS52YWx1ZSlcbiAgICAgICAgICAgIGxldCBmID0gQ2hhcnRraWNrW2RhdGEudHlwZV1cbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gZGF0YS5vcHRpb25zIHx8IHt9XG4gICAgICAgICAgICBuZXcgZih0aGlzLmVsLCBkYXRhLmRhdGEsIG9wdGlvbnMpXG4gICAgICAgIH0sXG4gICAgICAgIHVwZGF0ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZSh0aGlzLmVsLmF0dHJpYnV0ZXNbJ2RhdGEtY2hhcnQnXS52YWx1ZSlcbiAgICAgICAgICAgIGxldCBmID0gQ2hhcnRraWNrW2RhdGEudHlwZV1cbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gZGF0YS5vcHRpb25zIHx8IHt9XG4gICAgICAgICAgICBuZXcgZih0aGlzLmVsLCBkYXRhLmRhdGEsIG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgTmlleFBhZ2U6IHtcbiAgICAgICAgbW91bnRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGFueSBjbGljayBub3QgdGhlIGNoaWxkIG9mIGEgY2VsbCBzaG91bGQgYmx1clxuXG4gICAgICAgICAgICAgICAgaWYgKCFlLnRhcmdldC5jbG9zZXN0KFwiLmNlbGxcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoRXZlbnQoXCJibHVyLWNlbGxcIiwge30pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlwcmVzc1wiLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlLmNvZGUgPT09IFwiS2V5U1wiICYmIGUubWV0YUtleSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2hFdmVudChcInNhdmVcIiwge30pXG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gXCJLZXlPXCIgJiYgZS5tZXRhS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHVzaEV2ZW50KFwib3BlblwiLCB7fSlcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIE5pZXhFZGl0b3I6IHtcbiAgICAgICAgbW91bnRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZSA9PiByZXNpemVUZXh0QXJlYShlLnRhcmdldCkpO1xuICAgICAgICAgICAgcmVzaXplVGV4dEFyZWEodGhpcy5lbClcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmVzaXplVGV4dEFyZWEodGhpcy5lbClcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIE5pZXhDb2RlRWRpdG9yOiB7XG4gICAgICAgIG1vdW50ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGUgPT4gcmVzaXplVGV4dEFyZWEoZS50YXJnZXQpKTtcbiAgICAgICAgICAgIHJlc2l6ZVRleHRBcmVhKHRoaXMuZWwpXG5cbiAgICAgICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZS5tZXRhS2V5ICYmIGUuY29kZSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LmNsb3Nlc3QoXCIuY29udGVudFwiKS5xdWVyeVNlbGVjdG9yKFwiYnV0dG9uW2NsYXNzPSdydW4nXVwiKS5jbGljaygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmVzaXplVGV4dEFyZWEodGhpcy5lbClcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBOaWV4T3V0cHV0OiB7XG4gICAgICAgIG1vdW50ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuZWwuYXR0cmlidXRlc1snZGF0YS10eXBlJ10udmFsdWUgPT0gXCJjb2RlICAgXCIpXG4gICAgICAgICAgICAgICAgdGhpcy5lbC5pbm5lckhUTUwgPSBQcmlzbS5oaWdobGlnaHQodGhpcy5lbC5pbm5lclRleHQsIFByaXNtLmxhbmd1YWdlcy5lbGl4aXIsICdlbGl4aXInKTtcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYodGhpcy5lbC5hdHRyaWJ1dGVzWydkYXRhLXR5cGUnXS52YWx1ZSA9PSBcImNvZGVcIilcbiAgICAgICAgICAgICAgICB0aGlzLmVsLmlubmVySFRNTCA9IFByaXNtLmhpZ2hsaWdodCh0aGlzLmVsLmlubmVyVGV4dCwgUHJpc20ubGFuZ3VhZ2VzLmVsaXhpciwgJ2VsaXhpcicpO1xuICAgICAgICB9XG5cbiAgICB9XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBOzs7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBWkE7QUFlQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdkJBO0FBMEJBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFXQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFiQTtBQWdCQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQVJBO0FBckVBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./js/niex.js\n"); /***/ }),