py/gadict_srs_anki.py
author Oleksandr Gavenko <gavenkoa@gmail.com>
Tue, 08 Nov 2016 18:08:02 +0200
changeset 644 e38cd6112193
parent 618 6ad7203ac9dc
child 646 2d488cfc4c0c
permissions -rw-r--r--
New command line format for passing language list.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     1
# -*- coding: utf-8 -*-
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     2
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     3
import os
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     4
import io
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     5
import sys
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     6
import codecs
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     7
import tempfile
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     8
import shutil
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     9
import signal
644
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    10
import regex
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    11
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    12
import gadict
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    13
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    14
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    15
FINAME = None
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    16
FONAME = None
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    17
LANGS = None
644
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    18
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    19
# -lang:ru,uk
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    20
ARG_LANG_RE = regex.compile("-lang:(.+)")
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    21
# -freq:var:TAG=FILE or -freq:freq:TAG=FILE
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    22
ARG_FREQ_RE = regex.compile("-freq:(freq|var):([^=]+)=(.+)")
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    23
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    24
look_for_files = False
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    25
for idx in range(1, len(sys.argv)):
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    26
    arg = sys.argv[idx]
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    27
    if arg == "--":
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    28
        look_for_files = True
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    29
        continue
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    30
    if not look_for_files:
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    31
        m = ARG_LANG_RE.match(arg)
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    32
        if m:
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    33
            LANGS = set(m.group(1).split(","))
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    34
            for lang in LANGS:
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    35
                if len(lang) != 2:
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    36
                    raise Exception("Incorrect language specification: '{:s}'".format(arg))
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    37
            continue
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    38
        m = ARG_FREQ_RE.match(arg)
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    39
        if m:
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    40
            LANGS = set(arg.split(","))
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    41
            for lang in LANGS:
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    42
                if len(lang) != 2:
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    43
                    raise Exception("Incorrect language specification: '{:s}'".format(arg))
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    44
            continue
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    45
        if arg.startswith("-"):
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    46
            raise Exception("Unsupported option format: '{:s}'".format(arg))
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    47
    if not FINAME:
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    48
        FINAME = arg
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    49
        continue
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    50
    if not FONAME:
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    51
        FONAME = arg
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    52
        continue
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    53
    raise Exception("Unnecessary argument: '{:s}'".format(arg))
e38cd6112193 New command line format for passing language list.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 618
diff changeset
    54
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    55
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    56
FIN = io.open(FINAME, mode='r', buffering=1, encoding="utf-8")
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    57
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    58
PARSER = gadict.Parser()
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    59
try:
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    60
    DOM = PARSER.parse(FIN)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    61
except gadict.ParseException as ex:
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    62
    sys.stdout.write("{:s}{:s}\n".format(FINAME, repr(ex)))
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    63
    if __debug__:
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    64
        import traceback
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    65
        traceback.print_exc()
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    66
    exit(1)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    67
finally:
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    68
    FIN.close()
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    69
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    70
def cleanup(collection, tmpdir):
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    71
    if collection:
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    72
        collection.close()
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    73
    if tmpdir:
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    74
        shutil.rmtree(tmpdir, ignore_errors=True)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    75
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    76
# signal.signal(signal.SIGINT, lambda signal, frame: cleanup())
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    77
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    78
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    79
if FONAME is None:
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    80
    raise Exception('Missing output file name')
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    81
# Looks like anki libs change working directory to media directory of current deck
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    82
# Therefore absolute path should be stored before creating temporary deck
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    83
FONAME = os.path.abspath(FONAME)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    84
FBASENAME, _ = os.path.splitext(os.path.basename(FONAME))
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    85
TMPDIR = tempfile.mkdtemp(dir = os.path.dirname(FONAME))
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    86
608
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
    87
try:
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
    88
    FDEL = io.open(FBASENAME+".del", mode='r', buffering=1, encoding="utf-8")
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
    89
