Add audio support

This commit is contained in:
Alex Colucci 2021-06-23 22:22:55 +02:00
parent 1308e9776e
commit fe2ced83bb
4 changed files with 33 additions and 10 deletions

View File

@ -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**

View File

@ -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",

View File

@ -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

View File

@ -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) {