Cleanup editor API

This commit is contained in:
Kovid Goyal 2023-10-21 13:53:55 +05:30
parent a583773bfe
commit ed980a4c3e
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 24 additions and 15 deletions

View File

@ -449,6 +449,6 @@ def set_note(ctx, rd, field, item_id, library_id):
db_html = re.sub('|'.join(map(re.escape, db_replacements)), lambda m: db_replacements[m.group()], html) db_html = re.sub('|'.join(map(re.escape, db_replacements)), lambda m: db_replacements[m.group()], html)
if srv_replacements: if srv_replacements:
srv_html = re.sub('|'.join(map(re.escape, srv_replacements)), lambda m: srv_replacements[m.group()], html) srv_html = re.sub('|'.join(map(re.escape, srv_replacements)), lambda m: srv_replacements[m.group()], html)
db.set_notes_for(field, item_id, db_html, searchable_text, resources, True) db.set_notes_for(field, item_id, db_html, searchable_text, resources)
rd.outheaders['Content-Type'] = 'text/html; charset=UTF-8' rd.outheaders['Content-Type'] = 'text/html; charset=UTF-8'
return srv_html return srv_html

View File

@ -443,17 +443,24 @@ class CommentsEditorBoss:
registry = {} registry = {}
def add_editor(editor): def destroy_removed_editors():
for k in Object.keys(registry): for k in Object.keys(registry):
if not document.getElementById(k): if not document.getElementById(k):
registry[k].destroy() registry[k].destroy()
v'delete registry[k]' v'delete registry[k]'
def add_editor(editor):
destroy_removed_editors()
registry[editor.id] = editor registry[editor.id] = editor
def destroy_editor(container):
v'delete registry[container.querySelector("iframe").id]'
class Editor: class Editor:
def __init__(self, iframe_kw): def __init__(self, iframe_kw, insert_image_files):
handlers = { handlers = {
'ready': self.on_iframe_ready, 'ready': self.on_iframe_ready,
'html': self.on_html_received, 'html': self.on_html_received,
@ -467,6 +474,7 @@ class Editor:
self.pending_get_html = v'[]' self.pending_get_html = v'[]'
self.get_html_callbacks = v'[]' self.get_html_callbacks = v'[]'
self.iframe_obj = iframe self.iframe_obj = iframe
self.insert_image_files = v'!!insert_image_files'
def init(self): def init(self):
self.iframe_wrapper.init() self.iframe_wrapper.init()
@ -494,7 +502,7 @@ class Editor:
self.pending_set_html = None self.pending_set_html = None
if self.pending_get_html.length > 0: if self.pending_get_html.length > 0:
for x in self.pending_get_html: for x in self.pending_get_html:
self.get_html(x.proceed, x.extract_images) self.get_html(x)
def set_html(self, html): def set_html(self, html):
if not self.ready: if not self.ready:
@ -503,12 +511,12 @@ class Editor:
rgba = get_color_as_rgba('window-foreground') rgba = get_color_as_rgba('window-foreground')
self.iframe_wrapper.send_message('set_html', html=html, color_scheme=color_scheme(), color=f'rgba({rgba[0]},{rgba[1]},{rgba[2]},{rgba[3]})') self.iframe_wrapper.send_message('set_html', html=html, color_scheme=color_scheme(), color=f'rgba({rgba[0]},{rgba[1]},{rgba[2]},{rgba[3]})')
def get_html(self, proceed, extract_images): def get_html(self, proceed):
self.get_html_callbacks.push(proceed) self.get_html_callbacks.push(proceed)
if self.ready: if self.ready:
self.iframe_wrapper.send_message('get_html', extract_images=v'!!extract_images') self.iframe_wrapper.send_message('get_html', extract_images=self.insert_image_files)
else: else:
self.pending_get_html.push({'proceed': proceed, 'extract_images': v'!!extract_images'}) self.pending_get_html.push(proceed)
def on_html_received(self, data): def on_html_received(self, data):
if self.get_html_callbacks.length: if self.get_html_callbacks.length:
@ -531,11 +539,11 @@ class Editor:
div.classList.remove('activated') div.classList.remove('activated')
def create_editor(): def create_editor(insert_image_files):
iframe_kw = { iframe_kw = {
'sandbox': 'allow-scripts', 'seamless': True, 'style': 'flex-grow: 10; border: solid 1px currentColor' 'sandbox': 'allow-scripts', 'seamless': True, 'style': 'flex-grow: 10; border: solid 1px currentColor'
} }
editor = Editor(iframe_kw) editor = Editor(iframe_kw, insert_image_files)
iframe = editor.iframe_obj iframe = editor.iframe_obj
v'delete editor.iframe_obj' v'delete editor.iframe_obj'
add_editor(editor) add_editor(editor)
@ -560,8 +568,7 @@ def add_action(toolbar, ac_name, action, editor_id):
def create_comments_editor(container, options): def create_comments_editor(container, options):
iframe, editor = create_editor() iframe, editor = create_editor(options.insert_image_files)
editor.insert_image_files = v'!!options.insert_image_files'
toolbars = E.div(style='flex-grow: 0') toolbars = E.div(style='flex-grow: 0')
toolbar1 = E.div(class_=TOOLBAR_CLASS) toolbar1 = E.div(class_=TOOLBAR_CLASS)
toolbar2 = E.div(class_=TOOLBAR_CLASS) toolbar2 = E.div(class_=TOOLBAR_CLASS)
@ -606,11 +613,11 @@ def set_comments_html(container, html):
editor.set_html(html or '') editor.set_html(html or '')
def get_comments_html(container, proceed, extract_images): def get_comments_html(container, proceed):
iframe = container.querySelector('iframe') iframe = container.querySelector('iframe')
eid = iframe.getAttribute('id') eid = iframe.getAttribute('id')
editor = registry[eid] editor = registry[eid]
editor.get_html(proceed, extract_images) editor.get_html(proceed)
def develop(container): def develop(container):

View File

@ -6,7 +6,8 @@ from elementmaker import E
from ajax import ajax from ajax import ajax
from book_list.comments_editor import ( from book_list.comments_editor import (
create_comments_editor, focus_comments_editor, get_comments_html, set_comments_html create_comments_editor, destroy_editor, focus_comments_editor, get_comments_html,
set_comments_html
) )
from book_list.details_list import sandbox_css from book_list.details_list import sandbox_css
from book_list.router import back, home, show_note from book_list.router import back, home, show_note
@ -162,12 +163,13 @@ def save(container_id):
return return
q.html = xhr.responseText q.html = xhr.responseText
current_note_markup = q current_note_markup = q
destroy_editor(c)
close_action() close_action()
def on_got_html(html, extra_data): def on_got_html(html, extra_data):
ajax_send_progress_dialog(url, {'html': html, 'searchable_text': extra_data.text, 'images': extra_data.images}, on_complete, _('Sending note data to calibre server...')) ajax_send_progress_dialog(url, {'html': html, 'searchable_text': extra_data.text, 'images': extra_data.images}, on_complete, _('Sending note data to calibre server...'))
get_comments_html(c, on_got_html, True) get_comments_html(c, on_got_html)
def init_edit(container_id): def init_edit(container_id):