mirror of
https://github.com/ankitects/anki.git
synced 2025-09-18 22:12:21 -04:00
use isort to tidy up imports
This commit is contained in:
parent
638a8515bc
commit
c1587254f4
82 changed files with 545 additions and 457 deletions
2
.isort.cfg
Normal file
2
.isort.cfg
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
[settings]
|
||||||
|
skip=aqt/forms
|
14
Makefile
14
Makefile
|
@ -108,7 +108,7 @@ run: build
|
||||||
######################
|
######################
|
||||||
|
|
||||||
.PHONY: check
|
.PHONY: check
|
||||||
check: mypy pytest pylint pytype checkpretty
|
check: mypy pyimports pytest pylint pytype checkpretty
|
||||||
|
|
||||||
# Checking python
|
# Checking python
|
||||||
######################
|
######################
|
||||||
|
@ -131,11 +131,21 @@ PYCHECKDEPS := $(BUILDDEPS) $(shell find anki aqt -name '*.py' | grep -v buildha
|
||||||
pytype --config pytype.conf
|
pytype --config pytype.conf
|
||||||
touch $@
|
touch $@
|
||||||
|
|
||||||
.PHONY: mypy pytest pylint pytype
|
.build/pyimports: $(PYCHECKDEPS)
|
||||||
|
isort -rc anki aqt --check # if this fails, run 'make fixpyimports'
|
||||||
|
touch $@
|
||||||
|
|
||||||
|
.PHONY: mypy pytest pylint pytype pyimports fixpyimports
|
||||||
mypy: .build/mypy
|
mypy: .build/mypy
|
||||||
pytest: .build/pytest
|
pytest: .build/pytest
|
||||||
pylint: .build/pylint
|
pylint: .build/pylint
|
||||||
pytype: .build/pytype
|
pytype: .build/pytype
|
||||||
|
pyimports: .build/pyimports
|
||||||
|
|
||||||
|
.PHONY: fixpyimports
|
||||||
|
|
||||||
|
fixpyimports:
|
||||||
|
isort -rc anki aqt
|
||||||
|
|
||||||
# Checking typescript
|
# Checking typescript
|
||||||
######################
|
######################
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
from anki.storage import Collection
|
||||||
|
|
||||||
if sys.version_info[0] < 3 or sys.version_info[1] < 5:
|
if sys.version_info[0] < 3 or sys.version_info[1] < 5:
|
||||||
raise Exception("Anki requires Python 3.5+")
|
raise Exception("Anki requires Python 3.5+")
|
||||||
|
|
||||||
|
@ -11,5 +13,4 @@ if sys.getfilesystemencoding().lower() in ("ascii", "ansi_x3.4-1968"):
|
||||||
raise Exception("Anki requires a UTF-8 locale.")
|
raise Exception("Anki requires a UTF-8 locale.")
|
||||||
|
|
||||||
version="2.1.17" # build scripts grep this line, so preserve formatting
|
version="2.1.17" # build scripts grep this line, so preserve formatting
|
||||||
from anki.storage import Collection
|
|
||||||
__all__ = ["Collection"]
|
__all__ = ["Collection"]
|
||||||
|
|
|
@ -2,13 +2,13 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
import pprint
|
import pprint
|
||||||
|
|
||||||
import time
|
import time
|
||||||
from anki.hooks import runHook
|
from typing import Any, Dict, Optional
|
||||||
from anki.utils import intTime, timestampID, joinFields
|
|
||||||
from anki.consts import *
|
from anki.consts import *
|
||||||
|
from anki.hooks import runHook
|
||||||
from anki.notes import Note
|
from anki.notes import Note
|
||||||
from typing import Any, Optional, Dict
|
from anki.utils import intTime, joinFields, timestampID
|
||||||
|
|
||||||
# Cards
|
# Cards
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
|
@ -2,38 +2,40 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import pprint
|
|
||||||
import re
|
|
||||||
import time
|
|
||||||
import os
|
|
||||||
import random
|
|
||||||
import stat
|
|
||||||
import datetime
|
|
||||||
import copy
|
import copy
|
||||||
import traceback
|
import datetime
|
||||||
import json
|
import json
|
||||||
|
import os
|
||||||
|
import pprint
|
||||||
|
import random
|
||||||
|
import re
|
||||||
|
import stat
|
||||||
|
import time
|
||||||
|
import traceback
|
||||||
|
from typing import Any, Dict, List, Optional, Tuple, Union
|
||||||
|
|
||||||
from anki.lang import _, ngettext
|
|
||||||
from anki.utils import ids2str, fieldChecksum, \
|
|
||||||
intTime, splitFields, joinFields, maxID, devMode, stripHTMLMedia
|
|
||||||
from anki.hooks import runFilter, runHook
|
|
||||||
from anki.models import ModelManager
|
|
||||||
from anki.media import MediaManager
|
|
||||||
from anki.decks import DeckManager
|
|
||||||
from anki.tags import TagManager
|
|
||||||
from anki.consts import *
|
|
||||||
from anki.errors import AnkiError
|
|
||||||
from anki.sound import stripSounds
|
|
||||||
import anki.latex # sets up hook
|
|
||||||
import anki.cards
|
import anki.cards
|
||||||
|
import anki.find
|
||||||
|
import anki.latex # sets up hook
|
||||||
import anki.notes
|
import anki.notes
|
||||||
import anki.template
|
import anki.template
|
||||||
import anki.find
|
|
||||||
from typing import Any, List, Optional, Tuple, Union, Dict
|
|
||||||
|
|
||||||
from anki.cards import Card
|
from anki.cards import Card
|
||||||
|
from anki.consts import *
|
||||||
from anki.db import DB
|
from anki.db import DB
|
||||||
|
from anki.decks import DeckManager
|
||||||
|
from anki.errors import AnkiError
|
||||||
|
from anki.hooks import runFilter, runHook
|
||||||
|
from anki.lang import _, ngettext
|
||||||
|
from anki.media import MediaManager
|
||||||
|
from anki.models import ModelManager
|
||||||
from anki.notes import Note
|
from anki.notes import Note
|
||||||
|
from anki.sched import Scheduler as V1Scheduler
|
||||||
|
from anki.schedv2 import Scheduler as V2Scheduler
|
||||||
|
from anki.sound import stripSounds
|
||||||
|
from anki.tags import TagManager
|
||||||
|
from anki.utils import (devMode, fieldChecksum, ids2str, intTime, joinFields,
|
||||||
|
maxID, splitFields, stripHTMLMedia)
|
||||||
|
|
||||||
defaultConf = {
|
defaultConf = {
|
||||||
# review options
|
# review options
|
||||||
'activeDecks': [1],
|
'activeDecks': [1],
|
||||||
|
@ -59,8 +61,6 @@ def timezoneOffset() -> int:
|
||||||
else:
|
else:
|
||||||
return time.timezone//60
|
return time.timezone//60
|
||||||
|
|
||||||
from anki.sched import Scheduler as V1Scheduler
|
|
||||||
from anki.schedv2 import Scheduler as V2Scheduler
|
|
||||||
# this is initialized by storage.Collection
|
# this is initialized by storage.Collection
|
||||||
class _Collection:
|
class _Collection:
|
||||||
db: Optional[DB]
|
db: Optional[DB]
|
||||||
|
|
|
@ -2,9 +2,10 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from anki.lang import _
|
|
||||||
from typing import Any, Dict
|
from typing import Any, Dict
|
||||||
|
|
||||||
|
from anki.lang import _
|
||||||
|
|
||||||
# whether new cards should be mixed with reviews, or shown first or last
|
# whether new cards should be mixed with reviews, or shown first or last
|
||||||
NEW_CARDS_DISTRIBUTE = 0
|
NEW_CARDS_DISTRIBUTE = 0
|
||||||
NEW_CARDS_LAST = 1
|
NEW_CARDS_LAST = 1
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
|
from sqlite3 import Cursor
|
||||||
from sqlite3 import dbapi2 as sqlite, Cursor
|
from sqlite3 import dbapi2 as sqlite
|
||||||
from typing import Any, List
|
from typing import Any, List
|
||||||
|
|
||||||
DBError = sqlite.Error
|
DBError = sqlite.Error
|
||||||
|
|
|
@ -2,16 +2,17 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import copy, operator
|
import copy
|
||||||
import unicodedata
|
|
||||||
import json
|
import json
|
||||||
|
import operator
|
||||||
|
import unicodedata
|
||||||
|
from typing import Any, Dict, List, Optional, Set, Tuple, Union
|
||||||
|
|
||||||
from anki.utils import intTime, ids2str
|
|
||||||
from anki.hooks import runHook
|
|
||||||
from anki.consts import *
|
from anki.consts import *
|
||||||
from anki.lang import _
|
|
||||||
from anki.errors import DeckRenameError
|
from anki.errors import DeckRenameError
|
||||||
from typing import Any, Dict, List, Optional, Tuple, Set, Union
|
from anki.hooks import runHook
|
||||||
|
from anki.lang import _
|
||||||
|
from anki.utils import ids2str, intTime
|
||||||
|
|
||||||
# fixmes:
|
# fixmes:
|
||||||
# - make sure users can't set grad interval < 1
|
# - make sure users can't set grad interval < 1
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
|
@ -2,18 +2,24 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import re, os, zipfile, shutil, unicodedata
|
import json
|
||||||
import json, typing
|
import os
|
||||||
|
import re
|
||||||
from anki.lang import _
|
import shutil
|
||||||
from anki.utils import ids2str, splitFields, namedtmp, stripHTML
|
import typing
|
||||||
from anki.hooks import runHook
|
import unicodedata
|
||||||
from anki.storage import Collection
|
import zipfile
|
||||||
from typing import Any, Dict, List, Tuple
|
|
||||||
|
|
||||||
from io import BufferedWriter
|
from io import BufferedWriter
|
||||||
from anki.collection import _Collection
|
from typing import Any, Dict, List, Tuple
|
||||||
from zipfile import ZipFile
|
from zipfile import ZipFile
|
||||||
|
|
||||||
|
from anki.collection import _Collection
|
||||||
|
from anki.hooks import runHook
|
||||||
|
from anki.lang import _
|
||||||
|
from anki.storage import Collection
|
||||||
|
from anki.utils import ids2str, namedtmp, splitFields, stripHTML
|
||||||
|
|
||||||
|
|
||||||
class Exporter:
|
class Exporter:
|
||||||
includeHTML: typing.Union[bool, None] = None
|
includeHTML: typing.Union[bool, None] = None
|
||||||
|
|
||||||
|
|
|
@ -5,12 +5,12 @@
|
||||||
import re
|
import re
|
||||||
import sre_constants
|
import sre_constants
|
||||||
import unicodedata
|
import unicodedata
|
||||||
|
from typing import Any, List, Optional, Set, Tuple
|
||||||
|
|
||||||
from anki.utils import ids2str, splitFields, joinFields, intTime, fieldChecksum, stripHTMLMedia
|
|
||||||
from anki.consts import *
|
from anki.consts import *
|
||||||
from anki.hooks import *
|
from anki.hooks import *
|
||||||
from typing import Any, List, Optional, Tuple, Set
|
from anki.utils import (fieldChecksum, ids2str, intTime, joinFields,
|
||||||
|
splitFields, stripHTMLMedia)
|
||||||
|
|
||||||
# Find
|
# Find
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
|
@ -13,8 +13,9 @@ If you call wrap() with pos='around', the original function will not be called
|
||||||
automatically but can be called with _old().
|
automatically but can be called with _old().
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from typing import Any, Callable, Dict, List
|
||||||
|
|
||||||
import decorator
|
import decorator
|
||||||
from typing import List, Any, Callable, Dict
|
|
||||||
|
|
||||||
# Hooks
|
# Hooks
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
|
@ -2,12 +2,12 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from anki.importing.csvfile import TextImporter
|
|
||||||
from anki.importing.apkg import AnkiPackageImporter
|
|
||||||
from anki.importing.anki2 import Anki2Importer
|
from anki.importing.anki2 import Anki2Importer
|
||||||
from anki.importing.supermemo_xml import SupermemoXmlImporter
|
from anki.importing.apkg import AnkiPackageImporter
|
||||||
|
from anki.importing.csvfile import TextImporter
|
||||||
from anki.importing.mnemo import MnemosyneImporter
|
from anki.importing.mnemo import MnemosyneImporter
|
||||||
from anki.importing.pauker import PaukerImporter
|
from anki.importing.pauker import PaukerImporter
|
||||||
|
from anki.importing.supermemo_xml import SupermemoXmlImporter
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
|
||||||
Importers = (
|
Importers = (
|
||||||
|
|
|
@ -4,12 +4,13 @@
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import unicodedata
|
import unicodedata
|
||||||
from anki.storage import Collection
|
from typing import Any, Dict, List, Optional, Tuple
|
||||||
from anki.utils import intTime, splitFields, joinFields
|
|
||||||
|
from anki.collection import _Collection
|
||||||
from anki.importing.base import Importer
|
from anki.importing.base import Importer
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
from typing import Any, Optional, Dict, Tuple, List
|
from anki.storage import Collection
|
||||||
from anki.collection import _Collection
|
from anki.utils import intTime, joinFields, splitFields
|
||||||
|
|
||||||
GUID = 1
|
GUID = 1
|
||||||
MID = 2
|
MID = 2
|
||||||
|
|
|
@ -2,13 +2,16 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import zipfile, os
|
|
||||||
import unicodedata
|
|
||||||
import json
|
import json
|
||||||
from anki.utils import tmpfile
|
import os
|
||||||
from anki.importing.anki2 import Anki2Importer
|
import unicodedata
|
||||||
|
import zipfile
|
||||||
from typing import Any, Dict, Optional
|
from typing import Any, Dict, Optional
|
||||||
|
|
||||||
|
from anki.importing.anki2 import Anki2Importer
|
||||||
|
from anki.utils import tmpfile
|
||||||
|
|
||||||
|
|
||||||
class AnkiPackageImporter(Anki2Importer):
|
class AnkiPackageImporter(Anki2Importer):
|
||||||
nameToNum: Dict[str, str]
|
nameToNum: Dict[str, str]
|
||||||
zip: Optional[zipfile.ZipFile]
|
zip: Optional[zipfile.ZipFile]
|
||||||
|
|
|
@ -2,9 +2,10 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from anki.utils import maxID
|
from typing import Any, List, Optional
|
||||||
from typing import Any, Optional, List
|
|
||||||
from anki.collection import _Collection
|
from anki.collection import _Collection
|
||||||
|
from anki.utils import maxID
|
||||||
|
|
||||||
# Base importer
|
# Base importer
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
|
@ -4,12 +4,13 @@
|
||||||
|
|
||||||
import csv
|
import csv
|
||||||
import re
|
import re
|
||||||
|
from typing import Any, List, Optional, TextIO, Union
|
||||||
from anki.importing.noteimp import NoteImporter, ForeignNote
|
|
||||||
from anki.lang import _
|
|
||||||
from typing import List, Optional, Any, TextIO, Union
|
|
||||||
|
|
||||||
from anki.collection import _Collection
|
from anki.collection import _Collection
|
||||||
|
from anki.importing.noteimp import ForeignNote, NoteImporter
|
||||||
|
from anki.lang import _
|
||||||
|
|
||||||
|
|
||||||
class TextImporter(NoteImporter):
|
class TextImporter(NoteImporter):
|
||||||
|
|
||||||
needDelimiter = True
|
needDelimiter = True
|
||||||
|
|
|
@ -2,11 +2,14 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import time, re
|
import re
|
||||||
|
import time
|
||||||
|
|
||||||
from anki.db import DB
|
from anki.db import DB
|
||||||
from anki.importing.noteimp import NoteImporter, ForeignNote, ForeignCard
|
from anki.importing.noteimp import ForeignCard, ForeignNote, NoteImporter
|
||||||
|
from anki.lang import _, ngettext
|
||||||
from anki.stdmodels import addBasicModel, addClozeModel
|
from anki.stdmodels import addBasicModel, addClozeModel
|
||||||
from anki.lang import ngettext, _
|
|
||||||
|
|
||||||
class MnemosyneImporter(NoteImporter):
|
class MnemosyneImporter(NoteImporter):
|
||||||
|
|
||||||
|
|
|
@ -3,17 +3,15 @@
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import html
|
import html
|
||||||
|
|
||||||
import unicodedata
|
import unicodedata
|
||||||
|
from typing import Any, Dict, List, Optional, Tuple, Union
|
||||||
|
|
||||||
from anki.consts import NEW_CARDS_RANDOM, STARTING_FACTOR
|
|
||||||
from anki.lang import _
|
|
||||||
from anki.utils import fieldChecksum, guid64, timestampID, \
|
|
||||||
joinFields, intTime, splitFields
|
|
||||||
from anki.importing.base import Importer
|
|
||||||
from anki.lang import ngettext
|
|
||||||
from typing import Any, List, Optional, Tuple, Dict, Union
|
|
||||||
from anki.collection import _Collection
|
from anki.collection import _Collection
|
||||||
|
from anki.consts import NEW_CARDS_RANDOM, STARTING_FACTOR
|
||||||
|
from anki.importing.base import Importer
|
||||||
|
from anki.lang import _, ngettext
|
||||||
|
from anki.utils import (fieldChecksum, guid64, intTime, joinFields,
|
||||||
|
splitFields, timestampID)
|
||||||
|
|
||||||
# Stores a list of fields, tags and deck
|
# Stores a list of fields, tags and deck
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
|
@ -2,9 +2,14 @@
|
||||||
# Copyright: Andreas Klauer <Andreas.Klauer@metamorpher.de>
|
# Copyright: Andreas Klauer <Andreas.Klauer@metamorpher.de>
|
||||||
# License: BSD-3
|
# License: BSD-3
|
||||||
|
|
||||||
import gzip, math, random, time, html
|
import gzip
|
||||||
|
import html
|
||||||
|
import math
|
||||||
|
import random
|
||||||
|
import time
|
||||||
import xml.etree.ElementTree as ET
|
import xml.etree.ElementTree as ET
|
||||||
from anki.importing.noteimp import NoteImporter, ForeignNote, ForeignCard
|
|
||||||
|
from anki.importing.noteimp import ForeignCard, ForeignNote, NoteImporter
|
||||||
from anki.stdmodels import addForwardReverse
|
from anki.stdmodels import addForwardReverse
|
||||||
|
|
||||||
ONE_DAY = 60*60*24
|
ONE_DAY = 60*60*24
|
||||||
|
|
|
@ -3,16 +3,17 @@
|
||||||
# License: GNU GPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU GPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
# pytype: disable=attribute-error
|
# pytype: disable=attribute-error
|
||||||
|
|
||||||
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
import time
|
||||||
from anki.stdmodels import addBasicModel
|
import unicodedata
|
||||||
from anki.importing.noteimp import NoteImporter, ForeignNote, ForeignCard
|
|
||||||
from anki.lang import _
|
|
||||||
from anki.lang import ngettext
|
|
||||||
|
|
||||||
from xml.dom import minidom
|
|
||||||
from string import capwords
|
from string import capwords
|
||||||
import re, unicodedata, time
|
from xml.dom import minidom
|
||||||
|
|
||||||
|
from anki.importing.noteimp import ForeignCard, ForeignNote, NoteImporter
|
||||||
|
from anki.lang import _, ngettext
|
||||||
|
from anki.stdmodels import addBasicModel
|
||||||
|
|
||||||
|
|
||||||
class SmartDict(dict):
|
class SmartDict(dict):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -2,8 +2,10 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import os, sys, re
|
|
||||||
import gettext
|
import gettext
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
import threading
|
import threading
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
|
|
|
@ -2,11 +2,15 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import re, os, shutil, html
|
import html
|
||||||
from anki.utils import checksum, call, namedtmp, tmpdir, isMac, stripHTML
|
import os
|
||||||
|
import re
|
||||||
|
import shutil
|
||||||
|
from typing import Any, Dict, List, Optional, Union
|
||||||
|
|
||||||
from anki.hooks import addHook
|
from anki.hooks import addHook
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
from typing import Any, Dict, List, Optional, Union
|
from anki.utils import call, checksum, isMac, namedtmp, stripHTML, tmpdir
|
||||||
|
|
||||||
pngCommands = [
|
pngCommands = [
|
||||||
["latex", "-interaction=nonstopmode", "tmp.tex"],
|
["latex", "-interaction=nonstopmode", "tmp.tex"],
|
||||||
|
|
|
@ -2,24 +2,25 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
import io
|
import io
|
||||||
import re
|
|
||||||
import traceback
|
|
||||||
import urllib.request, urllib.parse, urllib.error
|
|
||||||
import unicodedata
|
|
||||||
import sys
|
|
||||||
import zipfile
|
|
||||||
import pathlib
|
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
import pathlib
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
import traceback
|
||||||
|
import unicodedata
|
||||||
|
import urllib.error
|
||||||
|
import urllib.parse
|
||||||
|
import urllib.request
|
||||||
|
import zipfile
|
||||||
|
from typing import Any, Callable, List, Optional, Tuple, Union
|
||||||
|
|
||||||
from anki.utils import checksum, isWin, isMac
|
|
||||||
from anki.db import DB, DBError
|
|
||||||
from anki.consts import *
|
from anki.consts import *
|
||||||
from anki.latex import mungeQA
|
from anki.db import DB, DBError
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
from typing import Any, List, Optional, Tuple
|
from anki.latex import mungeQA
|
||||||
|
from anki.utils import checksum, isMac, isWin
|
||||||
|
|
||||||
from typing import Callable, Union
|
|
||||||
|
|
||||||
class MediaManager:
|
class MediaManager:
|
||||||
|
|
||||||
|
|
|
@ -2,14 +2,16 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import copy, re, json
|
import copy
|
||||||
from anki.utils import intTime, joinFields, splitFields, ids2str,\
|
import json
|
||||||
checksum
|
import re
|
||||||
from anki.lang import _
|
import time
|
||||||
|
from typing import Any, Callable, Dict, List, Optional, Tuple, Union
|
||||||
|
|
||||||
from anki.consts import *
|
from anki.consts import *
|
||||||
from anki.hooks import runHook
|
from anki.hooks import runHook
|
||||||
import time
|
from anki.lang import _
|
||||||
from typing import Tuple, Union, Any, Callable, Dict, List, Optional
|
from anki.utils import checksum, ids2str, intTime, joinFields, splitFields
|
||||||
|
|
||||||
# Models
|
# Models
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
23
anki/mpv.py
23
anki/mpv.py
|
@ -25,22 +25,23 @@
|
||||||
#
|
#
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
import sys
|
import inspect
|
||||||
import os
|
|
||||||
import time
|
|
||||||
import json
|
import json
|
||||||
import socket
|
import os
|
||||||
import select
|
import select
|
||||||
|
import socket
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
import threading
|
import threading
|
||||||
import subprocess
|
import time
|
||||||
import inspect
|
from distutils.spawn import \
|
||||||
|
find_executable # pylint: disable=import-error,no-name-in-module
|
||||||
from distutils.spawn import find_executable # pylint: disable=import-error,no-name-in-module
|
from queue import Empty, Full, Queue
|
||||||
from queue import Queue, Empty, Full
|
|
||||||
|
|
||||||
from typing import Dict, Optional
|
from typing import Dict, Optional
|
||||||
|
|
||||||
|
from anki.utils import isWin
|
||||||
|
|
||||||
|
|
||||||
class MPVError(Exception):
|
class MPVError(Exception):
|
||||||
pass
|
pass
|
||||||
|
@ -57,7 +58,6 @@ class MPVCommandError(MPVError):
|
||||||
class MPVTimeoutError(MPVError):
|
class MPVTimeoutError(MPVError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
from anki.utils import isWin
|
|
||||||
if isWin:
|
if isWin:
|
||||||
# pylint: disable=import-error
|
# pylint: disable=import-error
|
||||||
import win32file, win32pipe, pywintypes, winerror # pytype: disable=import-error
|
import win32file, win32pipe, pywintypes, winerror # pytype: disable=import-error
|
||||||
|
@ -569,4 +569,3 @@ class MPV(MPVBase):
|
||||||
"""Set the value of property `name`.
|
"""Set the value of property `name`.
|
||||||
"""
|
"""
|
||||||
return self.command("set_property", name, value)
|
return self.command("set_property", name, value)
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,11 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from anki.utils import fieldChecksum, intTime, \
|
from typing import Any, List, Optional, Tuple
|
||||||
joinFields, splitFields, stripHTMLMedia, timestampID, guid64
|
|
||||||
from typing import List, Tuple
|
from anki.utils import (fieldChecksum, guid64, intTime, joinFields,
|
||||||
from typing import Any, Optional
|
splitFields, stripHTMLMedia, timestampID)
|
||||||
|
|
||||||
|
|
||||||
class Note:
|
class Note:
|
||||||
tags: List[str]
|
tags: List[str]
|
||||||
|
|
|
@ -2,17 +2,17 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import time
|
|
||||||
import random
|
|
||||||
import itertools
|
import itertools
|
||||||
from operator import itemgetter
|
import random
|
||||||
|
import time
|
||||||
from heapq import *
|
from heapq import *
|
||||||
|
from operator import itemgetter
|
||||||
|
|
||||||
#from anki.cards import Card
|
|
||||||
from anki.utils import ids2str, intTime, fmtTimeSpan
|
|
||||||
from anki.lang import _
|
|
||||||
from anki.consts import *
|
from anki.consts import *
|
||||||
from anki.hooks import runHook
|
from anki.hooks import runHook
|
||||||
|
from anki.lang import _
|
||||||
|
#from anki.cards import Card
|
||||||
|
from anki.utils import fmtTimeSpan, ids2str, intTime
|
||||||
|
|
||||||
# queue types: 0=new/cram, 1=lrn, 2=rev, 3=day lrn, -1=suspended, -2=buried
|
# queue types: 0=new/cram, 1=lrn, 2=rev, 3=day lrn, -1=suspended, -2=buried
|
||||||
# revlog types: 0=lrn, 1=rev, 2=relrn, 3=cram
|
# revlog types: 0=lrn, 1=rev, 2=relrn, 3=cram
|
||||||
|
|
|
@ -2,17 +2,20 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import time
|
|
||||||
import random
|
|
||||||
import itertools
|
|
||||||
from operator import itemgetter
|
|
||||||
from heapq import *
|
|
||||||
import datetime
|
import datetime
|
||||||
|
import itertools
|
||||||
|
import random
|
||||||
|
import time
|
||||||
|
from heapq import *
|
||||||
|
from operator import itemgetter
|
||||||
|
#from anki.collection import _Collection
|
||||||
|
from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Union
|
||||||
|
|
||||||
from anki.utils import ids2str, intTime, fmtTimeSpan
|
from anki.cards import Card
|
||||||
from anki.lang import _
|
|
||||||
from anki.consts import *
|
from anki.consts import *
|
||||||
from anki.hooks import runHook
|
from anki.hooks import runHook
|
||||||
|
from anki.lang import _
|
||||||
|
from anki.utils import fmtTimeSpan, ids2str, intTime
|
||||||
|
|
||||||
# card types: 0=new, 1=lrn, 2=rev, 3=relrn
|
# card types: 0=new, 1=lrn, 2=rev, 3=relrn
|
||||||
# queue types: 0=new, 1=(re)lrn, 2=rev, 3=day (re)lrn,
|
# queue types: 0=new, 1=(re)lrn, 2=rev, 3=day (re)lrn,
|
||||||
|
@ -21,9 +24,6 @@ from anki.hooks import runHook
|
||||||
# positive revlog intervals are in days (rev), negative in seconds (lrn)
|
# positive revlog intervals are in days (rev), negative in seconds (lrn)
|
||||||
# odue/odid store original due/did when cards moved to filtered deck
|
# odue/odid store original due/did when cards moved to filtered deck
|
||||||
|
|
||||||
from anki.cards import Card
|
|
||||||
#from anki.collection import _Collection
|
|
||||||
from typing import Any, Callable, Dict, List, Optional, Union, Tuple, Set
|
|
||||||
|
|
||||||
|
|
||||||
class Scheduler:
|
class Scheduler:
|
||||||
|
|
|
@ -2,15 +2,21 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
|
import atexit
|
||||||
import html
|
import html
|
||||||
import re, sys, threading, time, subprocess, os, atexit
|
import os
|
||||||
import random
|
import random
|
||||||
from typing import List, Tuple, Dict, Any
|
import re
|
||||||
from typing import Callable, NoReturn, Optional
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import threading
|
||||||
|
import time
|
||||||
|
from typing import Any, Callable, Dict, List, NoReturn, Optional, Tuple
|
||||||
|
|
||||||
from anki.hooks import addHook, runHook
|
from anki.hooks import addHook, runHook
|
||||||
from anki.utils import tmpdir, isWin, isMac, isLin
|
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from anki.mpv import MPV, MPVBase
|
||||||
|
from anki.utils import isLin, isMac, isWin, tmpdir
|
||||||
|
|
||||||
# Shared utils
|
# Shared utils
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
@ -90,7 +96,6 @@ def retryWait(proc) -> Any:
|
||||||
# MPV
|
# MPV
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
from anki.mpv import MPV, MPVBase
|
|
||||||
|
|
||||||
_player: Optional[Callable[[Any], Any]]
|
_player: Optional[Callable[[Any], Any]]
|
||||||
_queueEraser: Optional[Callable[[], Any]]
|
_queueEraser: Optional[Callable[[], Any]]
|
||||||
|
|
|
@ -2,14 +2,13 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import time
|
|
||||||
import datetime
|
import datetime
|
||||||
import json
|
import json
|
||||||
|
import time
|
||||||
|
from typing import Any, Dict, List, Optional, Tuple
|
||||||
|
|
||||||
from anki.utils import fmtTimeSpan, ids2str
|
|
||||||
from anki.lang import _, ngettext
|
from anki.lang import _, ngettext
|
||||||
from typing import Any, List, Tuple, Optional, Dict
|
from anki.utils import fmtTimeSpan, ids2str
|
||||||
|
|
||||||
|
|
||||||
# Card stats
|
# Card stats
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
from typing import Dict, Any
|
from typing import Any, Dict
|
||||||
|
|
||||||
from anki.lang import _
|
|
||||||
from anki.consts import MODEL_CLOZE
|
from anki.consts import MODEL_CLOZE
|
||||||
|
from anki.lang import _
|
||||||
|
|
||||||
models = []
|
models = []
|
||||||
|
|
||||||
|
|
|
@ -3,18 +3,19 @@
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import copy
|
import copy
|
||||||
import re
|
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
|
from typing import Any, Dict, Tuple
|
||||||
|
|
||||||
from anki.lang import _
|
|
||||||
from anki.utils import intTime, isWin
|
|
||||||
from anki.db import DB
|
|
||||||
from anki.collection import _Collection
|
from anki.collection import _Collection
|
||||||
from anki.consts import *
|
from anki.consts import *
|
||||||
from anki.stdmodels import addBasicModel, addClozeModel, addForwardReverse, \
|
from anki.db import DB
|
||||||
addForwardOptionalReverse, addBasicTypingModel
|
from anki.lang import _
|
||||||
from typing import Any, Dict, Tuple
|
from anki.stdmodels import (addBasicModel, addBasicTypingModel, addClozeModel,
|
||||||
|
addForwardOptionalReverse, addForwardReverse)
|
||||||
|
from anki.utils import intTime, isWin
|
||||||
|
|
||||||
|
|
||||||
def Collection(path: str, lock: bool = True, server: bool = False, log: bool = False) -> _Collection:
|
def Collection(path: str, lock: bool = True, server: bool = False, log: bool = False) -> _Collection:
|
||||||
"Open a new or existing collection. Path must be unicode."
|
"Open a new or existing collection. Path must be unicode."
|
||||||
|
|
24
anki/sync.py
24
anki/sync.py
|
@ -2,23 +2,25 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import io
|
|
||||||
import gzip
|
import gzip
|
||||||
import random
|
import io
|
||||||
import requests
|
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
import random
|
||||||
import sqlite3
|
import sqlite3
|
||||||
|
|
||||||
from anki.db import DB, DBError
|
|
||||||
from anki.utils import ids2str, intTime, platDesc, checksum, devMode
|
|
||||||
from anki.consts import *
|
|
||||||
from anki.utils import versionWithBuild
|
|
||||||
from .hooks import runHook
|
|
||||||
import anki
|
|
||||||
from .lang import ngettext
|
|
||||||
from typing import Any, Dict, List, Optional, Tuple, Union
|
from typing import Any, Dict, List, Optional, Tuple, Union
|
||||||
|
|
||||||
|
import requests
|
||||||
|
|
||||||
|
import anki
|
||||||
|
from anki.consts import *
|
||||||
|
from anki.db import DB, DBError
|
||||||
|
from anki.utils import (checksum, devMode, ids2str, intTime, platDesc,
|
||||||
|
versionWithBuild)
|
||||||
|
|
||||||
|
from .hooks import runHook
|
||||||
|
from .lang import ngettext
|
||||||
|
|
||||||
# syncing vars
|
# syncing vars
|
||||||
HTTP_TIMEOUT = 90
|
HTTP_TIMEOUT = 90
|
||||||
HTTP_BUF_SIZE = 64*1024
|
HTTP_BUF_SIZE = 64*1024
|
||||||
|
|
|
@ -11,10 +11,11 @@ This module manages the tag cache and tags for notes.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import json
|
import json
|
||||||
from anki.utils import intTime, ids2str
|
|
||||||
from anki.hooks import runHook
|
|
||||||
import re
|
import re
|
||||||
from typing import Any, List, Tuple, Callable, Dict
|
from typing import Any, Callable, Dict, List, Tuple
|
||||||
|
|
||||||
|
from anki.hooks import runHook
|
||||||
|
from anki.utils import ids2str, intTime
|
||||||
|
|
||||||
|
|
||||||
class TagManager:
|
class TagManager:
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
from .template import Template
|
from .template import Template
|
||||||
|
|
||||||
from . import furigana; furigana.install()
|
from . import furigana; furigana.install()
|
||||||
from . import hint; hint.install()
|
from . import hint; hint.install()
|
||||||
from typing import Any
|
|
||||||
|
|
||||||
def render(template, context=None, **kwargs) -> Any:
|
def render(template, context=None, **kwargs) -> Any:
|
||||||
context = context and context.copy() or {}
|
context = context and context.copy() or {}
|
||||||
|
|
|
@ -4,9 +4,10 @@
|
||||||
# Based off Kieran Clancy's initial implementation.
|
# Based off Kieran Clancy's initial implementation.
|
||||||
|
|
||||||
import re
|
import re
|
||||||
from anki.hooks import addHook
|
|
||||||
from typing import Any, Callable
|
from typing import Any, Callable
|
||||||
|
|
||||||
|
from anki.hooks import addHook
|
||||||
|
|
||||||
r = r' ?([^ >]+?)\[(.+?)\]'
|
r = r' ?([^ >]+?)\[(.+?)\]'
|
||||||
ruby = r'<ruby><rb>\1</rb><rt>\2</rt></ruby>'
|
ruby = r'<ruby><rb>\1</rb><rt>\2</rt></ruby>'
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
from anki.hooks import addHook
|
from anki.hooks import addHook
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
|
||||||
|
|
||||||
def hint(txt, extra, context, tag, fullname) -> str:
|
def hint(txt, extra, context, tag, fullname) -> str:
|
||||||
if not txt.strip():
|
if not txt.strip():
|
||||||
return ""
|
return ""
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import re
|
import re
|
||||||
from anki.utils import stripHTML, stripHTMLMedia
|
from typing import Any, Callable, Dict, Pattern
|
||||||
|
|
||||||
from anki.hooks import runFilter
|
from anki.hooks import runFilter
|
||||||
from typing import Any, Callable, Pattern, Dict
|
from anki.utils import stripHTML, stripHTMLMedia
|
||||||
|
|
||||||
clozeReg = r"(?si)\{\{(c)%s::(.*?)(::(.*?))?\}\}"
|
clozeReg = r"(?si)\{\{(c)%s::(.*?)(::(.*?))?\}\}"
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
from .template import Template
|
|
||||||
import os.path
|
import os.path
|
||||||
import re
|
import re
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
|
from .template import Template
|
||||||
|
|
||||||
|
|
||||||
class View:
|
class View:
|
||||||
# Path where this view's template(s) live
|
# Path where this view's template(s) live
|
||||||
template_path = '.'
|
template_path = '.'
|
||||||
|
|
|
@ -2,29 +2,28 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import re
|
|
||||||
import os
|
|
||||||
import random
|
|
||||||
import time
|
|
||||||
import math
|
|
||||||
from html.entities import name2codepoint
|
|
||||||
import subprocess
|
|
||||||
import tempfile
|
|
||||||
import shutil
|
|
||||||
import string
|
|
||||||
import sys
|
|
||||||
import locale
|
|
||||||
from hashlib import sha1
|
|
||||||
import platform
|
|
||||||
import traceback
|
|
||||||
from contextlib import contextmanager
|
|
||||||
from anki.lang import _, ngettext
|
|
||||||
|
|
||||||
# some add-ons expect json to be in the utils module
|
# some add-ons expect json to be in the utils module
|
||||||
import json # pylint: disable=unused-import
|
import json # pylint: disable=unused-import
|
||||||
|
import locale
|
||||||
|
import math
|
||||||
|
import os
|
||||||
|
import platform
|
||||||
|
import random
|
||||||
|
import re
|
||||||
|
import shutil
|
||||||
|
import string
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import tempfile
|
||||||
|
import time
|
||||||
|
import traceback
|
||||||
|
from contextlib import contextmanager
|
||||||
|
from hashlib import sha1
|
||||||
|
from html.entities import name2codepoint
|
||||||
|
from typing import Any, Iterator, List, Optional, Tuple, Union
|
||||||
|
|
||||||
from anki.db import DB
|
from anki.db import DB
|
||||||
from typing import Any, Iterator, List, Union, Optional, Tuple
|
from anki.lang import _, ngettext
|
||||||
|
|
||||||
_tmpdir: Optional[str]
|
_tmpdir: Optional[str]
|
||||||
|
|
||||||
|
|
|
@ -1,22 +1,21 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from anki import version as _version
|
|
||||||
|
|
||||||
import getpass
|
|
||||||
import sys
|
|
||||||
import argparse
|
import argparse
|
||||||
import tempfile
|
|
||||||
import builtins
|
import builtins
|
||||||
import locale
|
import getpass
|
||||||
import gettext
|
import gettext
|
||||||
from typing import Optional, Any
|
import locale
|
||||||
|
import sys
|
||||||
|
import tempfile
|
||||||
|
from typing import Any, Optional
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
import anki.lang
|
import anki.lang
|
||||||
|
from anki import version as _version
|
||||||
from anki.consts import HELP_SITE
|
from anki.consts import HELP_SITE
|
||||||
from anki.lang import langDir
|
from anki.lang import langDir
|
||||||
from anki.utils import isMac, isLin
|
from anki.utils import checksum, isLin, isMac
|
||||||
|
from aqt.qt import *
|
||||||
|
|
||||||
appVersion=_version
|
appVersion=_version
|
||||||
appWebsite="http://ankisrs.net/"
|
appWebsite="http://ankisrs.net/"
|
||||||
|
@ -26,8 +25,8 @@ appShared="https://ankiweb.net/shared/"
|
||||||
appUpdate="https://ankiweb.net/update/desktop"
|
appUpdate="https://ankiweb.net/update/desktop"
|
||||||
appHelpSite=HELP_SITE
|
appHelpSite=HELP_SITE
|
||||||
|
|
||||||
from aqt.main import AnkiQt
|
from aqt.main import AnkiQt # isort:skip
|
||||||
from aqt.profiles import ProfileManager
|
from aqt.profiles import ProfileManager # isort:skip
|
||||||
|
|
||||||
mw: Optional[AnkiQt] = None # set on init
|
mw: Optional[AnkiQt] = None # set on init
|
||||||
|
|
||||||
|
@ -41,7 +40,6 @@ except ImportError as e:
|
||||||
print()
|
print()
|
||||||
raise
|
raise
|
||||||
|
|
||||||
from anki.utils import checksum
|
|
||||||
|
|
||||||
# Dialog manager
|
# Dialog manager
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
@ -59,8 +57,8 @@ from anki.utils import checksum
|
||||||
#- make preferences modal? cmd+q does wrong thing
|
#- make preferences modal? cmd+q does wrong thing
|
||||||
|
|
||||||
|
|
||||||
from aqt import addcards, browser, editcurrent, stats, about, \
|
from aqt import addcards, browser, editcurrent # isort:skip
|
||||||
preferences
|
from aqt import stats, about, preferences # isort:skip
|
||||||
|
|
||||||
class DialogManager:
|
class DialogManager:
|
||||||
|
|
||||||
|
|
|
@ -2,11 +2,12 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
import aqt.forms
|
import aqt.forms
|
||||||
from anki.utils import versionWithBuild
|
|
||||||
from aqt.utils import supportText, tooltip
|
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from anki.utils import versionWithBuild
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import supportText, tooltip
|
||||||
|
|
||||||
|
|
||||||
class ClosableQDialog(QDialog):
|
class ClosableQDialog(QDialog):
|
||||||
def reject(self):
|
def reject(self):
|
||||||
|
|
|
@ -1,21 +1,22 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
from typing import List
|
from typing import Callable, List
|
||||||
|
|
||||||
|
import aqt.deckchooser
|
||||||
|
import aqt.editor
|
||||||
|
import aqt.forms
|
||||||
|
import aqt.modelchooser
|
||||||
|
from anki.hooks import addHook, remHook, runHook
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from anki.notes import Note
|
||||||
|
from anki.sound import clearAudioQueue
|
||||||
|
from anki.utils import htmlToTextLine, isMac
|
||||||
from aqt import AnkiQt
|
from aqt import AnkiQt
|
||||||
from aqt.qt import *
|
from aqt.qt import *
|
||||||
import aqt.forms
|
from aqt.utils import (addCloseShortcut, askUser, downArrow, openHelp,
|
||||||
from aqt.utils import saveGeom, restoreGeom, showWarning, askUser, shortcut, \
|
restoreGeom, saveGeom, shortcut, showWarning, tooltip)
|
||||||
tooltip, openHelp, addCloseShortcut, downArrow
|
|
||||||
from anki.sound import clearAudioQueue
|
|
||||||
from anki.hooks import addHook, remHook, runHook
|
|
||||||
from anki.utils import htmlToTextLine, isMac
|
|
||||||
import aqt.editor, aqt.modelchooser, aqt.deckchooser
|
|
||||||
|
|
||||||
from anki.notes import Note
|
|
||||||
from typing import Callable
|
|
||||||
|
|
||||||
class AddCards(QDialog):
|
class AddCards(QDialog):
|
||||||
|
|
||||||
|
|
|
@ -6,24 +6,25 @@ import json
|
||||||
import re
|
import re
|
||||||
import zipfile
|
import zipfile
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from typing import Callable, Dict, Any
|
from typing import Any, Callable, Dict
|
||||||
|
|
||||||
import markdown
|
|
||||||
from send2trash import send2trash
|
|
||||||
import jsonschema
|
|
||||||
from jsonschema.exceptions import ValidationError
|
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
from aqt.utils import showInfo, openFolder, isWin, openLink, \
|
|
||||||
askUser, restoreGeom, saveGeom, restoreSplitter, saveSplitter, \
|
|
||||||
showWarning, tooltip, getFile
|
|
||||||
from zipfile import ZipFile
|
from zipfile import ZipFile
|
||||||
import aqt.forms
|
|
||||||
|
import jsonschema
|
||||||
|
import markdown
|
||||||
|
from jsonschema.exceptions import ValidationError
|
||||||
|
from send2trash import send2trash
|
||||||
|
|
||||||
import aqt
|
import aqt
|
||||||
from aqt.downloader import download
|
import aqt.forms
|
||||||
from anki.lang import _, ngettext
|
from anki.lang import _, ngettext
|
||||||
from anki.utils import intTime
|
|
||||||
from anki.sync import AnkiRequestsClient
|
from anki.sync import AnkiRequestsClient
|
||||||
|
from anki.utils import intTime
|
||||||
|
from aqt.downloader import download
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import (askUser, getFile, isWin, openFolder, openLink,
|
||||||
|
restoreGeom, restoreSplitter, saveGeom, saveSplitter,
|
||||||
|
showInfo, showWarning, tooltip)
|
||||||
|
|
||||||
|
|
||||||
class AddonManager:
|
class AddonManager:
|
||||||
|
|
||||||
|
|
|
@ -2,35 +2,32 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import sre_constants
|
|
||||||
import html
|
import html
|
||||||
import time
|
import json
|
||||||
import re
|
import re
|
||||||
|
import sre_constants
|
||||||
|
import time
|
||||||
import unicodedata
|
import unicodedata
|
||||||
from operator import itemgetter
|
from operator import itemgetter
|
||||||
from typing import Callable, List, Optional
|
from typing import Callable, List, Optional
|
||||||
|
|
||||||
from anki.collection import _Collection
|
|
||||||
from anki.lang import ngettext
|
|
||||||
import json
|
|
||||||
|
|
||||||
from aqt import AnkiQt
|
|
||||||
from aqt.qt import *
|
|
||||||
import anki
|
import anki
|
||||||
import aqt.forms
|
import aqt.forms
|
||||||
from anki.utils import fmtTimeSpan, ids2str, htmlToTextLine, \
|
from anki.collection import _Collection
|
||||||
isWin, intTime, \
|
|
||||||
isMac, bodyClass
|
|
||||||
from aqt.utils import saveGeom, restoreGeom, saveSplitter, restoreSplitter, \
|
|
||||||
saveHeader, restoreHeader, saveState, restoreState, getTag, \
|
|
||||||
showInfo, askUser, tooltip, openHelp, showWarning, shortcut, mungeQA, \
|
|
||||||
getOnlyText, MenuList, SubMenu, qtMenuShortcutWorkaround
|
|
||||||
from anki.lang import _
|
|
||||||
from anki.hooks import runHook, addHook, remHook, runFilter
|
|
||||||
from aqt.webview import AnkiWebView
|
|
||||||
from anki.consts import *
|
from anki.consts import *
|
||||||
from anki.sound import clearAudioQueue, allSounds, play
|
from anki.hooks import addHook, remHook, runFilter, runHook
|
||||||
|
from anki.lang import _, ngettext
|
||||||
|
from anki.sound import allSounds, clearAudioQueue, play
|
||||||
|
from anki.utils import (bodyClass, fmtTimeSpan, htmlToTextLine, ids2str,
|
||||||
|
intTime, isMac, isWin)
|
||||||
|
from aqt import AnkiQt
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import (MenuList, SubMenu, askUser, getOnlyText, getTag,
|
||||||
|
mungeQA, openHelp, qtMenuShortcutWorkaround,
|
||||||
|
restoreGeom, restoreHeader, restoreSplitter,
|
||||||
|
restoreState, saveGeom, saveHeader, saveSplitter,
|
||||||
|
saveState, shortcut, showInfo, showWarning, tooltip)
|
||||||
|
from aqt.webview import AnkiWebView
|
||||||
|
|
||||||
# Data model
|
# Data model
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
@ -2264,4 +2261,3 @@ Are you sure you want to continue?""")):
|
||||||
|
|
||||||
def onHelp(self):
|
def onHelp(self):
|
||||||
openHelp("browsermisc")
|
openHelp("browsermisc")
|
||||||
|
|
||||||
|
|
|
@ -3,20 +3,20 @@
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import collections
|
import collections
|
||||||
|
import json
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
from anki.consts import *
|
|
||||||
import aqt
|
import aqt
|
||||||
from anki.sound import playFromText, clearAudioQueue
|
from anki.consts import *
|
||||||
from aqt.utils import saveGeom, restoreGeom, mungeQA,\
|
|
||||||
showInfo, askUser, getOnlyText, \
|
|
||||||
showWarning, openHelp, downArrow
|
|
||||||
from anki.utils import isMac, isWin, joinFields, bodyClass
|
|
||||||
from aqt.webview import AnkiWebView
|
|
||||||
import json
|
|
||||||
from anki.hooks import runFilter
|
from anki.hooks import runFilter
|
||||||
from anki.lang import _, ngettext
|
from anki.lang import _, ngettext
|
||||||
|
from anki.sound import clearAudioQueue, playFromText
|
||||||
|
from anki.utils import bodyClass, isMac, isWin, joinFields
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import (askUser, downArrow, getOnlyText, mungeQA, openHelp,
|
||||||
|
restoreGeom, saveGeom, showInfo, showWarning)
|
||||||
|
from aqt.webview import AnkiWebView
|
||||||
|
|
||||||
|
|
||||||
class CardLayout(QDialog):
|
class CardLayout(QDialog):
|
||||||
|
|
||||||
|
|
|
@ -2,11 +2,11 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
import aqt
|
import aqt
|
||||||
from aqt.utils import showInfo, showWarning
|
|
||||||
from anki.consts import *
|
from anki.consts import *
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import showInfo, showWarning
|
||||||
|
|
||||||
RADIO_NEW = 1
|
RADIO_NEW = 1
|
||||||
RADIO_REV = 2
|
RADIO_REV = 2
|
||||||
|
|
|
@ -1,18 +1,19 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
from copy import deepcopy
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
from aqt.utils import askUser, getOnlyText, openLink, showWarning, shortcut, \
|
|
||||||
openHelp
|
|
||||||
from anki.utils import ids2str, fmtTimeSpan
|
|
||||||
from anki.errors import DeckRenameError
|
|
||||||
import aqt
|
import aqt
|
||||||
from anki.sound import clearAudioQueue
|
from anki.errors import DeckRenameError
|
||||||
from anki.hooks import runHook
|
from anki.hooks import runHook
|
||||||
from copy import deepcopy
|
|
||||||
from anki.lang import _, ngettext
|
from anki.lang import _, ngettext
|
||||||
|
from anki.sound import clearAudioQueue
|
||||||
|
from anki.utils import fmtTimeSpan, ids2str
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import (askUser, getOnlyText, openHelp, openLink, shortcut,
|
||||||
|
showWarning)
|
||||||
|
|
||||||
|
|
||||||
class DeckBrowser:
|
class DeckBrowser:
|
||||||
_dueTree: Any
|
_dueTree: Any
|
||||||
|
|
|
@ -2,10 +2,11 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
from anki.hooks import addHook, remHook
|
from anki.hooks import addHook, remHook
|
||||||
from aqt.utils import shortcut
|
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import shortcut
|
||||||
|
|
||||||
|
|
||||||
class DeckChooser(QHBoxLayout):
|
class DeckChooser(QHBoxLayout):
|
||||||
|
|
||||||
|
|
|
@ -3,12 +3,13 @@
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
from operator import itemgetter
|
from operator import itemgetter
|
||||||
|
|
||||||
from anki.consts import NEW_CARDS_RANDOM
|
|
||||||
from aqt.qt import *
|
|
||||||
import aqt
|
import aqt
|
||||||
from aqt.utils import showInfo, showWarning, openHelp, getOnlyText, askUser, \
|
from anki.consts import NEW_CARDS_RANDOM
|
||||||
tooltip, saveGeom, restoreGeom
|
|
||||||
from anki.lang import _, ngettext
|
from anki.lang import _, ngettext
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import (askUser, getOnlyText, openHelp, restoreGeom, saveGeom,
|
||||||
|
showInfo, showWarning, tooltip)
|
||||||
|
|
||||||
|
|
||||||
class DeckConf(QDialog):
|
class DeckConf(QDialog):
|
||||||
def __init__(self, mw, deck):
|
def __init__(self, mw, deck):
|
||||||
|
|
|
@ -2,12 +2,15 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import time, re
|
import re
|
||||||
from aqt.qt import *
|
import time
|
||||||
from anki.sync import AnkiRequestsClient
|
|
||||||
from anki.hooks import addHook, remHook
|
|
||||||
import aqt
|
import aqt
|
||||||
|
from anki.hooks import addHook, remHook
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from anki.sync import AnkiRequestsClient
|
||||||
|
from aqt.qt import *
|
||||||
|
|
||||||
|
|
||||||
def download(mw, code):
|
def download(mw, code):
|
||||||
"Download addon from AnkiWeb. Caller must start & stop progress diag."
|
"Download addon from AnkiWeb. Caller must start & stop progress diag."
|
||||||
|
|
|
@ -2,10 +2,11 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
import aqt
|
import aqt
|
||||||
from aqt.utils import showWarning, openHelp, askUser, saveGeom, restoreGeom
|
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import askUser, openHelp, restoreGeom, saveGeom, showWarning
|
||||||
|
|
||||||
|
|
||||||
class DeckConf(QDialog):
|
class DeckConf(QDialog):
|
||||||
def __init__(self, mw, first=False, search="", deck=None):
|
def __init__(self, mw, first=False, search="", deck=None):
|
||||||
|
|
|
@ -2,13 +2,12 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
from aqt.utils import tooltip
|
|
||||||
import aqt.editor
|
import aqt.editor
|
||||||
from aqt.utils import saveGeom, restoreGeom
|
|
||||||
from anki.hooks import addHook, remHook
|
from anki.hooks import addHook, remHook
|
||||||
from anki.utils import isMac
|
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import restoreGeom, saveGeom, tooltip
|
||||||
|
|
||||||
|
|
||||||
class EditCurrent(QDialog):
|
class EditCurrent(QDialog):
|
||||||
|
|
||||||
|
|
|
@ -1,30 +1,32 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
import re
|
|
||||||
import urllib.request, urllib.parse, urllib.error
|
|
||||||
import warnings
|
|
||||||
import html
|
|
||||||
import mimetypes
|
|
||||||
import base64
|
import base64
|
||||||
import unicodedata
|
import html
|
||||||
import json
|
import json
|
||||||
|
import mimetypes
|
||||||
|
import re
|
||||||
|
import unicodedata
|
||||||
|
import urllib.error
|
||||||
|
import urllib.parse
|
||||||
|
import urllib.request
|
||||||
|
import warnings
|
||||||
|
|
||||||
|
import requests
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
|
||||||
|
import anki.sound
|
||||||
|
import aqt
|
||||||
|
from anki.hooks import addHook, runFilter, runHook
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from anki.sync import AnkiRequestsClient
|
||||||
|
from anki.utils import checksum, isWin, namedtmp, stripHTMLMedia
|
||||||
from aqt import AnkiQt
|
from aqt import AnkiQt
|
||||||
from aqt.qt import *
|
from aqt.qt import *
|
||||||
from anki.utils import isWin, namedtmp, stripHTMLMedia, \
|
|
||||||
checksum
|
|
||||||
import anki.sound
|
|
||||||
from anki.hooks import runHook, runFilter, addHook
|
|
||||||
from aqt.sound import getAudio
|
from aqt.sound import getAudio
|
||||||
|
from aqt.utils import (getFile, openHelp, qtMenuShortcutWorkaround, shortcut,
|
||||||
|
showInfo, showWarning, tooltip)
|
||||||
from aqt.webview import AnkiWebView
|
from aqt.webview import AnkiWebView
|
||||||
from aqt.utils import shortcut, showInfo, showWarning, getFile, \
|
|
||||||
openHelp, tooltip, qtMenuShortcutWorkaround
|
|
||||||
import aqt
|
|
||||||
from bs4 import BeautifulSoup
|
|
||||||
import requests
|
|
||||||
from anki.sync import AnkiRequestsClient
|
|
||||||
|
|
||||||
pics = ("jpg", "jpeg", "png", "tif", "tiff", "gif", "svg", "webp")
|
pics = ("jpg", "jpeg", "png", "tif", "tiff", "gif", "svg", "webp")
|
||||||
audio = ("wav", "mp3", "ogg", "flac", "mp4", "swf", "mov", "mpeg", "mkv", "m4a", "3gp", "spx", "oga", "webm")
|
audio = ("wav", "mp3", "ogg", "flac", "mp4", "swf", "mov", "mpeg", "mkv", "m4a", "3gp", "spx", "oga", "webm")
|
||||||
|
|
|
@ -1,14 +1,15 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
import sys, traceback
|
|
||||||
import html
|
import html
|
||||||
import re
|
import re
|
||||||
|
import sys
|
||||||
|
import traceback
|
||||||
|
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from aqt import mw
|
||||||
from aqt.qt import *
|
from aqt.qt import *
|
||||||
from aqt.utils import showText, showWarning, supportText
|
from aqt.utils import showText, showWarning, supportText
|
||||||
from aqt import mw
|
|
||||||
|
|
||||||
if not os.environ.get("DEBUG"):
|
if not os.environ.get("DEBUG"):
|
||||||
def excepthook(etype,val,tb):
|
def excepthook(etype,val,tb):
|
||||||
|
|
|
@ -3,15 +3,16 @@
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
import time
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
import aqt
|
import aqt
|
||||||
from aqt.utils import getSaveFile, tooltip, showWarning, \
|
|
||||||
checkInvalidFilename, showInfo
|
|
||||||
from anki.exporting import exporters
|
from anki.exporting import exporters
|
||||||
from anki.hooks import addHook, remHook
|
from anki.hooks import addHook, remHook
|
||||||
from anki.lang import ngettext, _
|
from anki.lang import _, ngettext
|
||||||
import time
|
from aqt.qt import *
|
||||||
|
from aqt.utils import (checkInvalidFilename, getSaveFile, showInfo,
|
||||||
|
showWarning, tooltip)
|
||||||
|
|
||||||
|
|
||||||
class ExportDialog(QDialog):
|
class ExportDialog(QDialog):
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
from anki.consts import *
|
|
||||||
import aqt
|
import aqt
|
||||||
from aqt.utils import showWarning, openHelp, getOnlyText, askUser
|
from anki.consts import *
|
||||||
from anki.lang import _, ngettext
|
from anki.lang import _, ngettext
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import askUser, getOnlyText, openHelp, showWarning
|
||||||
|
|
||||||
|
|
||||||
class FieldDialog(QDialog):
|
class FieldDialog(QDialog):
|
||||||
|
|
||||||
|
|
|
@ -2,24 +2,25 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
|
import json
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import traceback
|
|
||||||
import zipfile
|
|
||||||
import json
|
|
||||||
import unicodedata
|
|
||||||
import shutil
|
import shutil
|
||||||
|
import traceback
|
||||||
|
import unicodedata
|
||||||
|
import zipfile
|
||||||
|
|
||||||
from aqt import AnkiQt
|
|
||||||
from aqt.qt import *
|
|
||||||
import anki.importing as importing
|
import anki.importing as importing
|
||||||
from aqt.utils import getOnlyText, getFile, showText, showWarning, openHelp, \
|
import aqt.deckchooser
|
||||||
askUser, tooltip, showInfo
|
|
||||||
from anki.hooks import addHook, remHook
|
|
||||||
import aqt.forms
|
import aqt.forms
|
||||||
import aqt.modelchooser
|
import aqt.modelchooser
|
||||||
import aqt.deckchooser
|
from anki.hooks import addHook, remHook
|
||||||
from anki.lang import ngettext, _
|
from anki.lang import _, ngettext
|
||||||
|
from aqt import AnkiQt
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import (askUser, getFile, getOnlyText, openHelp, showInfo,
|
||||||
|
showText, showWarning, tooltip)
|
||||||
|
|
||||||
|
|
||||||
class ChangeMap(QDialog):
|
class ChangeMap(QDialog):
|
||||||
def __init__(self, mw: AnkiQt, model, current):
|
def __init__(self, mw: AnkiQt, model, current):
|
||||||
|
|
46
aqt/main.py
46
aqt/main.py
|
@ -2,39 +2,39 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
|
import faulthandler
|
||||||
|
import gc
|
||||||
|
import platform
|
||||||
import re
|
import re
|
||||||
import signal
|
import signal
|
||||||
import zipfile
|
|
||||||
import gc
|
|
||||||
import time
|
import time
|
||||||
import faulthandler
|
import zipfile
|
||||||
import platform
|
from argparse import Namespace
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
from typing import Sequence
|
from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple
|
||||||
|
|
||||||
from send2trash import send2trash
|
from send2trash import send2trash
|
||||||
|
|
||||||
|
import anki.mpv
|
||||||
|
import anki.sound
|
||||||
|
import aqt
|
||||||
|
import aqt.mediasrv
|
||||||
|
import aqt.progress
|
||||||
|
import aqt.stats
|
||||||
|
import aqt.toolbar
|
||||||
|
import aqt.webview
|
||||||
from anki.collection import _Collection
|
from anki.collection import _Collection
|
||||||
|
from anki.hooks import addHook, runFilter, runHook
|
||||||
|
from anki.lang import _, ngettext
|
||||||
|
from anki.storage import Collection
|
||||||
|
from anki.utils import devMode, ids2str, intTime, isMac, isWin, splitFields
|
||||||
from aqt.profiles import ProfileManager as ProfileManagerType
|
from aqt.profiles import ProfileManager as ProfileManagerType
|
||||||
from aqt.qt import *
|
from aqt.qt import *
|
||||||
from anki.storage import Collection
|
|
||||||
from anki.utils import isWin, isMac, intTime, splitFields, ids2str, \
|
|
||||||
devMode
|
|
||||||
from anki.hooks import runHook, addHook, runFilter
|
|
||||||
import aqt
|
|
||||||
import aqt.progress
|
|
||||||
import aqt.webview
|
|
||||||
import aqt.toolbar
|
|
||||||
import aqt.stats
|
|
||||||
import aqt.mediasrv
|
|
||||||
import anki.sound
|
|
||||||
import anki.mpv
|
|
||||||
from aqt.utils import saveGeom, restoreGeom, showInfo, showWarning, \
|
|
||||||
restoreState, getOnlyText, askUser, showText, tooltip, \
|
|
||||||
openHelp, openLink, checkInvalidFilename, getFile
|
|
||||||
from aqt.qt import sip
|
from aqt.qt import sip
|
||||||
from anki.lang import _, ngettext
|
from aqt.utils import (askUser, checkInvalidFilename, getFile, getOnlyText,
|
||||||
|
openHelp, openLink, restoreGeom, restoreState, saveGeom,
|
||||||
|
showInfo, showText, showWarning, tooltip)
|
||||||
|
|
||||||
from argparse import Namespace
|
|
||||||
from typing import Any, Callable, Dict, List, Optional, Tuple
|
|
||||||
|
|
||||||
class AnkiQt(QMainWindow):
|
class AnkiQt(QMainWindow):
|
||||||
col: _Collection
|
col: _Collection
|
||||||
|
|
|
@ -1,17 +1,18 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
import http.server
|
||||||
|
import re
|
||||||
|
import socket
|
||||||
|
import socketserver
|
||||||
|
import threading
|
||||||
|
from http import HTTPStatus
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from anki.collection import _Collection
|
from anki.collection import _Collection
|
||||||
from aqt.qt import *
|
|
||||||
from http import HTTPStatus
|
|
||||||
import http.server
|
|
||||||
import socketserver
|
|
||||||
import socket
|
|
||||||
from anki.utils import devMode
|
from anki.utils import devMode
|
||||||
import threading
|
from aqt.qt import *
|
||||||
import re
|
|
||||||
|
|
||||||
# locate web folder in source/binary distribution
|
# locate web folder in source/binary distribution
|
||||||
def _getExportFolder():
|
def _getExportFolder():
|
||||||
|
|
|
@ -2,10 +2,11 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
from anki.hooks import addHook, remHook, runHook
|
from anki.hooks import addHook, remHook, runHook
|
||||||
from aqt.utils import shortcut
|
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import shortcut
|
||||||
|
|
||||||
|
|
||||||
class ModelChooser(QHBoxLayout):
|
class ModelChooser(QHBoxLayout):
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,16 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
from aqt import AnkiQt
|
import collections
|
||||||
from aqt.qt import *
|
|
||||||
from operator import itemgetter
|
from operator import itemgetter
|
||||||
from aqt.utils import showInfo, askUser, getText, maybeHideClose, openHelp
|
|
||||||
import aqt.clayout
|
import aqt.clayout
|
||||||
from anki import stdmodels
|
from anki import stdmodels
|
||||||
from aqt.utils import saveGeom, restoreGeom
|
|
||||||
import collections
|
|
||||||
from anki.lang import _, ngettext
|
from anki.lang import _, ngettext
|
||||||
|
from aqt import AnkiQt
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import (askUser, getText, maybeHideClose, openHelp, restoreGeom,
|
||||||
|
saveGeom, showInfo)
|
||||||
|
|
||||||
|
|
||||||
class Models(QDialog):
|
class Models(QDialog):
|
||||||
def __init__(self, mw: AnkiQt, parent=None, fromMain=False):
|
def __init__(self, mw: AnkiQt, parent=None, fromMain=False):
|
||||||
|
|
|
@ -2,10 +2,11 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from aqt.utils import openLink, shortcut, tooltip, askUserDialog
|
|
||||||
import aqt
|
import aqt
|
||||||
from anki.sound import clearAudioQueue
|
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from anki.sound import clearAudioQueue
|
||||||
|
from aqt.utils import askUserDialog, openLink, shortcut, tooltip
|
||||||
|
|
||||||
|
|
||||||
class Overview:
|
class Overview:
|
||||||
"Deck overview."
|
"Deck overview."
|
||||||
|
|
|
@ -6,8 +6,19 @@
|
||||||
|
|
||||||
# pylint: disable=import-error,unused-import
|
# pylint: disable=import-error,unused-import
|
||||||
|
|
||||||
|
# included implicitly in the past, and relied upon by some add-ons
|
||||||
|
import cgi
|
||||||
|
import decimal
|
||||||
|
# useful for add-ons
|
||||||
|
import logging
|
||||||
|
import logging.config
|
||||||
|
import logging.handlers
|
||||||
# required by requests library
|
# required by requests library
|
||||||
import queue
|
import queue
|
||||||
|
import typing
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
import PyQt5.QtSvg
|
||||||
|
|
||||||
from anki.utils import isWin
|
from anki.utils import isWin
|
||||||
|
|
||||||
|
@ -16,15 +27,3 @@ if isWin:
|
||||||
import pythoncom
|
import pythoncom
|
||||||
import win32com
|
import win32com
|
||||||
import pywintypes
|
import pywintypes
|
||||||
|
|
||||||
# included implicitly in the past, and relied upon by some add-ons
|
|
||||||
import cgi
|
|
||||||
import uuid
|
|
||||||
import decimal
|
|
||||||
import PyQt5.QtSvg
|
|
||||||
|
|
||||||
# useful for add-ons
|
|
||||||
import logging
|
|
||||||
import logging.handlers
|
|
||||||
import logging.config
|
|
||||||
import typing
|
|
||||||
|
|
|
@ -2,14 +2,16 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import datetime, time
|
import datetime
|
||||||
|
import time
|
||||||
|
|
||||||
from aqt import AnkiQt
|
|
||||||
from aqt.qt import *
|
|
||||||
import anki.lang
|
import anki.lang
|
||||||
from aqt.utils import openHelp, showInfo, askUser
|
|
||||||
import aqt
|
import aqt
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from aqt import AnkiQt
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import askUser, openHelp, showInfo
|
||||||
|
|
||||||
|
|
||||||
class Preferences(QDialog):
|
class Preferences(QDialog):
|
||||||
|
|
||||||
|
|
|
@ -6,24 +6,24 @@
|
||||||
# - Saves in pickles rather than json to easily store Qt window state.
|
# - Saves in pickles rather than json to easily store Qt window state.
|
||||||
# - Saves in sqlite rather than a flat file so the config can't be corrupted
|
# - Saves in sqlite rather than a flat file so the config can't be corrupted
|
||||||
|
|
||||||
import random
|
|
||||||
import pickle
|
|
||||||
import shutil
|
|
||||||
import io
|
import io
|
||||||
import locale
|
import locale
|
||||||
|
import pickle
|
||||||
|
import random
|
||||||
|
import shutil
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
from typing import Dict, Any
|
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
from anki.db import DB
|
|
||||||
from anki.utils import isMac, isWin, intTime
|
|
||||||
import anki.lang
|
|
||||||
from aqt.utils import showWarning
|
|
||||||
from aqt import appHelpSite
|
|
||||||
import aqt.forms
|
|
||||||
from send2trash import send2trash
|
from send2trash import send2trash
|
||||||
|
|
||||||
|
import anki.lang
|
||||||
import anki.sound
|
import anki.sound
|
||||||
|
import aqt.forms
|
||||||
|
from anki.db import DB
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from anki.utils import intTime, isMac, isWin
|
||||||
|
from aqt import appHelpSite
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import showWarning
|
||||||
|
|
||||||
metaConf = dict(
|
metaConf = dict(
|
||||||
ver=0,
|
ver=0,
|
||||||
|
|
|
@ -3,9 +3,10 @@
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import time
|
import time
|
||||||
from aqt.qt import *
|
|
||||||
import aqt.forms
|
import aqt.forms
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from aqt.qt import *
|
||||||
|
|
||||||
# fixme: if mw->subwindow opens a progress dialog with mw as the parent, mw
|
# fixme: if mw->subwindow opens a progress dialog with mw as the parent, mw
|
||||||
# gets raised on finish on compiz. perhaps we should be using the progress
|
# gets raised on finish on compiz. perhaps we should be using the progress
|
||||||
|
|
22
aqt/qt.py
22
aqt/qt.py
|
@ -5,32 +5,34 @@
|
||||||
# pylint: disable=unused-import
|
# pylint: disable=unused-import
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
from PyQt5.Qt import * # type: ignore
|
||||||
|
from PyQt5.QtCore import *
|
||||||
|
from PyQt5.QtCore import \
|
||||||
|
pyqtRemoveInputHook # pylint: disable=no-name-in-module
|
||||||
|
from PyQt5.QtGui import * # type: ignore
|
||||||
|
from PyQt5.QtWebEngineWidgets import * # type: ignore
|
||||||
|
from PyQt5.QtWidgets import *
|
||||||
|
|
||||||
|
from anki.utils import isMac, isWin
|
||||||
|
|
||||||
# fix buggy ubuntu12.04 display of language selector
|
# fix buggy ubuntu12.04 display of language selector
|
||||||
os.environ["LIBOVERLAY_SCROLLBAR"] = "0"
|
os.environ["LIBOVERLAY_SCROLLBAR"] = "0"
|
||||||
|
|
||||||
from anki.utils import isWin, isMac
|
|
||||||
|
|
||||||
from PyQt5.QtCore import *
|
|
||||||
from PyQt5.QtWidgets import *
|
|
||||||
from PyQt5.QtGui import * # type: ignore
|
|
||||||
from PyQt5.Qt import * # type: ignore
|
|
||||||
# trigger explicit message in case of missing libraries
|
|
||||||
# instead of silently failing to import
|
|
||||||
from PyQt5.QtWebEngineWidgets import * # type: ignore
|
|
||||||
try:
|
try:
|
||||||
from PyQt5 import sip
|
from PyQt5 import sip
|
||||||
except ImportError:
|
except ImportError:
|
||||||
import sip # type: ignore
|
import sip # type: ignore
|
||||||
|
|
||||||
from PyQt5.QtCore import pyqtRemoveInputHook # pylint: disable=no-name-in-module
|
|
||||||
|
|
||||||
def debug():
|
def debug():
|
||||||
from pdb import set_trace
|
from pdb import set_trace
|
||||||
pyqtRemoveInputHook()
|
pyqtRemoveInputHook()
|
||||||
set_trace()
|
set_trace()
|
||||||
|
|
||||||
import sys, traceback
|
|
||||||
|
|
||||||
if os.environ.get("DEBUG"):
|
if os.environ.get("DEBUG"):
|
||||||
def info(type, value, tb):
|
def info(type, value, tb):
|
||||||
|
|
|
@ -3,25 +3,24 @@
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import difflib
|
import difflib
|
||||||
import re
|
|
||||||
import html
|
import html
|
||||||
import unicodedata as ucd
|
|
||||||
import html.parser
|
import html.parser
|
||||||
import json
|
import json
|
||||||
|
import re
|
||||||
|
import unicodedata as ucd
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
|
import aqt
|
||||||
from anki.cards import Card
|
from anki.cards import Card
|
||||||
|
from anki.hooks import addHook, runFilter, runHook
|
||||||
from anki.lang import _, ngettext
|
from anki.lang import _, ngettext
|
||||||
|
from anki.sound import clearAudioQueue, play, playFromText
|
||||||
|
from anki.utils import bodyClass, stripHTML
|
||||||
from aqt import AnkiQt
|
from aqt import AnkiQt
|
||||||
from aqt.qt import *
|
from aqt.qt import *
|
||||||
from anki.utils import stripHTML, bodyClass
|
|
||||||
from anki.hooks import addHook, runHook, runFilter
|
|
||||||
from anki.sound import playFromText, clearAudioQueue, play
|
|
||||||
from aqt.utils import mungeQA, tooltip, askUserDialog, \
|
|
||||||
downArrow, qtMenuShortcutWorkaround
|
|
||||||
from aqt.sound import getAudio
|
from aqt.sound import getAudio
|
||||||
import aqt
|
from aqt.utils import (askUserDialog, downArrow, mungeQA,
|
||||||
|
qtMenuShortcutWorkaround, tooltip)
|
||||||
|
|
||||||
|
|
||||||
class Reviewer:
|
class Reviewer:
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
|
|
||||||
import time
|
import time
|
||||||
from anki.sound import Recorder
|
|
||||||
from aqt.utils import saveGeom, restoreGeom, showWarning
|
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from anki.sound import Recorder
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import restoreGeom, saveGeom, showWarning
|
||||||
|
|
||||||
if not Recorder:
|
if not Recorder:
|
||||||
print("pyaudio not installed")
|
print("pyaudio not installed")
|
||||||
|
|
|
@ -2,12 +2,13 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from aqt.qt import *
|
import time
|
||||||
import os, time
|
|
||||||
from aqt.utils import saveGeom, restoreGeom, maybeHideClose, addCloseShortcut, \
|
|
||||||
tooltip, getSaveFile
|
|
||||||
import aqt
|
import aqt
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import (addCloseShortcut, getSaveFile, maybeHideClose,
|
||||||
|
restoreGeom, saveGeom, tooltip)
|
||||||
|
|
||||||
# Deck Stats
|
# Deck Stats
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
|
@ -2,11 +2,13 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
import aqt
|
import aqt
|
||||||
from aqt.utils import showInfo, openHelp, getOnlyText, shortcut, restoreGeom, saveGeom
|
|
||||||
from anki.hooks import addHook, remHook
|
from anki.hooks import addHook, remHook
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import (getOnlyText, openHelp, restoreGeom, saveGeom, shortcut,
|
||||||
|
showInfo)
|
||||||
|
|
||||||
|
|
||||||
class StudyDeck(QDialog):
|
class StudyDeck(QDialog):
|
||||||
def __init__(self, mw, names=None, accept=None, title=None,
|
def __init__(self, mw, names=None, accept=None, title=None,
|
||||||
|
|
14
aqt/sync.py
14
aqt/sync.py
|
@ -1,16 +1,16 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
import time
|
|
||||||
import gc
|
import gc
|
||||||
|
import time
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
from anki.storage import Collection
|
|
||||||
from anki.sync import Syncer, RemoteServer, FullSyncer, MediaSyncer, \
|
|
||||||
RemoteMediaServer
|
|
||||||
from anki.hooks import addHook, remHook
|
from anki.hooks import addHook, remHook
|
||||||
from aqt.utils import tooltip, askUserDialog, showWarning, showText, showInfo
|
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from anki.storage import Collection
|
||||||
|
from anki.sync import (FullSyncer, MediaSyncer, RemoteMediaServer,
|
||||||
|
RemoteServer, Syncer)
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import askUserDialog, showInfo, showText, showWarning, tooltip
|
||||||
|
|
||||||
# Sync manager
|
# Sync manager
|
||||||
######################################################################
|
######################################################################
|
||||||
|
@ -461,5 +461,3 @@ class SyncThread(QThread):
|
||||||
|
|
||||||
def fireEvent(self, cmd, arg=""):
|
def fireEvent(self, cmd, arg=""):
|
||||||
self._event.emit(cmd, arg)
|
self._event.emit(cmd, arg)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
from aqt.qt import *
|
||||||
|
|
||||||
|
|
||||||
class TagEdit(QLineEdit):
|
class TagEdit(QLineEdit):
|
||||||
|
|
||||||
lostFocus = pyqtSignal()
|
lostFocus = pyqtSignal()
|
||||||
|
|
|
@ -3,7 +3,8 @@
|
||||||
|
|
||||||
import aqt
|
import aqt
|
||||||
from aqt.qt import *
|
from aqt.qt import *
|
||||||
from aqt.utils import saveGeom, restoreGeom
|
from aqt.utils import restoreGeom, saveGeom
|
||||||
|
|
||||||
|
|
||||||
class TagLimit(QDialog):
|
class TagLimit(QDialog):
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,9 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from aqt.qt import *
|
||||||
|
|
||||||
|
|
||||||
class Toolbar:
|
class Toolbar:
|
||||||
|
|
||||||
|
|
|
@ -5,11 +5,12 @@ import time
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
import aqt
|
import aqt
|
||||||
from aqt.utils import openLink, showText
|
|
||||||
from anki.utils import platDesc, versionWithBuild
|
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from anki.utils import platDesc, versionWithBuild
|
||||||
|
from aqt.qt import *
|
||||||
|
from aqt.utils import openLink, showText
|
||||||
|
|
||||||
|
|
||||||
class LatestVersionFinder(QThread):
|
class LatestVersionFinder(QThread):
|
||||||
|
|
||||||
|
|
14
aqt/utils.py
14
aqt/utils.py
|
@ -1,15 +1,19 @@
|
||||||
# Copyright: Ankitects Pty Ltd and contributors
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from aqt.qt import *
|
|
||||||
import re, os, sys, subprocess
|
|
||||||
import aqt
|
import aqt
|
||||||
from anki.sound import stripSounds
|
|
||||||
from anki.utils import isWin, isMac, invalidFilename, noBundledLibs, \
|
|
||||||
versionWithBuild
|
|
||||||
from anki.lang import _
|
from anki.lang import _
|
||||||
|
from anki.sound import stripSounds
|
||||||
|
from anki.utils import (invalidFilename, isMac, isWin, noBundledLibs,
|
||||||
|
versionWithBuild)
|
||||||
|
from aqt.qt import *
|
||||||
|
|
||||||
|
|
||||||
def openHelp(section):
|
def openHelp(section):
|
||||||
link = aqt.appHelpSite
|
link = aqt.appHelpSite
|
||||||
|
|
|
@ -2,13 +2,14 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
import json
|
import json
|
||||||
import sys
|
|
||||||
import math
|
import math
|
||||||
|
import sys
|
||||||
|
|
||||||
from anki.hooks import runHook
|
from anki.hooks import runHook
|
||||||
|
from anki.lang import _
|
||||||
|
from anki.utils import isLin, isMac, isWin
|
||||||
from aqt.qt import *
|
from aqt.qt import *
|
||||||
from aqt.utils import openLink
|
from aqt.utils import openLink
|
||||||
from anki.utils import isMac, isWin, isLin
|
|
||||||
from anki.lang import _
|
|
||||||
|
|
||||||
# Page for debug messages
|
# Page for debug messages
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
|
@ -3,3 +3,4 @@ mypy==0.750
|
||||||
pylint
|
pylint
|
||||||
mock
|
mock
|
||||||
pytype
|
pytype
|
||||||
|
isort
|
||||||
|
|
Loading…
Reference in a new issue