except:
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
    90
    FDEL = None
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
    91
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
    92
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    93
import hashlib
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    94
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    95
import anki
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    96
from anki.exporting import AnkiPackageExporter
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    97
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    98
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    99
class AnkiDbBuilder:
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   100
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   101
    def __init__(self, tmpdir, name):
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   102
        self.tmpdir = tmpdir
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   103
        self.name = name
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   104
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   105
        self.collection = collection = anki.Collection(os.path.join(self.tmpdir, 'collection.anki2'))
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   106
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   107
        deck_id = collection.decks.id(self.name + "_deck")
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   108
        deck = collection.decks.get(deck_id)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   109
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   110
        model = collection.models.new(self.name + "_model")
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   111
        model['tags'].append(self.name + "_tag")
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   112
        model['did'] = deck_id
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   113
        model['css'] = """
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   114
.card {
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   115
  font-family: arial;
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   116
  font-size: 20px;
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   117
  text-align: center;
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   118
  color: black;
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   119
  background-color: white;
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   120
}
556
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   121
.ask {
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   122
  margin-bottom: 1.2em;
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   123
}
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   124
span.headword {
556
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   125
  font-weight: bolt;
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   126
}
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   127
.pron {
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   128
  color: magenta;
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   129
}
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   130
.pos {
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   131
  color: green;
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   132
  font-style: italic;
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   133
}
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   134
.lang {
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   135
  color: red;
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   136
  font-style: italic;
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   137
}
618
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   138
.topic {
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   139
  color: #B04080;
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   140
}
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   141
.ant {
565
ac68f2680ea0 Add syntax to add related words. Add separators between ant/syn/rel in
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 562
diff changeset
   142
  color: #404080;
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   143
}
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   144
.syn {
565
ac68f2680ea0 Add syntax to add related words. Add separators between ant/syn/rel in
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 562
diff changeset
   145
  color: #804040;
ac68f2680ea0 Add syntax to add related words. Add separators between ant/syn/rel in
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 562
diff changeset
   146
}
ac68f2680ea0 Add syntax to add related words. Add separators between ant/syn/rel in
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 562
diff changeset
   147
.rel {
618
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   148
  color: #604080;
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   149
}
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   150
.hyper {
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   151
  color: #600080;
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   152
}
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   153
.hypo {
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   154
  color: #606080;
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   155
}
556
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   156
.attrs {
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   157
  color: blue;
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   158
}
560
dad049a0f585 Include examples into dictionary articles and Packaged Anki Desk files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 559
diff changeset
   159
span.ex {
dad049a0f585 Include examples into dictionary articles and Packaged Anki Desk files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 559
diff changeset
   160
  font-style: italic;
dad049a0f585 Include examples into dictionary articles and Packaged Anki Desk files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 559
diff changeset
   161
  font-size: .85em;
dad049a0f585 Include examples into dictionary articles and Packaged Anki Desk files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 559
diff changeset
   162
}
569
5709d5bd349b Fix: reverse card missed glossary.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 566
diff changeset
   163
div.glos .lang {
5709d5bd349b Fix: reverse card missed glossary.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 566
diff changeset
   164
  color: brown;
5709d5bd349b Fix: reverse card missed glossary.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 566
diff changeset
   165
}
566
0bba61492c37 Add syntax for glossary/explanation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 565
diff changeset
   166
span.glos {
569
5709d5bd349b Fix: reverse card missed glossary.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 566
diff changeset
   167
  font-size: .95em;
566
0bba61492c37 Add syntax for glossary/explanation.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 565
diff changeset
   168
}
608
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   169
.del {
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   170
  color: red;
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   171
  font-weight: bold;
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   172
}
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   173
"""
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   174
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   175
        collection.models.addField(model, collection.models.newField('From'))
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   176
        collection.models.addField(model, collection.models.newField('To'))
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   177
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   178
        tmpl = collection.models.newTemplate('From -> To')
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   179
        tmpl['qfmt'] = '<div class="from">{{From}}</div>'
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   180
        tmpl['afmt'] = '{{FrontSide}}\n\n<hr id=answer>\n\n<div class="to">{{To}}</div>'
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   181
        collection.models.addTemplate(model, tmpl)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   182
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   183
        # Equivalent of:
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   184
        #   collection.models.add(model)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   185
        # without setting auto-generated ID. It is essential to keep model['id']
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   186
        # unchanged between upgrades or notes will be skipped!!
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   187
        model['id'] = int(hashlib.sha1(self.name).hexdigest(), 16) % (2**63)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   188
        collection.models.update(model)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   189
        collection.models.setCurrent(model)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   190
        collection.models.save(model)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   191
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   192
    def guid(self, type_, headword):
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   193
        """
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   194
        :type_ used to generate different notes from same headword
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   195
        """
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   196
        h = hashlib.md5(":".join((self.name, type_, headword)))
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   197
        return h.hexdigest()
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   198
608
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   199
    def add_note(self, type_, id_, from_, to_, tags_ = None):
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   200
        note = self.collection.newNote()
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   201
        note['From'] = from_
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   202
        # print(from_)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   203
        note['To'] = to_
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   204
        # print(to_)
