-
- // Editor key-presses
- $input.keydown(event => {
- // Insert image shortcut
- if (event.which === 73 && event.ctrlKey && event.shiftKey) {
- event.preventDefault();
- let caretPos = $input[0].selectionStart;
- let currentContent = $input.val();
- const mdImageText = "";
- $input.val(currentContent.substring(0, caretPos) + mdImageText + currentContent.substring(caretPos));
- $input.focus();
- $input[0].selectionStart = caretPos + (";
- $input[0].selectionEnd = caretPos + (';
- return;
- }
-
- // Insert entity link shortcut
- if (event.which === 75 && event.ctrlKey && event.shiftKey) {
- showLinkSelector();
- return;
- }
-
- // Pass key presses to controller via event
- scope.$emit('editor-keydown', event);
- });
-
- // Insert image from image manager
- $insertImage.click(event => {
- window.ImageManager.showExternal(image => {
- let caretPos = currentCaretPos;
- let currentContent = $input.val();
- let mdImageText = "";
- $input.val(currentContent.substring(0, caretPos) + mdImageText + currentContent.substring(caretPos));
- $input.change();
- });
- });
-
- function showLinkSelector() {
- window.showEntityLinkSelector((entity) => {
- let selectionStart = currentCaretPos;
- let selectionEnd = $input[0].selectionEnd;
- let textSelected = (selectionEnd !== selectionStart);
- let currentContent = $input.val();
-
- if (textSelected) {
- let selectedText = currentContent.substring(selectionStart, selectionEnd);
- let linkText = `[${selectedText}](${entity.link})`;
- $input.val(currentContent.substring(0, selectionStart) + linkText + currentContent.substring(selectionEnd));
- } else {
- let linkText = ` [${entity.name}](${entity.link}) `;
- $input.val(currentContent.substring(0, selectionStart) + linkText + currentContent.substring(selectionStart))
- }
- $input.change();
- });
- }
- $insertEntityLink.click(showLinkSelector);
-
- // Upload and insert image on paste
- function editorPaste(e) {
- e = e.originalEvent;
- if (!e.clipboardData) return
- let items = e.clipboardData.items;
- if (!items) return;
- for (let i = 0; i < items.length; i++) {
- uploadImage(items[i].getAsFile());
- }
- }
-
- $input.on('paste', editorPaste);
-
- // Handle image drop, Uploads images to BookStack.
- function handleImageDrop(event) {
- event.stopPropagation();
- event.preventDefault();
- let files = event.originalEvent.dataTransfer.files;
- for (let i = 0; i < files.length; i++) {
- uploadImage(files[i]);
- }
- }
-
- $input.on('drop', handleImageDrop);
-
- // Handle image upload and add image into markdown content
- function uploadImage(file) {
- if (file.type.indexOf('image') !== 0) return;
- let formData = new FormData();
- let ext = 'png';
- let xhr = new XMLHttpRequest();
-
- if (file.name) {
- let fileNameMatches = file.name.match(/\.(.+)$/);
- if (fileNameMatches) {
- ext = fileNameMatches[1];
- }
- }
-
- // Insert image into markdown
- let id = "image-" + Math.random().toString(16).slice(2);
- let selectStart = $input[0].selectionStart;
- let selectEnd = $input[0].selectionEnd;
- let content = $input[0].value;
- let selectText = content.substring(selectStart, selectEnd);
- let placeholderImage = window.baseUrl(`/loading.gif#upload${id}`);
- let innerContent = ((selectEnd > selectStart) ? `![${selectText}]` : '![]') + `(${placeholderImage})`;
- $input[0].value = content.substring(0, selectStart) + innerContent + content.substring(selectEnd);
-
- $input.focus();
- $input[0].selectionStart = selectStart;
- $input[0].selectionEnd = selectStart;
-
- let remoteFilename = "image-" + Date.now() + "." + ext;
- formData.append('file', file, remoteFilename);
- formData.append('_token', document.querySelector('meta[name="token"]').getAttribute('content'));
-
- xhr.open('POST', window.baseUrl('/images/gallery/upload'));
- xhr.onload = function () {
- let selectStart = $input[0].selectionStart;
- if (xhr.status === 200 || xhr.status === 201) {
- let result = JSON.parse(xhr.responseText);
- $input[0].value = $input[0].value.replace(placeholderImage, result.thumbs.display);
- $input.change();
- } else {
- console.log(trans('errors.image_upload_error'));
- console.log(xhr.responseText);
- $input[0].value = $input[0].value.replace(innerContent, '');
- $input.change();
- }
- $input.focus();
- $input[0].selectionStart = selectStart;
- $input[0].selectionEnd = selectStart;
- };
- xhr.send(formData);
- }
-