From 97f88a2b6d3c0cdcfeb4885b0cc080d5ebbfb13c Mon Sep 17 00:00:00 2001 From: Hugo Persson Date: Sat, 15 Mar 2025 10:23:28 +0100 Subject: [PATCH 1/5] fix: card context is undefined when showContextInCards false but access is not null safe --- src/gui/card-ui.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/card-ui.tsx b/src/gui/card-ui.tsx index 2ff5fbab..1d2b9ead 100644 --- a/src/gui/card-ui.tsx +++ b/src/gui/card-ui.tsx @@ -53,7 +53,7 @@ export class CardUI { public currentDeckCardCounter: HTMLDivElement; public currentDeckCardCounterIcon: HTMLDivElement; - public cardContext: HTMLElement; + public cardContext: HTMLElement | undefined; public content: HTMLDivElement; @@ -441,7 +441,7 @@ export class CardUI { private _updateCardContext() { if (!this.settings.showContextInCards) { - this.cardContext.setText(""); + this.cardContext?.setText(""); return; } this.cardContext.setText( From 4b3aa37dd113cf622f168a72c9ef4eb37c690fad Mon Sep 17 00:00:00 2001 From: Hugo Persson Date: Sat, 15 Mar 2025 10:29:22 +0100 Subject: [PATCH 2/5] feat: added option to exclude tags from flashcards review. Useful if many old flashcards exists --- src/gui/settings.tsx | 24 ++++++++++++++++++++++++ src/lang/locale/en.ts | 5 ++++- src/note-question-parser.ts | 10 ++++++++++ src/settings.ts | 11 +++++++++++ src/utils/strings.ts | 21 +++++++++++++++++++++ tests/unit/utils/strings.test.ts | 19 +++++++++++++++++++ 6 files changed, 89 insertions(+), 1 deletion(-) diff --git a/src/gui/settings.tsx b/src/gui/settings.tsx index 20dc2092..e632e7fd 100644 --- a/src/gui/settings.tsx +++ b/src/gui/settings.tsx @@ -129,6 +129,8 @@ export class SRSettingTab extends PluginSettingTab { this.createSettingFoldersToIgnore(containerEl); + this.createSettingsTagsToIgnore(containerEl); + containerEl.createEl("h3", { text: t("GROUP_FLASHCARD_REVIEW") }); new Setting(containerEl) .setName(t("BURY_SIBLINGS_TILL_NEXT_DAY")) @@ -551,6 +553,28 @@ export class SRSettingTab extends PluginSettingTab { }); } + private async createSettingsTagsToIgnore(containerEl: HTMLElement): Promise { + new Setting(containerEl) + .setName(t("TAGS_TO_EXCLUDE_FROM_DECKS")) + .setDesc(t("TAGS_TO_EXCLUDE_FROM_DECKS_DESC")) + .addTextArea((text) => + text + .setValue( + this.plugin.data.settings.flashcardTagsToExclude + ? this.plugin.data.settings.flashcardTagsToExclude.join(" ") + : "", + ) + .onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.flashcardTagsToExclude = value + .split(/\s+/) + .filter((t) => t.length > 0); + await this.plugin.savePluginData(); + }); + }), + ); + } + private async createSettingFoldersToIgnore(containerEl: HTMLElement): Promise { new Setting(containerEl) .setName(t("FOLDERS_TO_IGNORE")) diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index 5f9f0aed..eacb11d9 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -140,8 +140,11 @@ export default { NOTES: "Notes", NOTE: "Note", REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", - TAGS_TO_REVIEW: "Tags to review", + TAGS_TO_REVIEW: "Tags to review...", TAGS_TO_REVIEW_DESC: "Enter tags separated by spaces or newlines i.e. #review #tag2 #tag3.", + TAGS_TO_EXCLUDE_FROM_DECKS: "Tags to exclude from deck creation", + TAGS_TO_EXCLUDE_FROM_DECKS_DESC: + "Enter tags separated by spaces. Cards with these tags will still be included in review but won't create separate decks. This is sub components, so if you have #flashcards/test then enter 'test'.", OPEN_RANDOM_NOTE: "Open a random note for review", OPEN_RANDOM_NOTE_DESC: "When you turn this off, notes are ordered by importance (PageRank).", AUTO_NEXT_NOTE: "Open next note automatically after a review", diff --git a/src/note-question-parser.ts b/src/note-question-parser.ts index 491aca80..05eab28a 100644 --- a/src/note-question-parser.ts +++ b/src/note-question-parser.ts @@ -85,6 +85,16 @@ export class NoteQuestionParser { this.analyseTagCacheList(tagCompleteList); for (const question of this.questionList) { question.topicPathList = this.determineQuestionTopicPathList(question); + + if ( + question.topicPathList.list.some((e) => + e.path.some((tag) => { + return SettingsUtil.isExcludedFlashcardTag(this.settings, tag); + }), + ) + ) { + question.topicPathList = null; + } } // Now only keep questions that have a topic list diff --git a/src/settings.ts b/src/settings.ts index d2c8a3da..d733dfa6 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -5,9 +5,12 @@ import { DataStoreName } from "src/data-stores/base/data-store"; import { t } from "src/lang/helpers"; import { pathMatchesPattern } from "src/utils/fs"; +import { mapBadChars } from "./utils/strings"; + export interface SRSettings { // flashcards flashcardTags: string[]; + flashcardTagsToExclude: string[]; convertFoldersToDecks: boolean; burySiblingCards: boolean; randomizeCardOrder: boolean; @@ -68,6 +71,7 @@ export interface SRSettings { export const DEFAULT_SETTINGS: SRSettings = { // flashcards flashcardTags: ["#flashcards"], + flashcardTagsToExclude: [], convertFoldersToDecks: false, burySiblingCards: false, randomizeCardOrder: null, @@ -195,4 +199,11 @@ export class SettingsUtil { } return false; } + + static isExcludedFlashcardTag(settings: SRSettings, tag: string): boolean { + const res = settings.flashcardTagsToExclude.some( + (tagToExclude) => mapBadChars(tag) === mapBadChars(tagToExclude), + ); + return res; + } } diff --git a/src/utils/strings.ts b/src/utils/strings.ts index db3d26a9..8b173f8d 100644 --- a/src/utils/strings.ts +++ b/src/utils/strings.ts @@ -6,6 +6,27 @@ export enum TextDirection { type Hex = number; +export function getBadToGoodCharMap(): Record { + const badToGood: Record = {}; + badToGood["р"] = "p"; + return badToGood; +} + +/** + * Maps bad characters to good characters. + * We need this because when saving string in Obsidian some chars like "p" is converted to diffent p. See below + * If you try to save "cpen-331" in Obsidian we won't find that tag + */ +export function mapBadChars(tag: string): string { + const badToGood = getBadToGoodCharMap(); + return [...tag] + .map((e) => { + const good = badToGood[e]; + return good ? good : e; + }) + .join(""); +} + /** * Escapes the input string so that it can be converted to a regex * while making sure that symbols like `?` and `*` aren't interpreted diff --git a/tests/unit/utils/strings.test.ts b/tests/unit/utils/strings.test.ts index 4d8bb3b5..3284b7f2 100644 --- a/tests/unit/utils/strings.test.ts +++ b/tests/unit/utils/strings.test.ts @@ -3,13 +3,32 @@ import { cyrb53, escapeRegexString, findLineIndexOfSearchStringIgnoringWs, + getBadToGoodCharMap, literalStringReplace, + mapBadChars, MultiLineTextFinder, splitNoteIntoFrontmatterAndContent, splitTextIntoLineArray, stringTrimStart, } from "src/utils/strings"; +describe("mapBadChars", () => { + test("All LH should be different from RH", () => { + const m = getBadToGoodCharMap(); + // Check that each mapping is to a different character + for (const [key, value] of Object.entries(m)) { + expect(key).not.toEqual(value); + } + }); + + test("Map replaces special characters with safe alternatives", () => { + const problem = "cрen-331"; + const real = "cpen-331"; + expect(problem).not.toEqual(real); // Check that the strings are different + expect(mapBadChars(problem)).toEqual(real); + }); +}); + describe("escapeRegexString", () => { test("should escape special regex characters", () => { const input = ".*+?^${}()|[]\\"; From ffd34f078ed29a8a722bad331b381fb3d9ab30cc Mon Sep 17 00:00:00 2001 From: Hugo Persson Date: Sat, 15 Mar 2025 13:31:29 +0100 Subject: [PATCH 3/5] fix: linting issues --- src/settings.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/settings.ts b/src/settings.ts index d733dfa6..9dea4cb8 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -4,8 +4,7 @@ import { Algorithm } from "src/algorithms/base/isrs-algorithm"; import { DataStoreName } from "src/data-stores/base/data-store"; import { t } from "src/lang/helpers"; import { pathMatchesPattern } from "src/utils/fs"; - -import { mapBadChars } from "./utils/strings"; +import { mapBadChars } from "src/utils/strings"; export interface SRSettings { // flashcards From 52161767cd6b8e89ee04126f26eeef7e4467cf37 Mon Sep 17 00:00:00 2001 From: Hugo Persson Date: Sun, 6 Apr 2025 11:24:34 +0200 Subject: [PATCH 4/5] fixed tests --- src/lang/locale/ar.ts | 3 +++ src/lang/locale/cz.ts | 3 +++ src/lang/locale/de.ts | 3 +++ src/lang/locale/es.ts | 3 +++ src/lang/locale/fr.ts | 7 +++++-- src/lang/locale/it.ts | 3 +++ src/lang/locale/ja.ts | 3 +++ src/lang/locale/ko.ts | 3 +++ src/lang/locale/pl.ts | 3 +++ src/lang/locale/pt-br.ts | 3 +++ src/lang/locale/ru.ts | 5 ++++- src/lang/locale/tr.ts | 3 +++ src/lang/locale/zh-cn.ts | 2 ++ src/lang/locale/zh-tw.ts | 4 +++- src/note-question-parser.ts | 3 +-- src/question.ts | 2 +- 16 files changed, 46 insertions(+), 7 deletions(-) diff --git a/src/lang/locale/ar.ts b/src/lang/locale/ar.ts index 22b458c5..bceeaf6e 100644 --- a/src/lang/locale/ar.ts +++ b/src/lang/locale/ar.ts @@ -139,6 +139,9 @@ export default { REVIEW_PANE_ON_STARTUP: "تمكين جزء مراجعة الملاحظات عند بدء التشغيل", TAGS_TO_REVIEW: "وسوم للمراجعة", TAGS_TO_REVIEW_DESC: "#أدخل الوسوم مفصولة بمسافات أو خطوط جديدة ، أي : مراجعة# وسم2# وسم3", + TAGS_TO_EXCLUDE_FROM_DECKS: "الوسوم المستبعدة من إنشاء الرُزم", + TAGS_TO_EXCLUDE_FROM_DECKS_DESC: + "أدخل الوسوم مفصولة بمسافات. البطاقات التي تحمل هذه الوسوم ستظل مُدرجة في المراجعة ولكنها لن تنشئ رُزمًا منفصلة. هذه مكونات فرعية، لذا إذا كان لديك #flashcards/test فأدخل 'test'.", OPEN_RANDOM_NOTE: "افتح ملاحظة عشوائية للمراجعة", OPEN_RANDOM_NOTE_DESC: "(Pagerank) عند تعطيل هذا الخيار ،الملاحظات سيتم ترتيبُها حسب الأهمية", AUTO_NEXT_NOTE: "افتح الملاحظة التالية تلقائيًا بعد المراجعة", diff --git a/src/lang/locale/cz.ts b/src/lang/locale/cz.ts index a2d284d7..56e905c5 100644 --- a/src/lang/locale/cz.ts +++ b/src/lang/locale/cz.ts @@ -143,6 +143,9 @@ export default { TAGS_TO_REVIEW: "Tag pro revizi", TAGS_TO_REVIEW_DESC: "Zadejte tagy oddělené mezerami nebo odřádkováním například #review #tag2 #tag3.", + TAGS_TO_EXCLUDE_FROM_DECKS: "Tagy vyloučené z vytváření balíčků", + TAGS_TO_EXCLUDE_FROM_DECKS_DESC: + "Zadejte tagy oddělené mezerami. Karty s těmito tagy budou stále zahrnuty do revize, ale nevytvoří samostatné balíčky. Toto jsou dílčí komponenty, takže pokud máte #flashcards/test, zadejte 'test'.", OPEN_RANDOM_NOTE: "Otevřít náhodnou poznámku pro revizi", OPEN_RANDOM_NOTE_DESC: "Pokud toto vypnete, poznámky budou řazeny dle důležitosti (PageRank).", AUTO_NEXT_NOTE: "Otevřít automaticky další poznámku po dokončení revize", diff --git a/src/lang/locale/de.ts b/src/lang/locale/de.ts index a0443850..9cf92542 100644 --- a/src/lang/locale/de.ts +++ b/src/lang/locale/de.ts @@ -157,6 +157,9 @@ export default { TAGS_TO_REVIEW: "Zu wiederholende Tags", TAGS_TO_REVIEW_DESC: "Mehrere Tags können mit Leerzeichen oder Zeilenumbrüchen getrennt angegeben werden. Bsp. #karte #tag1 #tag2.", + TAGS_TO_EXCLUDE_FROM_DECKS: "Von der Stapelerstellung ausgeschlossene Tags", + TAGS_TO_EXCLUDE_FROM_DECKS_DESC: + "Geben Sie Tags durch Leerzeichen getrennt ein. Karten mit diesen Tags werden weiterhin in die Überprüfung einbezogen, erstellen aber keine separaten Stapel. Dies betrifft Unterkomponenten, wenn Sie also #flashcards/test haben, geben Sie 'test' ein.", OPEN_RANDOM_NOTE: "Zufällige Karten wiederholen", OPEN_RANDOM_NOTE_DESC: "Wenn dies deaktiviert wird, dann werden die Notizen nach Wichtigkeit wiederholt (PageRank).", diff --git a/src/lang/locale/es.ts b/src/lang/locale/es.ts index e8e444ee..52e5c75d 100644 --- a/src/lang/locale/es.ts +++ b/src/lang/locale/es.ts @@ -146,6 +146,9 @@ export default { TAGS_TO_REVIEW: "Etiquetas a revisar", TAGS_TO_REVIEW_DESC: "Escriba las etiquetas separadas por espacios o saltos de líneas, por ejemplo, #revisión #etiqueta2 #etiqueta3.", + TAGS_TO_EXCLUDE_FROM_DECKS: "Etiquetas para excluir de la creación de mazos", + TAGS_TO_EXCLUDE_FROM_DECKS_DESC: + "Ingrese etiquetas separadas por espacios. Las tarjetas con estas etiquetas seguirán incluyéndose en la revisión pero no crearán mazos separados. Estos son subcomponentes, así que si tiene #flashcards/test, ingrese 'test'.", OPEN_RANDOM_NOTE: "Abrir una nota al azar para revisar", OPEN_RANDOM_NOTE_DESC: "Cuando deshabilita esto, las notas son ordenadas por importancia (Algoritmo PageRank).", diff --git a/src/lang/locale/fr.ts b/src/lang/locale/fr.ts index 960ac83f..f35d451c 100644 --- a/src/lang/locale/fr.ts +++ b/src/lang/locale/fr.ts @@ -142,9 +142,12 @@ export default { NOTES: "Notes", NOTE: "Note", REVIEW_PANE_ON_STARTUP: "Montrer le module d'apprentissage des notes au démarrage", - TAGS_TO_REVIEW: "Tags à apprendre", + TAGS_TO_REVIEW: "Tags à réviser", TAGS_TO_REVIEW_DESC: - "Entrez les tags séparés par un espace ou une ligne i.e. #review #tag2 #tag3.", + "Entrez des tags séparés par des espaces ou des sauts de ligne, par exemple : #review #tag2 #tag3.", + TAGS_TO_EXCLUDE_FROM_DECKS: "Tags à exclure de la création de paquets", + TAGS_TO_EXCLUDE_FROM_DECKS_DESC: + "Entrez des tags séparés par des espaces. Les cartes avec ces tags seront toujours incluses dans la révision mais ne créeront pas de paquets séparés. Il s'agit de sous-composants, donc si vous avez #flashcards/test, entrez 'test'.", OPEN_RANDOM_NOTE: "Ouvrir une note à apprendre au hasard", OPEN_RANDOM_NOTE_DESC: "Si vous désactivez cette option, les notes sont triées par importance (PageRank).", diff --git a/src/lang/locale/it.ts b/src/lang/locale/it.ts index 9f3d62fd..ed8783ed 100644 --- a/src/lang/locale/it.ts +++ b/src/lang/locale/it.ts @@ -149,6 +149,9 @@ export default { TAGS_TO_REVIEW: "Etichette da rivedere", TAGS_TO_REVIEW_DESC: "Inserisci le etichette separate da spazi o a capi, tipo #review #tag2 #tag3.", + TAGS_TO_EXCLUDE_FROM_DECKS: "Tag da escludere dalla creazione del mazzo", + TAGS_TO_EXCLUDE_FROM_DECKS_DESC: + "Inserisci i tag separati da spazi. Le carte con questi tag saranno comunque incluse nella revisione ma non creeranno mazzi separati. Si tratta di sottocomponenti, quindi se hai #flashcard/test inserisci 'test'.", OPEN_RANDOM_NOTE: "Apri una nota a caso per revisione", OPEN_RANDOM_NOTE_DESC: "Quando lo disabiliti, le note saranno ordinate per importanza (PageRank).", diff --git a/src/lang/locale/ja.ts b/src/lang/locale/ja.ts index b0be8d3b..86c761df 100644 --- a/src/lang/locale/ja.ts +++ b/src/lang/locale/ja.ts @@ -146,6 +146,9 @@ export default { TAGS_TO_REVIEW: "レビューに使用するタグ", TAGS_TO_REVIEW_DESC: 'タグをスペースまたは改行で区切って入力してください。例: "#review #tag2 #tag3"', + TAGS_TO_EXCLUDE_FROM_DECKS: "デッキ作成から除外するタグ", + TAGS_TO_EXCLUDE_FROM_DECKS_DESC: + "スペースで区切られたタグを入力します。これらのタグを持つカードは復習に含まれますが、個別のデッキは作成されません。これはサブコンポーネントなので、#flashcards/testがある場合は「test」と入力します。", OPEN_RANDOM_NOTE: "ランダムにノートを開いてレビューする", OPEN_RANDOM_NOTE_DESC: "このオプションが無効化されている状態では、ノートは重要度(ページランク)による順番で表示されます。", diff --git a/src/lang/locale/ko.ts b/src/lang/locale/ko.ts index e7dc5912..e812df7b 100644 --- a/src/lang/locale/ko.ts +++ b/src/lang/locale/ko.ts @@ -144,6 +144,9 @@ export default { TAGS_TO_REVIEW: "리뷰에 사용할 태그", TAGS_TO_REVIEW_DESC: "태그를 공백 또는 빈 줄로 구분해서 입력해주세요. 예) '#review #tag2 #tag3'", + TAGS_TO_EXCLUDE_FROM_DECKS: "덱 생성에서 제외할 태그", + TAGS_TO_EXCLUDE_FROM_DECKS_DESC: + "태그를 공백으로 구분해서 입력해주세요. 이 태그가 있는 카드는 여전히 리뷰에 포함되지만 별도의 덱을 생성하지 않습니다. 이것은 하위 컴포넌트로, 예를 들어 #flashcards/test가 있다면 'test'를 입력하세요.", OPEN_RANDOM_NOTE: "리뷰를 위해 랜덤 노트를 엽니다.", OPEN_RANDOM_NOTE_DESC: "이 옵션이 꺼져있으면, 노트는 중요도(페이지 랭크)에 따라 정렬됩니다.", AUTO_NEXT_NOTE: "리뷰 후에 다음 노트를 자동으로 엽니다.", diff --git a/src/lang/locale/pl.ts b/src/lang/locale/pl.ts index 11ad51de..f7ef86d5 100644 --- a/src/lang/locale/pl.ts +++ b/src/lang/locale/pl.ts @@ -147,6 +147,9 @@ export default { TAGS_TO_REVIEW: "Tagi do przeglądu", TAGS_TO_REVIEW_DESC: "Wprowadź tagi oddzielone spacją lub nowymi liniami, np. #przegląd #tag2 #tag3.", + TAGS_TO_EXCLUDE_FROM_DECKS: "Tagi do wykluczenia z tworzenia talii", + TAGS_TO_EXCLUDE_FROM_DECKS_DESC: + "Wprowadź tagi oddzielone spacjami. Karty z tymi tagami nadal będą uwzględniane w przeglądzie, ale nie utworzą oddzielnych talii. Dotyczy to podkomponentów, więc jeśli masz #fiszki/test, wprowadź 'test'.", OPEN_RANDOM_NOTE: "Otwórz losową notatkę do przeglądu", OPEN_RANDOM_NOTE_DESC: "Po wyłączeniu tej opcji notatki są uporządkowane według istotności (PageRank).", diff --git a/src/lang/locale/pt-br.ts b/src/lang/locale/pt-br.ts index 472bbc25..9e83da62 100644 --- a/src/lang/locale/pt-br.ts +++ b/src/lang/locale/pt-br.ts @@ -146,6 +146,9 @@ export default { TAGS_TO_REVIEW: "Etiquetas para revisar", TAGS_TO_REVIEW_DESC: "Insira etiquetas separadas por espaços ou quebra de linhas ex: #revisar #etiqueta2 #etiqueta3.", + TAGS_TO_EXCLUDE_FROM_DECKS: "Etiquetas para excluir da criação de baralhos", + TAGS_TO_EXCLUDE_FROM_DECKS_DESC: + "Insira etiquetas separadas por espaços. Cartas com essas etiquetas ainda serão incluídas na revisão mas não criarão baralhos separados. Isto refere-se a subcomponentes, então se você tiver #flashcards/teste então insira 'teste'.", OPEN_RANDOM_NOTE: "Abrir uma nota aleatória para revisar", OPEN_RANDOM_NOTE_DESC: "Quando você desabilitar isso, as notas vão ser ordenadas por importância (PageRank).", diff --git a/src/lang/locale/ru.ts b/src/lang/locale/ru.ts index 7edb42c8..b15697fd 100644 --- a/src/lang/locale/ru.ts +++ b/src/lang/locale/ru.ts @@ -153,7 +153,10 @@ export default { REVIEW_PANE_ON_STARTUP: "Включить панель изучения карточек при запуске программы", TAGS_TO_REVIEW: "Теги для изучения", TAGS_TO_REVIEW_DESC: - "Введите теги, разделенные Enter-ами или пробелами, например: #review #tag2 #tag3.", + "Введите теги, разделенные Enter-ом или пробелом, например: #review #tag2 #tag3.", + TAGS_TO_EXCLUDE_FROM_DECKS: "Теги для исключения из создания колод", + TAGS_TO_EXCLUDE_FROM_DECKS_DESC: + "Введите теги, разделенные пробелами. Карточки с этими тегами все равно будут включены в обзор, но не будут создавать отдельные колоды. Это подкомпоненты, поэтому если у вас есть #flashcards/test, то введите 'test'.", OPEN_RANDOM_NOTE: "Открыть случайную заметку для изучения", OPEN_RANDOM_NOTE_DESC: "Если выключить, то заметки будут отсортированы по важности (PageRank).", AUTO_NEXT_NOTE: "После изучения автоматически открывать следующую заметку", diff --git a/src/lang/locale/tr.ts b/src/lang/locale/tr.ts index 4988957f..f4493662 100644 --- a/src/lang/locale/tr.ts +++ b/src/lang/locale/tr.ts @@ -144,6 +144,9 @@ export default { TAGS_TO_REVIEW: "Gözden geçirilecek etiketler", TAGS_TO_REVIEW_DESC: "Etiketleri boşluklar veya yeni satırlarla ayırarak girin, örneğin: #review #tag2 #tag3.", + TAGS_TO_EXCLUDE_FROM_DECKS: "Deste oluşturmada hariç tutulacak etiketler", + TAGS_TO_EXCLUDE_FROM_DECKS_DESC: + "Etiketleri boşluklarla ayırarak girin. Bu etiketlere sahip kartlar yine de incelemeye dahil edilecek ancak ayrı desteler oluşturmayacaktır. Bu alt bileşenlerdir, örneğin #flashcards/test etiketiniz varsa, 'test' girişi yapın.", OPEN_RANDOM_NOTE: "Gözden geçirmek için rastgele bir not aç", OPEN_RANDOM_NOTE_DESC: "Bunu kapattığınızda, notlar önem sırasına göre sıralanır (PageRank).", AUTO_NEXT_NOTE: "Bir incelemeden sonra otomatik olarak bir sonraki notu aç", diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index 2657d05f..d9d7a274 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -134,6 +134,8 @@ export default { REVIEW_PANE_ON_STARTUP: "启动时开启笔记复习窗格", TAGS_TO_REVIEW: "复习标签", TAGS_TO_REVIEW_DESC: "输入标签,用空格或新建行分隔,例如:#review #tag2 #tag3.", + TAGS_TO_EXCLUDE_FROM_DECKS: "从卡组创建中排除的标签", + TAGS_TO_EXCLUDE_FROM_DECKS_DESC: "输入以空格分隔的标签。带有这些标签的卡片仍将包含在复习中,但不会创建单独的卡组。这是子组件,例如,如果你有 #flashcards/test,那么输入 'test'。", OPEN_RANDOM_NOTE: "复习随机笔记", OPEN_RANDOM_NOTE_DESC: "关闭此选项,笔记将以重要度(PageRank)排序。", AUTO_NEXT_NOTE: "复习后自动打开下一个笔记", diff --git a/src/lang/locale/zh-tw.ts b/src/lang/locale/zh-tw.ts index ccca8997..07d30865 100644 --- a/src/lang/locale/zh-tw.ts +++ b/src/lang/locale/zh-tw.ts @@ -133,7 +133,9 @@ export default { NOTE: "Note", REVIEW_PANE_ON_STARTUP: "啟動時開啟筆記復習窗格", TAGS_TO_REVIEW: "復習標籤", - TAGS_TO_REVIEW_DESC: "輸入標籤,用空格或換行字元分隔,例如:#review #tag2 #tag3.", + TAGS_TO_REVIEW_DESC: "輸入標籤,用空白或換行字元分隔,例如:#review #tag2 #tag3.", + TAGS_TO_EXCLUDE_FROM_DECKS: "從牌組創建中排除的標籤", + TAGS_TO_EXCLUDE_FROM_DECKS_DESC: "輸入以空格分隔的標籤。帶有這些標籤的卡片仍將包含在復習中,但不會創建單獨的牌組。這是子組件,例如,如果你有 #flashcards/test,那麼輸入 'test'。", OPEN_RANDOM_NOTE: "復習隨機筆記", OPEN_RANDOM_NOTE_DESC: "關閉此選項,筆記將以重要度(PageRank)排序。", AUTO_NEXT_NOTE: "復習後自動打開下一個筆記", diff --git a/src/note-question-parser.ts b/src/note-question-parser.ts index 05eab28a..2fa833da 100644 --- a/src/note-question-parser.ts +++ b/src/note-question-parser.ts @@ -85,9 +85,8 @@ export class NoteQuestionParser { this.analyseTagCacheList(tagCompleteList); for (const question of this.questionList) { question.topicPathList = this.determineQuestionTopicPathList(question); - if ( - question.topicPathList.list.some((e) => + question.topicPathList?.list.some((e) => e.path.some((tag) => { return SettingsUtil.isExcludedFlashcardTag(this.settings, tag); }), diff --git a/src/question.ts b/src/question.ts index 9ce63592..0032cffe 100644 --- a/src/question.ts +++ b/src/question.ts @@ -184,7 +184,7 @@ export class QuestionText { export class Question { note: Note; parsedQuestionInfo: ParsedQuestionInfo; - topicPathList: TopicPathList; + topicPathList: TopicPathList | null; questionText: QuestionText; hasEditLaterTag: boolean; questionContext: string[]; From b5d0e84acffbf473f6d1508ae3fe2e51e38aab29 Mon Sep 17 00:00:00 2001 From: Hugo Persson Date: Fri, 17 Oct 2025 14:12:08 +0200 Subject: [PATCH 5/5] release 1.13.4 --- manifest.json | 20 ++++---- package.json | 134 +++++++++++++++++++++++++------------------------- 2 files changed, 77 insertions(+), 77 deletions(-) diff --git a/manifest.json b/manifest.json index 6d8c5e59..43113f64 100644 --- a/manifest.json +++ b/manifest.json @@ -1,12 +1,12 @@ { - "id": "obsidian-spaced-repetition", - "name": "Spaced Repetition", - "version": "1.13.3", - "minAppVersion": "1.2.8", - "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", - "author": "Stephen Mwangi", - "authorUrl": "https://github.com/st3v3nmw", - "helpUrl": "https://www.stephenmwangi.com/obsidian-spaced-repetition/", - "isDesktopOnly": false, - "fundingUrl": "https://ko-fi.com/M4M44DEN6" + "id": "obsidian-spaced-repetition", + "name": "Spaced Repetition", + "version": "1.13.4", + "minAppVersion": "1.2.8", + "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", + "author": "Stephen Mwangi", + "authorUrl": "https://github.com/st3v3nmw", + "helpUrl": "https://www.stephenmwangi.com/obsidian-spaced-repetition/", + "isDesktopOnly": false, + "fundingUrl": "https://ko-fi.com/M4M44DEN6" } diff --git a/package.json b/package.json index cc60e813..5b40ad90 100644 --- a/package.json +++ b/package.json @@ -1,69 +1,69 @@ { - "name": "obsidian-spaced-repetition", - "version": "1.13.3", - "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", - "main": "main.js", - "scripts": { - "build": "node esbuild.config.mjs production", - "dev": "node esbuild.config.mjs", - "format": "pnpm prettier --write . && pnpm eslint src/ tests/ --fix", - "lint": "pnpm prettier --check . && pnpm eslint src/ tests/", - "test": "pnpm jest", - "validate": "concurrently --kill-others-on-fail -g -p \"[{name}]\" -n \"format,lint,test\" \"pnpm:format\" \"pnpm:lint\" \"pnpm:test\"", - "precommit-msg": "echo 'Pre-commit checks...'", - "changelog": "pnpm auto-changelog --template=compact --package && pnpm prettier --write docs/docs/changelog.md" - }, - "keywords": [ - "obsidian", - "spaced repetition", - "flashcard", - "flashcards" - ], - "author": "Stephen Mwangi", - "license": "MIT", - "devDependencies": { - "@eslint/js": "^9.23.0", - "@types/eslint__js": "^8.42.3", - "@types/jest": "^29.5.14", - "@types/node": "^22.13.11", - "@types/vhtml": "^2.2.9", - "@typescript-eslint/eslint-plugin": "^8.27.0", - "@typescript-eslint/parser": "^8.27.0", - "auto-changelog": "^2.5.0", - "builtin-modules": "^4.0.0", - "concurrently": "^9.1.2", - "esbuild": "^0.23.1", - "eslint": "^9.23.0", - "eslint-plugin-simple-import-sort": "^12.1.1", - "eslint-plugin-unicorn": "^55.0.0", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "jest-expect-message": "^1.1.3", - "moment": "^2.30.1", - "obsidian": "^1.8.7", - "pre-commit": "^1.2.2", - "prettier": "^3.5.3", - "ts-jest": "^29.2.6", - "tslib": "^2.8.1", - "typescript": "~5.5.4", - "typescript-eslint": "^8.27.0", - "vhtml": "^2.2.0" - }, - "dependencies": { - "chart.js": "^4.4.8", - "clozecraft": "^0.4.0", - "gridjs": "^6.2.0", - "minimatch": "^10.0.1", - "pagerank.js": "^1.0.2", - "short-uuid": "^5.2.0" - }, - "pre-commit": [ - "precommit-msg", - "validate" - ], - "packageManager": "pnpm@9.10.0", - "engines": { - "pnpm": ">=9.10.0" - }, - "engineStrict": true + "name": "obsidian-spaced-repetition", + "version": "1.13.4", + "description": "Fight the forgetting curve by reviewing flashcards & entire notes.", + "main": "main.js", + "scripts": { + "build": "node esbuild.config.mjs production", + "dev": "node esbuild.config.mjs", + "format": "pnpm prettier --write . && pnpm eslint src/ tests/ --fix", + "lint": "pnpm prettier --check . && pnpm eslint src/ tests/", + "test": "pnpm jest", + "validate": "concurrently --kill-others-on-fail -g -p \"[{name}]\" -n \"format,lint,test\" \"pnpm:format\" \"pnpm:lint\" \"pnpm:test\"", + "precommit-msg": "echo 'Pre-commit checks...'", + "changelog": "pnpm auto-changelog --template=compact --package && pnpm prettier --write docs/docs/changelog.md" + }, + "keywords": [ + "obsidian", + "spaced repetition", + "flashcard", + "flashcards" + ], + "author": "Stephen Mwangi", + "license": "MIT", + "devDependencies": { + "@eslint/js": "^9.23.0", + "@types/eslint__js": "^8.42.3", + "@types/jest": "^29.5.14", + "@types/node": "^22.13.11", + "@types/vhtml": "^2.2.9", + "@typescript-eslint/eslint-plugin": "^8.27.0", + "@typescript-eslint/parser": "^8.27.0", + "auto-changelog": "^2.5.0", + "builtin-modules": "^4.0.0", + "concurrently": "^9.1.2", + "esbuild": "^0.23.1", + "eslint": "^9.23.0", + "eslint-plugin-simple-import-sort": "^12.1.1", + "eslint-plugin-unicorn": "^55.0.0", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "jest-expect-message": "^1.1.3", + "moment": "^2.30.1", + "obsidian": "^1.8.7", + "pre-commit": "^1.2.2", + "prettier": "^3.5.3", + "ts-jest": "^29.2.6", + "tslib": "^2.8.1", + "typescript": "~5.5.4", + "typescript-eslint": "^8.27.0", + "vhtml": "^2.2.0" + }, + "dependencies": { + "chart.js": "^4.4.8", + "clozecraft": "^0.4.0", + "gridjs": "^6.2.0", + "minimatch": "^10.0.1", + "pagerank.js": "^1.0.2", + "short-uuid": "^5.2.0" + }, + "pre-commit": [ + "precommit-msg", + "validate" + ], + "packageManager": "pnpm@9.10.0", + "engines": { + "pnpm": ">=9.10.0" + }, + "engineStrict": true }