608
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   205
        if isinstance(tags_, str):      note.tags = [tags_]
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   206
        elif isinstance(tags_, list):   note.tags = tags_
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   207
        elif tags_ is None:             pass
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   208
        else:                           raise Exception('Expect string or list of tags...')
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   209
        note.guid = self.guid(type_, id_)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   210
        self.collection.addNote(note)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   211
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   212
    def export(self, fname):
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   213
        export = AnkiPackageExporter(self.collection)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   214
        export.exportInto(fname)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   215
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   216
    def close(self):
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   217
        self.collection.close()
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   218
570
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   219
def write_sense(buf, sense, with_examples = True):
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   220
    buf.append("<div class='sense'>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   221
    if sense.pos:
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   222
        buf.append("<span class='pos'>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   223
        buf.append(sense.pos)
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   224
        buf.append("</span>")
574
5478477ab2ae Add related words to Anki cards. Break line if any reference is provided.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 570
diff changeset
   225
    have_ref = False
570
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   226
    if sense.ant_list and len(sense.ant_list) > 0:
574
5478477ab2ae Add related words to Anki cards. Break line if any reference is provided.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 570
diff changeset
   227
        have_ref = True
570
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   228
        buf.append(" <span class='ant'>ant: ")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   229
        buf.append("; ".join(sense.ant_list))
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   230
        buf.append("</span>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   231
    if sense.syn_list and len(sense.syn_list) > 0:
574
5478477ab2ae Add related words to Anki cards. Break line if any reference is provided.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 570
diff changeset
   232
        have_ref = True
570
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   233
        buf.append(" <span class='syn'>syn: ")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   234
        buf.append("; ".join(sense.syn_list))
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   235
        buf.append("</span>")
618
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   236
    if sense.hyper_list and len(sense.hyper_list) > 0:
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   237
        have_ref = True
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   238
        buf.append(" <span class='hyper'>hyper: ")
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   239
        buf.append("; ".join(sense.hyper_list))
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   240
        buf.append("</span>")
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   241
    if sense.hypo_list and len(sense.hypo_list) > 0:
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   242
        have_ref = True
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   243
        buf.append(" <span class='hypo'>hypo: ")
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   244
        buf.append("; ".join(sense.hypo_list))
6ad7203ac9dc Add support for hypernyms and hyponyms.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 608
diff changeset
   245
        buf.append("</span>")
574
5478477ab2ae Add related words to Anki cards. Break line if any reference is provided.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 570
diff changeset
   246
    if sense.rel_list and len(sense.rel_list) > 0:
5478477ab2ae Add related words to Anki cards. Break line if any reference is provided.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 570
diff changeset
   247
        have_ref = True
5478477ab2ae Add related words to Anki cards. Break line if any reference is provided.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 570
diff changeset
   248
        buf.append(" <span class='rel'>rel: ")
5478477ab2ae Add related words to Anki cards. Break line if any reference is provided.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 570
diff changeset
   249
        buf.append("; ".join(sense.rel_list))
5478477ab2ae Add related words to Anki cards. Break line if any reference is provided.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 570
diff changeset
   250
        buf.append("</span>")
570
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   251
    for (lang, tr) in sense.tr_list or []:
574
5478477ab2ae Add related words to Anki cards. Break line if any reference is provided.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 570
diff changeset
   252
        if len(sense.tr_list) > 1 or have_ref:
570
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   253
            buf.append("<div class='sense'>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   254
        buf.append(" <span class='lang'>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   255
        buf.append(lang)
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   256
        buf.append("</span>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   257
        buf.append(" <span class='tr'>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   258
        buf.append(tr)
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   259
        buf.append("</span>")
574
5478477ab2ae Add related words to Anki cards. Break line if any reference is provided.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 570
diff changeset
   260
        if len(sense.tr_list) > 1 or have_ref:
570
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   261
            buf.append("</div>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   262
    for (lang, tr) in sense.glos_list or []:
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   263
        buf.append("<div class='glos'>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   264
        buf.append(" <span class='lang'>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   265
        buf.append(lang)
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   266
        buf.append("</span>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   267
        buf.append(" <span class='glos'>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   268
        buf.append(tr)
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   269
        buf.append("</span>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   270
        buf.append("</div>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   271
    for (lang, tr) in (with_examples and sense.ex_list) or []:
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   272
        buf.append("<div class='ex'>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   273
        buf.append(" <span class='lang'>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   274
        buf.append(lang)
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   275
        buf.append("</span>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   276
        buf.append(" <span class='ex'>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   277
        buf.append(tr)
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   278
        buf.append("</span>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   279
        buf.append("</div>")
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   280
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   281
try:
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   282
    builder = AnkiDbBuilder(TMPDIR, FBASENAME)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   283
608
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   284
    for identity in FDEL or []:
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   285
        identity = identity.strip()
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   286
        warnmsg = "<div class='del'>Please delete this note ({})</div>".format(identity)
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   287
        builder.add_note("en->tr", identity, warnmsg, warnmsg+" en->tr", "del")
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   288
        builder.add_note("tr->en", identity, warnmsg, warnmsg+" tr->en", "del")
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   289
        builder.add_note("irregular1", identity, warnmsg, warnmsg+" irregular1", "del")
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   290
        builder.add_note("irregular2", identity, warnmsg, warnmsg+" irregular2", "del")
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   291
        builder.add_note("irregular3", identity, warnmsg, warnmsg+" irregular3", "del")
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   292
        builder.add_note("singular", identity, warnmsg, warnmsg+" singular", "del")
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   293
        builder.add_note("plural", identity, warnmsg, warnmsg+" plural", "del")
01fcbb1d5cea Add a way to mark card for deletion.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 574
diff changeset
   294
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   295
    for (headwords, translations) in DOM[1:]:
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   296
        identity = headwords[0].headword
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   297
        buf = []
556
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   298
        v1, v2, v3 = (None, None, None)
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   299
        singular, plural = (None, None)
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   300
        for hw in headwords:
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   301
            buf.append("<div clsas='headword'>")
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   302
            buf.append("<span clsas='headword'>")
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   303
            buf.append(hw.headword)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   304
            buf.append("</span>")
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   305
            if hw.pron is not None:
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   306
                buf.append(" <span class='pron'>[")
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   307
                buf.append(hw.pron)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   308
                buf.append("]</span>")
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   309
            if len(hw.attrs) > 0:
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   310
                l = [u"«"+x+u"»" for x in hw.attrs]
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   311
                l.sort()
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   312
                buf.append("<span class='attrs'>")
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   313
                buf.append(", ".join(l))
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   314
                buf.append("</span>")
556
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   315
            if 'v1' in hw.attrs:
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   316
                v1 = (hw.headword, hw.pron)
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   317
            if 'v2' in hw.attrs:
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   318
                v2 = (hw.headword, hw.pron)
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   319
            if 'v3' in hw.attrs:
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   320
                v3 = (hw.headword, hw.pron)
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   321
            if 's' in hw.attrs:
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   322
                singular = (hw.headword, hw.pron)
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   323
            if 'pl' in hw.attrs:
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   324
                plural = (hw.headword, hw.pron)
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   325
            buf.append("</div>")
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   326
        direct_from = "".join(buf)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   327
        buf = []
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   328
        for sense in translations:
570
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   329
            write_sense(buf, sense, with_examples = True)
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   330
        direct_to = "".join(buf)
560
dad049a0f585 Include examples into dictionary articles and Packaged Anki Desk files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 559
diff changeset
   331
        buf = []
dad049a0f585 Include examples into dictionary articles and Packaged Anki Desk files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 559
diff changeset
   332
        for sense in translations:
570
181897a421e9 Remove code duplication.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 569
diff changeset
   333
            write_sense(buf, sense, with_examples = False)
560
dad049a0f585 Include examples into dictionary articles and Packaged Anki Desk files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 559
diff changeset
   334
        reverse_from = "".join(buf)         # without examples!!
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   335
        builder.add_note("en->tr", identity, direct_from, direct_to)
560
dad049a0f585 Include examples into dictionary articles and Packaged Anki Desk files.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 559
diff changeset
   336
        builder.add_note("tr->en", identity, reverse_from, direct_from)
556
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   337
        if v1 and v2 and v3:
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   338
            question = u"<div class='ask'>Find irregular verb:</div>"
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   339
            riddle1 = u"<span class='headword'>{}</span> <span class='pron'>[{}]</span> <span class='attrs'>v1</span>".format(v1[0], v1[1])
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   340
            riddle2 = u"<span class='headword'>{}</span> <span class='pron'>[{}]</span> <span class='attrs'>v2</span>".format(v2[0], v2[1])
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   341
            riddle3 = u"<span class='headword'>{}</span> <span class='pron'>[{}]</span> <span class='attrs'>v3</span>".format(v3[0], v3[1])
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   342
            answer = u"{}<br>{}<br>{}<br>{}".format(riddle1, riddle2, riddle3, direct_to)
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   343
            builder.add_note("irregular1", identity, question + riddle1, answer)
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   344
            builder.add_note("irregular2", identity, question + riddle2, answer)
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   345
            builder.add_note("irregular3", identity, question + riddle3, answer)
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   346
        if singular and plural:
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   347
            question = u"<div class='ask'>Find plural:</div>"
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   348
            riddle_s = u"<span class='headword'>{}</span> <span class='pron'>[{}]</span> <span class='attrs'>s</span>".format(singular[0], singular[1])
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   349
            riddle_pl = u"<span class='headword'>{}</span> <span class='pron'>[{}]</span> <span class='attrs'>pl</span>".format(plural[0], plural[1])
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   350
            answer = u"{}<br>{}<br>{}".format(riddle_s, riddle_pl, direct_to)
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   351
            builder.add_note("singular", identity, question + riddle_s, answer)
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   352
            builder.add_note("plural", identity, question + riddle_pl, answer)
78bf1097106a Add question for plural form and irregular verbs.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 555
diff changeset
   353
555
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   354
    builder.export(FONAME)
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   355
finally:
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   356
    builder.close()
4a3188fc8951 Generating Packaged Anki Desk files for Anki space repetition software.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   357
    shutil.rmtree(TMPDIR, ignore_errors=True)