(function e(t, n, r) { function s(o, u) { if (!n[o]) { if (!t[o]) { var a = typeof require == "function" && require; if (!u && a) return a(o, !0); if (i) return i(o, !0); var f = new Error("Cannot find module '" + o + "'"); throw f.code = "MODULE_NOT_FOUND", f; } var l = n[o] = { exports: {} }; t[o][0].call(l.exports, function(e) { var n = t[o][1][e]; return s(n ? n : e); }, l, l.exports, e, t, n, r); } return n[o].exports; } var i = typeof require == "function" && require; for (var o = 0; o < r.length; o++) s(r[o]); return s; })({ 1: [ function(require, module, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = require("./utils"); var UPLOAD_URL_ATTRIBUTE = "data-markdownx-upload-urls-path", PROCESSING_URL_ATTRIBUTE = "data-markdownx-urls-path", RESIZABILITY_ATTRIBUTE = "data-markdownx-editor-resizable", LATENCY_ATTRIBUTE = "data-markdownx-latency", LATENCY_MINIMUM = 500, XHR_RESPONSE_ERROR = "Invalid response", UPLOAD_START_OPACITY = "0.3", NORMAL_OPACITY = "1"; var EventHandlers = { inhibitDefault: function(event) { event.preventDefault(); event.stopPropagation(); return event; }, onDragEnter: function(event) { event.dataTransfer.dropEffect = "copy"; return EventHandlers.inhibitDefault(event); } }; var keyboardEvents = { keys: { TAB: "Tab", DUPLICATE: "d", UNINDENT: "[", INDENT: "]" }, handlers: { applyTab: function(properties) { return properties.value.substring(0, properties.start) + (properties.value.substring(properties.start, properties.end).match(/\n/gm) === null ? "\t" + properties.value.substring(properties.start) : properties.value.substring(properties.start, properties.end).replace(/^/gm, "\t") + properties.value.substring(properties.end)); }, removeTab: function(properties) { var substitution = null, lineTotal = (properties.value.substring(properties.start, properties.end).match(/\n/g) || []).length; if (properties.start === properties.end) { properties.start = properties.start > 0 && properties.value[properties.start - 1].match(/\t/) !== null ? properties.start - 1 : properties.start; substitution = properties.value.substring(properties.start).replace("\t", ""); } else if (!lineTotal) { substitution = properties.value.substring(properties.start).replace("\t", ""); } else { substitution = properties.value.substring(properties.start, properties.end).replace(/^\t/gm, "") + properties.value.substring(properties.end); } return properties.value.substring(0, properties.start) + substitution; }, _multiLineIndentation: function(properties) { var endLine = new RegExp("(?:\n|.){0," + properties.end + "}(^.*$)", "m").exec(properties.value)[1]; return properties.value.substring(properties.value.indexOf(new RegExp("(?:\n|.){0," + properties.start + "}(^.*$)", "m").exec(properties.value)[1]), properties.value.indexOf(endLine) ? properties.value.indexOf(endLine) + endLine.length : properties.end); }, applyIndentation: function(properties) { if (properties.start === properties.end) { var line = new RegExp("(?:\n|.){0," + properties.start + "}(^.+$)", "m").exec(properties.value)[1]; return properties.value.replace(line, "\t" + line); } var content = this._multiLineIndentation({ start: properties.start, end: properties.end, value: properties.value }); return properties.value.replace(content, content.replace(/(^.+$)\n*/gim, "\t$&")); }, removeIndentation: function(properties) { if (properties.start === properties.end) { var line = new RegExp("(?:\n|.){0," + properties.start + "}(^\t.+$)", "m").exec(properties.value)[1]; return properties.value.replace(line, line.substring(1)); } var content = this._multiLineIndentation({ start: properties.start, end: properties.end, value: properties.value }); return properties.value.replace(content, content.replace(/^\t(.+)\n*$/gim, "$1")); }, applyDuplication: function(properties) { if (properties.start !== properties.end) return properties.value.substring(0, properties.start) + properties.value.substring(properties.start, properties.end) + (~properties.value.charAt(properties.start - 1).indexOf("\n") || ~properties.value.charAt(properties.start).indexOf("\n") ? "\n" : "") + properties.value.substring(properties.start, properties.end) + properties.value.substring(properties.end); var pattern = new RegExp("(?:.|\n){0,160}(^.*$)", "m"), line = ""; properties.value.replace(pattern, function(match, p1) { return line += p1; }); return properties.value.replace(line, line + "\n" + line); } }, hub: function(event) { switch (event.key) { case this.keys.TAB: return event.shiftKey ? this.handlers.removeTab : this.handlers.applyTab; case this.keys.DUPLICATE: return event.ctrlKey || event.metaKey ? this.handlers.applyDuplication : false; case this.keys.INDENT: return event.ctrlKey || event.metaKey ? this.handlers.applyIndentation : false; case this.keys.UNINDENT: return event.ctrlKey || event.metaKey ? this.handlers.removeIndentation : false; default: return false; } } }; function getHeight(element) { return Math.max(parseInt(window.getComputedStyle(element).height), parseInt(element.style.height) || 0); } function updateHeight(editor) { if (editor.scrollTop) editor.style.height = editor.scrollTop + getHeight(editor) + "px"; return editor; } var MarkdownX = function(parent, editor, preview) { var _this = this; var properties = { editor: editor, preview: preview, parent: parent, _latency: null, _editorIsResizable: null }; var _initialize = function() { _this.timeout = null; var documentListeners = { object: document, listeners: [ { type: "drop", capture: false, listener: EventHandlers.inhibitDefault }, { type: "dragover", capture: false, listener: EventHandlers.inhibitDefault }, { type: "dragenter", capture: false, listener: EventHandlers.inhibitDefault }, { type: "dragleave", capture: false, listener: EventHandlers.inhibitDefault } ] }, editorListeners = { object: properties.editor, listeners: [ { type: "drop", capture: false, listener: onDrop }, { type: "input", capture: true, listener: inputChanged }, { type: "keydown", capture: true, listener: onKeyDown }, { type: "dragover", capture: false, listener: EventHandlers.onDragEnter }, { type: "dragenter", capture: false, listener: EventHandlers.onDragEnter }, { type: "dragleave", capture: false, listener: EventHandlers.inhibitDefault }, { type: "compositionstart", capture: true, listener: onKeyDown } ] }; utils_1.mountEvents(editorListeners, documentListeners); properties.editor.setAttribute("data-markdownx-init", ""); properties.editor.style.transition = "opacity 1s ease"; properties.editor.style.webkitTransition = "opacity 1s ease"; properties._latency = Math.max(parseInt(properties.editor.getAttribute(LATENCY_ATTRIBUTE)) || 0, LATENCY_MINIMUM); properties._editorIsResizable = (properties.editor.getAttribute(RESIZABILITY_ATTRIBUTE).match(/true/i) || []).length > 0 && properties.editor.offsetHeight > 0 && properties.editor.offsetWidth > 0; getMarkdown(); utils_1.triggerCustomEvent("markdownx.init"); }; var _markdownify = function() { clearTimeout(_this.timeout); _this.timeout = setTimeout(getMarkdown, properties._latency); }; var inputChanged = function() { properties.editor = properties._editorIsResizable ? updateHeight(properties.editor) : properties.editor; return _markdownify(); }; var onDrop = function(event) { if (event.dataTransfer && event.dataTransfer.files.length) Object.keys(event.dataTransfer.files).map(function(fileKey) { return sendFile(event.dataTransfer.files[fileKey]); }); EventHandlers.inhibitDefault(event); }; var onKeyDown = function(event) { var handlerFunc = keyboardEvents.hub(event); if (typeof handlerFunc != "function") return false; EventHandlers.inhibitDefault(event); var SELECTION_START = properties.editor.selectionStart; properties.editor.value = handlerFunc({ start: properties.editor.selectionStart, end: properties.editor.selectionEnd, value: properties.editor.value }); _markdownify(); properties.editor.focus(); properties.editor.selectionEnd = properties.editor.selectionStart = SELECTION_START; return false; }; var sendFile = function(file) { properties.editor.style.opacity = UPLOAD_START_OPACITY; var xhr = new utils_1.Request(properties.editor.getAttribute(UPLOAD_URL_ATTRIBUTE), utils_1.preparePostData({ image: file })); xhr.success = function(resp) { var response = JSON.parse(resp); if (response.image_code) { insertImage(response.image_code); utils_1.triggerCustomEvent("markdownx.fileUploadEnd", properties.parent, [ response ]); } else if (response.image_path) { insertImage('![]("' + response.image_path + '")'); utils_1.triggerCustomEvent("markdownx.fileUploadEnd", properties.parent, [ response ]); } else { console.error(XHR_RESPONSE_ERROR, response); utils_1.triggerCustomEvent("markdownx.fileUploadError", properties.parent, [ response ]); insertImage(XHR_RESPONSE_ERROR); } properties.editor.style.opacity = NORMAL_OPACITY; }; xhr.error = function(response) { console.error(response); utils_1.triggerCustomEvent("fileUploadError", properties.parent, [ response ]); insertImage(XHR_RESPONSE_ERROR); properties.editor.style.opacity = NORMAL_OPACITY; }; return xhr.send(); }; var getMarkdown = function() { var xhr = new utils_1.Request(properties.editor.getAttribute(PROCESSING_URL_ATTRIBUTE), utils_1.preparePostData({ content: properties.editor.value })); xhr.success = function(response) { properties.preview.innerHTML = response; properties.editor = updateHeight(properties.editor); utils_1.triggerCustomEvent("markdownx.update", properties.parent, [ response ]); }; xhr.error = function(response) { console.error(response); utils_1.triggerCustomEvent("markdownx.updateError", properties.parent, [ response ]); }; return xhr.send(); }; var insertImage = function(textToInsert) { properties.editor.value = "" + properties.editor.value.substring(0, properties.editor.selectionStart) + textToInsert + ("" + properties.editor.value.substring(properties.editor.selectionEnd)); properties.editor.selectionStart = properties.editor.selectionEnd = properties.editor.selectionStart + textToInsert.length; utils_1.triggerEvent(properties.editor, "keyup"); inputChanged(); }; _initialize(); }; exports.MarkdownX = MarkdownX; (function(funcName, baseObj) { funcName = funcName || "docReady"; baseObj = baseObj || window; var readyList = [], readyFired = false, readyEventHandlersInstalled = false; var ready = function() { if (!readyFired) { readyFired = true; readyList.map(function(ready) { return ready.fn.call(window, ready.ctx); }); readyList = []; } }; var readyStateChange = function() { return document.readyState === "complete" ? ready() : null; }; baseObj[funcName] = function(callback, context) { if (readyFired) { setTimeout(function() { return callback(context); }, 1); return; } else { readyList.push({ fn: callback, ctx: context }); } if (document.readyState === "complete") { setTimeout(ready, 1); } else if (!readyEventHandlersInstalled) { document.addEventListener("DOMContentLoaded", ready, false); window.addEventListener("load", ready, false); readyEventHandlersInstalled = true; } }; })("docReady", window); docReady(function() { var ELEMENTS = document.getElementsByClassName("markdownx"); return Object.keys(ELEMENTS).map(function(key) { var element = ELEMENTS[key], editor = element.querySelector(".markdownx-editor"), preview = element.querySelector(".markdownx-preview"); if (!editor.hasAttribute("data-markdownx-init")) return new MarkdownX(element, editor, preview); }); }); }, { "./utils": 2 } ], 2: [ function(require, module, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function getCookie(name) { if (document.cookie && document.cookie.length) { var cookies = document.cookie.split(";").filter(function(cookie) { return cookie.indexOf(name + "=") !== -1; })[0]; try { return decodeURIComponent(cookies.trim().substring(name.length + 1)); } catch (e) { if (e instanceof TypeError) { console.info('No cookie with key "' + name + '". Wrong name?'); return null; } throw e; } } return null; } exports.getCookie = getCookie; function zip() { var rows = []; for (var _i = 0; _i < arguments.length; _i++) { rows[_i] = arguments[_i]; } if (rows[0].constructor == Array) return rows[0].slice().map(function(_, c) { return rows.map(function(row) { return row[c]; }); }); var asArray = rows.map(function(row) { return Object.keys(row).map(function(key) { return row[key]; }); }); return asArray[0].slice().map(function(_, c) { return asArray.map(function(row) { return row[c]; }); }); } exports.zip = zip; function mountEvents() { var collections = []; for (var _i = 0; _i < arguments.length; _i++) { collections[_i] = arguments[_i]; } return collections.map(function(events) { return events.listeners.map(function(series) { return events.object.addEventListener(series.type, series.listener, series.capture); }); }); } exports.mountEvents = mountEvents; function preparePostData(data, csrf) { if (csrf === void 0) { csrf = true; } var form = new FormData(); if (csrf) { var csrfToken = getCookie("csrftoken"); if (!csrfToken) csrfToken = document.querySelector("input[name='csrfmiddlewaretoken']").value; form.append("csrfmiddlewaretoken", csrfToken); } Object.keys(data).map(function(key) { return form.append(key, data[key]); }); return form; } exports.preparePostData = preparePostData; function AJAXRequest() { if ("XMLHttpRequest" in window) return new XMLHttpRequest(); try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e) {} try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch (e) {} try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} alert("Your browser belongs to history!"); throw new TypeError("This browser does not support AJAX requests."); } var Request = function() { function Request(url, data) { this.xhr = AJAXRequest(); this.url = url; this.data = data; } Request.prototype.progress = function(event) { if (event.lengthComputable) {} }; Request.prototype.error = function(response) { console.error(response); }; Request.prototype.success = function(response) { console.info(response); }; Request.prototype.send = function() { var _this = this; var SUCCESS = this.success, ERROR = this.error, PROGRESS = this.progress; this.xhr.open("POST", this.url, true); this.xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); this.xhr.upload.onprogress = function(event) { return PROGRESS(event); }; this.xhr.onerror = function(event) { ERROR(_this.xhr.responseText); }; this.xhr.onload = function(event) { var data = null; if (_this.xhr.readyState == XMLHttpRequest.DONE) { if (!_this.xhr.responseType || _this.xhr.responseType === "text") { data = _this.xhr.responseText; } else if (_this.xhr.responseType === "document") { data = _this.xhr.responseXML; } else { data = _this.xhr.response; } } SUCCESS(data); }; this.xhr.send(this.data); }; return Request; }(); exports.Request = Request; function triggerEvent(element, type) { var event = document.createEvent("HTMLEvents"); event.initEvent(type, false, true); element.dispatchEvent(event); } exports.triggerEvent = triggerEvent; function triggerCustomEvent(type, element, args) { if (element === void 0) { element = document; } if (args === void 0) { args = null; } var event = new CustomEvent(type, { detail: args }); element.dispatchEvent(event); } exports.triggerCustomEvent = triggerCustomEvent; function addClass(element) { var className = []; for (var _i = 1; _i < arguments.length; _i++) { className[_i - 1] = arguments[_i]; } className.map(function(cname) { if (element.classList) element.classList.add(cname); else { var classes = element.className.split(" "); if (classes.indexOf(cname) < 0) classes.push(cname); element.className = classes.join(" "); } }); } exports.addClass = addClass; function removeClass(element) { var className = []; for (var _i = 1; _i < arguments.length; _i++) { className[_i - 1] = arguments[_i]; } className.map(function(cname) { if (element.classList) element.classList.remove(cname); else { var classes = element.className.split(" "), idx = classes.indexOf(cname); if (idx > -1) classes.splice(idx, 1); element.className = classes.join(" "); } }); } exports.removeClass = removeClass; }, {} ] }, {}, [ 1 ]);