Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .drone.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ steps:
image: debian:bookworm
pull: always
commands:
- apt-get update && apt-get install -y zip
- apt-get update && apt-get install -y zip slugify
- ./build.sh

- name: Upload Artifact to Gitea
Expand All @@ -25,7 +25,8 @@ steps:
from_secret: gitea_api_token
checksum: sha256
base_url: https://git.tobiasmanske.de
files: editor-preview.ankiaddon
files:
- "*.ankiaddon"

image_pull_secrets:
- registry
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -169,3 +169,4 @@ tags

# Stores actual addon config if the src directory is symlinked into an anki installation during development
src/meta.json
src/manifest.json
20 changes: 18 additions & 2 deletions build.sh
Original file line number Diff line number Diff line change
@@ -1,11 +1,27 @@
#!/bin/bash
set -e
set -o nounset

SLUG=$(slugify "${DRONE_COMMIT_REF}")

if [ -d src/__pycache__ ]; then
rm -r src/__pycache__
fi

cd src
zip -r ../editor-preview.ankiaddon --exclude meta.json -- *

# Create Manifest
cat - > manifest.json <<EOF
{
"name": "Editor Live Preview - ${SLUG}",
"package": "editor-live-preview-${SLUG}"
}
EOF

zip -r ../editor-preview-external.ankiaddon --exclude meta.json -- *
zip -r ../editor-preview-ankiweb.ankiaddon --exclude meta.json --exclude manifest.json -- *
cd ..
unzip -l editor-preview.ankiaddon
echo "Ankiweb Contents"
unzip -l editor-preview-ankiweb.ankiaddon
echo "External Contents"
unzip -l editor-preview-external.ankiaddon
40 changes: 35 additions & 5 deletions src/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class EditorPreview(object):
def __init__(self):
gui_hooks.editor_did_init.append(self.editor_init_hook)
gui_hooks.editor_did_init_buttons.append(self.editor_init_button_hook)
self.scrollLock = config["enableScrollLockByDefault"]
if int(buildinfo.version.split(".")[2]) < 45: # < 2.1.45
self.js = [
"js/vendor/jquery.min.js",
Expand Down Expand Up @@ -86,39 +87,68 @@ def _inject_splitter(self, editor: editor.Editor):
split = self._get_splitter(editor)
layout.insertWidget(web_index, split)

def isScrollLocked(self):
return self.scrollLock

def toggleScrollLock(self):
self.scrollLock = not self.scrollLock

def editor_note_hook(self, editor):
self.onedit_hook(editor, editor.note)
# Dont lock the editor in place when loading a new note
# i.e. when using the cards browser
self.onedit_hook(editor, editor.note, keep_scrollbar_value=False)

def editor_init_button_hook(self, buttons, editor):
addon_path = os.path.dirname(__file__)
icons_dir = os.path.join(addon_path, "icons")
b = editor.addButton(
previewButton = editor.addButton(
icon=os.path.join(icons_dir, "file.svg"),
cmd="_editor_toggle_preview",
tip="Toggle Live Preview",
func=lambda o=editor: self.onEditorPreviewButton(o),
disables=False,
)
buttons.append(b)
scrollLockButton = editor.addButton(
# icon=os.path.join(icons_dir, "file.svg"),
icon=None,
label="🔒",
cmd="_editor_toggle_scroll_lock",
tip="Toggle Scroll Locking",
func=lambda o=editor: self.onEditorScrollLockButton(o),
disables=True,
)
buttons.append(previewButton)
buttons.append(scrollLockButton)

def onEditorPreviewButton(self, origin: editor.Editor):
if origin.editor_preview.isHidden():
origin.editor_preview.show()
else:
origin.editor_preview.hide()

def onEditorScrollLockButton(self, origin: editor.Editor):
self.toggleScrollLock()

def _obtainCardText(self, note):
c = note.ephemeral_card()
a = mw.prepare_card_text_for_display(c.answer())
a = gui_hooks.card_will_show(a, c, "clayoutAnswer")
bodyclass = theme_manager.body_classes_for_card_ord(c.ord, theme_manager.night_mode)
bodyclass = theme_manager.body_classes_for_card_ord(
c.ord, theme_manager.night_mode
)
bodyclass += " editor-preview"

return f"_showAnswer({json.dumps(a)},'{bodyclass}');"

def onedit_hook(self, editor, origin):
def onedit_hook(self, editor, origin, keep_scrollbar_value=True):
if editor.note == origin:
page: QWebEnginePage = editor.editor_preview.page()
scrollbar_value = page.scrollPosition()
editor.editor_preview.eval(self._obtainCardText(editor.note))
if keep_scrollbar_value and self.isScrollLocked():
page.runJavaScript(
f"window.scrollTo({scrollbar_value.x()}, {scrollbar_value.y()});"
)


eprev = EditorPreview()
3 changes: 2 additions & 1 deletion src/config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"showPreviewAutomatically": true,
"splitRatio": "1:1",
"location": "below"
"location": "below",
"enableScrollLockByDefault": true
}
3 changes: 3 additions & 0 deletions src/config.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,6 @@
\- `location` [string (above | below | left | right)]:<br/>
&nbsp;&nbsp;&nbsp;Defines where to render the preview (default: below)
<br/>
\- `showPreviewAutomatically` [boolean (true | false)]:<br/>
&nbsp;&nbsp;&nbsp;Whether to keep the scrollbar at the same location when text changed or not (default: true)<br/>
<br/>