From 7a36615a76893bcd44dec359555057a821991b84 Mon Sep 17 00:00:00 2001 From: PMKuipers Date: Fri, 8 Mar 2024 09:16:19 +0100 Subject: [PATCH] Implemented cache --- amd/build/filter_bibleversesnwt.min.js | 2 +- amd/build/filter_bibleversesnwt.min.js.map | 2 +- amd/src/filter_bibleversesnwt.js | 74 +++++++---------- build/bibleversesnwt-2023112000.zip | Bin 0 -> 13462 bytes build/bibleversesnwt-2023122800.zip | Bin 0 -> 13543 bytes build/bibleversesnwt-2023122801.zip | Bin 0 -> 13601 bytes classes/bible.php | 21 +++-- classes/bibleservice.php | 85 +++++++++++++------ db/install.xml | 25 ++++++ db/upgrade.php | 92 +++++++++++++++++++++ version.php | 2 +- 11 files changed, 224 insertions(+), 79 deletions(-) create mode 100644 build/bibleversesnwt-2023112000.zip create mode 100644 build/bibleversesnwt-2023122800.zip create mode 100644 build/bibleversesnwt-2023122801.zip create mode 100644 db/install.xml create mode 100644 db/upgrade.php diff --git a/amd/build/filter_bibleversesnwt.min.js b/amd/build/filter_bibleversesnwt.min.js index 562b6c1..89d380c 100644 --- a/amd/build/filter_bibleversesnwt.min.js +++ b/amd/build/filter_bibleversesnwt.min.js @@ -1,3 +1,3 @@ -define("filter_bibleversesnwt/filter_bibleversesnwt",["exports","core/ajax","core/modal","core/modal_factory","core/modal_events","core/notification"],(function(_exports,_ajax,_modal,_modal_factory,_modal_events,_notification){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function bible_link(event){const target=event.target,info=JSON.parse(target.getAttribute("data-verseinfo")),bibleblock_heading=document.querySelector("#block_bibleblock_heading"),bibleblock_quote=document.querySelector("#block_bibleblock_content");return bibleblock_quote&&(bibleblock_heading&&(bibleblock_heading.innerHTML=""),bibleblock_quote.innerHTML='
'),(0,_ajax.call)([{methodname:"filter_bibleversesnwt_get_biblequote",args:{lang:info.lang,book:info.book,ch:info.ch,verse:info.verse,book_end:info.book,ch_end:info.ch,verse_end:info.verse_end}}])[0].then((quote=>{var modalconfig;console.info("Got bible quote",quote),bibleblock_quote?(console.info("Attempting to place in verses block",bibleblock_heading,bibleblock_quote),bibleblock_heading&&(bibleblock_heading.innerHTML=quote.heading),bibleblock_quote.innerHTML=quote.quote):(console.info("Attempting to place in new modal"),(modalconfig={title:quote.heading,body:quote.quote},_modal.default.create?_modal.default.create(modalconfig):_modal_factory.default.create(modalconfig)).then((modal=>(modal.getRoot().on(_modal_events.default.hidden,(()=>{modal.destroy()})),modal.show(),modal))).catch(_notification.default.exception))})).catch((error=>{console.error("Error retrieving bible quote:",error),window.open(target.getAttribute("href"),"_bible_","width=500,height=800")})),event.preventDefault(),!1}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=function(){if(!initialized){initialized=!0;const elements=document.querySelectorAll("a.bible-link[data-verseinfo]");console.info("Found elements",elements),elements.forEach((el=>{console.info("Handling element",el),el.addEventListener("click",bible_link)}))}},_modal=_interopRequireDefault(_modal),_modal_factory=_interopRequireDefault(_modal_factory),_modal_events=_interopRequireDefault(_modal_events),_notification=_interopRequireDefault(_notification);let initialized=!1})); +define("filter_bibleversesnwt/filter_bibleversesnwt",["exports","core/ajax","core/modal","core/modal_factory","core/modal_events","core/notification"],(function(_exports,_ajax,_modal,_modal_factory,_modal_events,_notification){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=function(){if(!initialized){initialized=!0;const elements=document.querySelectorAll("a.bible-link[data-verseinfo]");console.info("Found elements",elements),elements.forEach((el=>{console.info("Handling element",el),el.addEventListener("click",bible_link);getQuote(JSON.parse(el.getAttribute("data-verseinfo")))}))}},_modal=_interopRequireDefault(_modal),_modal_factory=_interopRequireDefault(_modal_factory),_modal_events=_interopRequireDefault(_modal_events),_notification=_interopRequireDefault(_notification);const Preloaded={};function getQuote(info){const key=`${info.lang}|${info.book}.${info.ch}:${info.verse}-${info.book_end}.${info.ch_end}:${info.verse_end}`;return new Promise(((resolve,reject)=>{key in Preloaded?resolve(Preloaded[key]):(0,_ajax.call)([{methodname:"filter_bibleversesnwt_get_biblequote",args:{lang:info.lang,book:info.book,ch:info.ch,verse:info.verse,book_end:info.book,ch_end:info.ch_end,verse_end:info.verse_end}}])[0].then((quote=>{Preloaded[key]=quote,resolve(quote)})).catch((error=>{reject(error)}))}))}function bible_link(event){const target=event.target,info=JSON.parse(target.getAttribute("data-verseinfo")),bibleblock_heading=document.querySelector("#block_bibleblock_heading"),bibleblock_quote=document.querySelector("#block_bibleblock_content");return bibleblock_quote&&(bibleblock_heading&&(bibleblock_heading.innerHTML=""),bibleblock_quote.innerHTML='
'),getQuote(info).then((quote=>{var modalconfig;console.info("Got bible quote",quote),bibleblock_quote?(console.info("Attempting to place in verses block",bibleblock_heading,bibleblock_quote),bibleblock_heading&&(bibleblock_heading.innerHTML=quote.heading),bibleblock_quote.innerHTML=quote.quote):(console.info("Attempting to place in new modal"),(modalconfig={title:quote.heading,body:quote.quote},_modal.default.create?_modal.default.create(modalconfig):_modal_factory.default.create(modalconfig)).then((modal=>(modal.getRoot().on(_modal_events.default.hidden,(()=>{modal.destroy()})),modal.show(),modal))).catch(_notification.default.exception))})).catch((error=>{console.error("Error retrieving bible quote:",error),window.open(target.getAttribute("href"),"_bible_","width=500,height=800")})),event.preventDefault(),!1}let initialized=!1})); //# sourceMappingURL=filter_bibleversesnwt.min.js.map \ No newline at end of file diff --git a/amd/build/filter_bibleversesnwt.min.js.map b/amd/build/filter_bibleversesnwt.min.js.map index 7e64a2c..7614765 100644 --- a/amd/build/filter_bibleversesnwt.min.js.map +++ b/amd/build/filter_bibleversesnwt.min.js.map @@ -1 +1 @@ -{"version":3,"file":"filter_bibleversesnwt.min.js","sources":["../src/filter_bibleversesnwt.js"],"sourcesContent":["/*eslint no-var: \"error\" */\n/*eslint no-unused-vars: \"off\" */\n/*eslint no-console: \"off\" */\n/*eslint linebreak-style: \"off\" */\n/*eslint no-trailing-spaces: \"off\" */\n/*eslint-env es6*/\n// Put this file in path/to/plugin/amd/src\n// You can call it anything you like\nimport {call} from 'core/ajax';\nimport Modal from 'core/modal';\nimport ModalFactory from 'core/modal_factory';\nimport ModalEvents from 'core/modal_events';\nimport Notification from 'core/notification';\n\n/**\n * \n * @param {*} modalconfig \n * @returns Promise of modal\n */\nfunction modalcreate(modalconfig) {\n if(Modal.create) {\n return Modal.create(modalconfig);\n } else {\n return ModalFactory.create(modalconfig);\n }\n}\n/**\n * \n * @param {*} lang \n * @param {*} book \n * @param {*} ch \n * @param {*} verse \n * @param {*} book_end \n * @param {*} ch_end \n * @param {*} verse_end \n */\nfunction getBibleQuote(lang,book,ch,verse,book_end, ch_end, verse_end) {\n return new Promise((resolve, reject) => {\n let range = \"00000000\";\n let url = \"\";\n\n range = book.toString() + ch.toString().padStart(3,'0') + verse.toString().padStart(3,'0');\n\n if(book_end && ch_end && verse_end) {\n range = range + \"-\" + book_end.toString() + ch_end.toString().padStart(3,'0') + verse_end.toString().padStart(3,'0');\n }\n\n if (lang == \"nl\") {\n url = `https://www.jw.org/nl/bibliotheek/bijbel/nwt/boeken/json/html/${range}`;\n } else { // if $lang == 'en'\n url = `https://www.jw.org/en/library/bible/nwt/books/json/html/${range}`;\n }\n\n window.fetch(url).then((response) => {\n try {\n const o = JSON.parse();\n resolve(o.ranges[range]);\n } catch (error) {\n reject(\"Error parsing json response\",error, response);\n }\n }).catch((error) => {\n reject(\"Error retrieving url\",error);\n });\n });\n}\n\n/**\n * \n * @param {*} event \n */\nfunction bible_link(event) {\n const target = event.target;\n const info = JSON.parse(target.getAttribute(\"data-verseinfo\"));\n const bibleblock_heading = document.querySelector(\"#block_bibleblock_heading\");\n const bibleblock_quote = document.querySelector(\"#block_bibleblock_content\");\n if( bibleblock_quote ) {\n if(bibleblock_heading) {\n bibleblock_heading.innerHTML = \"\";\n }\n bibleblock_quote.innerHTML = `
`;\n }\n call([{\n methodname: 'filter_bibleversesnwt_get_biblequote',\n args: { \n lang: info.lang,\n book: info.book,\n ch: info.ch,\n verse: info.verse,\n book_end: info.book,\n ch_end: info.ch,\n verse_end: info.verse_end}\n }])[0].then((quote) => {\n console.info(\"Got bible quote\",quote);\n if( bibleblock_quote ) {\n console.info(\"Attempting to place in verses block\",bibleblock_heading,bibleblock_quote);\n if(bibleblock_heading) {\n bibleblock_heading.innerHTML = quote.heading;\n }\n bibleblock_quote.innerHTML = quote.quote;\n } else {\n console.info(\"Attempting to place in new modal\",);\n modalcreate({\n title: quote.heading,\n body: quote.quote,\n }).then(modal => {\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, () => {\n // Destroy when hidden.\n modal.destroy();\n });\n // Show the modal.\n modal.show();\n return modal;\n })\n .catch(Notification.exception);\n\n }\n }).catch((error) => {\n console.error(\"Error retrieving bible quote:\", error);\n window.open(target.getAttribute(\"href\"),\"_bible_\",\"width=500,height=800\");\n });\n\n event.preventDefault();\n return false;\n}\n\n/**\n * \n */\nlet initialized = false;\n/**\n * Initialize the Page\n */\nexport function init() {\n // Make sure this function is only called once on the page. May be called multiple times because of filter weirdness\n if (!initialized) {\n initialized = true;\n\n const elements = document.querySelectorAll(\"a.bible-link[data-verseinfo]\");\n console.info(\"Found elements\",elements);\n elements.forEach((el) => {\n console.info(\"Handling element\",el);\n el.addEventListener(\"click\", bible_link);\n });\n }\n}\n\n\n"],"names":["bible_link","event","target","info","JSON","parse","getAttribute","bibleblock_heading","document","querySelector","bibleblock_quote","innerHTML","methodname","args","lang","book","ch","verse","book_end","ch_end","verse_end","then","quote","modalconfig","console","heading","title","body","Modal","create","ModalFactory","modal","getRoot","on","ModalEvents","hidden","destroy","show","catch","Notification","exception","error","window","open","preventDefault","initialized","elements","querySelectorAll","forEach","el","addEventListener"],"mappings":"8TAsESA,WAAWC,aACVC,OAASD,MAAMC,OACfC,KAAOC,KAAKC,MAAMH,OAAOI,aAAa,mBACtCC,mBAAqBC,SAASC,cAAc,6BAC5CC,iBAAmBF,SAASC,cAAc,oCAC5CC,mBACGH,qBACCA,mBAAmBI,UAAY,IAEnCD,iBAAiBC,UAAa,+DAE7B,CAAC,CACFC,WAAY,uCACZC,KAAM,CACFC,KAAMX,KAAKW,KACXC,KAAMZ,KAAKY,KACXC,GAAIb,KAAKa,GACTC,MAAOd,KAAKc,MACZC,SAAUf,KAAKY,KACfI,OAAQhB,KAAKa,GACbI,UAAWjB,KAAKiB,cACpB,GAAGC,MAAMC,YAxEIC,YAyEbC,QAAQrB,KAAK,kBAAkBmB,OAC3BZ,kBACAc,QAAQrB,KAAK,sCAAsCI,mBAAmBG,kBACnEH,qBACCA,mBAAmBI,UAAYW,MAAMG,SAEzCf,iBAAiBC,UAAYW,MAAMA,QAEnCE,QAAQrB,KAAK,qCAjFJoB,YAkFG,CACRG,MAAOJ,MAAMG,QACbE,KAAML,MAAMA,OAnFrBM,eAAMC,OACED,eAAMC,OAAON,aAEbO,uBAAaD,OAAON,cAiFpBF,MAAKU,QAEJA,MAAMC,UAAUC,GAAGC,sBAAYC,QAAQ,KAEnCJ,MAAMK,aAGVL,MAAMM,OACCN,SAEVO,MAAMC,sBAAaC,eAGzBF,OAAOG,QACNjB,QAAQiB,MAAM,gCAAiCA,OAC/CC,OAAOC,KAAKzC,OAAOI,aAAa,QAAQ,UAAU,2BAGtDL,MAAM2C,kBACC,uFAYFC,YAAa,CACdA,aAAc,QAERC,SAAWtC,SAASuC,iBAAiB,gCAC3CvB,QAAQrB,KAAK,iBAAiB2C,UAC9BA,SAASE,SAASC,KACdzB,QAAQrB,KAAK,mBAAmB8C,IAChCA,GAAGC,iBAAiB,QAASlD,yNAbrC6C,aAAc"} \ No newline at end of file +{"version":3,"file":"filter_bibleversesnwt.min.js","sources":["../src/filter_bibleversesnwt.js"],"sourcesContent":["/*eslint no-var: \"error\" */\n/*eslint no-unused-vars: \"off\" */\n/*eslint no-console: \"off\" */\n/*eslint linebreak-style: \"off\" */\n/*eslint no-trailing-spaces: \"off\" */\n/*eslint-env es6*/\n// Put this file in path/to/plugin/amd/src\n// You can call it anything you like\nimport {call} from 'core/ajax';\nimport Modal from 'core/modal';\nimport ModalFactory from 'core/modal_factory';\nimport ModalEvents from 'core/modal_events';\nimport Notification from 'core/notification';\n\n/**\n * \n * @param {*} modalconfig \n * @returns Promise of modal\n */\nfunction modalcreate(modalconfig) {\n if(Modal.create) {\n return Modal.create(modalconfig);\n } else {\n return ModalFactory.create(modalconfig);\n }\n}\n\nconst Preloaded = {};\n\n/**\n * \n * @param {*} info \n */\nfunction getQuote(info) {\n const key = `${info.lang}|${info.book}.${info.ch}:${info.verse}-${info.book_end}.${info.ch_end}:${info.verse_end}`;\n return new Promise((resolve,reject) => {\n if (key in Preloaded) {\n resolve(Preloaded[key]);\n } else {\n call([{\n methodname: 'filter_bibleversesnwt_get_biblequote',\n args: { \n lang: info.lang,\n book: info.book,\n ch: info.ch,\n verse: info.verse,\n book_end: info.book,\n ch_end: info.ch_end,\n verse_end: info.verse_end}\n }])[0].then((quote) => {\n Preloaded[key] = quote;\n resolve(quote);\n }).catch((error) => {\n reject(error);\n });\n }\n });\n}\n\n/**\n * \n * @param {*} event \n */\nfunction bible_link(event) {\n const target = event.target;\n const info = JSON.parse(target.getAttribute(\"data-verseinfo\"));\n const bibleblock_heading = document.querySelector(\"#block_bibleblock_heading\");\n const bibleblock_quote = document.querySelector(\"#block_bibleblock_content\");\n if( bibleblock_quote ) {\n if(bibleblock_heading) {\n bibleblock_heading.innerHTML = \"\";\n }\n bibleblock_quote.innerHTML = `
`;\n }\n\n getQuote(info).then((quote) => {\n console.info(\"Got bible quote\",quote);\n if( bibleblock_quote ) {\n console.info(\"Attempting to place in verses block\",bibleblock_heading,bibleblock_quote);\n if(bibleblock_heading) {\n bibleblock_heading.innerHTML = quote.heading;\n }\n bibleblock_quote.innerHTML = quote.quote;\n } else {\n console.info(\"Attempting to place in new modal\",);\n modalcreate({\n title: quote.heading,\n body: quote.quote,\n }).then(modal => {\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, () => {\n // Destroy when hidden.\n modal.destroy();\n });\n // Show the modal.\n modal.show();\n return modal;\n })\n .catch(Notification.exception);\n\n }\n }).catch((error) => {\n console.error(\"Error retrieving bible quote:\", error);\n window.open(target.getAttribute(\"href\"),\"_bible_\",\"width=500,height=800\");\n });\n\n event.preventDefault();\n return false;\n}\n\n/**\n * \n */\nlet initialized = false;\n/**\n * Initialize the Page\n */\nexport function init() {\n // Make sure this function is only called once on the page. May be called multiple times because of filter weirdness\n if (!initialized) {\n initialized = true;\n\n const elements = document.querySelectorAll(\"a.bible-link[data-verseinfo]\");\n console.info(\"Found elements\",elements);\n elements.forEach((el) => {\n console.info(\"Handling element\",el);\n el.addEventListener(\"click\", bible_link);\n const info = JSON.parse(el.getAttribute(\"data-verseinfo\"));\n getQuote(info);\n });\n }\n}\n\n\n"],"names":["initialized","elements","document","querySelectorAll","console","info","forEach","el","addEventListener","bible_link","getQuote","JSON","parse","getAttribute","Preloaded","key","lang","book","ch","verse","book_end","ch_end","verse_end","Promise","resolve","reject","methodname","args","then","quote","catch","error","event","target","bibleblock_heading","querySelector","bibleblock_quote","innerHTML","modalconfig","heading","title","body","Modal","create","ModalFactory","modal","getRoot","on","ModalEvents","hidden","destroy","show","Notification","exception","window","open","preventDefault"],"mappings":"0YAuHSA,YAAa,CACdA,aAAc,QAERC,SAAWC,SAASC,iBAAiB,gCAC3CC,QAAQC,KAAK,iBAAiBJ,UAC9BA,SAASK,SAASC,KACdH,QAAQC,KAAK,mBAAmBE,IAChCA,GAAGC,iBAAiB,QAASC,YAE7BC,SADaC,KAAKC,MAAML,GAAGM,aAAa,mBACxC,gNArGNC,UAAY,YAMTJ,SAASL,YACRU,IAAO,GAAEV,KAAKW,QAAQX,KAAKY,QAAQZ,KAAKa,MAAMb,KAAKc,SAASd,KAAKe,YAAYf,KAAKgB,UAAUhB,KAAKiB,mBAChG,IAAIC,SAAQ,CAACC,QAAQC,UACpBV,OAAOD,UACPU,QAAQV,UAAUC,qBAEb,CAAC,CACFW,WAAY,uCACZC,KAAM,CACFX,KAAMX,KAAKW,KACXC,KAAMZ,KAAKY,KACXC,GAAIb,KAAKa,GACTC,MAAOd,KAAKc,MACZC,SAAUf,KAAKY,KACfI,OAAQhB,KAAKgB,OACbC,UAAWjB,KAAKiB,cACpB,GAAGM,MAAMC,QACTf,UAAUC,KAAOc,MACjBL,QAAQK,MAAR,IACDC,OAAOC,QACNN,OAAOM,MAAP,gBAUPtB,WAAWuB,aACVC,OAASD,MAAMC,OACf5B,KAAOM,KAAKC,MAAMqB,OAAOpB,aAAa,mBACtCqB,mBAAqBhC,SAASiC,cAAc,6BAC5CC,iBAAmBlC,SAASiC,cAAc,oCAC5CC,mBACGF,qBACCA,mBAAmBG,UAAY,IAEnCD,iBAAiBC,UAAa,gDAGlC3B,SAASL,MAAMuB,MAAMC,YAxDJS,YAyDblC,QAAQC,KAAK,kBAAkBwB,OAC3BO,kBACAhC,QAAQC,KAAK,sCAAsC6B,mBAAmBE,kBACnEF,qBACCA,mBAAmBG,UAAYR,MAAMU,SAEzCH,iBAAiBC,UAAYR,MAAMA,QAEnCzB,QAAQC,KAAK,qCAjEJiC,YAkEG,CACRE,MAAOX,MAAMU,QACbE,KAAMZ,MAAMA,OAnErBa,eAAMC,OACED,eAAMC,OAAOL,aAEbM,uBAAaD,OAAOL,cAiEpBV,MAAKiB,QAEJA,MAAMC,UAAUC,GAAGC,sBAAYC,QAAQ,KAEnCJ,MAAMK,aAGVL,MAAMM,OACCN,SAEVf,MAAMsB,sBAAaC,eAGzBvB,OAAOC,QACN3B,QAAQ2B,MAAM,gCAAiCA,OAC/CuB,OAAOC,KAAKtB,OAAOpB,aAAa,QAAQ,UAAU,2BAGtDmB,MAAMwB,kBACC,MAMPxD,aAAc"} \ No newline at end of file diff --git a/amd/src/filter_bibleversesnwt.js b/amd/src/filter_bibleversesnwt.js index 55abb1e..6d44fb9 100644 --- a/amd/src/filter_bibleversesnwt.js +++ b/amd/src/filter_bibleversesnwt.js @@ -24,43 +24,36 @@ function modalcreate(modalconfig) { return ModalFactory.create(modalconfig); } } + +const Preloaded = {}; + /** * - * @param {*} lang - * @param {*} book - * @param {*} ch - * @param {*} verse - * @param {*} book_end - * @param {*} ch_end - * @param {*} verse_end + * @param {*} info */ -function getBibleQuote(lang,book,ch,verse,book_end, ch_end, verse_end) { - return new Promise((resolve, reject) => { - let range = "00000000"; - let url = ""; - - range = book.toString() + ch.toString().padStart(3,'0') + verse.toString().padStart(3,'0'); - - if(book_end && ch_end && verse_end) { - range = range + "-" + book_end.toString() + ch_end.toString().padStart(3,'0') + verse_end.toString().padStart(3,'0'); +function getQuote(info) { + const key = `${info.lang}|${info.book}.${info.ch}:${info.verse}-${info.book_end}.${info.ch_end}:${info.verse_end}`; + return new Promise((resolve,reject) => { + if (key in Preloaded) { + resolve(Preloaded[key]); + } else { + call([{ + methodname: 'filter_bibleversesnwt_get_biblequote', + args: { + lang: info.lang, + book: info.book, + ch: info.ch, + verse: info.verse, + book_end: info.book, + ch_end: info.ch_end, + verse_end: info.verse_end} + }])[0].then((quote) => { + Preloaded[key] = quote; + resolve(quote); + }).catch((error) => { + reject(error); + }); } - - if (lang == "nl") { - url = `https://www.jw.org/nl/bibliotheek/bijbel/nwt/boeken/json/html/${range}`; - } else { // if $lang == 'en' - url = `https://www.jw.org/en/library/bible/nwt/books/json/html/${range}`; - } - - window.fetch(url).then((response) => { - try { - const o = JSON.parse(); - resolve(o.ranges[range]); - } catch (error) { - reject("Error parsing json response",error, response); - } - }).catch((error) => { - reject("Error retrieving url",error); - }); }); } @@ -79,17 +72,8 @@ function bible_link(event) { } bibleblock_quote.innerHTML = `
`; } - call([{ - methodname: 'filter_bibleversesnwt_get_biblequote', - args: { - lang: info.lang, - book: info.book, - ch: info.ch, - verse: info.verse, - book_end: info.book, - ch_end: info.ch, - verse_end: info.verse_end} - }])[0].then((quote) => { + + getQuote(info).then((quote) => { console.info("Got bible quote",quote); if( bibleblock_quote ) { console.info("Attempting to place in verses block",bibleblock_heading,bibleblock_quote); @@ -141,6 +125,8 @@ export function init() { elements.forEach((el) => { console.info("Handling element",el); el.addEventListener("click", bible_link); + const info = JSON.parse(el.getAttribute("data-verseinfo")); + getQuote(info); }); } } diff --git a/build/bibleversesnwt-2023112000.zip b/build/bibleversesnwt-2023112000.zip new file mode 100644 index 0000000000000000000000000000000000000000..343db3e791fc4c41fcddaaf3afc1d2b86f04009b GIT binary patch literal 13462 zcmbW8WmKI>)2?v~?(QDk-Q8V+%f{VZg1d)6a0w6~xCHm$?jGFT^^nQ?&15E-_dDmX zR`0d>b5-~ARCQP1Ra-$C6buIF`yZmZllmWD{_}wVgbQS7ZfFH?0XR4U9Bo{k=v7sq zfk5SHwE*9Tv)d~mV6YufAfP`!6#fKZdpD^43_|@CWMyDu`h&JnYiC?@_~!qfhVd^n zfX)93M17eR6wvqSCDRqGYJva(iGl$EG5kBw#N5gW;Gp;Sr$A?CX7|T~_&#;9z+a{w zq-V%I%hx@= zdwA#o>wv;Bk?(K^8)tW=RXPVIf)8#mSECp9H`_VrzWV>MZkwh@Q@zyZIT9R*YYtErT zxATB12uw{fb?BHqf;4D~T!*)`0I3aI6P>A@zoWFni?R*5Ikvx9b9r0>uSl7U#V~|r z9%M7R8k$nZ_2zl@y$EIQzWzBTQD3ThR#c`RiTlh~)rI40#nSt7OAEio8*=QZwW=zl zw05DL1`Jj%4=we|BkT80h$GZyN#+*x>3fz%HD*Y`BcW}Pt%o9~Qf_|NrP;&pN=k4L zv`}4;7wJ>BQ!zHswZh4f0p??0KKOC;llHW_>2n1o#q7(8M%hlqPFMgpzRJ+mV9E&- z&y8u4Z+K$F53I;JmA?U5=T4dEKP8U09`khkoad82eL4l5=$Me>1Tm;3*W?3`py01K zfs!pHqqyb{@essYCHUB|`A)9p$ zUp4wg7o^*L4&yJgierG2h4eJ0q+LTjUN5;;^jd26$!4uuijxSd?E(Cj_!xX z4rnhyVDfFDRzr)}pg3KyPM@O4r*5034l>JkgfwXxjljik(^Z551)5D_AL!q7 z0Nqt+zoGRwNvhlr?TOI+jh-!M(TAzmmSiJXrz3UN^ks zz#Dq*?q#1EGwea)z_y4`yOac5-;;<}gI{gEo==b%(7X_%nt`PO$KjPb!J^C>&BC>* z*s+4!zjUNqHRU+X2@tKbg0<&U{1txJ)-vfi7;`_7U* zyBIB}=e6E}%sVl0osWmNQSwlOP-znZSkOq3%-a^8toTNubVmgA)K&P&oKrm!6)6u! zX*1hXnA`0Q1*fkXTf3iE7q5;HCPv+AY`cg*RP!d^_nuiVve(2K>Feg4Vm^k#KX3$` z9bhyOQmo258ZNY6NI;kQw5q|QL}5(hteB1G><$UOempWE2_I>dh9uinbALkJEO!_K zQMFxOUuR9!ujvkIhVWTE!@pcz6|b>^g5bXcu4iIx=zfoTb2=JB^8qAMOl0mPcPE54 zyFFG7plTKvSw0-obJ=-Zye&oq@_Y{rF%F9s?+pPavCgz-bJs`_rz(1WmryIH2SN8{ zGgEY7nLfj*E1}t~W34Y_Ex}AVsh)NXmI!_Tw!qh*8lLC$L?k$uJhCQOR>Ah63a=X% z>mx~Wxi<1fJc+}JRj>5}N<0`7C5xccsyO*h1sy0hYDpqS#8dSAr!*nmS8r?CM&0VH z@M4H95LvJ^_TaP>?;&aK<1|%E9iy6aIkYA=90T+@G@M7UXd58NyP%{WV`V?1#)K-I z87GwG-?nXLdpq1Q-Q<+jm3Anp0ub|&Z{C(k+Lvd|di#VbZznCQuRiPg-o4@1Mnj{u zF@IEfRkPtH1#KU5PqvQ{NylPy4n@hruS8_8+OvSR8(v5*B0xL&aW3{=s(c$u?UQjt zCU^{Ujqd9quJV&R0zKqvA}rbxxuJr6(I-o{%;NILoIe2lxz&k&) zgFT%=GD9C;_BkVxA-RuIJjHIoW+GOxIZAXywskEs{esG9S<*e2YN2pv!x4d#V|T0P zMk}i$D2q|D3pB?)wko8M)W~JTajGS%(UVDoIrp@lM}`Wa$A!Y3iV(iEg_n-l!!KK^LJ7tTD@%b zc_)-~ZnIWhCxG!FpPoac!`g?#8m68A#u`@AWBwKShF%T`)l1>CgP=IXE6|g>1eBBk z#PAMc#Sa$kxrUN3N^rwBv6HKr!{UK3LLx3q&;z7`a{e$v`k zBrbU<^yzN9c}a32y91vu@{?OG#*<4g@+rMnXxu3pY~4PX2Uaz8)Kn>4#^?pHW3%uI5i9L&m7v8wTD zDO7OXxm+~=4N#=demK9pI}+(Oz^Gg%{~G~W1Rvpc5cgh-D1vlIOJTV zqg%@PRQKF`z!72xsD~9vHV}?@{CzzZNzvrj>e@s=nE2rc&!ko2$w;Ot*Sh)?lLueKA`K*ZPx1Cv7IolR{C=27`N1= z3^v5k#N`QUUf|BZ3&Mcur*UD*%dW6a1aXeKLX1wm1k3O-SH}WYF2Z0^BeY>RYJ!c6 zi?*?%100j<*bc)7jJb^gweZ4*2?zcj?n2CDL)tzW>WHbZ8CH04Go=1Y@eUnLo(*Hu zE#8co{q_C9p5@3v9Y5aZhn=IsbwNQj-W>RWH;T;%ze(^?b(P*nlXzSFd zw^O;zm*O2Y*A7K#9Y{xUr^Ae@#bmId(QAzq%~HW}hS+`V2R)Ievi@3T2k)J4Js3!q zm(-n8$EXjWeQsQ+hxiz3njP;y62Fxn(bcf>M31}OE_st&9M0vUYfz?a0%zl~Menw4 zinQV+KT_|JvG3sMf}*#Y=aa6}wbHXk{_b!#*s@~;vmZOAaPM#~+68CNbL?;-a>3Hg zR}e2zKf2cQy6?*Odm{8BZ~3a~q%H#7p|}MO1f-7u1Vr(_2N!cAz@O>MCbbse z`}jxt(yVUnIM0FjG+Z{DE5nF|ah+;ABt4Lyw;2u8Ik3rO9n5(3b_%L5X#?@&kZ)_! zprr)L-M8UReVSvw`vVKt8r)Xtgla^vQTg}5jO$QN^1=Xt=yp;l-h}S+#1Igr4B7X7 z6)JW_fWf$n5{oDO%N`h{YTOT+g(tLw00<;1>c|wf@F*r>LkJ-xNHC@(Mw}5^kWv7# z*d{EtigI)HQw6JE45dO4F4tUW6;vvXP&Sg#nz_2uTgFJ-=qZjmT#r}qc687jEHW?z zv16X#b%iXvo!`cLKt>^pXhJct2ekcVN_B&FhW$fKO5ZHmdmZY*q7p}>_9l8sLPa)x zU>r6Gj5WtKU99UTg-wonD!9r*sF_C7o^DurQ|#+3(m@_~fo{tfVmOh=EJPloLOGZg z%6)!$G)JLS^f+e5cBd{vFpTr4);tq%?t)=4TI75mRV7$89WWBa4jmvQc z%+c&20yu*h3e)FgI=!)X7KUGqBs#S6N~2~N0i9&^`8Nmu+ z6R?bN%SB3FE)c#SGMNhN{iGxdlCi(PnplsEi@FL#XP>9IH2x~ot+2)@UBSg(?53KK zWb0}M2s;G@-bZH~DVhyvD7h-o$wLc+FY#*Sa}9*e@5SJf&W z(~rGu1y`uRLouk8>0NvxiiTYcWy}}DOU`In21$2TM&*pJ#S?)G!i^Dhb5N9&s3IJq zvUw-=T;f5PUuE;NUK`L4x5Lfwgr^(<@am!QaRG!)uCUd*@bk^o& zAhzso~uUv&X6BYChC1qdp(!Wr4(&f1NbSNqQwkJ?OC zRM>r(18BZDrlgxg%p8eCVC!Dsui=Fb+eG?w2^En)y6}sz;eDeEm!4?$OWPRHr|BaC z^y*5GLN2u2p178B79uR9`{c?dRqXH6`}3dNayo6#(PPbqccYxl2qanfE*`5$vC9jG zJoBSUXIvt@2230=qvaH(+u@F5rHWo)Hy`d%l4JIeDtU1QF3pn#*%93{M1)80=|agl zC_mp7_#YV*<`_@iE*4>>QdS&}$$=SGCVCx*`&K}a4ci=;ZQ>V7bLFE&@?sI}ghfJx zA}@>bM8tKU2+ps^o50oSk7!3pKSF+z!K4&b!gNSs89CFN{xm%2=@cA@#h$f2zgk^6 zu6K}>&b8H=fv($EOWkU`KT0nerst57PCpy&hqC?7yY8}{I;C3*K;kXM0;G7%4IBcZ z8ctC&HCuHP;&bafcYN8{DR4$Yf;{5 z)6Bn9d&d%dJ-n|&P>A=9&%^0Fo%mu?H z!lta0TvsVG0*Tqig+}+jv18vRojPq4S{Rfx>hmVXSA)ydr6O^?q;*0b@AjQg8sFRW z7TS-punyKZCm!sab;}<_`ZRs0WtLWuU_1hkR?osg{avZVu40xln_UKEbwpdWYcrd4 zHW^o_J0BVq>ggZ;xKIB$M(pIA)KkaC(N=(8q0Q2H|`fL%>t+QxW7%jaN0z%6Wse$>#`wh3m_4*4$0p zk~=A>)lfZVsWIjVqctZAXAbo)#g-)z6He2@7vWC1U2kQ>E707z_}2bS%&M2%yx~b$ z<8Cg~Gu6>&-h0`*m!I#*^|)1rGr70*D0x7jB2XL&M@6&^5|B;C=Y(bli5@d7ZikoT z$kiy+146shzO1RTUU=L8ah~rY#>a^wzXr$LKZsA5$k<4ySP2>^&(4f{K;IiVvBUiM zvxu!HZh6q>8#>{@Ae75JAH9SiSc>Wn&FXLfU}odKysu*Plb3F;B_%xq6Lv~AMVj@f zqYYuZL7OA?!8T`%SPx=li(GMd<~Yu2B{NN(oN66W_LiaX(I70@BhouaD1q23bO^1t zL+I$@lO&J2)!d)ZOJdrJhalE&$l9uc2gtx>uJxo!R1;_x$JG}QhxM5X?$otZ0fKyu z;bo?i7=*OX`?9<%XU|kED&bpt$vbC1xlh-N``}gJ>o&Y-p|LLt3f8~5&z~Ms_Tnwy z$3HwKN^K?PCGYSV(PKWqOcy*p_Yae2v2m zEF^gx9YQ)h=yg8CzWzQ0!TlYi0aQdJjzqmcmgjIacv9Q3RQJV4$dsB}9ZZ|YhB7B? zrN~#sJlZ8>~KK6ZET}9?3Wm+tMMQ2YsFe^lu z07;?-y7y_{2HZ|>0bl&S8H4KuSIyZ~YAhvG4WVk!mUe)>oR zY*Zcj%8|xhl$Nzit}C_zPsx&GgL|!qQ0ewt>%x}6dj+OTfEqG#sXd6&935uPwL;Xq zPwR0(nRI8iYYoT8cC6=FsZd^yAtp>PLyX>DD>=5%){ zOW{h{yUYj6Us`TYiQh9oEk@!>THlCe;c&4y*tXtodLydTu-yVZSu6HH^jkO7R_i8b zoRAPY#9FrGT8)MmA_m08L(3o2%hD`6xK}5BtPGPRBB`S)l&$SuC{1HI;G*0`cK(EV zv@P50-_r^sM|=t4``)=LP@~FvvBi7?pRJ{NciFCQ7ecSqRVt&b9efF;2+TUM)Ugzo zxxqz?k-P-4)^RHdrY1YvinoQv^t=H1*mwiFTI*fQ+h%`-uG&PP<(44!`k}+@_Sqtg z!&me=dwU(8_3%ynqRqM+z7s$v&kibQ`DQbGBMsHnwm#^npL|NC{TjLHq5w=CE@aZS zZR^pkEENw)#u!c#%r<6HsgZi#t}V|r=^sv&0}2M%lio1W{0&T7b$(u6C4? z>kq*#b1y}Qv&tLFMp=qdUtx&OoOlKhw1m#Udznf2GIiqN7F9;*bRb|k8S6_7ZO_6_+&t+Qw7FYimG+0&|#2UQ9G#lRD-ocS-%cj zK?Y9p`)nh2eU#G*L_KJ{K3ZBDSehYz-9+feu@0d`hq$A|U@e%>ph}(n!Lql6)+T_k zY`A5-(T@RM&6MN&Mxf-Wk8S&{P->P58XLu?Wb4DYQYtukf`ECiYR5#bQC6c8d11Q= z6uPsGHo(;_rF0dX%z|8B(FSa#BhXe68%zv)DXNdbU$%Q4QMkZB)6y@S*wExlytROw zJ)Gxc@bD=2Od<3_RyBz^(|)3*LQrRo#1Rr$6-ME6_NlZlw4G*!$)_w`CgR*9cx|Xz z!bFG(rE0wQ@!y*pyMbc{2*#UXsAU$vBg7d`UM|A4J|L zC}bZT`JU6%jZQn<5r_dY*lnc1a;RLlhw9WoBpS6b!xr2dAZe${QKSc>dh;3rZ2h@diCoSOh36&%LtDq)4t!-_b}KLL-5~YUXCC+W)0b+Y4qx+)IXiaC(i-a{@d>@kO$)b+k3#l#5qYLu-ahzIS(@J07mm3Tl(C8griSd} z^V__w3)VXIb=35UBIaRDiZS+`>>zlkQ9QFfwo(oz(nEcX*9>s$sv^POTJg>l0sI>o z;V1?($B2vf;D1#kBwq57pX+_dzk0l};g3RuI;j>w<7NEA)BlPd>lc>wv%Wa&%TdY> z0R)8qTh@QB@qcAt=`YOh;~(506|I*DLiHIb<3LCNK_gbapI+#BV>U)fNcTxWi->|# zvI&d33Xf9B_aR!i{-XAltkSz>;7ix`${Ee|TOe{Q_EnRTiXRbV7w)}BR;q0SDa_u%B~eiG=^TYdA4 zqnboUllfVq%?w(XAD&Qcz8|E)qLgl6y!hEHP?25@CI+AYy#%uN=DP1Gg%HH#R*HSP$t)-Ta8`Ux7`9{4kao5RLPOOl#OT@ zAVPs1`bwd}pvnx3t`v0vyI^k~u@>vZa@Bm9xO4SCP&IUu*%aOoW2C*OA{ollNjOz% z;caLjlh_xpn@Jz+<#TFC@bTmc9@Yn=#jF)eIGU=S!EU$X!iMiTByYn^r=4l^MPsMB z7Y2_UW1<^m+r+AwjO9iW?s+Hia&f2c!wHbs+<&ecietz&e)CZ?Db~svCAOcfEw=f5 zaDFijqTQm#;$x*5bvlG$0DC)`J15uKD%24pOJTAT@XJ{>L(7z?M6b|zf6N)-Q-$jP zP5}wUQM%Kh7E~vgW9H=?1?PD3@B-=F(n0Y-=P6K222T3Ce$)G|^OcNM>{d?7T+r+W z-$DCXmvbI2E-?%beNUitq~+6+zTJ}LNaLfV=cMiB16NbiD3n2|&z8I1r$kuowt#Kp zW(wD)Av<3=)f=ZIU}N9s>!XvYsqNR4Bwik{y>~nt*#hi0W*hy(%GDoo`GYEVI=jhu z+FTTEizrS$Q^nJk?^@?RNH7>Jrsy4ob@)Cg99Arz1-Q!)Yv#pxZXv|u9 zqi`Yckor;w#jbN8cO6;X%l$NsD-Wucs#QX8W7Il(ZYf&)il-d4A}vVUZeZ*NM>-@r zD92P+*_wlQ@yYT*xzlm|2IH@Iz5e3(w|GVQHO36Ajei6za@ZRH`pfu7VEqMq{0Hne zx$k$Fp|iQwe~@@DIKtl}f855tHzK5Po}y4dzm)5-fPgrEKffQy-K~KC*C4=iYvkr&*F$bwB9bV^5r>qg^dQFLp|a6pEgrZDxxu zeN64BO`+_L9X>esxaFqHF5PLv4T|Wir|d{p6N{bF5F_%gONqJ2<#T{jG8|sqM`}E- z14UQLfgSCwl+ajeVJ24mI>aC;6KbSu#I_jBeB$><#vbnUXrW`~h@DRk6dxezI_7Ivqx>xLWRAKXNhFo2BPH)b6Z9M5Zbah~ZO3&HGiZPqQp&}EIQ z_ePuADWgBK8PeXK{5>`fao5|juU}v#)4v6}S&UIh&Y8FhKxeuwW_P*;o4|dI8Efyq z36D$;cIp-ZL0{}NYraE#R``6x?}6Mq0AZImSq%(J0f(sbS?%Z*Q7$@kseXKAPhztt zl@kK}X^3|F+^7mhP~*2QGV(fw%{OyLVzcv8(^^V2;btyeMSib6Xtf1&!xU_*n$-c2 z6hc*~)zGz&Ge=>Mu<6OF@jSAjeu()e8geYd6MHHJcBNbk2aK4S9#>m}PM-o)Tr<9C z$=4#v_wWlSDS{T&TwNTuVhjiAOn^HN4BlbNtoXk@bHl4>s9~M;Mt^==vQeXY2^4AA ze>ED$gvA9H5EbGpQ=MVjxO8M#aq<~GLyEqUY1hy@CMg4oG3aqhf>fvQd?^lDnW#}c zC4MO^gKTN#Xs4-|03dvjZ>Rv>9=!s?T^qP~*GTRcPl}%}*g&crIQ9ACTv=jrb9pEr z4}Do<$8H=Luz;T?p%gxxoe=6_vnDQ#RqB5dkS@*)zSY9X%NfidV8sQvwuOPp_Z4?H z*1n2*ckHZGUjeMq%{7UD)6N)w^5hgOM<9v$sSE$@wrMwXaI`eYB5PiD;l>B+m_!$t z{Go{%r;bNCBl{?ecJH7{sp(Q_A{#XXXAldzC@zt2&3?h$hluU-Xg%w(`wB&Ehk+M^ z>jO-pG+%4VF^LgcS|IMlIZ^AgQNX!ov$=zC?TBh$8}>#k=5*|Ki+~~FyT^!951JNU zo6?PM7D<4)fFWMV3(pyYe7O#L3`@H5MZr#0v>-u+QC2o4^DK8_EwR{8Pw0xsN8R0* z7e8imt|JTC>wj&<{}j1qiB2x~?hr2BO0GUVPKqRsiPq*K+WxVazfs_3@9W2i_)dM) zJ+IeTTqqtn#8`v+i3=8ZJoJP;5F$NRUvNx%fiVw`G%go4B3!5dJQnV(Wdi;c8hb&i zRvZ-^W^t;pb4GC=-Ptw`iF_qopjYTxMaq3@Gqk){o~||;X>B&b?v`o;szMH8%|QXo z2}rEkR-KoX@#3w$)#zXBR=TV{pPrd@Z$ZnqEBL#98zINyt6jQMpW<|ID`lq3u(8)+I~1 zRbM=u)xG3XZ;tUrw70fJr(vrxRq!`0M2St5{|ybo)FC zPhTGQH8~M4&M{AVyU4OgP!mfg#a)gv+2kWH@0U`~l3}j&{}2rW(5XMD(-*Y0i1yf$aR5;Q({$fNcvb6fNu7Hv z7)f0W0pO8v%pPH_wpl0HAK=s5a$^ry{Vq$nK)hE(iqj-(rSJ-Ib=_fTIqv4HQwsdt zjgqcFrN;9Pg=UPE!P_^gA4r>hszlbn6-74Jbkf=}Nf}x@Nk8H%rQ$4nRs0|=9QG{p z4OZ~k(7GOXCOa^2%9z(`lt;rZF)%1tQe&VF82)dwO- zd^%0WGIxq7>ba38MwLg6$cLSF0Pd1NB}2T{$kJzZ zhDIBdRIBle#h94^o3o;xCIOlO5@6#GgMZYPrWuUWWC-y`duZKny4f&&R9@jde`G#_ z;Ct>^LRsNoa*gqNhPw6|T&ipF6>7ERY}X?h>LVJx_vhZf)pm?7ey;kuq^!SfvvZ$) zkE`GdL=7=n;;JAvs4Q7<5l+G|lbAfB*EwbLX0Dg<=bH!$%AdbN%?#>Opty z4bT7Jm%F)b1Akv;{4EZA{feIH7S`uh58^C|a2uWJARZR}!>RE82jI9~pW=aGi4~y8qm?uJIY;!(0Ao9g)|^#}>oWM|Li|~F zUd*g#KKNb~+md<&yI#KAU~f4{>sd+EYZ4vs0CN>fEx@hNzhDCgcHTd3eND$0B3RzaaEX zlc*?3MHMg}qAgyJchD=G>vCFb)md4$U#d~m^YQhxme6E3vgD|rAPsrZ8rntom{f_v zb|p&fabr7FIRl)wk-r{-Xd`)PvM3c_#eG0P(vy!d`F|BoLzPE zDUn=@aUj&va@cG#Ge+nY&K_Fsk?BP%o7u|)az{8bDI@RU8H7dh?6L}=8tt^(X{P=J z6&xuaW;%3YEIxjo49B}Txod-}_DW}s$gY$;)uy*1d!*y>fl(U*6TF?glPUb4+-c5M zeQO@ZqQlOfT|nT9B{0~~m)1))xOY)E5;inwP7{v-bFkR)a2UMBGbo658v zw25$N@GWaRe9a)*SnHGnO^b)G=g^Deg#6^F0J9kD7|z3~6#Z>rKh|IO-;H}GpW@Xt#se%Y)4 z@do~RUyS{0?f1pjZ|c53+xoRM__Hl8w12Vnqcre>|4otb zXZ)|lhM)1`FXG8RUj5%n4=?=RlpTKXf4J7K((Vub%dbUVf}0cf7ychY?+f?4(EDG! z>Q|Zf=XnSHmiu?n_r=C<1mBO;d``J7R^?zC2 be>4B@yFU1f%>Uh=5P_s$zOmAM|L^|*Rgx^I literal 0 HcmV?d00001 diff --git a/build/bibleversesnwt-2023122800.zip b/build/bibleversesnwt-2023122800.zip new file mode 100644 index 0000000000000000000000000000000000000000..cece1e1d9827decb73d8e2c4289eb2a4a415086b GIT binary patch literal 13543 zcmbW8WmH|umbP&xxLa_7ySuwP!QI{63GVI=!9BRUOK?eWcejt6bl;oX$vHjx+hefD z;?FZ{tyQyX*89#aD*+4w1@Pkoui~Kc*TsK*!2w_c=$YzS7&;l+*&EthIXloODMA7O z%TQ?;svJZZI=Vmu0D|lR0|5N>CHpTBrf0MAuOQ^#K^D4J#y@FW4K@bv!h0w`Zf@3`2CHFYeMcNFXYgndHXIwX74Y=9I`m<2Z-KjSdezj_HaSvehR+FNEvMY=EAqVxzMjuP#@ol`I)II8NVj?!ijwkFpFv2K z6O-O@1iSI!Y~U3(?|3f;^MtCy_F1>lG+jaeJHujS|1(wpkQ4eAy7q5b`!gqq@c%Yt zf96DjxPywfhh?`G1ONckdjNpR81HfFWSirBvUp>7GF zx+tTmd{j54F0Ka%`iLPP)<1CsRsY#HKUNxuM-J}>^d=E)xsj^4YS zTp1;7i}ZZiGGmUkfV}f7d7w#wJ-AW(WEeJXr)t%9UJEyyn7yH8@7UDHkXS&+lHxmg z@R2Gh(q~UwOitxcc5@u853gtJFw9niu{4hF*>Qzjx_a2A zMvc1>+A*)dHLNDUH1)^h)Z^A!ZWiFh`?oDeDP>})!m@hg%`hr3MKZE)%XP0~4{u+Y zvrvKvE3_#(AbH}f*`1r!u$0X8H8pq$49dC!@A#r0NNABJt#1xyb0wOyv^t4?{+PoLkNL*MOc zE;@&9>F9giSh+cco0)W}x9%lKtK&*~9K5hxVX2SS*U`#7M}H1^_r&UdafH_To^(UT zUT?YMN))ovt3&x6QUuyptaX#=-2E{=isus}!qABh32@?lW!D$v?JBz|ASLUy%}u6w zo%+7OHZZS^3*76C4Uu{a2r!-pz$SX8=DuX?yYtB?$~2&GVZp_-yuDzmoUUkPLnV`d z@T&2s{_CF8&%46-K(CL0VAC)tv7TTcqMP&wRu3(tF-k(04{;5A+F;b`+gU=(Yc!b- zy>V?W-QS0TzsH#5ggsp=!* zRxF|2nZ=;x6H+V)JsBgP_=X6{UNto^CURLkTG&hEQfWHB7PMaj^Q23o1x^%!89XC~ z>H(~V+#@*UV~mCuQbMSeTf;cv~GW9>FuWX!Z{kjwTtqy0UBl4EIa z>zqE}m~^2y=VzB76G4mUTzP7I>&AA;VLk9q!Crq?HJ% zWy;fjYegb(a>Po47^O0$$k~KZO$uGu%1n*xD!<)q4CQANqPgaZ91o)mRV1fq^2#zx zUDY_ffO{QViN2oqmQzUF(gJ9KF5e~iL);jN%J3J>MI%i*eI4ZRH?BLp68RG@t-jYa z@}fP-WaQ#&G7VudeNu@7Vfs|oZ#sZ@M>*oW$0q^?4Seg3kko!Pom75RK<2ql=}Ovc?UH61P}|yFUn_f+D{d^__MWy8ryH*H3heoH zYz@sz|K5MUWemt0P1!lPV;$OfrReT4vldTx-`$8h1A_I`>u^3d7d0*wV(3HWgwTY&LND1cWi5s`p01>i#wgM(x#>mM~$C2Kh0@ywd9n-~+gfmL64cnNY!jGpFBs%edr37o0BRbR>b{uSho&}UMjGMN;&Hk~Fz)xmEOVz?1HRgV|Og-syD7%xEZl!_|td-jijmxev!n%XZM3YlA5OeZWP|(d z(2e(xLg;7RGN9z3A_&+mw*v|QpaTa0K>EMbE%t_XPNw>X|0-X$$^Tfsw5eFyFR{YE zj8`t?Nz!4U-KJWPNsJWaZ$|?3jBL|e2GQO4%|Q$$Y{3_fd3Pj?nu{Vmd>il4p*-b& zJTh~x$L^4btAhublt~Vv+k|kC5isP9>>`5TitD?K4+fIYluGugR>}+$OK`jgYh0>5aF$9bmO`K(WcnOD~-cM zFi84auBS>pH@QOj5RHE=w8+4S~6$p=?m-RU$F>SW;<4wP0HiM}F< zT6-$dOm9G6v|A&;JR*7(u@RmiWjt%085+^<1IhT95X2{CeHeaBJjN*w>2R^@<@d>B zMsuGAOXa12G7k?o;+wFskv9OSZS&<;r=de!itF_=WSwk<@9N$Y?%b>uC=el)gf}c2 z-}0H##+n=&dTI3Dnxd};Ab~U&qnk_w6Ec4{VZp6W#vnD|QnH9e_hG4A$L23`lMC#i zPmGO6Qnjfki~6E>%@!#|E9S~Xr;s`Dc_v_4pe2lY5rT{iS&&soD*w!uT_g~FKvL%@ zfoAC#ZtS6I>R`U5T)p8Pc%FvH3(9Z)v1gSP2t5+)M7y_oHkDKI_pUAO#Q{S$Q6^MDTgLQ_?a=y{RI_S^ep zV_!K3QbJbPnZOuEKTrVxIm=u+%m#&sn4d$YayG2fo7yB(Tbfn^S+f*Vp)eDLkW*3z zk|+RyjAtsJZ(NEGXc01*zltcK2gIc0Q;LGjzXU^qp z#c<0RUU^ap)rW^PzC365Y!17NG#Cq^eMo2Xya{IBE2oO$EHVPYuRO>Snb&X>hBGG& zD7hsWHrUe`sX|wnZN~>>B;)*{To`zJpTfaH5Z8n_!(#f*_?9+f zjbIyfCO$?;JcE}?qLT^9quZr0PF!ezEgfHUcL)l=V9DNH+Ni6U);>zeVBhJ;MAaH< zAn!0ZoTL%@q-~dyL9-C*gS4CI*?8SVp3*07Na!if2q1UL0T>LV6iQk@w@`Z*>~-(B zczWH^BYoUcrN(ork_|=iY2|^CUnCHP6U)8h8zYmwbzcn-jdr&kopE!0ou0>1T2z+ZxJm|=ObFZsO@r7P zDC@o3d4vm}!U!Frb1}flw35rqxnJ9cO^0okGOOybYU9~!cwh{=9Y55> zE5`Z8?dEWq!SM)j>y{N{d>kg7wBum5&!H?1RZrCq>e|{f2xK8zCPXZ@=p$QMKjYIl zd5y;_ugoCzu{HMTqXXYepLtSm%ShH`u@+D4Si=Es4CfM}##Q(+m{nytiI#j;7y^Tp z6Q$N;OZTBw26_4GdC8t z#pLJDedaoF`6p38FX^HGBM`ntm1nRIa8&UQ1 zQzj2d<@!}HHzpNdIpa(;TIr-iepf6L>C4WTBXR;}d7vw8mb`;X?l=`4#mqwMNf7ED zcw7nP6YvEC5ZlWX9FD?}A|F?3tdendt~$mxx4j_@>`<aEm$ak3H1Gxq84fHiX%R>U>+n8{S=y)Q=cblG82wJ;iR|QtwQ40hF zB3&PNX~zY^kk)mp)rA@w&Tl4Q^^tJVCbg+{+AC>Vb?ef~9LD*rrVB9zyo-s%po32nLr zSu|x{+=qsif^B7qu(|;PuVQ}7KuLNr596cs7Y>OE!lt$zH1+tw3!{z+P;3*HvZBtgi&lo^v$>tgX74`|A zL1elHOuwi7zPFYPqrc#SjYemOy@LXd{sG7+kzx^a%V54rz|sWvG?I0u_d@oTEE6hy^^9zZiZqb#nT*5ts9O!!JJH z3_!JmY8P#4R9E9_$B@-*gNc#Xcl?m(mGV>SzzI%fc*byf6b8>4&o5o72_9%MX-H%) z*}}DqXan|b8qj&Dvw|6tsf}ln?iKKKA|p}ReY_D^&Y$rC_3Of+?I~S_sF-@Cd!wsy zb5=_-Y=iXffe(Id z4a^3bkou!aLpV_s2t)sj(>;>4+HS7smw1aXS?-$;qe5PzYFDHZ2pdat%bIklMJa(O z^sCp7GT7t(SP@a8Y(iOm)x!E<+_?mzA+Sd{>7BhnrqmB9tD*8a`wT~GU)t}_36g0c zR>HBxEboM~vDg{ytUKeDWnePE!Eam#ahAo>L>a>zF&j{b!MVq(hSxkl&!~4g? zLdu-dNKvlYxz@!O)_fAfCv5ysEY&c$T%OK?%4=vaz;vMbf*+us2tO>hn7o$S~f zpjvCW(r&ti%iP|!zh*PE52oGWES_1}1-gn<0%93oZeNbg(Cnl^M^XmgV84?9RiBe% z!PQP_d|8BeYOn=ar;*t1*XAqR+Yk@1)*i^xG;=r-g$$!jQh(iCDtAb2GAovHB^&0L?*^!OBED zHC)@%x&4(gqcCN8Jgt-v; z4VuvWnY%w;d&vAd4--*u`W_tYq8sr?vy+L-6E%7I14FcxZ#F*4u4Wji;7c@2fqN|+ z6d#)5@_F1>Q@-mx?rKsbmqnOc3M2?@jn?586q`?7kc7rIfxoWYurej-o43`oWWS<< zNvtsynOS$d0RQ_)!qkwiVk9ylk@;pXq`&PYn7=OuKMWO9YpZ{)22RHjhClxPhocgx zupGHW3-39hGAcl<(?{}Av3^N|<+$6gR|?;uZ)P|evie}56?ua=L1$FV-P6I?T*e~KPZVoUGD#IX53ou=|;}M^a-c8h^aOMe) zflv-dY-l8(QHlF^isrS@VUSdnxM1t;F;bet(kcp$QmWLz4t}W6jar(-c-X~c(#48* zB9b!7u!AkNX+j<1^3%Bix?X4U+NS}eruZs}GAki$FuUpt4Tu#mt)m{=0IWdY8ooK@ zfg-@F(IbH_^o>$$UA|@vS;#hulsps74~fC?Z50qf)Jnh;To(p`?1&`YbdkEyWsNlU z-$o3&gy2^VkmG!5NDV-sRG!jn$G!uQaHyF?c+zh&t;fUE@k_MT9jB@^EeM+Z1VY~+ zqJE5epIJw@Q2PDuwVn-;Bz{H7@+%>c+9q;-jU_G7X+^`*H=8r(nzB|BX&WTYyG*o? znyxmW>xWW1`7w#3VK1G?%sD5@M%-v&j`1O)I{Yr}`ear){O}cXZ_?p|9y)mh( zKZ}?&rpTr7vikAU_YG9B35SO(Mohlihm-wX;Uc;BdEDc@R{8Z4k6w+-%{JCbT4bN5 z5nc0eH-oG}*vT+mt0LCpw?-3FwQWh`(0Ng*a{_7b3?+PsAjr#{1B2ZDo zdWja88-+fNA*QmI#&hT|`@Nt9*cKeT$h`414^|;IkY8Gq0(Ly#80V z`E0x3&vC0v5JtC?J1xDp_kFy?c4aBUACkfc$y!j*fcOKtb>u^WfE8$0oJkw~_d(R3 zF;*Id^OU{mIr4PUJ~a0cTNU3Cprt2&ARNorj60Wa=W1>y7CjVcoX;2?Q$|4}yOZ4bA0BZ)Z&cE%WpsX)$ z9zZ=inn+%#oJGn>fC&|wcY}#N(2^F>JGm)~feTyQM_m`aj``Tw1W=qb{Q(l;<}a%{ zHml|nEze@^v)0#7?5(Yn5W3}FJFeQL@h~4d{dW!8NS#~9Y`mqF?i>;T4ZL4(PtNA% zb}7gRJ=|ahA2_#icveBLf0&Dhq`iMC@o#d=bNY5%h#8Or5Tjo89((13I zXrFxQ_I{E*u3k}g@XAAOveUt27PJ4rHWrh{;z3fCue&UcTTB)0RpdgtJG(|S<HN{Q=W+G`09IB+lO>f1bud-*!+|KVask zw^G^`9RPss&*S@v{If-GX=+7nW>0OY`_rjMK8Y|~{e6Q?Pz_U9=0to|acEC7-9rz) zXFqlp;bAA`Fm(wu_LZN`i7Y1q6M5GFlmGGMc3E>MG6Q_THApql>rv}iyj3-dU@TWq zeHqWf9KNr6sXqyE-;(EG04Pa_BrBdFGT%N)ts#Nf6*FXXsl6JzD5ZeUo(a&$JJEzD zMqD&daO{>KjIbnGk{R#WA?=znrci9DcHz-TMmfno#h5@)F{sLbRuvEmF@?BV71#%F zN+!^|Bc)_t9l1)b1h31bDMiXd)`iJNVNismMuu_Tfb@%=8L}Y^*8sr~NjoN!(sX+7 zJ#DO%H+HT+gnPyoR^;LE6?xBau`VTCUszQ&JWD5xYz_X>1a^UiN5#3 z2@N_ej2tOd3fe_i3Hb-}XY4?VcF#>?k3DKh`W{w#w{D~&J=(E8M&0j`4n2?3;dPlb zSO(Q`8Kb8D(kkSxTC~&6%AlZ^t*3?ffk8eyrgEk`$thP5d zRom$D`^r(hruepvX_`F2Dt}m$HN1{)5xFRFPN%ZE!`1FCxgYcEyJa38ZaZG|BMMl% zjVOu);b-hn-U%qrZEJb>=v-qP}3s z(U*#t5y4Jp9F5Ta*8#@KG4FBY(kuFr2)8*CO7nU}=0tpHq5@Ip4o5h?zRbDWM1fXb z(Qb2tju)sr5!7C<#N(?n3x4yoXChdk;dmG2w54n97c-! zvyY^7nO`+>jTa?KUOTuN{b;tL&}EQG{KXfDf-Yeb^);a|Y=P89#_Q0CsZO#Rh4x`% zruk?o!j>H@N0S7Kj8UP7Q`gQ(NOg;5ND)S~7(3k1)pTn^k#Skg8_J7oo{7?}RG1o* z$Z-nb#WWOlHaxx@j=<9!BM0V07mkm|x@xHn{w1?YQ1?1AH@quzGccR>HqQ_76=H^;1#`gLSL6Y)rjlG={`brN| zcUBuc?P_!IIoEwaY0CKoJds{A=MB7Qoo#jr-7eqZ0&`F%9Ad~?NH0v|9f9@MuTMco zE)F`c9ST@_&oh_7Eypj+{9nMS-9Lh8v9)t*N8KjL7IzBQ%U1h)}@IO z!;oT0r5JUOJd|K7y0U2~n{jl$WmYVsR(%edivnoZ7UNZ~r>*g)h4Y^1;Xd7XJ`J?w zbv|r4xRP{#RLFT8d%>q2Lh18aEQ|U{nzb%B#8+_Nd4LCRA>x2UOB5?VT?7hrYGLTY z@GPAGpl^mx;+z}CQ~0z@x4<6A58d#v!DuNJD&iyGYB@1`(BBQ5g|R>zfDgDRf(XSL zk7DEYny$eN&#=+uJz|89@}&y9UF13Qo_Mq*ml>t5-DW?sr#SkQ?d1S-(LvMb^a zocg*7@tOoW2COyL9hHb$fY;yrj<5%E>MJyf(fmSICjtUzlclBRrN?dh@_hPZ!$4c~ zGWV{p=kT&|rsw!Q%5$c>)0Q3Xmm7FqJWe=(r`cLKRvuc4#~aYwmu)*gJoH@PjV6u0 zNI(v!y_S-rU33mh!~7*FUWOG&-Ep;vd(o939W+0`;nkBsj^_(b)6rN7`#y6ojfhs8)} zXH%Hb9%P4b*-d_6jY_ftl#yJKctl4w`8F^FO7#&DX~N6KwM7PG@1j!W1_d*^=MFq& zrNDH$?s0YRUFK5-nm0Q170g28Jd2Y<(``hnBQ~aab1&jm3;JjYn0xVJ30=_OgM0DP zoTjO^4=Q?6p8F*I>2fDJK(@Y~*Dh|XAvgqkPjLe$ecG9b2qVcm(woU`G}2)q{YpDD zpnXlmn^r?2Y=1L6G2r(pA}?LU)JV>_?%Q0l5O@9@)Atyz+4Nh-q^i$*`|+49ww`q7 zR|GYC9(}Yf(f;hj9PD8?E*frBaWU~~?OYb;(np>)Qg%7g*&Sc+Q+XP1CcZIQUT-c{ zG=Zbuo**HeMZFP z^qOCblAU;T0-rf3lY+cht@0wXoaI!>)bBJmIsW&H+H=SMdnK4v?53aXe2Abrm@|JOVgoKt07r1>btP z?CC(Uf6cf25d01-kp$P(#CQJc0w}~w_8OT0R+ixrF3DNZybOc4j20l-aW!ri6@}mY zM*H7_#gB4pBg`HL?@g>oerp9~`u{Dr{%VT+QEILHUTQ@sTUswO!@sO)=Tr%Z1BHM0 zLZ>BD@&g)Ch8bEaTrPSqYr1bimm?OOd*qV(;(kvsr2L%-6ei5Mm1E7`+5nJ&8ZZw7 z4a|XgTLF+_5=GI@GV<0Ap-uR#N^wasB=@5!t5M@ojy8>AS8vFm5haVbb-$#!tQD20 z;a&Lds15NHY+tSVj#WhM30dkF0h67C78&a%Qh%}3V@yIRYx3cyI+NK8s1x&wZ_dfp z>gZ*KjrmhLW>kbN+?;jZwuyX>C86q_Da3Jw5Z#}Mmu@bvQ0&21>(i73Y3NAIIOBSlrj?qP#i03wT z{X`dXRfqA}Td$^Schntv+(#ioO)kAf@#ERB4@iU@wToA9@hz2odrTZ#a%DZe&+Eg@ z{i(}PS<+4PLJbdQ-hEwzhDkU80>ApBc}qaigaPAGtccP@jRTEPf8SN8JUqc>th=(Y zVv?qOhY5Tr3iE`NJAM2CJT`b5Bj43K=KWi3%z;qQxXYW@$YgTI`F@<3B+F?k&yA%# zoDvv=YQp`Yn7UmLp8X}h?j`nO)Ri4DeOTsuifqh}_edIWU-LpnsDf&xLEzHODeMFg zIU%31b|oSFD$_udLv$ zpGX+aWJ0{G8Mp!Eqbr=8%@_Chdz6_NYj0@7{@tjcgREf?Q8|^S9Mnt~=b!;MX3Hv7 zOct4l&_uuO4L1r#!7Y@j%qyRkV)s6XGp@9o9E z-qPncY3_f#f&cCe{_9QrXg2=i^ZI#9zqcCydP`4#5C5g{`0W;cG#>v$l;0bJevMKG z^S8I~SCs!~6M75wqfO`^g8gnE{~GKO@wZ@qYbL+N`e7#jL#*Gu#$RKxqx?;*pI*Zo z{)hAU5BT5Ri(l~~7{B5F!^?Q%|G~%jH4lH+ihuIoetze^fQA0^-a68=By%U{FaefWpF`={`Ktu=oP V4f^IA{FqPh01|IkLDWC~`+ozXeN_Me literal 0 HcmV?d00001 diff --git a/build/bibleversesnwt-2023122801.zip b/build/bibleversesnwt-2023122801.zip new file mode 100644 index 0000000000000000000000000000000000000000..521ecce1ade1107d8536926c3df4d8305c1b5dd8 GIT binary patch literal 13601 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 literal 0 HcmV?d00001 diff --git a/classes/bible.php b/classes/bible.php index cd6c857..714e3f1 100644 --- a/classes/bible.php +++ b/classes/bible.php @@ -16,17 +16,17 @@ class bible { return $languages; } - private function wolhref($book,$chapter,$verse,$verse_end=0){ + private function wolhref($book,$chapter,$verse,$chapter_end,$verse_end=0){ $book = ($book > 0)?$book:1; $chapter = ($chapter >0)?$chapter:1; $verse = ($verse > 0)?$verse:1; $verse_end = ($verse_end > $verse)?$verse_end:$verse; if($this->lang == "nl"){ - return "https://wol.jw.org/nl/wol/b/r18/lp-o/nwtsty/{$book}/{$chapter}#v={$book}:{$chapter}:{$verse}-{$book}:{$chapter}:{$verse_end}"; + return "https://wol.jw.org/nl/wol/b/r18/lp-o/nwtsty/{$book}/{$chapter}#v={$book}:{$chapter}:{$verse}-{$book}:{$chapter_end}:{$verse_end}"; } else { // if $this->lang == 'en' - return "https://wol.jw.org/nl/wol/b/r1/lp-e/nwtsty/{$book}/{$chapter}#v={$book}:{$chapter}:{$verse}-{$book}:{$chapter}:{$verse_end}"; + return "https://wol.jw.org/nl/wol/b/r1/lp-e/nwtsty/{$book}/{$chapter}#v={$book}:{$chapter}:{$verse}-{$book}:{$chapter_end}:{$verse_end}"; } } @@ -185,21 +185,24 @@ class bible { $names = $this->books[$booknum]; foreach($names as $bookname){ - $re = "/([1-3]?\s?\b{$bookname})\s*?(\d*):(\d+)(?:\s*?[-,]\s*?(\d+))?/i"; + $re = "/(\b{$bookname})\h*?(\d*):(\d+)(?:\h*[-,]\h*(\d+)(?::(\d+))?)?/i"; // First check the presence of the bookname before - if( ($ix = stripos($content,$bookname)) !== false){ - $matches = []; + if ( ($ix = stripos($content,$bookname)) !== false ) { $lang = $this->lang; $content = preg_replace_callback($re,function ($m) use ($lang,$booknum, $bookname){ $book = strtolower(trim($m[1])); $ch = $m[2]; $verse = $m[3]; - $verse_to = (count($m)>4)?$m[4]:0; + $ch_end = (count($m)>5)?$m[4]:$ch; + $verse_to = (count($m)>5)?$m[5]:((count($m)>4)?$m[4]:0); if($book == $bookname){ // Check if name matches - $href = $this->wolhref($lang, $booknum, $ch, $verse, $verse_to); - $versedata = json_encode(["lang" => $lang, "book" => $booknum, "ch" => $ch, "verse" => $verse, "verse_end" => $verse_to, "wolhref" => $href]); + $href = $this->wolhref($booknum, $ch, $verse, $ch_end, $verse_to); + $versedata = json_encode([ "lang" => $lang, "book" => $booknum, + "ch" => $ch, "verse" => $verse, + "ch_end" => $ch_end, "verse_end" => $verse_to, + "wolhref" => $href]); return "".$m[0].""; } else { return $m[0]; diff --git a/classes/bibleservice.php b/classes/bibleservice.php index 5c6973a..622fd08 100644 --- a/classes/bibleservice.php +++ b/classes/bibleservice.php @@ -63,33 +63,72 @@ class bibleservice extends \external_api { * @return array */ public static function get_biblequote($lang,$book,$ch,$verse,$book_end = null,$ch_end = null,$verse_end = null) { - $range = $book .str_pad($ch,3,'0',STR_PAD_LEFT) . str_pad($verse,3,'0',STR_PAD_LEFT); + global $DB; + $TABLE = "filter_bibleversesnwt"; - if(!empty($book_end) && !empty($ch_end) && !empty($verse_end)) { - $range .= "-" . $book_end .str_pad($ch_end,3,'0',STR_PAD_LEFT) . str_pad($verse_end,3,'0',STR_PAD_LEFT); - } + $search = [ + "lang" => $lang, + "book" => $book, + "ch"=> $ch, + "verse" => $verse, + "book_end" => $book_end, + "ch_end" => $ch_end, + "verse_end" => $verse_end, + ]; - if ($lang == "nl") { - $url = "https://www.jw.org/nl/bibliotheek/bijbel/nwt/boeken/json/html/{$range}"; - } else { // if $lang == 'en' - $url = "https://www.jw.org/en/library/bible/nwt/books/json/html/{$range}"; - } + $cache = $DB->get_record($TABLE,$search); + $now = time(); - $ch = curl_init(); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_SSH_COMPRESSION, true); - $result = curl_exec($ch); - - $o = json_decode($result,true); - if(isset($o["ranges"]) && isset($o["ranges"][$range])) { - $r = $o["ranges"][$range]; - return [ - "heading" => $r["citation"], - "quote" => preg_replace('#(.*?)#i', '\1', $r["html"]), - ]; + if($cache && ($now - $cache->time_retrieved) < (24*3600)) { + // Return from cache. + $quote = json_decode($cache->content,true); + return $quote; } else { - throw new \moodle_exception("Unexpected JSON code",'','',null,$result); + + $range = $book .str_pad($ch,3,'0',STR_PAD_LEFT) . str_pad($verse,3,'0',STR_PAD_LEFT); + + if(!empty($book_end) && !empty($ch_end) && !empty($verse_end)) { + $range .= "-" . $book_end .str_pad($ch_end,3,'0',STR_PAD_LEFT) . str_pad($verse_end,3,'0',STR_PAD_LEFT); + } + + if ($lang == "nl") { + $url = "https://www.jw.org/nl/bibliotheek/bijbel/nwt/boeken/json/html/{$range}"; + } else { // if $lang == 'en' + $url = "https://www.jw.org/en/library/bible/nwt/books/json/html/{$range}"; + } + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_SSH_COMPRESSION, true); + $result = curl_exec($ch); + + $o = json_decode($result,true); + if(isset($o["ranges"]) && isset($o["ranges"][$range])) { + $r = $o["ranges"][$range]; + + $quote = [ + "heading" => $r["citation"], + "quote" => preg_replace('#(.*?)#i', '\1', $r["html"]), + ]; + + // Store bible verse into cache. + $quotejson = json_encode($quote); + if($cache) { + $cache->time_retrieved = time(); + $cache->content = $quotejson; + $DB->update_record($TABLE,$cache); + } else { + $cache = (object)$search; + $cache->time_retrieved = time(); + $cache->content = $quotejson; + $DB->insert_record($TABLE,$cache); + } + + return $quote; + } else { + throw new \moodle_exception("Unexpected JSON code",'','',null,$result); + } } } diff --git a/db/install.xml b/db/install.xml new file mode 100644 index 0000000..1df5d89 --- /dev/null +++ b/db/install.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + +
+
+
diff --git a/db/upgrade.php b/db/upgrade.php new file mode 100644 index 0000000..4799d1e --- /dev/null +++ b/db/upgrade.php @@ -0,0 +1,92 @@ +. +/** + * Database upgrade script + * @package filter_bibleversesnwt + * @copyright 2023 P.M. Kuipers + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +/** + * Hook to upgrade database upon plugin upgrade + * @param mixed $oldversion Version of plugin database before upgrade + * @return bool Upgrade success status + * + */ +function xmldb_filter_bibleversesnwt_upgrade($oldversion) { + global $DB; + $dbman = $DB->get_manager(); + + if ($oldversion < 2024030800) { + + // Define table filter_bibleversesnwt to be created. + $table = new xmldb_table('filter_bibleversesnwt'); + + // Adding fields to table filter_bibleversesnwt. + $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); + $table->add_field('book', XMLDB_TYPE_INTEGER, '5', null, null, null, null); + $table->add_field('ch', XMLDB_TYPE_INTEGER, '5', null, null, null, null); + $table->add_field('verse', XMLDB_TYPE_INTEGER, '5', null, null, null, null); + $table->add_field('book_end', XMLDB_TYPE_INTEGER, '5', null, null, null, null); + $table->add_field('ch_end', XMLDB_TYPE_INTEGER, '5', null, null, null, null); + $table->add_field('verse_end', XMLDB_TYPE_INTEGER, '5', null, null, null, null); + $table->add_field('content', XMLDB_TYPE_TEXT, null, null, null, null, null); + + // Adding keys to table filter_bibleversesnwt. + $table->add_key('primary', XMLDB_KEY_PRIMARY, ['id']); + + // Conditionally launch create table for filter_bibleversesnwt. + if (!$dbman->table_exists($table)) { + $dbman->create_table($table); + } + + // Bibleversesnwt savepoint reached. + upgrade_plugin_savepoint(true, 2024030800, 'filter', 'bibleversesnwt'); + } + if ($oldversion < 2024030801) { + + // Define field time_retrieved to be added to filter_bibleversesnwt. + $table = new xmldb_table('filter_bibleversesnwt'); + $field = new xmldb_field('time_retrieved', XMLDB_TYPE_INTEGER, '20', null, null, null, null, 'content'); + + // Conditionally launch add field time_retrieved. + if (!$dbman->field_exists($table, $field)) { + $dbman->add_field($table, $field); + } + + // Bibleversesnwt savepoint reached. + upgrade_plugin_savepoint(true, 2024030801, 'filter', 'bibleversesnwt'); + } + + + if ($oldversion < 2024030802) { + + // Define field lang to be added to filter_bibleversesnwt. + $table = new xmldb_table('filter_bibleversesnwt'); + $field = new xmldb_field('lang', XMLDB_TYPE_CHAR, '12', null, null, null, null, 'time_retrieved'); + + // Conditionally launch add field lang. + if (!$dbman->field_exists($table, $field)) { + $dbman->add_field($table, $field); + } + + // Bibleversesnwt savepoint reached. + upgrade_plugin_savepoint(true, 2024030802, 'filter', 'bibleversesnwt'); + } + + + return true; +} diff --git a/version.php b/version.php index c39a5f3..3161654 100644 --- a/version.php +++ b/version.php @@ -24,7 +24,7 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2023112000; +$plugin->version = 2024030802; $plugin->requires = 2021051700; // YYYYMMDDHH (This is the release version for Moodle 3.11) $plugin->component = 'filter_bibleversesnwt'; $plugin->maturity = MATURITY_STABLE;