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** 🏷️ Global and local **tags**
🔢 Support for **LaTeX** 🔢 Support for **LaTeX**
🖼️ Support for **images** 🖼️ Support for **images**
🎤 Support for **audios**
🔗 Support for **Obsidian URI** 🔗 Support for **Obsidian URI**
⚓ Support for **reference to note** ⚓ Support for **reference to note**
📟 Support for **code syntax highlight** 📟 Support for **code syntax highlight**

View File

@ -1,7 +1,7 @@
{ {
"id": "flashcards-obsidian", "id": "flashcards-obsidian",
"name": "Flashcards", "name": "Flashcards",
"version": "1.4.0", "version": "1.5.0",
"minAppVersion": "0.9.17", "minAppVersion": "0.9.17",
"description": "Anki integration", "description": "Anki integration",
"author": "Alex Colucci", "author": "Alex Colucci",

View File

@ -4,6 +4,7 @@ export class Regex {
headingsRegex: RegExp headingsRegex: RegExp
wikiImageLinks: RegExp wikiImageLinks: RegExp
markdownImageLinks: RegExp markdownImageLinks: RegExp
wikiAudioLinks: RegExp
codeBlock: RegExp codeBlock: RegExp
cardsDeckLine: RegExp cardsDeckLine: RegExp
cardsToDelete: RegExp cardsToDelete: RegExp
@ -23,6 +24,9 @@ export class Regex {
// Supported images https://publish.obsidian.md/help/How+to/Embed+files // Supported images https://publish.obsidian.md/help/How+to/Embed+files
this.wikiImageLinks = /!\[\[(.*\.(?:png|jpg|jpeg|gif|bmp|svg|tiff)).*?\]\]/gim this.wikiImageLinks = /!\[\[(.*\.(?:png|jpg|jpeg|gif|bmp|svg|tiff)).*?\]\]/gim
this.markdownImageLinks = /!\[\]\((.*\.(?: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.codeBlock = /<code\b[^>]*>(.*?)<\/code>/gims
this.cardsDeckLine = /cards-deck: [\p{L}]+/giu this.cardsDeckLine = /cards-deck: [\p{L}]+/giu

View File

@ -103,7 +103,8 @@ export class Parser {
let originalPrompt = match[2].trim() let originalPrompt = match[2].trim()
let prompt = contextAware ? [...context, match[2].trim()].join(`${this.settings.contextSeparator}`) : 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) prompt = this.parseLine(prompt, vault)
let endingLine = match.index + match[0].length let endingLine = match.index + match[0].length
@ -116,7 +117,7 @@ export class Parser {
} }
let containsCode = this.containsCode([prompt]) 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) cards.push(card)
} }
@ -144,8 +145,9 @@ export class Parser {
let originalQuestion = match[2].trim() let originalQuestion = match[2].trim()
let question = contextAware ? [...context, match[2].trim()].join(`${this.settings.contextSeparator}`) : match[2].trim() let question = contextAware ? [...context, match[2].trim()].join(`${this.settings.contextSeparator}`) : match[2].trim()
let answer = match[4].trim() let answer = match[4].trim()
let imagesMedia: string[] = this.getImageLinks(question) let medias: string[] = this.getImageLinks(question)
imagesMedia = imagesMedia.concat(this.getImageLinks(answer)) medias = medias.concat(this.getImageLinks(answer))
medias = medias.concat(this.getAudioLinks(answer))
question = this.parseLine(question, vault) question = this.parseLine(question, vault)
answer = this.parseLine(answer, vault) answer = this.parseLine(answer, vault)
@ -159,7 +161,7 @@ export class Parser {
} }
let containsCode = this.containsCode([question, answer]) 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) cards.push(card)
} }
@ -180,8 +182,9 @@ export class Parser {
let originalQuestion = match[2].trim() let originalQuestion = match[2].trim()
let question = contextAware ? [...context, match[2].trim()].join(`${this.settings.contextSeparator}`) : match[2].trim() let question = contextAware ? [...context, match[2].trim()].join(`${this.settings.contextSeparator}`) : match[2].trim()
let answer = match[5].trim() let answer = match[5].trim()
let imagesMedia: string[] = this.getImageLinks(question) let medias: string[] = this.getImageLinks(question)
imagesMedia = imagesMedia.concat(this.getImageLinks(answer)) medias = medias.concat(this.getImageLinks(answer))
medias = medias.concat(this.getAudioLinks(answer))
question = this.parseLine(question, vault) question = this.parseLine(question, vault)
answer = this.parseLine(answer, vault) answer = this.parseLine(answer, vault)
@ -195,7 +198,7 @@ export class Parser {
} }
let containsCode = this.containsCode([question, answer]) 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) cards.push(card)
} }
@ -217,7 +220,7 @@ export class Parser {
} }
private parseLine(str: string, vaultName: string) { 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) { private getImageLinks(str: string) {
@ -236,6 +239,17 @@ export class Parser {
return links 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) { private substituteObsidianLinks(str: string, vaultName: string) {
let linkRegex = /\[\[(.+?)(?:\|(.+))?\]\]/gmi let linkRegex = /\[\[(.+?)(?:\|(.+))?\]\]/gmi
vaultName = encodeURIComponent(vaultName) vaultName = encodeURIComponent(vaultName)
@ -255,6 +269,10 @@ export class Parser {
return str return str
} }
private substituteAudioLinks(str: string): string {
return str.replace(this.regex.wikiAudioLinks, "[sound:$1]")
}
private mathToAnki(str: string) { private mathToAnki(str: string) {
let mathBlockRegex = /(\$\$)(.*?)(\$\$)/gis let mathBlockRegex = /(\$\$)(.*?)(\$\$)/gis
str = str.replace(mathBlockRegex, function (match, p1, p2) { str = str.replace(mathBlockRegex, function (match, p1, p2) {