stop (un)escaping media filenames
Back in the WebKit days, images with Unicode filenames would fail to appear if they weren't percent-escaped. This no longer seems to be the case - with this patch, images appear correctly on the Mac and Windows platforms I tested with. Fixes https://forums.ankiweb.net/t/anki-2-1-45-beta/10664/96 Fixes #1219
This commit is contained in:
parent
c01c4b642b
commit
14110add55
@ -8,13 +8,11 @@ import pprint
|
||||
import re
|
||||
import sys
|
||||
import time
|
||||
import urllib.error
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
from typing import Any, Callable, List, Match, Optional, Tuple
|
||||
from typing import Any, Callable, List, Optional, Tuple
|
||||
|
||||
import anki
|
||||
import anki._backend.backend_pb2 as _pb
|
||||
from anki._legacy import deprecated
|
||||
from anki.consts import *
|
||||
from anki.latex import render_latex, render_latex_returning_errors
|
||||
from anki.models import NotetypeId
|
||||
@ -186,27 +184,12 @@ class MediaManager:
|
||||
txt = re.sub(reg, "", txt)
|
||||
return txt
|
||||
|
||||
@deprecated(info="no longer required")
|
||||
def escapeImages(self, string: str, unescape: bool = False) -> str:
|
||||
"escape_media_filenames alias for compatibility with add-ons."
|
||||
return self.escape_media_filenames(string, unescape)
|
||||
return string
|
||||
|
||||
@deprecated(info="no longer required")
|
||||
def escape_media_filenames(self, string: str, unescape: bool = False) -> str:
|
||||
"Apply or remove percent encoding to filenames in html tags (audio, image, object)."
|
||||
fn: Callable
|
||||
if unescape:
|
||||
fn = urllib.parse.unquote
|
||||
else:
|
||||
fn = urllib.parse.quote
|
||||
|
||||
def repl(match: Match) -> str:
|
||||
tag = match.group(0)
|
||||
fname = match.group("fname")
|
||||
if re.match("(https?|ftp)://", fname):
|
||||
return tag
|
||||
return tag.replace(fname, fn(fname))
|
||||
|
||||
for reg in self.html_media_regexps:
|
||||
string = re.sub(reg, repl, string)
|
||||
return string
|
||||
|
||||
# Checking media
|
||||
|
@ -49,10 +49,6 @@ def test_strings():
|
||||
assert sp("aoeu") == "aoeu"
|
||||
assert sp("aoeu[sound:foo.mp3]aoeu") == "aoeuaoeu"
|
||||
assert sp("a<img src=yo>oeu") == "aoeu"
|
||||
es = col.media.escape_media_filenames
|
||||
assert es("aoeu") == "aoeu"
|
||||
assert es("<img src='http://foo.com'>") == "<img src='http://foo.com'>"
|
||||
assert es('<img src="foo bar.jpg">') == '<img src="foo%20bar.jpg">'
|
||||
|
||||
|
||||
def test_deckIntegration():
|
||||
|
@ -435,10 +435,7 @@ $editorToolbar.then(({{ toolbar }}) => toolbar.appendGroup({{
|
||||
if not self.note:
|
||||
return
|
||||
|
||||
data = [
|
||||
(fld, self.mw.col.media.escape_media_filenames(val))
|
||||
for fld, val in self.note.items()
|
||||
]
|
||||
data = self.note.items()
|
||||
self.widget.show()
|
||||
self.updateTags()
|
||||
|
||||
@ -588,13 +585,9 @@ $editorToolbar.then(({{ toolbar }}) => toolbar.appendGroup({{
|
||||
if html.find(">") > -1:
|
||||
# filter html through beautifulsoup so we can strip out things like a
|
||||
# leading </div>
|
||||
html_escaped = self.mw.col.media.escape_media_filenames(html)
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter("ignore", UserWarning)
|
||||
html_escaped = str(BeautifulSoup(html_escaped, "html.parser"))
|
||||
html = self.mw.col.media.escape_media_filenames(
|
||||
html_escaped, unescape=True
|
||||
)
|
||||
html = str(BeautifulSoup(html, "html.parser"))
|
||||
self.note.fields[field] = html
|
||||
if not self.addMode:
|
||||
self._save_current_note()
|
||||
@ -1268,15 +1261,9 @@ def remove_null_bytes(txt: str, editor: Editor) -> str:
|
||||
return txt.replace("\x00", "")
|
||||
|
||||
|
||||
def reverse_url_quoting(txt: str, editor: Editor) -> str:
|
||||
# reverse the url quoting we added to get images to display
|
||||
return editor.mw.col.media.escape_media_filenames(txt, unescape=True)
|
||||
|
||||
|
||||
gui_hooks.editor_will_use_font_for_field.append(fontMungeHack)
|
||||
gui_hooks.editor_will_munge_html.append(munge_html)
|
||||
gui_hooks.editor_will_munge_html.append(remove_null_bytes)
|
||||
gui_hooks.editor_will_munge_html.append(reverse_url_quoting)
|
||||
|
||||
|
||||
def set_cloze_button(editor: Editor) -> None:
|
||||
|
@ -482,7 +482,6 @@ class AnkiQt(QMainWindow):
|
||||
return aqt.sound.av_refs_to_play_icons(text)
|
||||
|
||||
def prepare_card_text_for_display(self, text: str) -> str:
|
||||
text = self.col.media.escape_media_filenames(text)
|
||||
text = self._add_play_buttons(text)
|
||||
return text
|
||||
|
||||
|
@ -35,6 +35,7 @@ from PyQt5.QtWidgets import (
|
||||
|
||||
import aqt
|
||||
from anki import Collection
|
||||
from anki._legacy import deprecated
|
||||
from anki.lang import TR, tr_legacyglobal # pylint: disable=unused-import
|
||||
from anki.utils import invalidFilename, isMac, isWin, noBundledLibs, versionWithBuild
|
||||
from aqt.qt import *
|
||||
@ -679,9 +680,8 @@ def restore_combo_history(comboBox: QComboBox, name: str) -> List[str]:
|
||||
return history
|
||||
|
||||
|
||||
@deprecated(info="use mw.prepare_card_text_for_display()")
|
||||
def mungeQA(col: Collection, txt: str) -> str:
|
||||
print("mungeQA() deprecated; use mw.prepare_card_text_for_display()")
|
||||
txt = col.media.escape_media_filenames(txt)
|
||||
return txt
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user