diff --git a/main.ts b/main.ts index b0b37915..0bc9af59 100644 --- a/main.ts +++ b/main.ts @@ -19,6 +19,8 @@ export default class MyPlugin extends Plugin { CUSTOM_REGEXPS: {}, FILE_LINK_FIELDS: {}, CONTEXT_FIELDS: {}, + FOLDER_DECKS: {}, + FOLDER_TAGS: {}, Syntax: { "Begin Note": "START", "End Note": "END", @@ -38,6 +40,7 @@ export default class MyPlugin extends Plugin { "CurlyCloze": false, "CurlyCloze - Highlights to Clozes": false, "ID Comments": true, + "Add Obsidian Tags": false, } } /*Making settings from scratch, so need note types*/ diff --git a/manifest.json b/manifest.json index 7475efb2..15dcddb8 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-to-anki-plugin", "name": "Obsidian_to_Anki", - "version": "3.3.5", + "version": "3.4.0", "minAppVersion": "0.9.20", "description": "This is an Anki integration plugin! Designed for efficient bulk exporting.", "author": "Pseudonium", diff --git a/src/file.ts b/src/file.ts index 5bdf2837..7ebaa0e5 100644 --- a/src/file.ts +++ b/src/file.ts @@ -258,6 +258,15 @@ export class AllFile extends AbstractFile { add_spans_to_ignore() { this.ignore_spans = [] + this.ignore_spans.push(...spans(this.data.FROZEN_REGEXP, this.file)) + const deck_result = this.file.match(this.data.DECK_REGEXP) + if (deck_result) { + this.ignore_spans.push([deck_result.index, deck_result.index + deck_result[0].length]) + } + const tag_result = this.file.match(this.data.TAG_REGEXP) + if (tag_result) { + this.ignore_spans.push([tag_result.index, tag_result.index + tag_result[0].length]) + } this.ignore_spans.push(...spans(this.data.NOTE_REGEXP, this.file)) this.ignore_spans.push(...spans(this.data.INLINE_REGEXP, this.file)) this.ignore_spans.push(...spans(c.OBS_INLINE_MATH_REGEXP, this.file)) diff --git a/src/files-manager.ts b/src/files-manager.ts index 3c16c363..38258b86 100644 --- a/src/files-manager.ts +++ b/src/files-manager.ts @@ -1,6 +1,6 @@ /*Class for managing a list of files, and their Anki requests.*/ -import { ParsedSettings } from './interfaces/settings-interface' -import { App, TFile, CachedMetadata, FileSystemAdapter, Notice } from 'obsidian' +import { ParsedSettings, FileData } from './interfaces/settings-interface' +import { App, TFile, TFolder, TAbstractFile, CachedMetadata, FileSystemAdapter, Notice } from 'obsidian' import { AllFile } from './file' import * as AnkiConnect from './anki' import { basename } from 'path' @@ -73,41 +73,93 @@ export class FileManager { return "obsidian://open?vault=" + encodeURIComponent(this.data.vault_name) + String.raw`&file=` + encodeURIComponent(file.path) } - async initialiseFiles() { - await this.genAllFiles() - let files_changed: Array = [] - let obfiles_changed: TFile[] = [] - for (let index in this.ownFiles) { - const i = parseInt(index) - let file = this.ownFiles[i] - if (!(this.file_hashes.hasOwnProperty(file.path) && file.getHash() === this.file_hashes[file.path])) { - //Indicates it's changed or new - console.info("Scanning ", file.path, "as it's changed or new.") - file.scanFile() - files_changed.push(file) - obfiles_changed.push(this.files[i]) + getFolderPathList(file: TFile): TFolder[] { + let result: TFolder[] = [] + let abstractFile: TAbstractFile = file + while (abstractFile.hasOwnProperty('parent')) { + result.push(abstractFile.parent) + abstractFile = abstractFile.parent + } + result.pop() // Removes top-level vault + return result + } + + getDefaultDeck(file: TFile, folder_path_list: TFolder[]): string { + let folder_decks = this.data.folder_decks + for (let folder of folder_path_list) { + // Loops over them from innermost folder + if (folder_decks[folder.path] !== "") { + return folder_decks[folder.path] } } - this.ownFiles = files_changed - this.files = obfiles_changed + // If no decks specified + return this.data.template.deckName + } + + getDefaultTags(file: TFile, folder_path_list: TFolder[]): string[] { + let folder_tags = this.data.folder_tags + let tags_list: string[] = [] + for (let folder of folder_path_list) { + // Loops over them from innermost folder + if (folder_tags[folder.path] !== "") { + tags_list.push(...folder_tags[folder.path].split(" ")) + } + } + tags_list.push(...this.data.template.tags) + return tags_list + } + + dataToFileData(file: TFile): FileData { + const folder_path_list: TFolder[] = this.getFolderPathList(file) + let result: FileData = JSON.parse(JSON.stringify(this.data)) + //Lost regexp, so have to get them back + result.FROZEN_REGEXP = this.data.FROZEN_REGEXP + result.DECK_REGEXP = this.data.DECK_REGEXP + result.TAG_REGEXP = this.data.TAG_REGEXP + result.NOTE_REGEXP = this.data.NOTE_REGEXP + result.INLINE_REGEXP = this.data.INLINE_REGEXP + result.EMPTY_REGEXP = this.data.EMPTY_REGEXP + result.template.deckName = this.getDefaultDeck(file, folder_path_list) + result.template.tags = this.getDefaultTags(file, folder_path_list) + return result } async genAllFiles() { for (let file of this.files) { const content: string = await this.app.vault.read(file) const cache: CachedMetadata = this.app.metadataCache.getCache(file.path) + const file_data = this.dataToFileData(file) this.ownFiles.push( new AllFile( content, file.path, this.data.add_file_link ? this.getUrl(file) : "", - this.data, + file_data, cache ) ) } } + async initialiseFiles() { + await this.genAllFiles() + let files_changed: Array = [] + let obfiles_changed: TFile[] = [] + for (let index in this.ownFiles) { + const i = parseInt(index) + let file = this.ownFiles[i] + if (!(this.file_hashes.hasOwnProperty(file.path) && file.getHash() === this.file_hashes[file.path])) { + //Indicates it's changed or new + console.info("Scanning ", file.path, "as it's changed or new.") + file.scanFile() + files_changed.push(file) + obfiles_changed.push(this.files[i]) + } + } + this.ownFiles = files_changed + this.files = obfiles_changed + } + async requests_1() { let requests: AnkiConnect.AnkiConnectRequest[] = [] let temp: AnkiConnect.AnkiConnectRequest[] = [] diff --git a/src/interfaces/settings-interface.ts b/src/interfaces/settings-interface.ts index 65f764f0..217e7a19 100644 --- a/src/interfaces/settings-interface.ts +++ b/src/interfaces/settings-interface.ts @@ -4,7 +4,9 @@ import { AnkiConnectNote } from './note-interface' export interface PluginSettings { CUSTOM_REGEXPS: Record, FILE_LINK_FIELDS: Record, - CONTEXT_FIELDS: Record + CONTEXT_FIELDS: Record, + FOLDER_DECKS: Record, + FOLDER_TAGS: Record, Syntax: { "Begin Note": string, "End Note": string, @@ -24,6 +26,7 @@ export interface PluginSettings { "CurlyCloze": boolean, "CurlyCloze - Highlights to Clozes": boolean, "ID Comments": boolean, + "Add Obsidian Tags": boolean } } @@ -48,8 +51,11 @@ export interface FileData { highlights_to_cloze: boolean comment: boolean add_context: boolean + add_obs_tags: boolean } export interface ParsedSettings extends FileData { add_file_link: boolean + folder_decks: Record + folder_tags: Record } diff --git a/src/note.ts b/src/note.ts index 570d9eda..9125eb02 100644 --- a/src/note.ts +++ b/src/note.ts @@ -12,6 +12,7 @@ const TAG_PREFIX:string = "Tags: " export const TAG_SEP:string = " " export const ID_REGEXP_STR: string = String.raw`\n?(?: