Damien Elmes
c395003def
expose translations to Python
2020-02-17 08:40:17 +10:00
Damien Elmes
4fe47b7be4
cache i18n categories
2020-02-17 08:40:17 +10:00
Damien Elmes
9247e5de7d
don't hard-code available ftl languages
...
Instead of trying to define which languages we support, just check
if an appropriate folder is available on disk. This allows users
to drop their own translations into the locale folder and have things
just work.
2020-02-17 08:40:17 +10:00
Damien Elmes
8cd76bee92
wrap i18n struct in a shared mutex so we can start caching
2020-02-17 08:40:17 +10:00
Damien Elmes
f6a881f950
pass progress back as translated string(s)
2020-02-17 08:40:17 +10:00
Damien Elmes
d1e587fca9
add ftl to the build process, and a sync-git script
...
also
- ensure po files are checked when updated
- add start of sync.ftl
2020-02-17 08:40:17 +10:00
Damien Elmes
cc99f221be
expose StringsGroup enum in protobuf
2020-02-17 08:40:17 +10:00
Damien Elmes
61b9f70ab9
bump version
2020-02-17 08:40:17 +10:00
Damien Elmes
319390f0c6
more frequent progress updates
2020-02-17 08:40:17 +10:00
Damien Elmes
b8e516b47c
rename card-templates.ftl
2020-02-17 08:40:17 +10:00
Damien Elmes
0cc1938657
move empty card check into template code
2020-02-17 08:40:17 +10:00
Damien Elmes
33367c8edf
make template errors translatable
2020-02-17 08:40:17 +10:00
Damien Elmes
5c8e3df612
include report in MediaCheckOutput
2020-02-17 08:40:17 +10:00
Damien Elmes
dc9362d4ed
add i18n support to Rust code using Fluent
2020-02-17 08:40:17 +10:00
Damien Elmes
ee27711b65
remove redundant test_ prefix
2020-02-17 08:40:17 +10:00
Damien Elmes
23483b0a57
mark deletions in media DB when files are deleted
2020-02-17 08:40:17 +10:00
Damien Elmes
1b0e8485fd
ignore errors when file to delete is already gone
...
May be marked as pending upload or in media check screen, then removed
by user.
2020-02-17 08:40:17 +10:00
Damien Elmes
df201c164f
make sure we don't leave a trailing dot or space when truncating
2020-02-17 08:40:17 +10:00
Damien Elmes
1ff6cbc54d
make sure renames generated during sync don't get immediately removed
2020-02-17 08:40:17 +10:00
Damien Elmes
d394aed5fd
don't filter out invalid filenames when we're sending them as a deletion
2020-02-17 08:40:17 +10:00
Damien Elmes
44a1a5f987
fix the wrong named being returned when renaming in sync
2020-02-17 08:40:17 +10:00
Damien Elmes
c3f22364c9
pt->pb for consistency with rsbackend.py
2020-02-17 08:40:17 +10:00
Damien Elmes
d73fec3280
shorten add_file_to_media_folder
2020-02-17 08:40:17 +10:00
Damien Elmes
4c0f216df2
use media.trash for unused media deletion as well
2020-02-17 08:40:17 +10:00
Damien Elmes
7f365faf3f
add extract_latex to backend; use it for latex build
2020-02-17 08:40:17 +10:00
Damien Elmes
c890ef871e
include LaTeX png/svg files when checking for unused media
2020-02-17 08:40:17 +10:00
Damien Elmes
4cca3ecef5
files with leading underscore are ignored
2020-02-17 08:40:17 +10:00
Damien Elmes
9913dcd5dc
include normalized filenames in the rename list
...
Since they'll need to be uploaded on the next sync, better not to
hide them from the list
2020-02-17 08:40:17 +10:00
Damien Elmes
6f158c8555
plug new media check in
2020-02-17 08:40:17 +10:00
Damien Elmes
c1939aebd1
when adding hash suffix, need length in hex, not bytes
2020-02-17 08:40:17 +10:00
Damien Elmes
fabfcb0338
gather field references in Rust; media check now mostly complete
2020-02-17 08:40:17 +10:00
Damien Elmes
aa832e9117
backend stores media folder/db locations; don't need to pass them in
2020-02-17 08:40:17 +10:00
Damien Elmes
58da7988c3
catch trailing space/period as well
2020-02-17 08:40:17 +10:00
Damien Elmes
5ccdeb46b8
check [ instead of con in unit test, so test works on Windows as well
2020-02-17 08:40:17 +10:00
Damien Elmes
dad8108feb
run the TZ test only on Macs
2020-02-17 08:40:17 +10:00
Damien Elmes
87c73741d0
test shouldn't depend on dentry order
2020-02-17 08:40:17 +10:00
Damien Elmes
314e643140
expire media trash after a week
2020-02-17 08:40:17 +10:00
Damien Elmes
e9f51a694c
use our own trash folder instead of using the system trash
...
the trash crate was invoking external commands on Macs and Linux
which is slow and likely to fall over if a large number of files need
to be deleted at once.
2020-02-17 08:40:17 +10:00
Damien Elmes
660a9bf7ad
tidying
2020-02-17 08:40:17 +10:00
Damien Elmes
3350b4fa69
hold the DB open for the duration of the check
2020-02-17 08:40:17 +10:00
Damien Elmes
cee8d4b789
DB check
...
Working, but should be refactored so media DB not re-opened
each time a file is renamed.
2020-02-17 08:40:17 +10:00
Damien Elmes
8aa2984d04
factor entry code out for later
2020-02-17 08:40:17 +10:00
Damien Elmes
ce241f9756
mgr didn't need to be mutable
2020-02-17 08:40:17 +10:00
Damien Elmes
f7c26724f3
nfc helper
2020-02-17 08:40:17 +10:00
Damien Elmes
933b7a9a34
ignore 0 byte files when picking up changes
2020-02-17 08:40:17 +10:00
Damien Elmes
4fa4a5077c
don't add non-normalized files to media DB
2020-02-17 08:40:17 +10:00
Damien Elmes
22793c8cd6
media table doesn't need rowid
2020-02-17 08:40:17 +10:00
Damien Elmes
1ca11e4268
dirty index doesn't need to cover false case
2020-02-17 08:40:17 +10:00
Damien Elmes
bf50f88540
handle read errors during zip build
2020-02-17 08:40:17 +10:00
Damien Elmes
eddf9fdc44
clean up invalid media DB entries on the fly, instead of requiring DB check
2020-02-17 08:40:17 +10:00
Damien Elmes
7ae6244f6a
log media DB change registration progress, and allow aborting it
2020-02-17 08:40:17 +10:00
Damien Elmes
e5f9ed5a5b
move change tracking into separate file
2020-02-17 08:40:17 +10:00
Damien Elmes
5fe1bfc5b4
simplify code by accumulating stats at the source
2020-02-17 08:40:17 +10:00
Damien Elmes
4289f7a02a
move sync_media() into MediaManager
2020-02-17 08:40:17 +10:00
Damien Elmes
fb8f753d2d
update rslib version automatically
2020-02-17 08:40:17 +10:00
Damien Elmes
4c8ceeb809
remove duplicate method
2020-02-17 08:40:17 +10:00
Damien Elmes
32a3b5a020
tidy up sync.rs
2020-02-17 08:40:17 +10:00
Damien Elmes
9067bf98bd
handle concurrent modifications and ankiweb terminating early
2020-02-17 08:40:17 +10:00
Damien Elmes
e0511c560b
update dirmod as files added during sync
2020-02-17 08:40:17 +10:00
Damien Elmes
631bdc2a1e
add debug line
2020-02-17 08:40:17 +10:00
Damien Elmes
1f35ff0bd5
fix force_resync()
2020-02-17 08:40:17 +10:00
Damien Elmes
23f5c7cb9b
rename non-normalized filenames when downloading
2020-02-17 08:40:17 +10:00
Damien Elmes
0fb70dab0f
comply with manylinux wheel requirements, and vendor sqlite on Windows
2020-02-17 08:40:17 +10:00
Damien Elmes
98279add15
defer errors on upload to media check
2020-02-17 08:40:17 +10:00
Damien Elmes
0f7fc1e960
add proper version
2020-02-17 08:40:16 +10:00
Damien Elmes
6a64c8dfcc
use enums for some common errors
2020-02-17 08:40:16 +10:00
Damien Elmes
8d97f862a4
defer media DB load until media action performed
...
This means a corrupt media DB will not prevent collection load.
2020-02-17 08:40:16 +10:00
Damien Elmes
ec9abf1ce5
pass in endpoint
2020-02-17 08:40:16 +10:00
Damien Elmes
ea4de9a6de
connect media sync progress to Python, add a progress dialog
2020-02-17 08:40:16 +10:00
Damien Elmes
c82cff3836
add progress hook to media sync
2020-02-17 08:40:16 +10:00
Damien Elmes
d0ee95c4cd
send removed files to the trash
...
The way the trash crate implements deletion on a Mac is ugly, and
we may need to look into alternatives.
2020-02-17 08:40:16 +10:00
Damien Elmes
5e5906f183
store sync state in a struct, and reuse ctx across methods
2020-02-17 08:40:16 +10:00
Damien Elmes
f20b5b8db6
media sync working, but unpolished
2020-02-17 08:40:16 +10:00
Damien Elmes
1974981b94
bump nightly for the unwrap source line fix
2020-02-17 08:40:16 +10:00
Damien Elmes
ec8a91b493
more refactoring
2020-02-17 08:40:16 +10:00
Damien Elmes
10f64d54b8
rearrange some methods to make structure clearer
2020-02-17 08:40:16 +10:00
Damien Elmes
01470c4854
backend init can now fail, and update media db when file is added
...
- Adding files inside Anki now updates the media DB, so a full file
scan at sync time is no longer required if no other changes have been
made.
- Use a protobuf message for backend initialization, and return a
string error if initialization fails.
2020-02-17 08:40:16 +10:00
Damien Elmes
96f0a5cc3c
port change tracking
2020-02-17 08:40:16 +10:00
Damien Elmes
7d42da67c6
make sure results are checked
2020-02-17 08:40:16 +10:00
Damien Elmes
056c2d3fd1
initial rs implementation of media database
2020-02-17 08:40:16 +10:00
Damien Elmes
4096d21c07
add add_file() and write_data()
2020-02-17 08:40:16 +10:00
Damien Elmes
41266f46f1
add another implementation of media.addFile() and cleanFilename() et al
...
Instead of adding an incrementing number in the conflict case,
the file hash is appended.
2020-02-17 08:40:16 +10:00
Damien Elmes
bd96c27096
show which side the template error occurred on
2020-02-08 11:54:08 +10:00
Damien Elmes
ed8c1ae9c5
clearer error when closing tags transposed
2020-02-08 10:32:34 +10:00
Damien Elmes
c075191697
reuse reveal_cloze_text() for LaTeX cloze expansion
2020-01-28 07:40:44 +10:00
Damien Elmes
9ad80f4d2c
move cloze-related code into a separate file
2020-01-27 20:41:23 +10:00
Damien Elmes
21cbb5a766
support speed control in tts tags
2020-01-26 14:31:07 +10:00
Damien Elmes
17ebdfc099
extract and flag AV tags as part of the render process
...
We can now show replay buttons for the audio contained in {{FrontSide}}
without having to play it again when the answer is shown.
The template code now always defers FrontSide rendering, as it wasn't
a big saving, and meant the logic had to be implemented twice.
2020-01-24 11:06:11 +10:00
Damien Elmes
de3fe320c0
look through negated conditionals instead of just ignoring them
...
https://anki.tenderapp.com/discussions/ankidesktop/38220-bug-in-2119-regarding-computation-of-req
2020-01-23 17:27:07 +10:00
Damien Elmes
4fb227ca4c
added flag_av_tags() for replay button support
2020-01-21 14:44:27 +10:00
Damien Elmes
c713683f63
add rank handling to TTS; parse TTS args in get_av_tags()
2020-01-21 12:41:37 +10:00
Damien Elmes
66e277e44b
more TTS and sound work
...
- use provided language and voices when playing on Mac
- fix hang in waiting for termination
- allow players to return a rank for a given tag,
which will allow for the best matching player to be chosen
depending on the context (eg, prioritize one player for videos,
one tts player for certain voices, etc)
2020-01-21 11:34:25 +10:00
Damien Elmes
0942ffbff6
add a simple TTS field filter
...
This simply wraps the field in extra text that the frontend will
deal with. Also added some helpers for extracting and stripping
audio and TTS tags from the rendered text.
2020-01-20 19:16:24 +10:00
Damien Elmes
fbf0f94bcc
workflow fix
2020-01-19 15:02:08 +10:00
Damien Elmes
bead03e858
drop plus_one test
2020-01-17 18:54:38 -07:00
Damien Elmes
12c60f20fe
_localOffsetForDate() was broken
...
It was including the elapsed time of day when calculating
the offset, leading to incorrect results
2020-01-17 18:52:36 -07:00
Damien Elmes
cddfddf1c8
save filters and field name separately
2020-01-16 18:47:21 +10:00
Damien Elmes
bdac937802
show missing field errors in the same way as the other errors
2020-01-16 18:47:21 +10:00
Damien Elmes
b56c9591c0
more useful template error message
2020-01-16 18:47:21 +10:00
Damien Elmes
99c45c5fbc
allow an empty field name if filters are provided
...
This is to make it easier for add-ons to provide extra content that
degrades nicely on platforms that don't have the add-on.
2020-01-15 18:48:23 +10:00
Damien Elmes
9d84f8fb70
fix overlapping clozes
2020-01-14 07:07:21 +10:00
Damien Elmes
9bb0348fdd
more template rendering tweaks
...
- The front and back are rendered in one call now. If the front
side contains no custom filters, we can bake {{FrontSide}} into the
rear side. If it did contain custom filters, we return the partially
complete rear template instead, and the calling code can inject
the FrontSide in after it has been fully rendered.
- Instead of modifying "cloze" into something like "cq-2", the card
ordinal and whether we're rendering the question or answer are now
passed in to the rendering filters as context.
- The Rust code doesn't need to support filter names split on '-'
anymore.
- Drop the "Show" part of hint descriptions so i18n support can be
deferred.
- Ignore blank filter names caused by user using two colons instead
of one.
- Fixed hint field and text transposition.
2020-01-12 21:34:07 +10:00
Damien Elmes
84d22046d4
fix type:cloze handling
2020-01-11 19:38:41 +10:00
Damien Elmes
7cde51e884
ignore extra { chars in replacement
...
This will still show a trailing } with {{{field}}}, but will at
least show the field content instead of 'unknown field'.
2020-01-11 18:02:24 +10:00
Damien Elmes
feb0a31bba
static->const
2020-01-11 13:06:48 +10:00
Damien Elmes
0ccc9e98a8
drop unnecessary capitalized cloze handling
2020-01-11 13:03:43 +10:00
Damien Elmes
389bf07b52
handle mathjax+cloze case
...
instead of trying to selectively change clozes from c to C, just
strip HTML from inside the mathjax sections instead
2020-01-11 12:57:32 +10:00
Damien Elmes
cc09ca34d4
cloze: support
...
MathJax still to do
2020-01-11 12:07:06 +10:00
Damien Elmes
94a72f970a
type: and hint: support
...
We may need to keep handling hints in the Python code for now until
i18n is sorted out.
2020-01-11 09:35:41 +10:00
Damien Elmes
7d7656d86f
add ruby filters
2020-01-10 21:04:52 +10:00
Damien Elmes
d4553e9488
add some text helpers
2020-01-10 21:01:23 +10:00
Damien Elmes
96c8784024
add copyright headers to some files
2020-01-10 21:00:48 +10:00
Damien Elmes
deca82ca9d
skip rslib doctests, we don't use them and they're slower
2020-01-10 18:06:21 +10:00
Damien Elmes
3f724e5c98
replace fields and apply standard filters in rslib
...
The filters still need to be implemented.
2020-01-10 18:02:26 +10:00
Damien Elmes
f7ff0d1c17
flatten->render; pass field content in
...
This is paving the way to move the standard filters into Rust.
Non-empty fields are now determined in Rust, using a single regex
instead of the overkill stripHTMLMedia(). The old implementation
has been moved into the Pystache code for now.
2020-01-10 14:59:29 +10:00
Damien Elmes
ff7ff5c2b9
fix next_day_at being off by a day before the rollover
2020-01-10 08:21:52 +10:00
Damien Elmes
a5613523ee
rework new timezone code
...
We now store the UTC offset that was in effect at creation time,
and use that to determine the starting date.
2020-01-09 16:58:27 +10:00
Damien Elmes
ad17c765e6
ignore template closing characters outside of a tag
2020-01-08 20:29:04 +10:00
Damien Elmes
0087eee6d9
handle conditional replacement in Rust
...
This extends the existing Rust code to handle conditional
replacement. The replacement of field names and filters to text
remains in Python, so that add-ons can still define their own
field modifiers.
The code is currently running the old Pystache rendering and the
new implementation in parallel, and will print a message to the
console if they don't match. If you notice any problems, please
let me know.
2020-01-08 20:28:04 +10:00
Damien Elmes
46445638a8
fix days_elapsed moving backwards
2020-01-07 09:29:43 +10:00
Damien Elmes
86055bb564
add failing test for days_elapsed calculation
...
the current code was causing the day to move backwards:
at day 7 hour 23:59, elap is 1
at day 8 hour 0:59, elap is 0
at day 8 hour 1:59, elap is 0
at day 8 hour 2:59, elap is 1
at day 8 hour 3:59, elap is 1
at day 8 hour 4:59, elap is 2
as mentioned in https://github.com/ankitects/anki/pull/416
2020-01-07 09:29:43 +10:00
Damien Elmes
53692567e8
make sure rust tests rerun on source change; don't hide output
2020-01-07 09:29:43 +10:00
Damien Elmes
8df5f49c52
add some more protobuf messages
2020-01-06 12:18:20 +10:00
Damien Elmes
0bfc90f52f
update readme, remove submodule readmes
2020-01-04 12:21:58 +10:00
Damien Elmes
8007113d7c
move license info into one place
2020-01-03 09:41:30 +10:00
Damien Elmes
5876866565
tweaking the folder names again
...
hopefully that's the last of it
2020-01-03 07:48:38 +10:00