Skip to content

Instantly share code, notes, and snippets.

@ruqqq
Last active June 20, 2021 23:22
Show Gist options
  • Save ruqqq/424c380dfcc273892e00226eac956afd to your computer and use it in GitHub Desktop.
Save ruqqq/424c380dfcc273892e00226eac956afd to your computer and use it in GitHub Desktop.
Obsidian templater user script to generate random quran extract for daily notes
/*
* Install: Put this script in your templater scripts folder
* Usage: (in your Obsidian template)
* ## Quran
* <% tp.user.random_quran() %>
*/
const baseUrl = "https://api.quran.com/api/v4";
const languageId = "en";
const translationId = 20;
const tafsirId = 169;
const scriptId = "uthmani_simple";
async function getRequest(url) {
let response = await fetch(url);
if (!response.ok) {
throw new Error("Error performing GET request");
}
return response;
}
async function getChapter(id) {
let response = await getRequest(`${baseUrl}/chapters/${id}?language=${languageId}`);
let json = await response.json();
return json.chapter;
}
async function getRandomVerse() {
let chapter = await getChapter(Math.floor(Math.random() * 114) + 1);
let verse_number = Math.floor(Math.random() * chapter.verses_count) + 1;
return {
verse_number,
verse_key: `${chapter.id}:${verse_number}`,
chapter,
}
}
async function getScript(verseKey) {
let response = await getRequest(`${baseUrl}/quran/verses/${scriptId}?verse_key=${verseKey}`);
let json = await response.json();
return json.verses[0][`text_${scriptId}`];
}
async function getTranslation(verseKey) {
let response = await getRequest(`${baseUrl}/quran/translations/${translationId}?verse_key=${verseKey}`);
let json = await response.json();
return json.translations[0].text;
}
async function getTafsir(verseKey) {
let response = await getRequest(`${baseUrl}/quran/tafsirs/${tafsirId}?verse_key=${verseKey}`);
let json = await response.json();
if (json.tafsirs && json.tafsirs.length > 0) {
return json.tafsirs.map(item => item.text).join("\n");
}
return getTafsirForChapter(verseKey.split(":")[0]);
}
async function getTafsirForChapter(chapter) {
let response = await getRequest(`${baseUrl}/quran/tafsirs/${tafsirId}?chapter_number=${chapter}`);
let json = await response.json();
if (json.tafsirs && json.tafsirs.length > 0) {
return json.tafsirs.map(item => item.text).join("\n>");
}
return null;
}
async function main() {
let json = await getRandomVerse();
let chapter = json.chapter;
let [verse, translation, tafsir] = await Promise.all(
[getScript, getTranslation, getTafsir]
.map(fn => fn(json.verse_key))
);
let verseCitationFull = `${chapter.name_simple} (${chapter.translated_name.name}), Verse ${json.verse_number}`;
let verseCitation = `${chapter.name_complex} ${chapter.id}:${json.verse_number}`;
let new_content = `### ${verseCitationFull}\n> ${verse}\n>\n>${translation}\n>\n> &mdash; <cite>${verseCitation}</cite>\n${tafsir ? "\n#### Tafsir\n>" + tafsir : ""}`;
return new_content;
}
module.exports = main;
@ruqqq
Copy link
Author

ruqqq commented Jun 20, 2021

Sample output:

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment