diff --git a/anki/__init__.py b/anki/__init__.py index 9af79a97a..acdf63910 100644 --- a/anki/__init__.py +++ b/anki/__init__.py @@ -28,7 +28,7 @@ Edit the card: fields = card.fact.model.fieldModels for field in fields: - card.fact[field.name] = "newvalue" + card.fact[field.name] = 'newvalue' card.fact.setModified(textChanged=True, deck=deck) deck.setModified() @@ -46,7 +46,6 @@ Save & close: deck.save() deck.close() """ -__docformat__ = 'restructuredtext' try: __import__('pkg_resources').declare_namespace(__name__) diff --git a/anki/cards.py b/anki/cards.py index f8f0d13b1..9ac994745 100644 --- a/anki/cards.py +++ b/anki/cards.py @@ -2,12 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Cards -==================== -""" -__docformat__ = 'restructuredtext' - import time, sys, math, random from anki.db import * from anki.models import CardModel, Model, FieldModel, formatQA diff --git a/anki/db.py b/anki/db.py index e9aa207d2..229d3a5ac 100644 --- a/anki/db.py +++ b/anki/db.py @@ -13,7 +13,6 @@ object_session() is a replacement for the standard object_session(), which provides the features of SessionHelper, and avoids taking out another transaction. """ -__docformat__ = 'restructuredtext' try: from pysqlite2 import dbapi2 as sqlite diff --git a/anki/deck.py b/anki/deck.py index 7a17d0068..347344c89 100644 --- a/anki/deck.py +++ b/anki/deck.py @@ -2,12 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -The Deck -==================== -""" -__docformat__ = 'restructuredtext' - import tempfile, time, os, random, sys, re, stat, shutil import types, traceback, simplejson, datetime diff --git a/anki/errors.py b/anki/errors.py index e91318c37..80f24aacc 100644 --- a/anki/errors.py +++ b/anki/errors.py @@ -2,12 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Errors -============================== -""" -__docformat__ = 'restructuredtext' - class Error(Exception): def __init__(self, message="", **data): self.data = data diff --git a/anki/exporting.py b/anki/exporting.py index d048da532..657d58a0f 100644 --- a/anki/exporting.py +++ b/anki/exporting.py @@ -2,12 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Exporting support -============================== -""" -__docformat__ = 'restructuredtext' - import itertools, time, re, os, HTMLParser from operator import itemgetter from anki import DeckStorage diff --git a/anki/facts.py b/anki/facts.py index 6e162d92a..524776e1a 100644 --- a/anki/facts.py +++ b/anki/facts.py @@ -2,12 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Facts -======== -""" -__docformat__ = 'restructuredtext' - import time from anki.db import * from anki.errors import * diff --git a/anki/fonts.py b/anki/fonts.py index 1bff954e9..4f7bd115a 100644 --- a/anki/fonts.py +++ b/anki/fonts.py @@ -2,11 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Fonts - mapping to/from platform-specific fonts -============================================================== -""" - import sys # set this to 'all', to get all fonts in a list diff --git a/anki/graphs.py b/anki/graphs.py index edb33d5dc..b94c25232 100644 --- a/anki/graphs.py +++ b/anki/graphs.py @@ -2,12 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Graphs of deck statistics -============================== -""" -__docformat__ = 'restructuredtext' - import os, sys, time import anki.stats from anki.lang import _ diff --git a/anki/history.py b/anki/history.py index 10cb9847e..94d92bb46 100644 --- a/anki/history.py +++ b/anki/history.py @@ -2,17 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -History - keeping a record of all reviews -========================================== - -If users run 'check db', duplicate records will be inserted into the DB - I -really should have used the time stamp as the key. You can remove them by -keeping the lowest id for any given timestamp. -""" - -__docformat__ = 'restructuredtext' - import time from anki.db import * diff --git a/anki/importing/__init__.py b/anki/importing/__init__.py index ad8376f02..24a94d15e 100644 --- a/anki/importing/__init__.py +++ b/anki/importing/__init__.py @@ -11,8 +11,6 @@ may be extended by calling code if a file has more fields. To ignore a particular FieldModel, replace it with None. A special number 0 donates a tags field. The same field model should not occur more than once.""" -__docformat__ = 'restructuredtext' - import time from anki.cards import cardsTable from anki.facts import factsTable, fieldsTable diff --git a/anki/importing/anki10.py b/anki/importing/anki10.py index cb0f33b9b..d2b2983ce 100644 --- a/anki/importing/anki10.py +++ b/anki/importing/anki10.py @@ -2,12 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Importing Anki 0.9+ decks -========================== -""" -__docformat__ = 'restructuredtext' - from anki import DeckStorage from anki.importing import Importer from anki.sync import SyncClient, SyncServer, copyLocalMedia diff --git a/anki/importing/csvfile.py b/anki/importing/csvfile.py index db0ed611e..b75c50489 100644 --- a/anki/importing/csvfile.py +++ b/anki/importing/csvfile.py @@ -2,12 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Importing CSV/TSV files -======================== -""" -__docformat__ = 'restructuredtext' - import codecs, csv, re from anki.importing import Importer, ForeignCard from anki.lang import _ diff --git a/anki/importing/mnemosyne10.py b/anki/importing/mnemosyne10.py index a6dcb4362..820f439cd 100644 --- a/anki/importing/mnemosyne10.py +++ b/anki/importing/mnemosyne10.py @@ -2,12 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Importing Mnemosyne 1.0 decks -============================== -""" -__docformat__ = 'restructuredtext' - import sys, pickle, time, re from anki.importing import Importer, ForeignCard from anki.errors import * diff --git a/anki/importing/supermemo_xml.py b/anki/importing/supermemo_xml.py index 09086cc18..2db8c2997 100644 --- a/anki/importing/supermemo_xml.py +++ b/anki/importing/supermemo_xml.py @@ -2,12 +2,6 @@ # Copyright: petr.michalec@gmail.com # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Importing Supermemo XML decks -============================== -""" -__docformat__ = 'restructuredtext' - import sys from anki.importing import Importer, ForeignCard @@ -24,16 +18,16 @@ import re, unicodedata, time from anki.deck import Deck class SmartDict(dict): - """ + """ See http://www.peterbe.com/plog/SmartDict Copyright 2005, Peter Bengtsson, peter@fry-it.com - A smart dict can be instanciated either from a pythonic dict - or an instance object (eg. SQL recordsets) but it ensures that you can + A smart dict can be instanciated either from a pythonic dict + or an instance object (eg. SQL recordsets) but it ensures that you can do all the convenient lookups such as x.first_name, x['first_name'] or x.get('first_name'). """ - + def __init__(self, *a, **kw): if a: if type(a[0]) is DictType: @@ -42,10 +36,10 @@ class SmartDict(dict): kw.update(a[0].__dict__) elif hasattr(a[0], '__class__') and a[0].__class__.__name__=='SmartDict': kw.update(a[0].__dict__) - + dict.__init__(self, **kw) self.__dict__ = self - + class SuperMemoElement(SmartDict): "SmartDict wrapper to store SM Element data" @@ -72,14 +66,14 @@ class SuperMemoElement(SmartDict): class SupermemoXmlImporter(Importer): """ Supermemo XML export's to Anki parser. - Goes through a SM collection and fetch all elements. + Goes through a SM collection and fetch all elements. My SM collection was a big mess where topics and items were mixed. I was unable to parse my content in a regular way like for loop on minidom.getElementsByTagName() etc. My collection had also an limitation, topics were splited into branches with max 100 items on each. Learning themes were in deep structure. I wanted to have - full title on each element to be stored in tags. + full title on each element to be stored in tags. Code should be upgrade to support importing of SM2006 exports. """ @@ -133,13 +127,13 @@ class SupermemoXmlImporter(Importer): def _decode_htmlescapes(self,s): """Unescape HTML code.""" #In case of bad formated html you can import MinimalSoup etc.. see btflsoup source code - from BeautifulSoup import BeautifulStoneSoup as btflsoup + from BeautifulSoup import BeautifulStoneSoup as btflsoup #my sm2004 also ecaped & char in escaped sequences. - s = re.sub(u'&',u'&',s) + s = re.sub(u'&',u'&',s) #unescaped solitary chars < or > that were ok for minidom confuse btfl soup - s = re.sub(u'>',u'>',s) - s = re.sub(u'<',u'<',s) + s = re.sub(u'>',u'>',s) + s = re.sub(u'<',u'<',s) return unicode(btflsoup(s,convertEntities=btflsoup.HTML_ENTITIES )) @@ -148,7 +142,7 @@ class SupermemoXmlImporter(Importer): """Note: This method is not used, BeautifulSoup does better job. """ - if self._unescape_trtable == None: + if self._unescape_trtable == None: self._unescape_trtable = ( ('€',u'€'), (' ',u' '), ('!',u'!'), ('"',u'"'), ('#',u'#'), ('$',u'$'), ('%',u'%'), ('&',u'&'), (''',u"'"), ('(',u'('), (')',u')'), ('*',u'*'), ('+',u'+'), (',',u','), ('-',u'-'), ('.',u'.'), ('/',u'/'), ('0',u'0'), @@ -195,7 +189,7 @@ class SupermemoXmlImporter(Importer): ('Ū',u'Ū'), ('ū',u'ū'), ('Ŭ',u'Ŭ'), ('ŭ',u'ŭ'), ('Ů',u'Ů'), ('ů',u'ů'), ('Ű',u'Ű'), ('ű',u'ű'), ('Ų',u'Ų'), ('ų',u'ų'), ('Ŵ',u'Ŵ'), ('ŵ',u'ŵ'), ('Ŷ',u'Ŷ'), ('ŷ',u'ŷ'), ('Ÿ',u'Ÿ'), ('Ź',u'Ź'), ('ź',u'ź'), ('Ż',u'Ż'), ('ż',u'ż'), ('Ž',u'Ž'), ('ž',u'ž'), ('ſ',u'ſ'), - ) + ) #m = re.match() @@ -213,7 +207,7 @@ class SupermemoXmlImporter(Importer): self.logger(u'Parsing started.') self.parse() self.logger(u'Parsing done.') - + # Return imported cards return self.cards @@ -236,8 +230,8 @@ class SupermemoXmlImporter(Importer): # pre-process scheduling data tLastrep = time.mktime(time.strptime(item.LastRepetition, '%d.%m.%Y')) tToday = time.time() - - # convert learning data + + # convert learning data if not self.META.resetLearningData: # migration of LearningData algorithm card.interval = item.Interval @@ -270,7 +264,7 @@ class SupermemoXmlImporter(Importer): if tTaggTitle or self.META.tagAllTopics: # normalize - remove diacritic punctuation from unicode chars to ascii item.lTitle = [ self._unicode2ascii(topic) for topic in item.lTitle] - + # Transfrom xyz / aaa / bbb / ccc on Title path to Tag xyzAaaBbbCcc # clean things like [999] or [111-2222] from title path, example: xyz / [1000-1200] zyx / xyz # clean whitespaces @@ -302,27 +296,27 @@ class SupermemoXmlImporter(Importer): # OPEN AND LOAD - def openAnything(self,source): + def openAnything(self,source): "Open any source / actually only openig of files is used" if source == "-": return sys.stdin # try to open with urllib (if source is http, ftp, or file URL) - import urllib - try: - return urllib.urlopen(source) - except (IOError, OSError): - pass + import urllib + try: + return urllib.urlopen(source) + except (IOError, OSError): + pass # try to open with native open function (if source is pathname) - try: - return open(source) - except (IOError, OSError): - pass + try: + return open(source) + except (IOError, OSError): + pass # treat source as string - import StringIO + import StringIO return StringIO.StringIO(str(source)) def loadSource(self, source): @@ -336,7 +330,7 @@ class SupermemoXmlImporter(Importer): # PARSE - def parse(self, node=None): + def parse(self, node=None): "Parse method - parses document elements" if node==None and self.xmldoc<>None: @@ -349,12 +343,12 @@ class SupermemoXmlImporter(Importer): else: self.logger(u'No handler for method %s' % _method, level=3) - def parse_Document(self, node): + def parse_Document(self, node): "Parse XML document" self.parse(node.documentElement) - def parse_Element(self, node): + def parse_Element(self, node): "Parse XML element" _method = "do_%s" % node.tagName @@ -365,7 +359,7 @@ class SupermemoXmlImporter(Importer): self.logger(u'No handler for method %s' % _method, level=3) #print traceback.print_exc() - def parse_Text(self, node): + def parse_Text(self, node): "Parse text inside elements. Text is stored into local buffer." text = node.data @@ -379,12 +373,12 @@ class SupermemoXmlImporter(Importer): # DO - def do_SuperMemoCollection(self, node): + def do_SuperMemoCollection(self, node): "Process SM Collection" for child in node.childNodes: self.parse(child) - def do_SuperMemoElement(self, node): + def do_SuperMemoElement(self, node): "Process SM Element (Type - Title,Topics)" self.logger('='*45, level=3) @@ -407,7 +401,7 @@ class SupermemoXmlImporter(Importer): # if smel.Lapses != None and smel.Interval != None and smel.Question != None and smel.Answer != None: if smel.Title == None and smel.Question != None and smel.Answer != None: if smel.Answer.strip() !='' and smel.Question.strip() !='': - + # migrate only memorized otherway skip/continue if self.META.onlyMemorizedItems and not(int(smel.Interval) > 0): self.logger(u'Element skiped \t- not memorized ...', level=3) @@ -425,7 +419,7 @@ class SupermemoXmlImporter(Importer): else: - # now we know that item was topic + # now we know that item was topic # parseing of whole node is now finished # test if it's really topic @@ -434,31 +428,31 @@ class SupermemoXmlImporter(Importer): t = self.cntMeta['title'].pop() self.logger(u'End of topic \t- %s' % (t), level=2) - def do_Content(self, node): + def do_Content(self, node): "Process SM element Content" for child in node.childNodes: if hasattr(child,'tagName') and child.firstChild != None: self.cntElm[-1][child.tagName]=child.firstChild.data - def do_LearningData(self, node): + def do_LearningData(self, node): "Process SM element LearningData" - + for child in node.childNodes: if hasattr(child,'tagName') and child.firstChild != None: self.cntElm[-1][child.tagName]=child.firstChild.data # It's being processed in do_Content now - #def do_Question(self, node): + #def do_Question(self, node): # for child in node.childNodes: self.parse(child) # self.cntElm[-1][node.tagName]=self.cntBuf.pop() # It's being processed in do_Content now - #def do_Answer(self, node): + #def do_Answer(self, node): # for child in node.childNodes: self.parse(child) # self.cntElm[-1][node.tagName]=self.cntBuf.pop() - def do_Title(self, node): + def do_Title(self, node): "Process SM element Title" t = self._decode_htmlescapes(node.firstChild.data) @@ -468,7 +462,7 @@ class SupermemoXmlImporter(Importer): self.logger(u'Start of topic \t- ' + u" / ".join(self.cntMeta['title']), level=2) - def do_Type(self, node): + def do_Type(self, node): "Process SM element Type" if len(self.cntBuf) >=1 : diff --git a/anki/importing/wcu.py b/anki/importing/wcu.py index 16a8e2baa..e281821ef 100644 --- a/anki/importing/wcu.py +++ b/anki/importing/wcu.py @@ -2,12 +2,6 @@ # Author Chris Aakre # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Importing WCU files -==================== -""" -__docformat__ = 'restructuredtext' - import codecs from anki.importing import Importer, ForeignCard from anki.lang import _ diff --git a/anki/lang.py b/anki/lang.py index ff24518d0..578c34636 100644 --- a/anki/lang.py +++ b/anki/lang.py @@ -2,12 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Internationalisation -===================== -""" -__docformat__ = 'restructuredtext' - import os, sys import gettext import threading diff --git a/anki/latex.py b/anki/latex.py index 636f9a3e6..5e1039309 100644 --- a/anki/latex.py +++ b/anki/latex.py @@ -2,12 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Latex support -============================== -""" -__docformat__ = 'restructuredtext' - import re, tempfile, os, sys, shutil, cgi, subprocess from anki.utils import genID, checksum, call from anki.hooks import addHook diff --git a/anki/media.py b/anki/media.py index 35cc17a5c..ebe16b823 100644 --- a/anki/media.py +++ b/anki/media.py @@ -2,12 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Media support -==================== -""" -__docformat__ = 'restructuredtext' - import os, shutil, re, urllib2, time, tempfile, unicodedata, urllib from anki.db import * from anki.utils import checksum, genID diff --git a/anki/models.py b/anki/models.py index 368805615..3a9bf825b 100644 --- a/anki/models.py +++ b/anki/models.py @@ -2,16 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Model - define the way in which facts are added and shown -========================================================== - -- Field models -- Card models -- Models - -""" - import time, re from sqlalchemy.ext.orderinglist import ordering_list from anki.db import * diff --git a/anki/sound.py b/anki/sound.py index c2b688d48..3c275e4d1 100644 --- a/anki/sound.py +++ b/anki/sound.py @@ -2,12 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Sound support -============================== -""" -__docformat__ = 'restructuredtext' - import re, sys, threading, time, subprocess, os, signal, errno, atexit import tempfile, shutil from anki.hooks import addHook, runHook diff --git a/anki/stats.py b/anki/stats.py index c1ed61be5..4f97a6f04 100644 --- a/anki/stats.py +++ b/anki/stats.py @@ -2,12 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Statistical tracking and reports -================================= -""" -__docformat__ = 'restructuredtext' - # we track statistics over the life of the deck, and per-day STATS_LIFE = 0 STATS_DAY = 1 diff --git a/anki/sync.py b/anki/sync.py index a9ef50be9..c072d4fc4 100644 --- a/anki/sync.py +++ b/anki/sync.py @@ -2,15 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Synchronisation -============================== - -Support for keeping two decks synchronized. Both local syncing and syncing -over HTTP are supported. -""" -__docformat__ = 'restructuredtext' - import zlib, re, urllib, urllib2, socket, simplejson, time, shutil import os, base64, httplib, sys, tempfile, httplib, types from datetime import date diff --git a/anki/tags.py b/anki/tags.py index 03bbf25c5..8f75432c3 100644 --- a/anki/tags.py +++ b/anki/tags.py @@ -2,13 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Tags -==================== -""" -__docformat__ = 'restructuredtext' - - from anki.db import * #src 0 = fact diff --git a/anki/utils.py b/anki/utils.py index c8752c7af..f9e570543 100644 --- a/anki/utils.py +++ b/anki/utils.py @@ -2,12 +2,6 @@ # Copyright: Damien Elmes # License: GNU GPL, version 3 or later; http://www.gnu.org/copyleft/gpl.html -"""\ -Miscellaneous utilities -============================== -""" -__docformat__ = 'restructuredtext' - import re, os, random, time, types, math, htmlentitydefs, subprocess try: