mirror of
https://github.com/gosticks/flashcards-obsidian.git
synced 2025-10-16 12:05:33 +00:00
Add audio support
This commit is contained in:
parent
1308e9776e
commit
fe2ced83bb
@ -16,6 +16,7 @@ Anki integration for [Obsidian](https://obsidian.md/).
|
||||
🏷️ Global and local **tags**
|
||||
🔢 Support for **LaTeX**
|
||||
🖼️ Support for **images**
|
||||
🎤 Support for **audios**
|
||||
🔗 Support for **Obsidian URI**
|
||||
⚓ Support for **reference to note**
|
||||
📟 Support for **code syntax highlight**
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "flashcards-obsidian",
|
||||
"name": "Flashcards",
|
||||
"version": "1.4.0",
|
||||
"version": "1.5.0",
|
||||
"minAppVersion": "0.9.17",
|
||||
"description": "Anki integration",
|
||||
"author": "Alex Colucci",
|
||||
|
||||
@ -4,6 +4,7 @@ export class Regex {
|
||||
headingsRegex: RegExp
|
||||
wikiImageLinks: RegExp
|
||||
markdownImageLinks: RegExp
|
||||
wikiAudioLinks: RegExp
|
||||
codeBlock: RegExp
|
||||
cardsDeckLine: RegExp
|
||||
cardsToDelete: RegExp
|
||||
@ -23,6 +24,9 @@ export class Regex {
|
||||
// Supported images https://publish.obsidian.md/help/How+to/Embed+files
|
||||
this.wikiImageLinks = /!\[\[(.*\.(?:png|jpg|jpeg|gif|bmp|svg|tiff)).*?\]\]/gim
|
||||
this.markdownImageLinks = /!\[\]\((.*\.(?:png|jpg|jpeg|gif|bmp|svg|tiff)).*?\)/gim
|
||||
|
||||
this.wikiAudioLinks = /!\[\[(.*\.(?:mp3|webm|wav|m4a|ogg|3gp|flac)).*?\]\]/gim
|
||||
|
||||
this.codeBlock = /<code\b[^>]*>(.*?)<\/code>/gims
|
||||
|
||||
this.cardsDeckLine = /cards-deck: [\p{L}]+/giu
|
||||
|
||||
@ -103,7 +103,8 @@ export class Parser {
|
||||
|
||||
let originalPrompt = match[2].trim()
|
||||
let prompt = contextAware ? [...context, match[2].trim()].join(`${this.settings.contextSeparator}`) : match[2].trim()
|
||||
let imagesMedia: string[] = this.getImageLinks(prompt)
|
||||
let medias: string[] = this.getImageLinks(prompt)
|
||||
medias = medias.concat(this.getAudioLinks(prompt))
|
||||
prompt = this.parseLine(prompt, vault)
|
||||
|
||||
let endingLine = match.index + match[0].length
|
||||
@ -116,7 +117,7 @@ export class Parser {
|
||||
}
|
||||
let containsCode = this.containsCode([prompt])
|
||||
|
||||
let card = new Spacedcard(id, deck, originalPrompt, fields, reversed, endingLine, tags, inserted, imagesMedia, containsCode)
|
||||
let card = new Spacedcard(id, deck, originalPrompt, fields, reversed, endingLine, tags, inserted, medias, containsCode)
|
||||
cards.push(card)
|
||||
}
|
||||
|
||||
@ -144,8 +145,9 @@ export class Parser {
|
||||
let originalQuestion = match[2].trim()
|
||||
let question = contextAware ? [...context, match[2].trim()].join(`${this.settings.contextSeparator}`) : match[2].trim()
|
||||
let answer = match[4].trim()
|
||||
let imagesMedia: string[] = this.getImageLinks(question)
|
||||
imagesMedia = imagesMedia.concat(this.getImageLinks(answer))
|
||||
let medias: string[] = this.getImageLinks(question)
|
||||
medias = medias.concat(this.getImageLinks(answer))
|
||||
medias = medias.concat(this.getAudioLinks(answer))
|
||||
question = this.parseLine(question, vault)
|
||||
answer = this.parseLine(answer, vault)
|
||||
|
||||
@ -159,7 +161,7 @@ export class Parser {
|
||||
}
|
||||
let containsCode = this.containsCode([question, answer])
|
||||
|
||||
let card = new Inlinecard(id, deck, originalQuestion, fields, reversed, endingLine, tags, inserted, imagesMedia, containsCode)
|
||||
let card = new Inlinecard(id, deck, originalQuestion, fields, reversed, endingLine, tags, inserted, medias, containsCode)
|
||||
cards.push(card)
|
||||
}
|
||||
|
||||
@ -180,8 +182,9 @@ export class Parser {
|
||||
let originalQuestion = match[2].trim()
|
||||
let question = contextAware ? [...context, match[2].trim()].join(`${this.settings.contextSeparator}`) : match[2].trim()
|
||||
let answer = match[5].trim()
|
||||
let imagesMedia: string[] = this.getImageLinks(question)
|
||||
imagesMedia = imagesMedia.concat(this.getImageLinks(answer))
|
||||
let medias: string[] = this.getImageLinks(question)
|
||||
medias = medias.concat(this.getImageLinks(answer))
|
||||
medias = medias.concat(this.getAudioLinks(answer))
|
||||
question = this.parseLine(question, vault)
|
||||
answer = this.parseLine(answer, vault)
|
||||
|
||||
@ -195,7 +198,7 @@ export class Parser {
|
||||
}
|
||||
let containsCode = this.containsCode([question, answer])
|
||||
|
||||
let card = new Flashcard(id, deck, originalQuestion, fields, reversed, endingLine, tags, inserted, imagesMedia, containsCode)
|
||||
let card = new Flashcard(id, deck, originalQuestion, fields, reversed, endingLine, tags, inserted, medias, containsCode)
|
||||
cards.push(card)
|
||||
}
|
||||
|
||||
@ -217,7 +220,7 @@ export class Parser {
|
||||
}
|
||||
|
||||
private parseLine(str: string, vaultName: string) {
|
||||
return this.htmlConverter.makeHtml(this.mathToAnki(this.substituteObsidianLinks(this.substituteImageLinks(str), vaultName)))
|
||||
return this.htmlConverter.makeHtml(this.mathToAnki(this.substituteObsidianLinks(this.substituteImageLinks(this.substituteAudioLinks(str)), vaultName)))
|
||||
}
|
||||
|
||||
private getImageLinks(str: string) {
|
||||
@ -236,6 +239,17 @@ export class Parser {
|
||||
return links
|
||||
}
|
||||
|
||||
private getAudioLinks(str: string) {
|
||||
let wikiMatches = str.matchAll(this.regex.wikiAudioLinks)
|
||||
let links: string[] = []
|
||||
|
||||
for (let wikiMatch of wikiMatches) {
|
||||
links.push(wikiMatch[1])
|
||||
}
|
||||
|
||||
return links
|
||||
}
|
||||
|
||||
private substituteObsidianLinks(str: string, vaultName: string) {
|
||||
let linkRegex = /\[\[(.+?)(?:\|(.+))?\]\]/gmi
|
||||
vaultName = encodeURIComponent(vaultName)
|
||||
@ -255,6 +269,10 @@ export class Parser {
|
||||
return str
|
||||
}
|
||||
|
||||
private substituteAudioLinks(str: string): string {
|
||||
return str.replace(this.regex.wikiAudioLinks, "[sound:$1]")
|
||||
}
|
||||
|
||||
private mathToAnki(str: string) {
|
||||
let mathBlockRegex = /(\$\$)(.*?)(\$\$)/gis
|
||||
str = str.replace(mathBlockRegex, function (match, p1, p2) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user