mirror of
https://github.com/ankitects/anki.git
synced 2025-11-10 22:57:11 -05:00
html editor
This commit is contained in:
parent
5702ec2da1
commit
6f0168aec1
1 changed files with 39 additions and 43 deletions
|
|
@ -12,6 +12,7 @@ from anki.hooks import addHook, removeHook, runHook, runFilter
|
|||
from aqt.sound import getAudio
|
||||
from aqt.webview import AnkiWebView
|
||||
from aqt.utils import shortcut, showInfo, showWarning, getBase, getFile
|
||||
import aqt
|
||||
import anki.js
|
||||
|
||||
pics = ("jpg", "jpeg", "png", "tif", "tiff", "gif")
|
||||
|
|
@ -103,6 +104,7 @@ function onBlur() {
|
|||
function saveField(type) {
|
||||
// type is either 'blur' or 'key'
|
||||
py.run(type + ":" + currentField.innerHTML);
|
||||
clearChangeTimer();
|
||||
};
|
||||
|
||||
function wrap(front, back) {
|
||||
|
|
@ -117,7 +119,7 @@ function wrap(front, back) {
|
|||
setFormat('inserthtml', front + span.innerHTML + back);
|
||||
};
|
||||
|
||||
function setFields(fields) {
|
||||
function setFields(fields, focusTo) {
|
||||
var txt = "";
|
||||
for (var i=0; i<fields.length; i++) {
|
||||
var n = fields[i][0];
|
||||
|
|
@ -129,7 +131,10 @@ function setFields(fields) {
|
|||
txt += "</td></tr>";
|
||||
}
|
||||
$("#fields").html("<table cellpadding=3>"+txt+"</table>");
|
||||
$("#f0").focus();
|
||||
if (!focusTo) {
|
||||
focusTo = 0;
|
||||
}
|
||||
$("#f"+focusTo).focus();
|
||||
};
|
||||
|
||||
$(function () {
|
||||
|
|
@ -165,11 +170,8 @@ class Editor(object):
|
|||
self.widget = widget
|
||||
self.mw = mw
|
||||
self.fact = None
|
||||
self.onChange = None
|
||||
self._loaded = False
|
||||
# to be handled js side
|
||||
#self.lastFocusedEdit = None
|
||||
self.changeTimer = None
|
||||
self._keepButtons = False
|
||||
# current card, for card layout
|
||||
self.card = None
|
||||
addHook("deckClosed", self.deckClosedHook)
|
||||
|
|
@ -266,14 +268,15 @@ class Editor(object):
|
|||
_("Cloze (Ctrl+Shift+c)"), text="[...]")
|
||||
but.setFixedWidth(24)
|
||||
# fixme: better image names
|
||||
b("text-speak", self.onAddMedia, "F3", _("Add audio/video (F4)"))
|
||||
b("text-speak", self.onAddMedia, "F3", _("Add pictures/audio/video (F3)"))
|
||||
b("media-record", self.onRecSound, "F5", _("Record audio (F5)"))
|
||||
b("tex", self.insertLatex, "Ctrl+t, t", _("LaTeX (Ctrl+t then t)"))
|
||||
b("math_sqrt", self.insertLatexEqn, "Ctrl+t, e",
|
||||
_("LaTeX equation (Ctrl+t then e)"))
|
||||
b("math_matrix", self.insertLatexMathEnv, "Ctrl+t, m",
|
||||
_("LaTeX math environment (Ctrl+t then m)"))
|
||||
but = b("text-xml", self.onHtmlEdit, "Ctrl+x", _("Source (Ctrl+x)"))
|
||||
but = b("text-xml", self.onHtmlEdit, "Ctrl+Shift+x",
|
||||
_("Source (Ctrl+Shift+x)"))
|
||||
|
||||
def enableButtons(self, val=True):
|
||||
for b in self._buttons.values():
|
||||
|
|
@ -296,11 +299,12 @@ class Editor(object):
|
|||
def bridge(self, str):
|
||||
# focus lost or key/button pressed?
|
||||
if str.startswith("blur") or str.startswith("key"):
|
||||
print "save fact"
|
||||
(type, txt) = str.split(":", 1)
|
||||
self.fact._fields[self.currentField] = txt
|
||||
print "save fact", txt
|
||||
if type == "blur":
|
||||
self.disableButtons()
|
||||
if not self._keepButtons:
|
||||
self.disableButtons()
|
||||
runHook("editor.focusLost", self.fact)
|
||||
else:
|
||||
runHook("editor.keyPressed", self.fact)
|
||||
|
|
@ -333,9 +337,7 @@ class Editor(object):
|
|||
def setFact(self, fact):
|
||||
"Make FACT the current fact."
|
||||
self.fact = fact
|
||||
if self.changeTimer:
|
||||
self.changeTimer.stop()
|
||||
self.changeTimer = None
|
||||
# change timer
|
||||
if self.fact:
|
||||
self.web.setHtml(_html % (getBase(self.mw.deck), anki.js.all),
|
||||
loadCB=self._loadFinished)
|
||||
|
|
@ -343,12 +345,13 @@ class Editor(object):
|
|||
else:
|
||||
self.widget.hide()
|
||||
|
||||
def loadFact(self):
|
||||
def loadFact(self, field=0):
|
||||
if not self._loaded:
|
||||
# will be loaded when page is ready
|
||||
return
|
||||
# fixme: focus on first widget
|
||||
self.web.eval("setFields(%s);" % simplejson.dumps(self.fact.items()))
|
||||
self.web.eval("setFields(%s, %d);" % (
|
||||
simplejson.dumps(self.fact.items()), field))
|
||||
self.widget.show()
|
||||
|
||||
def refresh(self):
|
||||
|
|
@ -381,21 +384,16 @@ class Editor(object):
|
|||
"Must call this before adding cards, closing dialog, etc."
|
||||
if not self.fact:
|
||||
return
|
||||
# disable timer
|
||||
if self.changeTimer:
|
||||
self.changeTimer.stop()
|
||||
self.changeTimer = None
|
||||
if self.onChange:
|
||||
self.onChange('field')
|
||||
# save fields and run features
|
||||
w = self.focusedEdit()
|
||||
if w:
|
||||
self.onFocusLost(w)
|
||||
self._keepButtons = True
|
||||
self.web.eval("saveField('blur');")
|
||||
self._keepButtons = False
|
||||
self.onTagChange()
|
||||
self.onGroupChange()
|
||||
# ensure valid
|
||||
self.checkValid()
|
||||
|
||||
def checkValid(self):
|
||||
return
|
||||
empty = []
|
||||
dupe = []
|
||||
for field in self.fact.fields:
|
||||
|
|
@ -413,23 +411,22 @@ class Editor(object):
|
|||
p.setColor(QPalette.Base, QColor("#ffffff"))
|
||||
self.fields[field.name][1].setPalette(p)
|
||||
|
||||
# HTML editing
|
||||
######################################################################
|
||||
|
||||
def onHtmlEdit(self):
|
||||
def helpRequested():
|
||||
aqt.openHelp("HtmlEditor")
|
||||
w = self.focusedEdit()
|
||||
if w:
|
||||
self.saveFields()
|
||||
d = QDialog(self.widget)
|
||||
form = aqt.forms.edithtml.Ui_Dialog()
|
||||
form.setupUi(d)
|
||||
d.connect(form.buttonBox, SIGNAL("helpRequested()"),
|
||||
helpRequested)
|
||||
form.textEdit.setPlainText(self.widgets[w].value)
|
||||
form.textEdit.moveCursor(QTextCursor.End)
|
||||
d.exec_()
|
||||
w.setHtml(unicode(form.textEdit.toPlainText()).\
|
||||
replace("\n", ""))
|
||||
self.saveFields()
|
||||
self.saveFieldsNow()
|
||||
d = QDialog(self.widget)
|
||||
form = aqt.forms.edithtml.Ui_Dialog()
|
||||
form.setupUi(d)
|
||||
d.connect(form.buttonBox, SIGNAL("helpRequested()"),
|
||||
lambda: aqt.openHelp("HtmlEditor"))
|
||||
form.textEdit.setPlainText(self.fact._fields[self.currentField])
|
||||
form.textEdit.moveCursor(QTextCursor.End)
|
||||
d.exec_()
|
||||
self.fact._fields[self.currentField] = unicode(
|
||||
form.textEdit.toPlainText())
|
||||
self.loadFact(self.currentField)
|
||||
|
||||
# Tag and group handling
|
||||
######################################################################
|
||||
|
|
@ -468,6 +465,7 @@ class Editor(object):
|
|||
pass
|
||||
|
||||
def onTagChange(self):
|
||||
return
|
||||
if not self.fact:
|
||||
return
|
||||
old = self.fact.tags
|
||||
|
|
@ -478,8 +476,6 @@ class Editor(object):
|
|||
self.fact.setModified(textChanged=True, deck=self.deck)
|
||||
self.deck.flushMod()
|
||||
self.mw.reset(runHooks=False)
|
||||
if self.onChange:
|
||||
self.onChange('tag')
|
||||
|
||||
# Format buttons
|
||||
######################################################################
|
||||
|
|
|
|||
Loading…
Reference in a new issue