Merge remote-tracking branch 'upstream/HEAD' into text-import-export

This commit is contained in:
RumovZ 2022-05-11 18:58:48 +02:00
commit 93a90db7d4
14 changed files with 76 additions and 18 deletions

View file

@ -1,5 +1,8 @@
{ {
"editor.formatOnSave": true, "editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
"files.watcherExclude": { "files.watcherExclude": {
"**/.git/objects/**": true, "**/.git/objects/**": true,
"**/.git/subtree-cache/**": true, "**/.git/subtree-cache/**": true,

View file

@ -141,6 +141,13 @@ that's causing the problem, and then run
bazel run //ts:format bazel run //ts:format
``` ```
If you get complaints from eslint about unordered imports, run the following
line first, then run ts:format:
```
bazel run eslint -- --fix
```
For other packages, change to the folder and run For other packages, change to the folder and run
``` ```

View file

@ -158,6 +158,7 @@ class TemplateRenderContext:
self._fill_empty = fill_empty self._fill_empty = fill_empty
self._fields: dict | None = None self._fields: dict | None = None
self._latex_svg = False self._latex_svg = False
self._question_side: bool = True
if not notetype: if not notetype:
self._note_type = note.note_type() self._note_type = note.note_type()
else: else:
@ -167,6 +168,10 @@ class TemplateRenderContext:
# hooks, you can insert it into this dictionary # hooks, you can insert it into this dictionary
self.extra_state: dict[str, Any] = {} self.extra_state: dict[str, Any] = {}
@property
def question_side(self) -> bool:
return self._question_side
def col(self) -> anki.collection.Collection: def col(self) -> anki.collection.Collection:
return self._col return self._col
@ -226,9 +231,11 @@ class TemplateRenderContext:
answer_av_tags=[], answer_av_tags=[],
) )
self._question_side = True
qtext = apply_custom_filters(partial.qnodes, self, front_side=None) qtext = apply_custom_filters(partial.qnodes, self, front_side=None)
qout = self.col()._backend.extract_av_tags(text=qtext, question_side=True) qout = self.col()._backend.extract_av_tags(text=qtext, question_side=True)
self._question_side = False
atext = apply_custom_filters(partial.anodes, self, front_side=qout.text) atext = apply_custom_filters(partial.anodes, self, front_side=qout.text)
aout = self.col()._backend.extract_av_tags(text=atext, question_side=False) aout = self.col()._backend.extract_av_tags(text=atext, question_side=False)

View file

@ -39,7 +39,7 @@ if __name__ == "__main__":
"anki", "anki",
"tests", "tests",
"tools", "tools",
"--exclude=_pb2|buildinfo|_gen", "--exclude=_pb2|buildinfo|_gen|_backend/generated|fluent",
] ]
+ args, + args,
check=False, check=False,

View file

@ -115,12 +115,12 @@ def register_repos():
################ ################
core_i18n_repo = "anki-core-i18n" core_i18n_repo = "anki-core-i18n"
core_i18n_commit = "0d97543af78a11c7cc4f2af34f4eaef18e86cae9" core_i18n_commit = "f404191d521051946b824d7974b14aff35932016"
core_i18n_zip_csum = "ca722979b1c6ff4098d5fc3b91a723e51ac760e1a723ac46983c05248e4e79e2" core_i18n_zip_csum = "da823e153ff55ca1bb46d8e1eb5b74ca723f596abf85fb530f2457d17d0ffa05"
qtftl_i18n_repo = "anki-desktop-ftl" qtftl_i18n_repo = "anki-desktop-ftl"
qtftl_i18n_commit = "9eda7432ff61768e867376bf7e4cf9a450056c9b" qtftl_i18n_commit = "51724fbb327815358d6f896a4f79cf9cb2303562"
qtftl_i18n_zip_csum = "6544d7d02cf605559f8d1ac1103d9375b2a2ecad499734dff748cf2675d59deb" qtftl_i18n_zip_csum = "e8f4723eb6d20432754b08c19164fbaafd43ff8222779e2a7cd1fb835f41c7b5"
i18n_build_content = """ i18n_build_content = """
filegroup( filegroup(

View file

@ -122,7 +122,9 @@ impl LimitTreeMap {
.unwrap(); .unwrap();
let mut map = HashMap::new(); let mut map = HashMap::new();
if root_limits.limits.review > 0 {
map.insert(root_deck.id, root_id.clone()); map.insert(root_deck.id, root_id.clone());
}
let mut limits = Self { tree, map }; let mut limits = Self { tree, map };
let mut remaining_decks = child_decks.into_iter().peekable(); let mut remaining_decks = child_decks.into_iter().peekable();

View file

@ -287,6 +287,13 @@ mod test {
self.add_or_update_deck(deck).unwrap(); self.add_or_update_deck(deck).unwrap();
} }
fn set_deck_review_limit(&mut self, deck: DeckId, limit: u32) {
let dcid = self.get_deck(deck).unwrap().unwrap().config_id().unwrap();
let mut conf = self.get_deck_config(dcid, false).unwrap().unwrap();
conf.inner.reviews_per_day = limit;
self.add_or_update_deck_config(&mut conf).unwrap();
}
fn queue_as_deck_and_template(&mut self, deck_id: DeckId) -> Vec<(DeckId, u16)> { fn queue_as_deck_and_template(&mut self, deck_id: DeckId) -> Vec<(DeckId, u16)> {
self.build_queues(deck_id) self.build_queues(deck_id)
.unwrap() .unwrap()
@ -318,6 +325,18 @@ mod test {
} }
} }
#[test]
fn should_build_empty_queue_if_limit_is_reached() {
let mut col = open_test_collection();
col.set_config_bool(BoolKey::Sched2021, true, false)
.unwrap();
let note_id = col.add_new_note("Basic").id;
let cids = col.storage.card_ids_of_notes(&[note_id]).unwrap();
col.set_due_date(&cids, "0", None).unwrap();
col.set_deck_review_limit(DeckId(1), 0);
assert_eq!(col.queue_as_deck_and_template(DeckId(1)), vec![]);
}
#[test] #[test]
fn new_queue_building() -> Result<()> { fn new_queue_building() -> Result<()> {
let mut col = open_test_collection(); let mut col = open_test_collection();

View file

@ -43,10 +43,12 @@
let previousTooltip: string = tooltip; let previousTooltip: string = tooltip;
$: if (tooltip !== previousTooltip) { $: if (tooltip !== previousTooltip) {
previousTooltip = tooltip; previousTooltip = tooltip;
if (tooltipObject !== undefined) {
const element: HTMLElement = tooltipObject["_element"]; const element: HTMLElement = tooltipObject["_element"];
tooltipObject.dispose(); tooltipObject.dispose();
createTooltip(element); createTooltip(element);
} }
}
</script> </script>
<slot {createTooltip} {tooltipObject} /> <slot {createTooltip} {tooltipObject} />

View file

@ -66,7 +66,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
tooltip={getPlatformString(saveKeyCombination)} tooltip={getPlatformString(saveKeyCombination)}
--border-left-radius="5px">{tr.deckConfigSaveButton()}</LabelButton --border-left-radius="5px">{tr.deckConfigSaveButton()}</LabelButton
> >
<Shortcut keyCombination={saveKeyCombination} on:click={() => save(false)} /> <Shortcut keyCombination={saveKeyCombination} on:action={() => save(false)} />
<WithDropdown let:createDropdown --border-right-radius="5px"> <WithDropdown let:createDropdown --border-right-radius="5px">
<LabelButton <LabelButton

View file

@ -70,7 +70,7 @@ export function convertMathjax(
* Escape characters which are technically legal in Mathjax, but confuse HTML. * Escape characters which are technically legal in Mathjax, but confuse HTML.
*/ */
export function escapeSomeEntities(value: string): string { export function escapeSomeEntities(value: string): string {
return value.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/&/g, "&amp;"); return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
} }
export function unescapeSomeEntities(value: string): string { export function unescapeSomeEntities(value: string): string {

View file

@ -40,7 +40,6 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import Absolute from "../components/Absolute.svelte"; import Absolute from "../components/Absolute.svelte";
import Badge from "../components/Badge.svelte"; import Badge from "../components/Badge.svelte";
import { bridgeCommand } from "../lib/bridgecommand"; import { bridgeCommand } from "../lib/bridgecommand";
import { isApplePlatform } from "../lib/platform";
import { ChangeTimer } from "./change-timer"; import { ChangeTimer } from "./change-timer";
import DecoratedElements from "./DecoratedElements.svelte"; import DecoratedElements from "./DecoratedElements.svelte";
import { clearableArray } from "./destroyable"; import { clearableArray } from "./destroyable";
@ -70,7 +69,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
return fontFamily; return fontFamily;
} }
const size = isApplePlatform() ? 1.6 : 1.8; const size = 1.6;
const wrap = true; const wrap = true;
const fieldStores: Writable<string>[] = []; const fieldStores: Writable<string>[] = [];

View file

@ -152,12 +152,13 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
} }
/** /**
* Image resizing add-ons previously used image.style.width to set the * Image resizing add-ons previously used image.style.width/height to set the
* preferred width of an image. In these cases, if we'd only set * preferred dimension of an image. In these cases, if we'd only set
* image.width, there would be no visible effect on the image. * image.[dimension], there would be no visible effect on the image.
* To avoid confusion with users we'll clear image.style.width (for now). * To avoid confusion with users we'll clear image.style.[dimension] (for now).
*/ */
activeImage!.style.removeProperty("width"); activeImage!.style.removeProperty("width");
activeImage!.style.removeProperty("height");
if (activeImage!.getAttribute("style")?.length === 0) { if (activeImage!.getAttribute("style")?.length === 0) {
activeImage!.removeAttribute("style"); activeImage!.removeAttribute("style");
} }

View file

@ -112,6 +112,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
function appendEmptyTag(): void { function appendEmptyTag(): void {
// used by tag badge and tag spacer // used by tag badge and tag spacer
deselect();
const lastTag = tagTypes[tagTypes.length - 1]; const lastTag = tagTypes[tagTypes.length - 1];
if (!lastTag || lastTag.name.length > 0) { if (!lastTag || lastTag.name.length > 0) {
@ -219,6 +220,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
activeAfterBlur = index - 1; activeAfterBlur = index - 1;
active = null; active = null;
activeInput.blur();
} }
async function moveToNextTag(index: number): Promise<void> { async function moveToNextTag(index: number): Promise<void> {
@ -232,6 +234,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
activeAfterBlur = index + 1; activeAfterBlur = index + 1;
active = null; active = null;
activeInput.blur();
await tick(); await tick();
activeInput.setSelectionRange(0, 0); activeInput.setSelectionRange(0, 0);
@ -448,6 +451,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
splitTag(index, detail.start, detail.end)} splitTag(index, detail.start, detail.end)}
on:tagadd={() => insertTagKeepFocus(index)} on:tagadd={() => insertTagKeepFocus(index)}
on:tagdelete={() => deleteTagAt(index)} on:tagdelete={() => deleteTagAt(index)}
on:tagselectall={selectAllTags}
on:tagjoinprevious={() => joinWithPreviousTag(index)} on:tagjoinprevious={() => joinWithPreviousTag(index)}
on:tagjoinnext={() => joinWithNextTag(index)} on:tagjoinnext={() => joinWithNextTag(index)}
on:tagmoveprevious={() => moveToPreviousTag(index)} on:tagmoveprevious={() => moveToPreviousTag(index)}

View file

@ -5,6 +5,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
<script lang="ts"> <script lang="ts">
import { createEventDispatcher, onMount, tick } from "svelte"; import { createEventDispatcher, onMount, tick } from "svelte";
import { registerShortcut } from "../../lib/shortcuts";
import { import {
delimChar, delimChar,
normalizeTagname, normalizeTagname,
@ -230,7 +231,20 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
name = last; name = last;
} }
onMount(() => input.focus()); async function onSelectAll(event: KeyboardEvent) {
if (name.length === 0) {
input.blur();
await tick(); // ensure blur events are processed before tagselectall
dispatch("tagselectall");
event.preventDefault();
event.stopPropagation();
}
}
onMount(() => {
registerShortcut(onSelectAll, "Control+A", { target: input });
input.focus();
});
</script> </script>
<input <input