remove remaining CSS; more template properties into div

This commit is contained in:
Damien Elmes 2011-11-18 07:50:39 +09:00
parent 15e4b64162
commit 7a5cee1d20
6 changed files with 43 additions and 56 deletions

View file

@ -100,11 +100,11 @@ lapses=?, left=?, edue=? where id = ?""",
self.factor, self.reps, self.lapses, self.factor, self.reps, self.lapses,
self.left, self.edue, self.id) self.left, self.edue, self.id)
def q(self, classes="q", reload=False): def q(self, reload=False):
return self._withClass(self._getQA(reload)['q'], classes) return self._getQA(reload)['q']
def a(self, classes="a"): def a(self):
return self._withClass(self._getQA()['a'], classes) return self._getQA()['a']
def _getQA(self, reload=False): def _getQA(self, reload=False):
if not self._qa or reload: if not self._qa or reload:
@ -114,9 +114,6 @@ lapses=?, left=?, edue=? where id = ?""",
self._qa = self.deck._renderQA(data) self._qa = self.deck._renderQA(data)
return self._qa return self._qa
def _withClass(self, txt, extra):
return '<div class="%s %s">%s</div>' % (self.cssClass(), extra, txt)
def _reviewData(self, reload=False): def _reviewData(self, reload=False):
"Fetch the model and fact." "Fetch the model and fact."
if not self._rd or reload: if not self._rd or reload:
@ -137,10 +134,6 @@ lapses=?, left=?, edue=? where id = ?""",
def template(self): def template(self):
return self._reviewData()[1]['tmpls'][self.ord] return self._reviewData()[1]['tmpls'][self.ord]
def cssClass(self):
return "cm%s-%s" % (hexifyID(self.model()['id']),
hexifyID(self.template()['ord']))
def startTimer(self): def startTimer(self):
self.timerStarted = time.time() self.timerStarted = time.time()

View file

@ -14,7 +14,6 @@ from anki.consts import *
# - careful not to add any lists/dicts/etc here, as they aren't deep copied # - careful not to add any lists/dicts/etc here, as they aren't deep copied
defaultModel = { defaultModel = {
'css': "",
'sortf': 0, 'sortf': 0,
'gid': 1, 'gid': 1,
'clozectx': False, 'clozectx': False,
@ -37,15 +36,14 @@ defaultModel = {
defaultField = { defaultField = {
'name': "", 'name': "",
'ord': None, 'ord': None,
'rtl': False,
'req': False, 'req': False,
'uniq': False, 'uniq': False,
'font': "Arial",
'qsize': 20,
'esize': 20,
'qcol': "#000",
'pre': True,
'sticky': False, 'sticky': False,
# the following alter editing, and are used as defaults for the
# template wizard
'rtl': False,
'font': "Arial",
'size': 20,
} }
defaultTemplate = { defaultTemplate = {
@ -53,8 +51,6 @@ defaultTemplate = {
'ord': None, 'ord': None,
'qfmt': "", 'qfmt': "",
'afmt': "", 'afmt': "",
'align': 0,
'bg': "#fff",
'typeAns': None, 'typeAns': None,
'gid': None, 'gid': None,
} }
@ -77,7 +73,6 @@ class ModelManager(object):
if m: if m:
m['mod'] = intTime() m['mod'] = intTime()
m['usn'] = self.deck.usn() m['usn'] = self.deck.usn()
m['css'] = self._css(m)
self._updateRequired(m) self._updateRequired(m)
if gencards: if gencards:
self.deck.genCards(self.fids(m)) self.deck.genCards(self.fids(m))
@ -195,21 +190,6 @@ select id from cards where fid in (select id from facts where mid = ?)""",
m2['name'] = _("%s copy") % m2['name'] m2['name'] = _("%s copy") % m2['name']
return self._add(m2) return self._add(m2)
# CSS generation
##################################################
def css(self):
"CSS for all models."
return "\n".join([m['css'] for m in self.all()])
def _css(self, m):
# templates
css = "".join(".cm%s-%s {text-align:%s;background:%s}\n" % (
hexifyID(m['id']), hexifyID(t['ord']),
("center", "left", "right")[t['align']], t['bg'])
for t in m['tmpls'])
return css
# Fields # Fields
################################################## ##################################################

View file

