diff --git a/src/pyj/book_list/comments_editor.pyj b/src/pyj/book_list/comments_editor.pyj
index 1fbc5ec0f7..cbcc5b52b3 100644
--- a/src/pyj/book_list/comments_editor.pyj
+++ b/src/pyj/book_list/comments_editor.pyj
@@ -10,6 +10,7 @@ from gettext import gettext as _
from iframe_comm import IframeClient, create_wrapped_iframe
from modals import create_custom_dialog
from utils import html_escape
+from uuid import short_uuid4
from widgets import create_button
CLASS_NAME = 'comments-editor'
@@ -60,7 +61,7 @@ def insert_heading(editor_id, cmd):
editor.focus()
-def insert_image():
+def insert_image(editor):
acceptable_image_types = v'["image/png", "image/jpeg", "image/gif", "image/webp"]'
parent_id = ''
accepted = False
@@ -70,11 +71,9 @@ def insert_image():
if parent:
img = parent.querySelector('img')
if img:
- if accepted:
- pass
- else:
- if img.src:
- window.URL.revokeObjectURL(img.src)
+ if accepted and img.src:
+ markup = f'
'
+ editor.exec_command('insertHTML', markup)
def dialog(parent, close_modal):
nonlocal parent_id
@@ -94,17 +93,21 @@ def insert_image():
def handle_files(files):
parent.querySelector('.no-image-selected').style.display = 'none'
img = parent.getElementsByTagName('img')[0]
- if img.src:
- window.URL.revokeObjectURL(img.src)
img.src = ''
+ img.dataset.filename = ''
img.parentElement.style.display = 'none'
for f in files:
if acceptable_image_types.indexOf(f.type) > -1:
+ r = new FileReader()
+ r.onload = def():
+ img.src = r.result
+ r.readAsDataURL(f)
h = parent.querySelector('.button-box').offsetHeight
img.parentElement.style.display = 'block'
non_content_height = (container.offsetHeight - parent.offsetHeight) + 'px'
img.style.maxHeight = f'calc({max_container_height} - {non_content_height} - {h}px - 1rem)'
- img.src = window.URL.createObjectURL(f)
+ if f.name:
+ img.dataset.filename = f.name
return
alert(_('No valid image file found'))
@@ -178,7 +181,7 @@ def insert_link_or_image(editor_id, is_image, ok, url, title):
editor = registry[editor_id]
if ok:
if title:
- markup = '
' if is_image else '{}'
+ markup = '
' if is_image else '{}'
editor.exec_command('insertHTML', markup.format(html_escape(url), html_escape(title)))
else:
cmd = 'insertImage' if is_image else 'createLink'
@@ -348,7 +351,7 @@ def all_editor_actions(): # {{{
'title': _('Insert an image'),
'execute': def (editor, activated):
if editor.insert_image_files:
- insert_image()
+ insert_image(editor)
else:
insert_link(_('Insert an image'), _('Enter the image URL and optionally the image name'), insert_link_or_image.bind(None, editor.id, True))
},
@@ -388,10 +391,9 @@ class CommentsEditorBoss:
document.execCommand("styleWithCSS", False, False)
document.body.style.margin = '0'
document.body.style.padding = '0'
- document.documentElement.style.height = document.body.style.height = '100%'
- document.documentElement.style.overflow = document.body.style.overflow = 'hidden'
document.body.style.fontFamily = window.default_font_family
- document.body.appendChild(E.div(style='width: 100%; height: 100%; padding: 0; margin: 0; border: solid 3px transparent; box-sizing: border-box'))
+ document.body.appendChild(E.style('div:focus { outline: none }'))
+ document.body.appendChild(E.div(style='width: 100%; padding: 0.5rem; margin: 0; border-width: 0; box-sizing: border-box'))
document.body.lastChild.contentEditable = True
document.body.lastChild.addEventListener('keyup', self.update_state)
document.body.lastChild.addEventListener('mouseup', self.update_state)
@@ -418,11 +420,20 @@ class CommentsEditorBoss:
def get_html(self, data):
c = document.body.lastChild
- img_urls = v'[]'
+ images = v'{}'
+ for img in c.getElementByTagName('img'):
+ if img.src and img.src.startsWith('data:'):
+ key = short_uuid4()
+ images[key] = {'data': img.src, 'filename': img.dataset.filename}
+ img.src = key
+ v'delete img.dataset.filename'
+ self.comm.send_message('html', html=c.innerHTML, extra_data={'images': images})
for img in c.getElementByTagName('img'):
if img.src:
- img_urls.push(img.src)
- self.comm.send_message('html', html=c.innerHTML, extra_data={'img_urls': img_urls})
+ d = images[img.src]
+ if d:
+ img.src = d.data
+ img.dataset.filename = d.filename
def exec_command(self, data):
document.execCommand(data.name, False, data.value)