mirror of
https://github.com/ankitects/anki.git
synced 2025-09-21 07:22:23 -04:00
Merge branch 'master' of https://github.com/dae/anki
This commit is contained in:
commit
b4057152f7
16 changed files with 24 additions and 20 deletions
|
@ -214,9 +214,7 @@ class AnkiExporter(Exporter):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def removeSystemTags(self, tags):
|
def removeSystemTags(self, tags):
|
||||||
tags = ' '.join(tag for tag in tags.split()
|
return self.src.tags.remFromStr("marked leech", tags)
|
||||||
if (tag.lower() != "marked" and tag.lower() != "leech"))
|
|
||||||
return tags
|
|
||||||
|
|
||||||
# Packaged Anki decks
|
# Packaged Anki decks
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
|
@ -340,7 +340,7 @@ class MediaManager(object):
|
||||||
# Illegal characters
|
# Illegal characters
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
_illegalCharReg = re.compile(r'[][><:"/?*^\\|\0]')
|
_illegalCharReg = re.compile(r'[][><:"/?*^\\|\0\r\n]')
|
||||||
|
|
||||||
def stripIllegal(self, str):
|
def stripIllegal(self, str):
|
||||||
return re.sub(self._illegalCharReg, "", str)
|
return re.sub(self._illegalCharReg, "", str)
|
||||||
|
|
|
@ -705,7 +705,7 @@ select
|
||||||
sum(case when queue=2 and ivl >= 21 then 1 else 0 end), -- mtr
|
sum(case when queue=2 and ivl >= 21 then 1 else 0 end), -- mtr
|
||||||
sum(case when queue in (1,3) or (queue=2 and ivl < 21) then 1 else 0 end), -- yng/lrn
|
sum(case when queue in (1,3) or (queue=2 and ivl < 21) then 1 else 0 end), -- yng/lrn
|
||||||
sum(case when queue=0 then 1 else 0 end), -- new
|
sum(case when queue=0 then 1 else 0 end), -- new
|
||||||
sum(case when queue=-1 then 1 else 0 end) -- susp
|
sum(case when queue<0 then 1 else 0 end) -- susp
|
||||||
from cards where did in %s""" % self._limit())
|
from cards where did in %s""" % self._limit())
|
||||||
|
|
||||||
# Footer
|
# Footer
|
||||||
|
|
|
@ -191,6 +191,7 @@ class Template(object):
|
||||||
txt = self.clozeText(txt, extra, mod[1]) if txt and extra else ""
|
txt = self.clozeText(txt, extra, mod[1]) if txt and extra else ""
|
||||||
else:
|
else:
|
||||||
# hook-based field modifier
|
# hook-based field modifier
|
||||||
|
mod, extra = re.search("^(.*?)(?:\((.*)\))?$", mod).groups()
|
||||||
txt = runFilter('fmod_' + mod, txt or '', extra, context,
|
txt = runFilter('fmod_' + mod, txt or '', extra, context,
|
||||||
tag, tag_name);
|
tag, tag_name);
|
||||||
if txt is None:
|
if txt is None:
|
||||||
|
|
|
@ -31,7 +31,7 @@ system. It's free and open source.")
|
||||||
Alex Fraser, Andreas Klauer, Andrew Wright, Bernhard Ibertsberger, Charlene Barina,
|
Alex Fraser, Andreas Klauer, Andrew Wright, Bernhard Ibertsberger, Charlene Barina,
|
||||||
Christian Krause, Christian Rusche, David Smith, Dave Druelinger, Dotan Cohen,
|
Christian Krause, Christian Rusche, David Smith, Dave Druelinger, Dotan Cohen,
|
||||||
Emilio Wuerges, Emmanuel Jarri, Frank Harper, Gregor Skumavc, H. Mijail,
|
Emilio Wuerges, Emmanuel Jarri, Frank Harper, Gregor Skumavc, H. Mijail,
|
||||||
Ian Lewis, Immanuel Asmus, Iroiro, Jarvik7,
|
Houssam Salem, Ian Lewis, Immanuel Asmus, Iroiro, Jarvik7,
|
||||||
Jin Eun-Deok, Jo Nakashima, Johanna Lindh, Kieran Clancy, LaC, Laurent Steffan,
|
Jin Eun-Deok, Jo Nakashima, Johanna Lindh, Kieran Clancy, LaC, Laurent Steffan,
|
||||||
Luca Ban, Luciano Esposito, Marco Giancotti, Marcus Rubeus, Mari Egami, Michael Jürges, Mark Wilbur,
|
Luca Ban, Luciano Esposito, Marco Giancotti, Marcus Rubeus, Mari Egami, Michael Jürges, Mark Wilbur,
|
||||||
Matthew Duggan, Matthew Holtz, Meelis Vasser, Michael Keppler, Michael
|
Matthew Duggan, Matthew Holtz, Meelis Vasser, Michael Keppler, Michael
|
||||||
|
|
|
@ -190,6 +190,7 @@ question on all cards."""), help="AddItems")
|
||||||
saveGeom(self, "add")
|
saveGeom(self, "add")
|
||||||
aqt.dialogs.close("AddCards")
|
aqt.dialogs.close("AddCards")
|
||||||
QDialog.reject(self)
|
QDialog.reject(self)
|
||||||
|
self.deleteLater()
|
||||||
|
|
||||||
def canClose(self):
|
def canClose(self):
|
||||||
if (self.forceClose or self.editor.fieldsAreBlank() or
|
if (self.forceClose or self.editor.fieldsAreBlank() or
|
||||||
|
|
|
@ -373,6 +373,11 @@ class Browser(QMainWindow):
|
||||||
self.onSearch()
|
self.onSearch()
|
||||||
self.show()
|
self.show()
|
||||||
|
|
||||||
|
def _headerKey(self):
|
||||||
|
if qtmajor >= 5:
|
||||||
|
return "editor2"
|
||||||
|
return "editor"
|
||||||
|
|
||||||
def setupToolbar(self):
|
def setupToolbar(self):
|
||||||
self.toolbarWeb = AnkiWebView()
|
self.toolbarWeb = AnkiWebView()
|
||||||
self.toolbarWeb.setFixedHeight(32 + self.mw.fontHeightDelta)
|
self.toolbarWeb.setFixedHeight(32 + self.mw.fontHeightDelta)
|
||||||
|
@ -458,7 +463,7 @@ class Browser(QMainWindow):
|
||||||
self.editor.setNote(None)
|
self.editor.setNote(None)
|
||||||
saveGeom(self, "editor")
|
saveGeom(self, "editor")
|
||||||
saveState(self, "editor")
|
saveState(self, "editor")
|
||||||
saveHeader(self.form.tableView.horizontalHeader(), "editor")
|
saveHeader(self.form.tableView.horizontalHeader(), self._headerKey())
|
||||||
self.col.conf['activeCols'] = self.model.activeCols
|
self.col.conf['activeCols'] = self.model.activeCols
|
||||||
self.col.setMod()
|
self.col.setMod()
|
||||||
self.hide()
|
self.hide()
|
||||||
|
@ -466,6 +471,7 @@ class Browser(QMainWindow):
|
||||||
self.teardownHooks()
|
self.teardownHooks()
|
||||||
self.mw.maybeReset()
|
self.mw.maybeReset()
|
||||||
evt.accept()
|
evt.accept()
|
||||||
|
self.deleteLater()
|
||||||
|
|
||||||
def canClose(self):
|
def canClose(self):
|
||||||
return True
|
return True
|
||||||
|
@ -623,7 +629,7 @@ class Browser(QMainWindow):
|
||||||
if not isWin:
|
if not isWin:
|
||||||
vh.hide()
|
vh.hide()
|
||||||
hh.show()
|
hh.show()
|
||||||
restoreHeader(hh, "editor")
|
restoreHeader(hh, self._headerKey())
|
||||||
hh.setHighlightSections(False)
|
hh.setHighlightSections(False)
|
||||||
hh.setMinimumSectionSize(50)
|
hh.setMinimumSectionSize(50)
|
||||||
hh.setMovable(True)
|
hh.setMovable(True)
|
||||||
|
|
|
@ -345,7 +345,7 @@ where id > ?""", (self.mw.col.sched.dayCutoff-86400)*1000)
|
||||||
if isMac:
|
if isMac:
|
||||||
size = 28
|
size = 28
|
||||||
else:
|
else:
|
||||||
size = 36 + self.mw.fontHeightDelta*3
|
size = 38 + self.mw.fontHeightDelta*3
|
||||||
self.bottom.web.setFixedHeight(size)
|
self.bottom.web.setFixedHeight(size)
|
||||||
self.bottom.web.setLinkHandler(self._linkHandler)
|
self.bottom.web.setLinkHandler(self._linkHandler)
|
||||||
|
|
||||||
|
|
|
@ -64,6 +64,7 @@ class EditCurrent(QDialog):
|
||||||
self.mw.moveToState("review")
|
self.mw.moveToState("review")
|
||||||
saveGeom(self, "editcurrent")
|
saveGeom(self, "editcurrent")
|
||||||
aqt.dialogs.close("EditCurrent")
|
aqt.dialogs.close("EditCurrent")
|
||||||
|
self.deleteLater()
|
||||||
|
|
||||||
def canClose(self):
|
def canClose(self):
|
||||||
return True
|
return True
|
||||||
|
|
|
@ -690,7 +690,7 @@ class Editor(object):
|
||||||
|
|
||||||
def onCloze(self):
|
def onCloze(self):
|
||||||
# check that the model is set up for cloze deletion
|
# check that the model is set up for cloze deletion
|
||||||
if '{{cloze:' not in self.note.model()['tmpls'][0]['qfmt']:
|
if not re.search('{{(.*:)*cloze:',self.note.model()['tmpls'][0]['qfmt']):
|
||||||
if self.addMode:
|
if self.addMode:
|
||||||
tooltip(_("Warning, cloze deletions will not work until "
|
tooltip(_("Warning, cloze deletions will not work until "
|
||||||
"you switch the type at the top to Cloze."))
|
"you switch the type at the top to Cloze."))
|
||||||
|
|
|
@ -1084,7 +1084,7 @@ will be lost. Continue?"""))
|
||||||
def setupFonts(self):
|
def setupFonts(self):
|
||||||
f = QFontInfo(self.font())
|
f = QFontInfo(self.font())
|
||||||
ws = QWebSettings.globalSettings()
|
ws = QWebSettings.globalSettings()
|
||||||
self.fontHeight = f.pixelSize()
|
self.fontHeight = max(14, f.pixelSize())
|
||||||
self.fontFamily = f.family()
|
self.fontFamily = f.family()
|
||||||
self.fontHeightDelta = max(0, self.fontHeight - 13)
|
self.fontHeightDelta = max(0, self.fontHeight - 13)
|
||||||
ws.setFontFamily(QWebSettings.StandardFont, self.fontFamily)
|
ws.setFontFamily(QWebSettings.StandardFont, self.fontFamily)
|
||||||
|
|
|
@ -179,7 +179,7 @@ documentation for information on using a flash drive.""")
|
||||||
|
|
||||||
def _defaultBase(self):
|
def _defaultBase(self):
|
||||||
if isWin:
|
if isWin:
|
||||||
if qtmajor >= 5:
|
if False: #qtmajor >= 5:
|
||||||
loc = QStandardPaths.writeableLocation(QStandardPaths.DocumentsLocation)
|
loc = QStandardPaths.writeableLocation(QStandardPaths.DocumentsLocation)
|
||||||
else:
|
else:
|
||||||
loc = QDesktopServices.storageLocation(QDesktopServices.DocumentsLocation)
|
loc = QDesktopServices.storageLocation(QDesktopServices.DocumentsLocation)
|
||||||
|
|
|
@ -49,8 +49,3 @@ if qtmajor <= 4 and qtminor <= 6:
|
||||||
import anki.template.furigana
|
import anki.template.furigana
|
||||||
anki.template.furigana.ruby = r'<span style="display: inline-block; text-align: center; line-height: 1; white-space: nowrap; vertical-align: baseline; margin: 0; padding: 0"><span style="display: block; text-decoration: none; line-height: 1.2; font-weight: normal; font-size: 0.64em">\2</span>\1</span>'
|
anki.template.furigana.ruby = r'<span style="display: inline-block; text-align: center; line-height: 1; white-space: nowrap; vertical-align: baseline; margin: 0; padding: 0"><span style="display: block; text-decoration: none; line-height: 1.2; font-weight: normal; font-size: 0.64em">\2</span>\1</span>'
|
||||||
|
|
||||||
if isWin or isMac:
|
|
||||||
# we no longer use this, but want it included in the mac+win builds
|
|
||||||
# so we don't break add-ons that use it. any new add-ons should use
|
|
||||||
# the above variables instead
|
|
||||||
from PyQt4 import pyqtconfig
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ class Reviewer(object):
|
||||||
if isMac:
|
if isMac:
|
||||||
self.bottom.web.setFixedHeight(46)
|
self.bottom.web.setFixedHeight(46)
|
||||||
else:
|
else:
|
||||||
self.bottom.web.setFixedHeight(52+self.mw.fontHeightDelta*4)
|
self.bottom.web.setFixedHeight(54+self.mw.fontHeightDelta*4)
|
||||||
self.bottom.web.setLinkHandler(self._linkHandler)
|
self.bottom.web.setLinkHandler(self._linkHandler)
|
||||||
self._reps = None
|
self._reps = None
|
||||||
self.nextCard()
|
self.nextCard()
|
||||||
|
@ -134,7 +134,8 @@ function _updateQA (q, answerMode, klass) {
|
||||||
typeans.focus();
|
typeans.focus();
|
||||||
}
|
}
|
||||||
if (answerMode) {
|
if (answerMode) {
|
||||||
window.location = "#answer";
|
var e = $("#answer");
|
||||||
|
if (e[0]) { e[0].scrollIntoView(); }
|
||||||
} else {
|
} else {
|
||||||
window.scrollTo(0, 0);
|
window.scrollTo(0, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,7 @@ class DeckStats(QDialog):
|
||||||
def reject(self):
|
def reject(self):
|
||||||
saveGeom(self, self.name)
|
saveGeom(self, self.name)
|
||||||
QDialog.reject(self)
|
QDialog.reject(self)
|
||||||
|
self.deleteLater()
|
||||||
|
|
||||||
def browser(self):
|
def browser(self):
|
||||||
name = time.strftime("-%Y-%m-%d@%H-%M-%S.png",
|
name = time.strftime("-%Y-%m-%d@%H-%M-%S.png",
|
||||||
|
|
|
@ -109,7 +109,7 @@ class AnkiWebView(QWebView):
|
||||||
|
|
||||||
def stdHtml(self, body, css="", bodyClass="", loadCB=None, js=None, head=""):
|
def stdHtml(self, body, css="", bodyClass="", loadCB=None, js=None, head=""):
|
||||||
if isMac:
|
if isMac:
|
||||||
button = "font-weight: bold; height: 24px;"
|
button = "font-weight: normal; height: 24px;"
|
||||||
else:
|
else:
|
||||||
button = "font-weight: normal;"
|
button = "font-weight: normal;"
|
||||||
self.setHtml("""
|
self.setHtml("""
|
||||||
|
|
Loading…
Reference in a new issue