@ -348,6 +348,7 @@ insert or replace into deck select id, cast(created as int), :t,
db = self.db db = self.db
dconf = anki.models.defaultField dconf = anki.models.defaultField
flds = [] flds = []
# note: qsize & qcol are used in upgrade then discarded
for c, row in enumerate(db.all(""" for c, row in enumerate(db.all("""
select name, features, required, "unique", select name, features, required, "unique",
quizFontFamily, quizFontSize, quizFontColour, editFontSize from fieldModels quizFontFamily, quizFontSize, quizFontColour, editFontSize from fieldModels
@ -361,15 +362,14 @@ order by ordinal""", mid)):
conf['font'], conf['font'],
conf['qsize'], conf['qsize'],
conf['qcol'], conf['qcol'],
conf['esize']) = row conf['size']) = row
conf['ord'] = c conf['ord'] = c
# ensure data is good # ensure data is good
conf['rtl'] = not not conf['rtl'] conf['rtl'] = not not conf['rtl']
conf['pre'] = True
conf['font'] = conf['font'] or "Arial" conf['font'] = conf['font'] or "Arial"
conf['size'] = conf['size'] or 20
conf['qcol'] = conf['qcol'] or "#000" conf['qcol'] = conf['qcol'] or "#000"
conf['qsize'] = conf['qsize'] or 20 conf['qsize'] = conf['qsize'] or 20
conf['esize'] = conf['esize'] or 20
flds.append(conf) flds.append(conf)
return flds return flds
@ -378,6 +378,7 @@ order by ordinal""", mid)):
db = self.db db = self.db
dconf = anki.models.defaultTemplate dconf = anki.models.defaultTemplate
tmpls = [] tmpls = []
# align and bg are used in upgrade then discarded
for c, row in enumerate(db.all(""" for c, row in enumerate(db.all("""
select name, active, qformat, aformat, questionInAnswer, select name, active, qformat, aformat, questionInAnswer,
questionAlign, lastFontColour, typeAnswer from cardModels questionAlign, lastFontColour, typeAnswer from cardModels
@ -421,8 +422,9 @@ order by ordinal""", mid)):
# Template upgrading # Template upgrading
###################################################################### ######################################################################
# {{field}} no longer inserts an implicit span, so we make the span # - {{field}} no longer inserts an implicit span, so we make the span
# explicit on upgrade. # explicit on upgrade.
# - likewise with alignment and background color
def _upgradeTemplates(self): def _upgradeTemplates(self):
d = self.deck d = self.deck
for m in d.models.all(): for m in d.models.all():
@ -432,13 +434,17 @@ order by ordinal""", mid)):
attrs = [ attrs = [
"font-family:%s" % f['font'], "font-family:%s" % f['font'],
"font-size:%spx" % f['qsize'], "font-size:%spx" % f['qsize'],
"color:%s" % f['qcol']] "color:%s" % f['qcol'],
"white-space:pre-wrap",
]
if f['rtl']: if f['rtl']:
attrs.append("direction:rtl;unicode-bidi:embed") attrs.append("direction:rtl;unicode-bidi:embed")
if f['pre']: attrs.append()
attrs.append("white-space:pre-wrap") styles[f['name']] = '<span style="%s">{{%s}}</span>' % (
styles[f['name']] = '<span style="%s">\n{{%s}}\n</span>' % (
";".join(attrs), f['name']) ";".join(attrs), f['name'])
# obsolete
del f['qcol']
del f['qsize']
# then for each template # then for each template
for t in m['tmpls']: for t in m['tmpls']:
def repl(match): def repl(match):
@ -448,7 +454,21 @@ order by ordinal""", mid)):
# special or non-existant field; leave alone # special or non-existant field; leave alone
return match.group(0) return match.group(0)
for k in 'qfmt', 'afmt': for k in 'qfmt', 'afmt':
# replace old field references
t[k] = re.sub("(^|[^{]){{([^{}]+)?}}", repl, t[k]) t[k] = re.sub("(^|[^{]){{([^{}]+)?}}", repl, t[k])
# then template properties.
if t['bg'].lower() == "#ffffff":
# a bit more intuitive default
bg = "white"
else:
bg = t['bg']
t[k] = '''\
<div style="text-align:%s;background-color:%s">\n\n%s\n\n</div>''' % (
("center", "left", "right")[t['align']],
bg, t[k])
# remove obsolete
del t['bg']
del t['align']
# save model # save model
d.models.save(m) d.models.save(m)
@ -557,7 +577,7 @@ and ord = ? limit 1""", m['id'], t['ord']):
self._rewriteMediaRefs() self._rewriteMediaRefs()
# template handling has changed # template handling has changed
self._upgradeTemplates() self._upgradeTemplates()
# regenerate css, and set new card order # set new card order
for m in deck.models.all(): for m in deck.models.all():
m['newOrder'] = deck.conf['oldNewOrder'] m['newOrder'] = deck.conf['oldNewOrder']
deck.models.save(m) deck.models.save(m)

View file

@ -53,5 +53,4 @@ def test_misc():
d.addFact(f) d.addFact(f)
c = f.cards()[0] c = f.cards()[0]
id = d.models.current()['id'] id = d.models.current()['id']
assert c.cssClass() == "cm%s-0" % hexifyID(id)
assert c.template()['ord'] == 0 assert c.template()['ord'] == 0

View file

@ -245,12 +245,3 @@ def test_modelChange():
assert f['Notes'] == "b2" assert f['Notes'] == "b2"
assert len(f.cards()) == 2 assert len(f.cards()) == 2
assert "b2" in f.cards()[0].a() assert "b2" in f.cards()[0].a()
def test_css():
deck = getEmptyDeck()
basic = deck.models.byName("Basic")
assert "arial" in basic['css']
assert "helvetica" not in basic['css']
basic['flds'][0]['font'] = "helvetica"
deck.models.save(basic)
assert "helvetica" in basic['css']

View file

@ -31,3 +31,7 @@ def test_upgrade():
assert deck.sched.cardCounts() == (3,2,1) assert deck.sched.cardCounts() == (3,2,1)
# now's a good time to test the integrity check too # now's a good time to test the integrity check too
deck.fixIntegrity() deck.fixIntegrity()
# c = deck.sched.getCard()
# print "--q", c.q()
# print
# print "--a", c.a()