diff --git a/amd/build/main.min.js b/amd/build/main.min.js
index e6cb349..dec2895 100644
--- a/amd/build/main.min.js
+++ b/amd/build/main.min.js
@@ -21,6 +21,6 @@
* @copyright Copyright (c) 2016 Open LMS / 2023 Anthology Inc. and its affiliates
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-define("filter_ally/main",["jquery","core/templates","core/str","filter_ally/ally","filter_ally/imagecover","filter_ally/util"],(function($,Templates,Strings,Ally,ImageCover,Util){return new function(){var self=this;self.canViewFeedback=!1,self.canDownload=!1,self.initialised=!1,self.params={};var getNodeByXpath=function(xpath){return window.document.createExpression(xpath).evaluate(window.document,XPathResult.FIRST_ORDERED_NODE_TYPE).singleNodeValue},renderTemplate=function(data,pathHash,targetEl){var dfd=$.Deferred();return $(targetEl).parents(".filter-ally-wrapper").length?(dfd.resolve(),dfd.promise()):(data.canviewfeedback=self.canViewFeedback,data.candownload=self.canDownload,data.html='',Templates.render("filter_ally/wrapper",data).done((function(result){0==$(targetEl).next().find('span[data-file-id="'+pathHash+'"]').length&&($(targetEl).after(result),$("#content-target-"+pathHash).after(targetEl),$("#content-target-"+pathHash).remove()),dfd.resolve()})),dfd.promise())},placeHoldSelector=function(selector,map){var dfd=$.Deferred(),c=0,length=$(selector).length;return length||dfd.resolve(),$(selector).each((function(){var url,type,regex,checkComplete=function(){c===length&&dfd.resolve()};"a"===$(this).prop("tagName").toLowerCase()?(url=$(this).attr("href"),type="a"):(url=$(this).attr("src"),type="img"),regex=url.indexOf("?")>-1?/pluginfile.php\/(\d*)\/(.*)(\?)/:/pluginfile.php\/(\d*)\/(.*)/;var pathHash,match=url.match(regex);if(match){var path=match[1]+"/"+match[2];path=decodeURIComponent(path),pathHash=map[path]}if(void 0===pathHash){var query=Util.getQuery(url);if(query.file)regex=/\/(\d*)\/(.*)/,(match=decodeURIComponent(query.file).match(regex))&&(path=match[1]+"/"+match[2],path=decodeURIComponent(path),pathHash=map[path])}if(void 0===pathHash)return c++,void checkComplete();renderTemplate({isimage:"img"===type,fileid:pathHash,url:url},pathHash,$(this)).done((function(){c++,checkComplete()}))})),dfd.promise()},placeHoldForumModule=function(forumFileMapping){var dfd=$.Deferred();return placeHoldSelector('.forumpost .attachedimages img[src*="pluginfile.php"], .forumpost .body-content-container a[href*="pluginfile.php"]',forumFileMapping).done((function(){dfd.resolve()})),dfd.promise()},placeHoldAssignModule=function(assignFileMapping){var dfd=$.Deferred();return Util.whenTrue((function(){return $('div[id*="assign_files_tree"] .ygtvitem').length>0}),10).done((function(){placeHoldSelector('div[id*="assign_files_tree"] a[href*="pluginfile.php"]',assignFileMapping),dfd.resolve()})),dfd.promise()},placeHoldFolderModule=function(folderFileMapping){var dfd=$.Deferred();return Util.whenTrue((function(){return $(".foldertree > .filemanager .ygtvitem").length>0}),10).done((function(){placeHoldSelector('.foldertree > .filemanager span:not(.filter-ally-wrapper) > a[href*="pluginfile.php"]',folderFileMapping).done((function(){dfd.resolve()}))})),dfd.promise()},placeHoldGlossaryModule=function(glossaryFileMapping){var dfd=$.Deferred();$(".entry .attachments > br").each((function(){var mainAnchor=$(this).prev('a[href*="pluginfile.php"]');mainAnchor.addClass("ally-glossary-attachment");var iconAnchor=$(mainAnchor).prev('a[href*="pluginfile.php"]');$(this).after('
');var container=$(this).next(".ally-glossary-attachment-row");container.append(iconAnchor),container.append(mainAnchor),$(this).remove()}));return placeHoldSelector(".entry .attachments .ally-glossary-attachment",glossaryFileMapping).done((function(){dfd.resolve()})),dfd.promise()},urlEncodeFilePath=function(filePath){var parts=filePath.split("/");for(var p in parts)parts[p]=encodeURIComponent(parts[p]);return parts.join("/")},placeHoldLessonGeneral=function(map,selectorPrefix){var dfd=$.Deferred();if(0===map.length)dfd.resolve();else for(var c in map){var path=urlEncodeFilePath(c);placeHoldSelector(selectorPrefix+'img[src*="'+path+'"], '+selectorPrefix+'a[href*="'+path+'"]',map).done((function(){dfd.resolve()}))}return dfd.promise()},placeHoldLessonModule=function(lessonFileMapping){var dfd=$.Deferred(),pageContentsMap=lessonFileMapping.page_contents,pageAnswersMap=lessonFileMapping.page_answers,pageResponsesMap=lessonFileMapping.page_responses;return function(pageContentsMap){return placeHoldLessonGeneral(pageContentsMap,"")}(pageContentsMap).then((function(){return function(pageAnswersMap){return placeHoldLessonGeneral(pageAnswersMap,".studentanswer table tr:nth-child(1) ")}(pageAnswersMap)})).then((function(){return function(pageResponsesMap){return placeHoldLessonGeneral(pageResponsesMap,".studentanswer table tr.lastrow ")}(pageResponsesMap)})).then((function(){dfd.resolve()})),dfd.promise()},placeHoldResourceModule=function(moduleFileMapping){var dfd=$.Deferred(),c=0,checkAllProcessed=function(){++c>=Object.keys(moduleFileMapping).length&&dfd.resolve()};for(var moduleId in moduleFileMapping){const pathHash=moduleFileMapping[moduleId].content;if($("body").hasClass("theme-snap")&&!$("body").hasClass("format-tiles"))var moduleEl=$("#module-"+moduleId+":not(.snap-native) .activityinstance .snap-asset-link a:first-of-type:not(.clickable-region)");else moduleEl=$("#module-"+moduleId+" .activity-instance a:first-of-type:not(.clickable-region,.editing_move)");moduleEl.each(((key,element)=>{if($(element).find(".filter-ally-wrapper").length>0)return void checkAllProcessed();let data={isimage:!1,fileid:pathHash,url:element.getAttribute("href")};renderTemplate(data,pathHash,element).done(checkAllProcessed)}))}return dfd.promise()},buildContentIdent=function(component,table,field,id){return[component,table,field,id].join(":")},annotateSections=function(sectionMapping){var dfd=$.Deferred();for(var s in sectionMapping){var sectionId=sectionMapping[s],ident=buildContentIdent("course","course_sections","summary",sectionId);$(["#"+s+' > .content div[class*="summarytext"] .no-overflow',"body.theme-snap #"+s+" > .content > .summary > div > .no-overflow"].join(",")).attr("data-ally-richcontent",ident)}return dfd.resolve(),dfd.promise()},annotateModuleIntros=function(introMapping,module,additionalSelectors){for(var i in introMapping){var annotation=introMapping[i],selectors=["body.path-mod-"+module+".cmid-"+i+" #intro > .no-overflow","li.activity.modtype_"+module+"#module-"+i+" .description .no-overflow > .no-overflow","li.snap-activity.modtype_"+module+"#module-"+i+" .contentafterlink > .no-overflow"];if(additionalSelectors)for(var a in additionalSelectors)selectors.push(additionalSelectors[a].replace("{{i}}",i));$(selectors.join(",")).attr("data-ally-richcontent",annotation)}},annotateLesson=function(mapping){var intros=mapping.intros;annotateModuleIntros(intros,"lesson",["li.snap-native.modtype_lesson#module-{{i}} .contentafterlink > .summary-text .no-overflow"]);var content=mapping.lesson_pages;for(var p in content)if("page-mod-lesson-edit"===document.body.id){var xpath='//a[@id="lesson-'+p+'"]//ancestor::table//tbody/tr/td/div[contains(@class, "no-overflow")]',annotation=content[p],node=getNodeByXpath(xpath);$(node).attr("data-ally-richcontent",annotation)}else{if(node=getNodeByXpath('//form[contains(@action, "continue.php")]//input[@name="pageid"]'))var pageId=$(node).val();else pageId=new URLSearchParams(window.location.search).get("pageid");if(pageId!=p)continue;annotation=content[p];$(["#page-mod-lesson-view #region-main .box.contents > .no-overflow","#page-mod-lesson-view #region-main form > fieldset > .fcontainer > .contents .no-overflow","li.snap-native.modtype_page#module-"+p+" .pagemod-content"].join(",")).attr("data-ally-richcontent",annotation)}Strings.get_strings([{key:"answer",component:"mod_lesson"},{key:"response",component:"mod_lesson"}]).then((function(strings){var answerLabel=strings[0],responseLabel=strings[1],answers=mapping.lesson_answers,processAnswerResponse=function(pageId,i,label,annotation){var nodes=function(xpath){var result=window.document.createExpression(xpath).evaluate(window.document,XPathResult.ANY_TYPE),nodes=[];do{var node=result.iterateNext();nodes.push(node)}while(node);return nodes}('//a[@id="lesson-'+pageId+'"]//ancestor::table//td/label[contains(text(),"'+label+" "+i+'")]/ancestor::tr/td[2]');for(var n in nodes){var node=nodes[n];$(node).attr("data-ally-richcontent",annotation)}};for(var a in answers){var annotation=answers[a],pageId=(tmpArr=a.split("_"))[0],ansId=tmpArr[1],anum=tmpArr[2];if("page-mod-lesson-edit"===document.body.id)processAnswerResponse(pageId,anum,answerLabel,annotation);else{if($('#page-mod-lesson-view label[for="id_answerid_'+ansId+'"]').attr("data-ally-richcontent",annotation),self.params.answerid&&self.params.answerid==ansId)$(".studentanswer tr:nth-of-type(1) > td div").attr("data-ally-richcontent",annotation);else{var answerWrapperId="answer_wrapper_"+ansId,answerEl=$("#id_answerid_"+ansId);if(1!=answerEl.data("annotated")){var contentEls=answerEl.nextAll();answerEl.parent("label").append(''),$("#"+answerWrapperId).append(contentEls)}answerEl.data("annotated",1)}$("#answer_wrapper_"+a).attr("data-ally-richcontent",annotation)}}var responses=mapping.lesson_answers_response;for(var r in responses){annotation=responses[r],pageId=(tmpArr=r.split("_"))[0];var tmpArr,respId=tmpArr[1],rnum=tmpArr[2];if("page-mod-lesson-edit"===document.body.id)processAnswerResponse(pageId,rnum,responseLabel,annotation);else if(self.params.answerid&&self.params.answerid==respId){var responseWrapperId="response_wrapper_"+respId;if(!$(".studentanswer tr.lastrow > td #"+responseWrapperId).length){contentEls=$(".studentanswer tr.lastrow > td > br").nextAll();$(".studentanswer tr.lastrow > td > br").after(''),$("#"+responseWrapperId).append(contentEls)}$("#"+responseWrapperId).attr("data-ally-richcontent",annotation)}}}))},annotateModules=function(moduleMapping){var dfd=$.Deferred();return void 0!==moduleMapping.mod_forum&&function(forumMapping){var intros=forumMapping.intros;annotateModuleIntros(intros,"forum");var discussions=forumMapping.posts;for(var d in discussions){var post="p"+d,annotation=discussions[d];$(["#page-mod-forum-discuss #"+post+" div.forumpost div.no-overflow"].join(",")).attr("data-ally-richcontent",annotation)}}(moduleMapping.mod_forum),void 0!==moduleMapping.mod_hsuforum&&function(forumMapping){var intros=forumMapping.intros;annotateModuleIntros(intros,"hsuforum",["#hsuforum-header .hsuforum_introduction > .no-overflow"]);var discussions=forumMapping.posts;for(var d in discussions){var annotation=discussions[d];$('article[id="p'+d+'"] div.posting').attr("data-ally-richcontent",annotation)}}(moduleMapping.mod_hsuforum),void 0!==moduleMapping.mod_glossary&&function(mapping){var intros=mapping.intros;annotateModuleIntros(intros,"glossary");var entries=mapping.entries;for(var e in entries){var annotation=entries[e],entryFooter=$('.entrylowersection .commands a[href*="id='+e+'"]'),entry=$(entryFooter).parents(".glossarypost").find(".entry .no-overflow");$(entry).attr("data-ally-richcontent",annotation)}}(moduleMapping.mod_glossary),void 0!==moduleMapping.mod_page&&function(mapping){var intros=mapping.intros;annotateModuleIntros(intros,"page",["li.snap-native.modtype_page#module-{{i}} .contentafterlink > .summary-text"]);var content=mapping.content;for(var c in content){var annotation=content[c];$(["#page-mod-page-view #region-main .box.generalbox > .no-overflow","li.snap-native.modtype_page#module-"+c+" .pagemod-content"].join(",")).attr("data-ally-richcontent",annotation)}}(moduleMapping.mod_page),void 0!==moduleMapping.mod_book&&function(mapping){var intros=mapping.intros;annotateModuleIntros(intros,"book",["li.snap-native.modtype_book#module-{{i}} .contentafterlink > .summary-text .no-overflow"]);var chapterId,content=mapping.chapters;if(self.params.chapterid)chapterId=self.params.chapterid;else{var urlParams=new URLSearchParams(window.location.search);chapterId=urlParams.get("chapterid")}$.each(content,(function(ch,annotation){chapterId==ch&&$(["#page-mod-book-view #region-main .box.generalbox.book_content > .no-overflow","li.snap-native.modtype_page#module-"+ch+" .pagemod-content"].join(",")).attr("data-ally-richcontent",annotation)}))}(moduleMapping.mod_book),void 0!==moduleMapping.mod_lesson&&annotateLesson(moduleMapping.mod_lesson),dfd.resolve(),dfd.promise()},annotateSnapCourseSummary=function(mapping){var dfd=$.Deferred(),snapFooterCourseSummary=$("#snap-course-footer-summary > div.no-overflow");if(snapFooterCourseSummary.length){var ident=buildContentIdent("course","course","summary",mapping.courseId);snapFooterCourseSummary.attr("data-ally-richcontent",ident)}return dfd.resolve(),dfd.promise()},annotateHtmlBlock=function(mapping){var dfd=$.Deferred(),items=mapping.block_html;for(var i in items){var ident=items[i],selector=["#inst"+i+".block_html > .card-body > .card-text > .no-overflow","#inst"+i+".block_html > .content > .no-overflow"].join(",");$(selector).attr("data-ally-richcontent",ident)}return dfd.resolve(),dfd.promise()},debounceApplyPlaceHolders=Util.debounce((function(){return function(){M.util.js_pending("filter_ally_applyPlaceHolders");var dfd=$.Deferred();if(void 0===ally_module_maps||void 0===ally_section_maps)return dfd.resolve(),dfd.promise();var tasks=[{mapVar:ally_module_maps.file_resources,method:placeHoldResourceModule},{mapVar:ally_module_maps.assignment_files,method:placeHoldAssignModule},{mapVar:ally_module_maps.folder_files,method:placeHoldFolderModule},{mapVar:ally_module_maps.forum_files,method:placeHoldForumModule},{mapVar:ally_module_maps.glossary_files,method:placeHoldGlossaryModule},{mapVar:ally_module_maps.lesson_files,method:placeHoldLessonModule},{mapVar:ally_section_maps,method:annotateSections},{mapVar:ally_annotation_maps,method:annotateModules},{mapVar:{courseId:self.courseId},method:annotateSnapCourseSummary},{mapVar:ally_annotation_maps,method:annotateHtmlBlock}];return $(document).ready((function(){var completed=0,onTaskComplete=function(){++completed===tasks.length&&(M.util.js_complete("filter_ally_applyPlaceHolders"),dfd.resolve())};for(var t in tasks){var task=tasks[t];Object.keys(task.mapVar).length>0?task.method(task.mapVar).done(onTaskComplete):onTaskComplete()}})),dfd.promise()}()}),1e3);this.initStageTwo=function(jwt,config){(self.canViewFeedback||self.canDownload)&&(debounceApplyPlaceHolders().done((function(){ImageCover.init(),Ally.init(jwt,config);try{var targetNode=$(".foldertree > .filemanager")[0];if(targetNode){new MutationObserver((function(mutationsList){mutationsList.filter((function(mutation){return"childList"===mutation.type})).forEach((function(){placeHoldFolderModule(ally_module_maps.folder_files)}))})).observe(targetNode,{attributes:!0,childList:!0,subtree:!0})}}catch(error){setInterval((function(){placeHoldFolderModule(ally_module_maps.folder_files)}),5e3)}self.initialised=!0})),$(document).ajaxComplete((function(){self.initialised&&debounceApplyPlaceHolders()})),$("body.theme-snap").length&&$(document).ajaxComplete((function(event,xhr,settings){settings.url.includes("ally.js")&&(setTimeout((function(){$(".ally-feedback.ally-active.ally-score-indicator-embedded span").each((function(){"none"==this.style.display&&(this.style.display="block","ally-scoreindicator-container"==this.getAttribute("class")&&(this.style.display="inline-block",this.children[0].style.display="inline-block"))}))}),5e3),$(document).off("ajaxComplete"))})))},this.init=function(jwt,config,canViewFeedback,canDownload,courseId,params){self.canViewFeedback=canViewFeedback,self.canDownload=canDownload,self.courseId=courseId,self.params=params;var pluginJSURL=function(path){return M.cfg.wwwroot+"/pluginfile.php/"+M.cfg.contextid+"/filter_ally/"+path},polyfills={};if(document.evaluate||(polyfills["filter_ally/wgxpath"]=pluginJSURL("vendorjs/wgxpath.install")),"undefined"==typeof URLSearchParams&&(polyfills["filter_ally/urlsearchparams"]=["https://cdnjs.cloudflare.com/ajax/libs/url-search-params/1.1.0/url-search-params.amd.js",pluginJSURL("vendorjs/url-search-params.amd")]),polyfills==={})self.initStageTwo(jwt,config);else{require.config({enforceDefine:!1,paths:polyfills});var requires=Object.keys(polyfills);require(requires,(function(){"undefined"==typeof URLSearchParams&&(window.URLSearchParams=arguments[1]),self.initStageTwo(jwt,config)}))}}}}));
+define("filter_ally/main",["jquery","core/templates","core/str","filter_ally/ally","filter_ally/imagecover","filter_ally/util"],(function($,Templates,Strings,Ally,ImageCover,Util){return new function(){var self=this;self.canViewFeedback=!1,self.canDownload=!1,self.initialised=!1,self.params={};var getNodeByXpath=function(xpath){return window.document.createExpression(xpath).evaluate(window.document,XPathResult.FIRST_ORDERED_NODE_TYPE).singleNodeValue},renderTemplate=function(data,pathHash,targetEl){var dfd=$.Deferred();return $(targetEl).parents(".filter-ally-wrapper").length?(dfd.resolve(),dfd.promise()):(data.canviewfeedback=self.canViewFeedback,data.candownload=self.canDownload,data.html='',Templates.render("filter_ally/wrapper",data).done((function(result){0==$(targetEl).next().find('span[data-file-id="'+pathHash+'"]').length&&($(targetEl).parent(".inplaceeditable").length&&(targetEl=$(targetEl).parent(".inplaceeditable")),$(targetEl).after(result),$("#content-target-"+pathHash).after(targetEl),$("#content-target-"+pathHash).remove()),dfd.resolve()})),dfd.promise())},placeHoldSelector=function(selector,map){var dfd=$.Deferred(),c=0,length=$(selector).length;return length||dfd.resolve(),$(selector).each((function(){var url,type,regex,checkComplete=function(){c===length&&dfd.resolve()};"a"===$(this).prop("tagName").toLowerCase()?(url=$(this).attr("href"),type="a"):(url=$(this).attr("src"),type="img"),regex=url.indexOf("?")>-1?/pluginfile.php\/(\d*)\/(.*)(\?)/:/pluginfile.php\/(\d*)\/(.*)/;var pathHash,match=url.match(regex);if(match){var path=match[1]+"/"+match[2];path=decodeURIComponent(path),pathHash=map[path]}if(void 0===pathHash){var query=Util.getQuery(url);if(query.file)regex=/\/(\d*)\/(.*)/,(match=decodeURIComponent(query.file).match(regex))&&(path=match[1]+"/"+match[2],path=decodeURIComponent(path),pathHash=map[path])}if(void 0===pathHash)return c++,void checkComplete();renderTemplate({isimage:"img"===type,fileid:pathHash,url:url},pathHash,$(this)).done((function(){c++,checkComplete()}))})),dfd.promise()},placeHoldForumModule=function(forumFileMapping){var dfd=$.Deferred();return placeHoldSelector('.forumpost .attachedimages img[src*="pluginfile.php"], .forumpost .body-content-container a[href*="pluginfile.php"]',forumFileMapping).done((function(){dfd.resolve()})),dfd.promise()},placeHoldAssignModule=function(assignFileMapping){var dfd=$.Deferred();return Util.whenTrue((function(){return $('div[id*="assign_files_tree"] .ygtvitem').length>0}),10).done((function(){placeHoldSelector('div[id*="assign_files_tree"] a[href*="pluginfile.php"]',assignFileMapping),dfd.resolve()})),dfd.promise()},placeHoldFolderModule=function(folderFileMapping){var dfd=$.Deferred();return Util.whenTrue((function(){return $(".foldertree > .filemanager .ygtvitem").length>0}),10).done((function(){placeHoldSelector('.foldertree > .filemanager span:not(.filter-ally-wrapper) > a[href*="pluginfile.php"]',folderFileMapping).done((function(){dfd.resolve()}))})),dfd.promise()},placeHoldGlossaryModule=function(glossaryFileMapping){var dfd=$.Deferred();$(".entry .attachments > br").each((function(){var mainAnchor=$(this).prev('a[href*="pluginfile.php"]');mainAnchor.addClass("ally-glossary-attachment");var iconAnchor=$(mainAnchor).prev('a[href*="pluginfile.php"]');$(this).after('');var container=$(this).next(".ally-glossary-attachment-row");container.append(iconAnchor),container.append(mainAnchor),$(this).remove()}));return placeHoldSelector(".entry .attachments .ally-glossary-attachment",glossaryFileMapping).done((function(){dfd.resolve()})),dfd.promise()},urlEncodeFilePath=function(filePath){var parts=filePath.split("/");for(var p in parts)parts[p]=encodeURIComponent(parts[p]);return parts.join("/")},placeHoldLessonGeneral=function(map,selectorPrefix){var dfd=$.Deferred();if(0===map.length)dfd.resolve();else for(var c in map){var path=urlEncodeFilePath(c);placeHoldSelector(selectorPrefix+'img[src*="'+path+'"], '+selectorPrefix+'a[href*="'+path+'"]',map).done((function(){dfd.resolve()}))}return dfd.promise()},placeHoldLessonModule=function(lessonFileMapping){var dfd=$.Deferred(),pageContentsMap=lessonFileMapping.page_contents,pageAnswersMap=lessonFileMapping.page_answers,pageResponsesMap=lessonFileMapping.page_responses;return function(pageContentsMap){return placeHoldLessonGeneral(pageContentsMap,"")}(pageContentsMap).then((function(){return function(pageAnswersMap){return placeHoldLessonGeneral(pageAnswersMap,".studentanswer table tr:nth-child(1) ")}(pageAnswersMap)})).then((function(){return function(pageResponsesMap){return placeHoldLessonGeneral(pageResponsesMap,".studentanswer table tr.lastrow ")}(pageResponsesMap)})).then((function(){dfd.resolve()})),dfd.promise()},placeHoldResourceModule=function(moduleFileMapping){var dfd=$.Deferred(),c=0,checkAllProcessed=function(){++c>=Object.keys(moduleFileMapping).length&&dfd.resolve()};for(var moduleId in moduleFileMapping){const pathHash=moduleFileMapping[moduleId].content;if($("body").hasClass("theme-snap")&&!$("body").hasClass("format-tiles"))var moduleEl=$("#module-"+moduleId+":not(.snap-native) .activityinstance .snap-asset-link a:first-of-type:not(.clickable-region)");else moduleEl=$("#module-"+moduleId+" .activity-instance a:first-of-type:not(.clickable-region,.editing_move)");moduleEl.each(((key,element)=>{if($(element).find(".filter-ally-wrapper").length>0)return void checkAllProcessed();let data={isimage:!1,fileid:pathHash,url:element.getAttribute("href")};renderTemplate(data,pathHash,element).done(checkAllProcessed)}))}return dfd.promise()},buildContentIdent=function(component,table,field,id){return[component,table,field,id].join(":")},annotateSections=function(sectionMapping){var dfd=$.Deferred();for(var s in sectionMapping){var sectionId=sectionMapping[s],ident=buildContentIdent("course","course_sections","summary",sectionId);$(["#"+s+' > .content div[class*="summarytext"] .no-overflow',"body.theme-snap #"+s+" > .content > .summary > div > .no-overflow"].join(",")).attr("data-ally-richcontent",ident)}return dfd.resolve(),dfd.promise()},annotateModuleIntros=function(introMapping,module,additionalSelectors){for(var i in introMapping){var annotation=introMapping[i],selectors=["body.path-mod-"+module+".cmid-"+i+" #intro > .no-overflow","li.activity.modtype_"+module+"#module-"+i+" .description .no-overflow > .no-overflow","li.snap-activity.modtype_"+module+"#module-"+i+" .contentafterlink > .no-overflow"];if(additionalSelectors)for(var a in additionalSelectors)selectors.push(additionalSelectors[a].replace("{{i}}",i));$(selectors.join(",")).attr("data-ally-richcontent",annotation)}},annotateLesson=function(mapping){var intros=mapping.intros;annotateModuleIntros(intros,"lesson",["li.snap-native.modtype_lesson#module-{{i}} .contentafterlink > .summary-text .no-overflow"]);var content=mapping.lesson_pages;for(var p in content)if("page-mod-lesson-edit"===document.body.id){var xpath='//a[@id="lesson-'+p+'"]//ancestor::table//tbody/tr/td/div[contains(@class, "no-overflow")]',annotation=content[p],node=getNodeByXpath(xpath);$(node).attr("data-ally-richcontent",annotation)}else{if(node=getNodeByXpath('//form[contains(@action, "continue.php")]//input[@name="pageid"]'))var pageId=$(node).val();else pageId=new URLSearchParams(window.location.search).get("pageid");if(pageId!=p)continue;annotation=content[p];$(["#page-mod-lesson-view #region-main .box.contents > .no-overflow","#page-mod-lesson-view #region-main form > fieldset > .fcontainer > .contents .no-overflow","li.snap-native.modtype_page#module-"+p+" .pagemod-content"].join(",")).attr("data-ally-richcontent",annotation)}Strings.get_strings([{key:"answer",component:"mod_lesson"},{key:"response",component:"mod_lesson"}]).then((function(strings){var answerLabel=strings[0],responseLabel=strings[1],answers=mapping.lesson_answers,processAnswerResponse=function(pageId,i,label,annotation){var nodes=function(xpath){var result=window.document.createExpression(xpath).evaluate(window.document,XPathResult.ANY_TYPE),nodes=[];do{var node=result.iterateNext();nodes.push(node)}while(node);return nodes}('//a[@id="lesson-'+pageId+'"]//ancestor::table//td/label[contains(text(),"'+label+" "+i+'")]/ancestor::tr/td[2]');for(var n in nodes){var node=nodes[n];$(node).attr("data-ally-richcontent",annotation)}};for(var a in answers){var annotation=answers[a],pageId=(tmpArr=a.split("_"))[0],ansId=tmpArr[1],anum=tmpArr[2];if("page-mod-lesson-edit"===document.body.id)processAnswerResponse(pageId,anum,answerLabel,annotation);else{if($('#page-mod-lesson-view label[for="id_answerid_'+ansId+'"]').attr("data-ally-richcontent",annotation),self.params.answerid&&self.params.answerid==ansId)$(".studentanswer tr:nth-of-type(1) > td div").attr("data-ally-richcontent",annotation);else{var answerWrapperId="answer_wrapper_"+ansId,answerEl=$("#id_answerid_"+ansId);if(1!=answerEl.data("annotated")){var contentEls=answerEl.nextAll();answerEl.parent("label").append(''),$("#"+answerWrapperId).append(contentEls)}answerEl.data("annotated",1)}$("#answer_wrapper_"+a).attr("data-ally-richcontent",annotation)}}var responses=mapping.lesson_answers_response;for(var r in responses){annotation=responses[r],pageId=(tmpArr=r.split("_"))[0];var tmpArr,respId=tmpArr[1],rnum=tmpArr[2];if("page-mod-lesson-edit"===document.body.id)processAnswerResponse(pageId,rnum,responseLabel,annotation);else if(self.params.answerid&&self.params.answerid==respId){var responseWrapperId="response_wrapper_"+respId;if(!$(".studentanswer tr.lastrow > td #"+responseWrapperId).length){contentEls=$(".studentanswer tr.lastrow > td > br").nextAll();$(".studentanswer tr.lastrow > td > br").after(''),$("#"+responseWrapperId).append(contentEls)}$("#"+responseWrapperId).attr("data-ally-richcontent",annotation)}}}))},annotateModules=function(moduleMapping){var dfd=$.Deferred();return void 0!==moduleMapping.mod_forum&&function(forumMapping){var intros=forumMapping.intros;annotateModuleIntros(intros,"forum");var discussions=forumMapping.posts;for(var d in discussions){var post="p"+d,annotation=discussions[d];$(["#page-mod-forum-discuss #"+post+" div.forumpost div.no-overflow"].join(",")).attr("data-ally-richcontent",annotation)}}(moduleMapping.mod_forum),void 0!==moduleMapping.mod_hsuforum&&function(forumMapping){var intros=forumMapping.intros;annotateModuleIntros(intros,"hsuforum",["#hsuforum-header .hsuforum_introduction > .no-overflow"]);var discussions=forumMapping.posts;for(var d in discussions){var annotation=discussions[d];$('article[id="p'+d+'"] div.posting').attr("data-ally-richcontent",annotation)}}(moduleMapping.mod_hsuforum),void 0!==moduleMapping.mod_glossary&&function(mapping){var intros=mapping.intros;annotateModuleIntros(intros,"glossary");var entries=mapping.entries;for(var e in entries){var annotation=entries[e],entryFooter=$('.entrylowersection .commands a[href*="id='+e+'"]'),entry=$(entryFooter).parents(".glossarypost").find(".entry .no-overflow");$(entry).attr("data-ally-richcontent",annotation)}}(moduleMapping.mod_glossary),void 0!==moduleMapping.mod_page&&function(mapping){var intros=mapping.intros;annotateModuleIntros(intros,"page",["li.snap-native.modtype_page#module-{{i}} .contentafterlink > .summary-text"]);var content=mapping.content;for(var c in content){var annotation=content[c];$(["#page-mod-page-view #region-main .box.generalbox > .no-overflow","li.snap-native.modtype_page#module-"+c+" .pagemod-content"].join(",")).attr("data-ally-richcontent",annotation)}}(moduleMapping.mod_page),void 0!==moduleMapping.mod_book&&function(mapping){var intros=mapping.intros;annotateModuleIntros(intros,"book",["li.snap-native.modtype_book#module-{{i}} .contentafterlink > .summary-text .no-overflow"]);var chapterId,content=mapping.chapters;if(self.params.chapterid)chapterId=self.params.chapterid;else{var urlParams=new URLSearchParams(window.location.search);chapterId=urlParams.get("chapterid")}$.each(content,(function(ch,annotation){chapterId==ch&&$(["#page-mod-book-view #region-main .box.generalbox.book_content > .no-overflow","li.snap-native.modtype_page#module-"+ch+" .pagemod-content"].join(",")).attr("data-ally-richcontent",annotation)}))}(moduleMapping.mod_book),void 0!==moduleMapping.mod_lesson&&annotateLesson(moduleMapping.mod_lesson),dfd.resolve(),dfd.promise()},annotateSnapCourseSummary=function(mapping){var dfd=$.Deferred(),snapFooterCourseSummary=$("#snap-course-footer-summary > div.no-overflow");if(snapFooterCourseSummary.length){var ident=buildContentIdent("course","course","summary",mapping.courseId);snapFooterCourseSummary.attr("data-ally-richcontent",ident)}return dfd.resolve(),dfd.promise()},annotateHtmlBlock=function(mapping){var dfd=$.Deferred(),items=mapping.block_html;for(var i in items){var ident=items[i],selector=["#inst"+i+".block_html > .card-body > .card-text > .no-overflow","#inst"+i+".block_html > .content > .no-overflow"].join(",");$(selector).attr("data-ally-richcontent",ident)}return dfd.resolve(),dfd.promise()},debounceApplyPlaceHolders=Util.debounce((function(){return function(){M.util.js_pending("filter_ally_applyPlaceHolders");var dfd=$.Deferred();if(void 0===ally_module_maps||void 0===ally_section_maps)return dfd.resolve(),dfd.promise();var tasks=[{mapVar:ally_module_maps.file_resources,method:placeHoldResourceModule},{mapVar:ally_module_maps.assignment_files,method:placeHoldAssignModule},{mapVar:ally_module_maps.folder_files,method:placeHoldFolderModule},{mapVar:ally_module_maps.forum_files,method:placeHoldForumModule},{mapVar:ally_module_maps.glossary_files,method:placeHoldGlossaryModule},{mapVar:ally_module_maps.lesson_files,method:placeHoldLessonModule},{mapVar:ally_section_maps,method:annotateSections},{mapVar:ally_annotation_maps,method:annotateModules},{mapVar:{courseId:self.courseId},method:annotateSnapCourseSummary},{mapVar:ally_annotation_maps,method:annotateHtmlBlock}];return $(document).ready((function(){var completed=0,onTaskComplete=function(){++completed===tasks.length&&(M.util.js_complete("filter_ally_applyPlaceHolders"),dfd.resolve())};for(var t in tasks){var task=tasks[t];Object.keys(task.mapVar).length>0?task.method(task.mapVar).done(onTaskComplete):onTaskComplete()}})),dfd.promise()}()}),1e3);this.initStageTwo=function(jwt,config){(self.canViewFeedback||self.canDownload)&&(debounceApplyPlaceHolders().done((function(){ImageCover.init(),Ally.init(jwt,config);try{var targetNode=$(".foldertree > .filemanager")[0];if(targetNode){new MutationObserver((function(mutationsList){mutationsList.filter((function(mutation){return"childList"===mutation.type})).forEach((function(){placeHoldFolderModule(ally_module_maps.folder_files)}))})).observe(targetNode,{attributes:!0,childList:!0,subtree:!0})}}catch(error){setInterval((function(){placeHoldFolderModule(ally_module_maps.folder_files)}),5e3)}self.initialised=!0})),$(document).ajaxComplete((function(){self.initialised&&debounceApplyPlaceHolders()})),$("body.theme-snap").length&&$(document).ajaxComplete((function(event,xhr,settings){settings.url.includes("ally.js")&&(setTimeout((function(){$(".ally-feedback.ally-active.ally-score-indicator-embedded span").each((function(){"none"==this.style.display&&(this.style.display="block","ally-scoreindicator-container"==this.getAttribute("class")&&(this.style.display="inline-block",this.children[0].style.display="inline-block"))}))}),5e3),$(document).off("ajaxComplete"))})))},this.init=function(jwt,config,canViewFeedback,canDownload,courseId,params){self.canViewFeedback=canViewFeedback,self.canDownload=canDownload,self.courseId=courseId,self.params=params;var pluginJSURL=function(path){return M.cfg.wwwroot+"/pluginfile.php/"+M.cfg.contextid+"/filter_ally/"+path},polyfills={};if(document.evaluate||(polyfills["filter_ally/wgxpath"]=pluginJSURL("vendorjs/wgxpath.install")),"undefined"==typeof URLSearchParams&&(polyfills["filter_ally/urlsearchparams"]=["https://cdnjs.cloudflare.com/ajax/libs/url-search-params/1.1.0/url-search-params.amd.js",pluginJSURL("vendorjs/url-search-params.amd")]),polyfills==={})self.initStageTwo(jwt,config);else{require.config({enforceDefine:!1,paths:polyfills});var requires=Object.keys(polyfills);require(requires,(function(){"undefined"==typeof URLSearchParams&&(window.URLSearchParams=arguments[1]),self.initStageTwo(jwt,config)}))}}}}));
//# sourceMappingURL=main.min.js.map
\ No newline at end of file
diff --git a/amd/build/main.min.js.map b/amd/build/main.min.js.map
index c95e5d1..45cc230 100644
--- a/amd/build/main.min.js.map
+++ b/amd/build/main.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"main.min.js","sources":["../src/main.js"],"sourcesContent":["/**\n * This file is part of Moodle - http://moodle.org/\n *\n * Moodle is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Moodle is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Moodle. If not, see .\n *\n * Main library.\n *\n * @package\n * @author Guy Thomas\n * @copyright Copyright (c) 2016 Open LMS / 2023 Anthology Inc. and its affiliates\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n\ndefine(['jquery', 'core/templates', 'core/str', 'filter_ally/ally', 'filter_ally/imagecover', 'filter_ally/util'],\nfunction($, Templates, Strings, Ally, ImageCover, Util) {\n return new function() {\n\n var self = this;\n\n self.canViewFeedback = false;\n self.canDownload = false;\n self.initialised = false;\n self.params = {};\n\n /**\n * Get nodes by xpath.\n * @param {string} xpath\n * @returns {Array}\n */\n var getNodesByXpath = function(xpath) {\n var expression = window.document.createExpression(xpath);\n var result = expression.evaluate(window.document, XPathResult.ANY_TYPE);\n var nodes = [];\n do {\n var node = result.iterateNext();\n nodes.push(node);\n } while (node);\n return nodes;\n };\n\n /**\n * Get single node by xpath.\n * @param {string} xpath\n * @returns {Node}\n */\n var getNodeByXpath = function(xpath) {\n var expression = window.document.createExpression(xpath);\n var result = expression.evaluate(window.document, XPathResult.FIRST_ORDERED_NODE_TYPE);\n return result.singleNodeValue;\n };\n\n /**\n * Render template and insert result in appropriate place.\n * @param {object} data\n * @param {string} pathHash\n * @param {node} targetEl\n * @return {promise}\n */\n var renderTemplate = function(data, pathHash, targetEl) {\n var dfd = $.Deferred();\n\n if ($(targetEl).parents('.filter-ally-wrapper').length) {\n // This has already been processed.\n dfd.resolve();\n return dfd.promise();\n }\n\n // Too expensive to do at module level - this is a course level capability.\n data.canviewfeedback = self.canViewFeedback;\n data.candownload = self.canDownload;\n data.html = '';\n\n Templates.render('filter_ally/wrapper', data)\n .done(function(result) {\n var presentWrappers = $(targetEl).next().find('span[data-file-id=\"'+ pathHash +'\"]');\n if (presentWrappers.length == 0) {\n $(targetEl).after(result);\n\n // We are inserting the module element next to the target as opposed to replacing the\n // target as we want to ensure any listeners attributed to the module element persist.\n $('#content-target-' + pathHash).after(targetEl);\n $('#content-target-' + pathHash).remove();\n }\n dfd.resolve();\n });\n\n return dfd.promise();\n };\n\n /**\n * Place holder items that are matched by selector.\n * @param {string} selector\n * @param {string} map\n * @return {promise}\n */\n var placeHoldSelector = function(selector, map) {\n var dfd = $.Deferred();\n\n var c = 0;\n\n var length = $(selector).length;\n if (!length) {\n dfd.resolve();\n }\n $(selector).each(function() {\n\n /**\n * Check that all selectors have been processed.\n */\n var checkComplete = function() {\n if (c === length) {\n dfd.resolve();\n }\n };\n var url,\n type;\n\n if ($(this).prop(\"tagName\").toLowerCase() === 'a') {\n url = $(this).attr('href');\n type = 'a';\n } else {\n url = $(this).attr('src');\n type = 'img';\n }\n var regex;\n if (url.indexOf('?') > -1) {\n regex = /pluginfile.php\\/(\\d*)\\/(.*)(\\?)/;\n } else {\n regex = /pluginfile.php\\/(\\d*)\\/(.*)/;\n }\n var match = url.match(regex);\n var pathHash;\n if (match) {\n var path = match[1] + '/' + match[2];\n path = decodeURIComponent(path);\n pathHash = map[path];\n }\n\n if (pathHash === undefined) {\n // Maybe 'slasharguments' setting is disabled for this host.\n // Let's see if the file URI is found in the URL query.\n var query = Util.getQuery(url);\n if (query.file) {\n var filePath = decodeURIComponent(query.file);\n regex = /\\/(\\d*)\\/(.*)/;\n\n match = filePath.match(regex);\n if (match) {\n path = match[1] + '/' + match[2];\n path = decodeURIComponent(path);\n pathHash = map[path];\n }\n }\n }\n\n // Pathhash was definitely not found :( .\n if (pathHash === undefined) {\n c++;\n checkComplete();\n return;\n }\n\n var data = {\n isimage: type === 'img',\n fileid: pathHash,\n url: url\n };\n\n renderTemplate(data, pathHash, $(this))\n .done(function(){\n c++;\n checkComplete();\n });\n });\n return dfd.promise();\n };\n\n /**\n * Add place holders for forum module image attachments (note, regular files are covered by php).\n * @param {array} forumFileMapping\n * @return {promise}\n */\n var placeHoldForumModule = function(forumFileMapping) {\n var dfd = $.Deferred();\n placeHoldSelector('.forumpost .attachedimages img[src*=\"pluginfile.php\"], ' +\n '.forumpost .body-content-container a[href*=\"pluginfile.php\"]', forumFileMapping)\n .done(function(){\n dfd.resolve();\n });\n return dfd.promise();\n };\n\n /**\n * Add place holders for assign module additional files.\n * @param {array} assignFileMapping\n * @return {promise}\n */\n var placeHoldAssignModule = function(assignFileMapping) {\n var dfd = $.Deferred();\n Util.whenTrue(function() {\n return $('div[id*=\"assign_files_tree\"] .ygtvitem').length > 0;\n }, 10)\n .done(function() {\n placeHoldSelector('div[id*=\"assign_files_tree\"] a[href*=\"pluginfile.php\"]', assignFileMapping);\n dfd.resolve();\n });\n return dfd.promise();\n };\n\n /**\n * Add place holders for folder module files.\n * @param {array} folderFileMapping\n * @return {promise}\n */\n var placeHoldFolderModule = function(folderFileMapping) {\n var dfd = $.Deferred();\n Util.whenTrue(function() {\n return $('.foldertree > .filemanager .ygtvitem').length > 0;\n }, 10)\n .done(function() {\n var unwrappedlinks = '.foldertree > .filemanager span:not(.filter-ally-wrapper) > a[href*=\"pluginfile.php\"]';\n placeHoldSelector(unwrappedlinks, folderFileMapping)\n .done(function() {\n dfd.resolve();\n });\n });\n return dfd.promise();\n };\n\n /**\n * Add place holders for glossary module files.\n * @param {array} glossaryFileMapping\n * @return {promise}\n */\n var placeHoldGlossaryModule = function(glossaryFileMapping) {\n var dfd = $.Deferred();\n\n // Glossary attachment markup is terrible!\n // The first thing we need to do is rewrite the glossary attachments so that they are encapsulated.\n $('.entry .attachments > br').each(function() {\n var mainAnchor = $(this).prev('a[href*=\"pluginfile.php\"]');\n mainAnchor.addClass('ally-glossary-attachment');\n var iconAnchor = $(mainAnchor).prev('a[href*=\"pluginfile.php\"]');\n $(this).after('');\n var container = $(this).next('.ally-glossary-attachment-row');\n container.append(iconAnchor);\n container.append(mainAnchor);\n $(this).remove();\n });\n\n var unwrappedlinks = '.entry .attachments .ally-glossary-attachment';\n placeHoldSelector(unwrappedlinks, glossaryFileMapping)\n .done(function() {\n dfd.resolve();\n });\n return dfd.promise();\n };\n\n /**\n * Encode a file path so that it can be used to find things by uri.\n * @param {string} filePath\n * @returns {string}\n */\n var urlEncodeFilePath = function(filePath) {\n var parts = filePath.split('/');\n for (var p in parts) {\n parts[p] = encodeURIComponent(parts[p]);\n }\n var encoded = parts.join('/');\n return encoded;\n };\n\n /**\n * General function for finding lesson component file elements and then add mapping.\n * @param {array} map\n * @param {string} selectorPrefix\n * @return promise\n */\n var placeHoldLessonGeneral = function(map, selectorPrefix) {\n var dfd = $.Deferred();\n if (map.length === 0) {\n dfd.resolve();\n } else {\n for (var c in map) {\n var path = urlEncodeFilePath(c);\n var sel = selectorPrefix + 'img[src*=\"' + path + '\"], ' + selectorPrefix + 'a[href*=\"' + path + '\"]';\n placeHoldSelector(sel, map).done(function() {\n dfd.resolve();\n });\n }\n }\n return dfd.promise();\n };\n\n /**\n * Placehold lesson page contents.\n * @param {array} pageContentsMap\n * @returns promise\n */\n var placeHoldLessonPageContents = function(pageContentsMap) {\n return placeHoldLessonGeneral(pageContentsMap, '');\n };\n\n /**\n * Placehold lesson answers.\n * @param {array} pageAnswersMap\n * @returns promise\n */\n var placeHoldLessonAnswersContent = function(pageAnswersMap) {\n return placeHoldLessonGeneral(pageAnswersMap,\n '.studentanswer table tr:nth-child(1) '); // Space at end of selector intended.\n };\n\n /**\n * Placehold lesson responses.\n * @param {array} pageResponsesMap\n * @returns promise\n */\n var placeHoldLessonResponsesContent = function(pageResponsesMap) {\n return placeHoldLessonGeneral(pageResponsesMap,\n '.studentanswer table tr.lastrow '); // Space at end of selector intended.\n };\n\n /**\n * Add place holders for lesson module files.\n * @param {array} lessonFileMapping\n * @return {promise}\n */\n var placeHoldLessonModule = function(lessonFileMapping) {\n var dfd = $.Deferred();\n\n var pageContentsMap = lessonFileMapping.page_contents;\n var pageAnswersMap = lessonFileMapping.page_answers;\n var pageResponsesMap = lessonFileMapping.page_responses;\n\n placeHoldLessonPageContents(pageContentsMap)\n .then(function() {\n return placeHoldLessonAnswersContent(pageAnswersMap);\n })\n .then(function() {\n return placeHoldLessonResponsesContent(pageResponsesMap);\n })\n .then(function() {\n dfd.resolve();\n });\n return dfd.promise();\n };\n\n /**\n * Add place holders for resource module.\n * @param {object} moduleFileMapping\n * @return {promise}\n */\n var placeHoldResourceModule = function(moduleFileMapping) {\n var dfd = $.Deferred();\n var c = 0;\n\n /**\n * Once all modules processed, resolve promise for this function.\n */\n var checkAllProcessed = function() {\n c++;\n // All resource modules have been dealt with.\n if (c >= Object.keys(moduleFileMapping).length) {\n dfd.resolve();\n }\n };\n for (var moduleId in moduleFileMapping) {\n const pathHash = moduleFileMapping[moduleId]['content'];\n if ($('body').hasClass('theme-snap') && !$('body').hasClass('format-tiles')) {\n var moduleEl = $('#module-' + moduleId + ':not(.snap-native) .activityinstance ' +\n '.snap-asset-link a:first-of-type:not(.clickable-region)');\n } else {\n var moduleEl = $('#module-' + moduleId + ' .activity-instance ' +\n 'a:first-of-type:not(.clickable-region,.editing_move)');\n }\n moduleEl.each((key, element) => {\n var processed = $(element).find('.filter-ally-wrapper');\n if (processed.length > 0) {\n checkAllProcessed(); // Already processed.\n return;\n }\n let data = {\n isimage: false,\n fileid: pathHash,\n url: element.getAttribute('href')\n };\n renderTemplate(data, pathHash, element).done(checkAllProcessed);\n });\n }\n return dfd.promise();\n };\n\n var buildContentIdent = function(component, table, field, id) {\n return [component, table, field, id].join(':');\n };\n\n /**\n * Add annotations to sections content.\n * @param {array} sectionMapping\n */\n var annotateSections = function(sectionMapping) {\n var dfd = $.Deferred();\n\n for (var s in sectionMapping) {\n var sectionId = sectionMapping[s];\n var ident = buildContentIdent('course', 'course_sections', 'summary', sectionId);\n\n var selectors = [\n '#' + s + ' > .content div[class*=\"summarytext\"] .no-overflow',\n 'body.theme-snap #' + s + ' > .content > .summary > div > .no-overflow' // Snap.\n ];\n $(selectors.join(',')).attr('data-ally-richcontent', ident);\n }\n\n dfd.resolve();\n return dfd.promise();\n };\n\n /**\n * Annotate module introductions.\n * @param {array} introMapping\n * @param {string} module\n * @param {array} additionalSelectors\n */\n var annotateModuleIntros = function(introMapping, module, additionalSelectors) {\n for (var i in introMapping) {\n var annotation = introMapping[i];\n var selectors = [\n 'body.path-mod-' + module + '.cmid-' + i + ' #intro > .no-overflow',\n // We need to be specific here for non course pages to skip this.\n 'li.activity.modtype_' + module + '#module-' + i + ' .description .no-overflow > .no-overflow',\n 'li.snap-activity.modtype_' + module + '#module-' + i + ' .contentafterlink > .no-overflow'\n ];\n if (additionalSelectors) {\n for (var a in additionalSelectors) {\n selectors.push(additionalSelectors[a].replace('{{i}}', i));\n }\n }\n $(selectors.join(',')).attr('data-ally-richcontent', annotation);\n }\n };\n\n /**\n * Add annotations to forums.\n * @param {array} forumMapping\n */\n var annotateForums = function(forumMapping) {\n // Annotate introductions.\n var intros = forumMapping['intros'];\n annotateModuleIntros(intros, 'forum');\n\n // Annotate discussions.\n var discussions = forumMapping['posts'];\n for (var d in discussions) {\n var post = 'p' + d;\n var annotation = discussions[d];\n var selectors = [\n \"#page-mod-forum-discuss #\" + post +\n ' div.forumpost div.no-overflow'\n ];\n $(selectors.join(',')).attr('data-ally-richcontent', annotation);\n }\n };\n\n /**\n * Add annotations to Open Forums.\n * @param {array} forumMapping\n */\n var annotateMRForums = function(forumMapping) {\n\n // Annotate introductions.\n var intros = forumMapping['intros'];\n annotateModuleIntros(intros, 'hsuforum', ['#hsuforum-header .hsuforum_introduction > .no-overflow']);\n\n var discussions = forumMapping['posts'];\n for (var d in discussions) {\n var annotation = discussions[d];\n var postSelector = 'article[id=\"p' + d + '\"] div.posting';\n $(postSelector).attr('data-ally-richcontent', annotation);\n }\n };\n\n /**\n * Add annotations to glossary.\n * @param {array} mapping\n */\n var annotateGlossary = function(mapping) {\n // Annotate introductions.\n var intros = mapping['intros'];\n annotateModuleIntros(intros, 'glossary');\n\n // Annotate entries.\n var entries = mapping['entries'];\n for (var e in entries) {\n var annotation = entries[e];\n var entryFooter = $('.entrylowersection .commands a[href*=\"id=' + e + '\"]');\n var entry = $(entryFooter).parents('.glossarypost').find('.entry .no-overflow');\n $(entry).attr('data-ally-richcontent', annotation);\n }\n };\n\n /**\n * Add annotations to page.\n * @param {array} mapping\n */\n var annotatePage = function(mapping) {\n var intros = mapping['intros'];\n annotateModuleIntros(intros, 'page', ['li.snap-native.modtype_page#module-{{i}} .contentafterlink > .summary-text']);\n\n // Annotate content.\n var content = mapping['content'];\n for (var c in content) {\n var annotation = content[c];\n var selectors = [\n '#page-mod-page-view #region-main .box.generalbox > .no-overflow',\n 'li.snap-native.modtype_page#module-' + c + ' .pagemod-content'\n ];\n $(selectors.join(',')).attr('data-ally-richcontent', annotation);\n }\n };\n\n /**\n * Add annotations to book.\n * @param {array} mapping\n */\n var annotateBook = function(mapping) {\n var intros = mapping['intros'];\n\n // For book, the only place the intro shows is on the course page when you select \"display description on course page\"\n // in the module settings.\n annotateModuleIntros(intros, 'book',\n ['li.snap-native.modtype_book#module-{{i}} .contentafterlink > .summary-text .no-overflow']);\n\n // Annotate content.\n var content = mapping['chapters'], chapterId;\n\n if (self.params.chapterid) {\n chapterId = self.params.chapterid;\n } else {\n var urlParams = new URLSearchParams(window.location.search);\n chapterId = urlParams.get('chapterid');\n }\n\n $.each(content, function(ch, annotation) {\n if (chapterId != ch) {\n return;\n }\n var selectors = [\n '#page-mod-book-view #region-main .box.generalbox.book_content > .no-overflow',\n 'li.snap-native.modtype_page#module-' + ch + ' .pagemod-content'\n ];\n $(selectors.join(',')).attr('data-ally-richcontent', annotation);\n });\n };\n\n /**\n * Add annotations to lesson.\n * @param {array} mapping\n */\n var annotateLesson = function(mapping) {\n var intros = mapping['intros'];\n\n // For lesson, the only place the intro shows is on the course page when you select \"display description on course page\"\n // in the module settings.\n annotateModuleIntros(intros, 'lesson',\n ['li.snap-native.modtype_lesson#module-{{i}} .contentafterlink > .summary-text .no-overflow']);\n\n // Annotate content.\n var content = mapping['lesson_pages'];\n for (var p in content) {\n if (document.body.id === \"page-mod-lesson-edit\") {\n var xpath = '//a[@id=\"lesson-' + p + '\"]//ancestor::table//tbody/tr/td/div[contains(@class, \"no-overflow\")]';\n var annotation = content[p];\n var node = getNodeByXpath(xpath);\n $(node).attr('data-ally-richcontent', annotation);\n } else {\n // Try get page from form.\n var node = getNodeByXpath('//form[contains(@action, \"continue.php\")]//input[@name=\"pageid\"]');\n if (node) {\n var pageId = $(node).val();\n } else {\n var urlParams = new URLSearchParams(window.location.search);\n var pageId = urlParams.get('pageid');\n }\n\n if (pageId != p) {\n continue;\n }\n var annotation = content[p];\n var selectors = [\n // Regular page.\n '#page-mod-lesson-view #region-main .box.contents > .no-overflow',\n // Question page.\n '#page-mod-lesson-view #region-main form > fieldset > .fcontainer > .contents .no-overflow',\n // Lesson page.\n 'li.snap-native.modtype_page#module-' + p + ' .pagemod-content'\n ];\n\n $(selectors.join(',')).attr('data-ally-richcontent', annotation);\n }\n }\n\n // Annotate answer answers.\n Strings.get_strings([\n {key:'answer', component:'mod_lesson'},\n {key:'response', component:'mod_lesson'}\n ]).then(function(strings) {\n var answerLabel = strings[0];\n var responseLabel = strings[1];\n var answers = mapping['lesson_answers'];\n\n var processAnswerResponse = function(pageId, i, label, annotation) {\n var xpath = '//a[@id=\"lesson-' + pageId + '\"]//ancestor::table' +\n '//td/label[contains(text(),\"' + label + ' ' + i + '\")]/ancestor::tr/td[2]';\n var nodes = getNodesByXpath(xpath);\n for (var n in nodes) {\n var node = nodes[n];\n $(node).attr('data-ally-richcontent', annotation);\n }\n };\n\n for (var a in answers) {\n // increment anum so that we can get the answer number.\n // Note, we can trust that this is correct because you can't order answers and the code in the lesson component\n // orders answers by id.\n var annotation = answers[a];\n\n var tmpArr = a.split('_');\n var pageId = tmpArr[0];\n var ansId = tmpArr[1];\n var anum = tmpArr[2];\n\n // Process answers when on lesson edit page.\n if (document.body.id === \"page-mod-lesson-edit\") {\n processAnswerResponse(pageId, anum, answerLabel, annotation);\n } else {\n // Wrap answers in labels.\n $('#page-mod-lesson-view label[for=\"id_answerid_' + ansId + '\"]').attr('data-ally-richcontent', annotation);\n\n if (self.params.answerid && self.params.answerid == ansId) {\n $('.studentanswer tr:nth-of-type(1) > td div').attr('data-ally-richcontent', annotation);\n } else {\n var answerWrapperId = 'answer_wrapper_' + ansId;\n var answerEl = $('#id_answerid_' + ansId);\n if (answerEl.data('annotated') != 1) {\n // We only want to wrap this once.\n var contentEls = answerEl.nextAll();\n answerEl.parent('label').append('');\n $('#' + answerWrapperId).append(contentEls);\n }\n answerEl.data('annotated', 1);\n }\n $('#answer_wrapper_' + a).attr('data-ally-richcontent', annotation);\n }\n }\n\n // Annotate answer responses.\n var responses = mapping['lesson_answers_response'];\n for (var r in responses) {\n var annotation = responses[r];\n\n var tmpArr = r.split('_');\n var pageId = tmpArr[0];\n var respId = tmpArr[1];\n var rnum = tmpArr[2];\n\n if (document.body.id === \"page-mod-lesson-edit\") {\n processAnswerResponse(pageId, rnum, responseLabel, annotation);\n } else if (self.params.answerid && self.params.answerid == respId) {\n // Just incase you are wondering, yes answer ids ^ are the same as response ids ;-).\n var responseWrapperId = 'response_wrapper_' + respId;\n if (!$('.studentanswer tr.lastrow > td #' + responseWrapperId).length) {\n // We only want to wrap this once, hence above ! length check.\n var contentEls = $('.studentanswer tr.lastrow > td > br').nextAll();\n $('.studentanswer tr.lastrow > td > br').after('');\n $('#' + responseWrapperId).append(contentEls);\n }\n\n $('#' + responseWrapperId).attr('data-ally-richcontent', annotation);\n }\n\n }\n });\n };\n\n /**\n * Annotate supported modules\n * @param {array} moduleMapping\n */\n var annotateModules = function(moduleMapping) {\n var dfd = $.Deferred();\n if (moduleMapping['mod_forum'] !== undefined) {\n annotateForums(moduleMapping['mod_forum']);\n }\n if (moduleMapping['mod_hsuforum'] !== undefined) {\n annotateMRForums(moduleMapping['mod_hsuforum']);\n }\n if (moduleMapping['mod_glossary'] !== undefined) {\n annotateGlossary(moduleMapping['mod_glossary']);\n }\n if (moduleMapping['mod_page'] !== undefined) {\n annotatePage(moduleMapping['mod_page']);\n }\n if (moduleMapping['mod_book'] !== undefined) {\n annotateBook(moduleMapping['mod_book']);\n }\n if (moduleMapping['mod_lesson'] !== undefined) {\n annotateLesson(moduleMapping['mod_lesson']);\n }\n dfd.resolve();\n return dfd.promise();\n };\n\n /**\n * Annotates course summary if found on footer.\n * @param {object} mapping\n */\n var annotateSnapCourseSummary = function(mapping) {\n var dfd = $.Deferred();\n var snapFooterCourseSummary = $('#snap-course-footer-summary > div.no-overflow');\n if (snapFooterCourseSummary.length) {\n var ident = buildContentIdent('course', 'course', 'summary', mapping.courseId);\n snapFooterCourseSummary.attr('data-ally-richcontent', ident);\n }\n dfd.resolve();\n return dfd.promise();\n };\n\n /**\n * Annotate html block.\n * @param {object} mapping\n */\n var annotateHtmlBlock = function(mapping) {\n var dfd = $.Deferred();\n\n var items = mapping.block_html;\n for (var i in items) {\n var ident = items[i];\n var selectors = [\n '#inst' + i + '.block_html > .card-body > .card-text > .no-overflow',\n '#inst' + i + '.block_html > .content > .no-overflow'\n ];\n var selector = selectors.join(',');\n $(selector).attr('data-ally-richcontent', ident);\n }\n dfd.resolve();\n return dfd.promise();\n };\n\n /**\n * Apply place holders and add annotations to content.\n * @return {promise}\n */\n var applyPlaceHolders = function() {\n M.util.js_pending('filter_ally_applyPlaceHolders');\n var dfd = $.Deferred();\n\n if (ally_module_maps === undefined || ally_section_maps === undefined) {\n dfd.resolve();\n return dfd.promise();\n }\n\n var tasks = [{\n mapVar: ally_module_maps.file_resources,\n method: placeHoldResourceModule\n },\n {\n mapVar: ally_module_maps.assignment_files,\n method: placeHoldAssignModule\n },\n {\n mapVar: ally_module_maps.folder_files,\n method: placeHoldFolderModule\n },\n {\n mapVar: ally_module_maps.forum_files,\n method: placeHoldForumModule\n },\n {\n mapVar: ally_module_maps.glossary_files,\n method: placeHoldGlossaryModule\n },\n {\n mapVar: ally_module_maps.lesson_files,\n method: placeHoldLessonModule\n },\n {\n mapVar: ally_section_maps,\n method: annotateSections\n },\n {\n mapVar: ally_annotation_maps,\n method: annotateModules\n },\n {\n mapVar: {courseId: self.courseId},\n method: annotateSnapCourseSummary\n },\n {\n mapVar: ally_annotation_maps,\n method: annotateHtmlBlock\n }];\n\n $(document).ready(function() {\n var completed = 0;\n /**\n * Run this once a task has resolved.\n */\n var onTaskComplete = function() {\n completed++;\n if (completed === tasks.length) {\n // All tasks completed.\n M.util.js_complete('filter_ally_applyPlaceHolders');\n dfd.resolve();\n }\n };\n\n for (var t in tasks) {\n var task = tasks[t];\n if (Object.keys(task.mapVar).length > 0) {\n task.method(task.mapVar)\n .done(onTaskComplete);\n } else {\n // Skipped this task because mappings are empty.\n onTaskComplete();\n }\n }\n });\n return dfd.promise();\n };\n\n var debounceApplyPlaceHolders = Util.debounce(function() {\n return applyPlaceHolders();\n }, 1000);\n\n /**\n * Initialise JS stage two.\n * @param {string} jwt\n * @param {object} config\n */\n this.initStageTwo = function(jwt, config) {\n if (self.canViewFeedback || self.canDownload) {\n debounceApplyPlaceHolders()\n .done(function() {\n ImageCover.init();\n Ally.init(jwt, config);\n try {\n var selector = $('.foldertree > .filemanager');\n var targetNode = selector[0];\n if (targetNode) {\n var observerConfig = { attributes: true, childList: true, subtree: true };\n var callback = function(mutationsList) {\n mutationsList.filter( function (mutation) {\n return mutation.type === 'childList';\n }).forEach( function () {\n placeHoldFolderModule(ally_module_maps.folder_files);\n });\n };\n var observer = new MutationObserver(callback);\n observer.observe(targetNode, observerConfig);\n }\n } catch (error) {\n setInterval(function() {\n placeHoldFolderModule(ally_module_maps.folder_files);\n }, 5000);\n }\n self.initialised = true;\n });\n\n $(document).ajaxComplete(function() {\n if (!self.initialised) {\n return;\n }\n debounceApplyPlaceHolders();\n });\n // For Snap theme.\n if ($('body.theme-snap').length) {\n $(document).ajaxComplete(function(event, xhr, settings) {\n // Search ally server response.\n if (settings.url.includes('ally.js')) {\n setTimeout(function() {\n // Show score icons that are hidden, see INT-18688.\n $('.ally-feedback.ally-active.ally-score-indicator-embedded span').each(function () {\n if (this.style.display == 'none') {\n this.style.display = 'block';\n if (this.getAttribute('class') == 'ally-scoreindicator-container') {\n this.style.display = 'inline-block';\n this.children[0].style.display = 'inline-block';\n }\n }\n });\n }, 5000);\n $(document).off('ajaxComplete');\n }\n });\n }\n }\n };\n\n /**\n * Init function.\n * @param {string} jwt\n * @param {object} config\n * @param {boolean} canViewFeedback\n * @param {boolean} canDownload\n * @param {int} courseId\n * @param {object} params\n */\n this.init = function(jwt, config, canViewFeedback, canDownload, courseId, params) {\n\n self.canViewFeedback = canViewFeedback;\n self.canDownload = canDownload;\n self.courseId = courseId;\n self.params = params;\n\n var pluginJSURL = function(path) {\n return M.cfg.wwwroot + \"/pluginfile.php/\" + M.cfg.contextid + \"/filter_ally/\" + path;\n };\n\n var polyfills = {};\n if (!document.evaluate) {\n polyfills['filter_ally/wgxpath'] = pluginJSURL(\"vendorjs/wgxpath.install\");\n }\n if (typeof(URLSearchParams) === 'undefined') {\n polyfills['filter_ally/urlsearchparams'] = [\n 'https://cdnjs.cloudflare.com/ajax/libs/url-search-params/1.1.0/url-search-params.amd.js',\n pluginJSURL('vendorjs/url-search-params.amd') // CDN fallback.\n ];\n }\n if (polyfills !== {}) {\n // Polyfill document.evaluate.\n require.config(\n {\n enforceDefine: false,\n paths: polyfills\n }\n );\n var requires = Object.keys(polyfills);\n\n require(requires, function() {\n if (typeof(URLSearchParams) === 'undefined') {\n window.URLSearchParams = arguments[1]; // second arg in require (which is URLSearchParams)\n }\n self.initStageTwo(jwt, config);\n });\n\n return;\n }\n self.initStageTwo(jwt, config);\n };\n };\n});\n"],"names":["define","$","Templates","Strings","Ally","ImageCover","Util","self","this","canViewFeedback","canDownload","initialised","params","getNodeByXpath","xpath","window","document","createExpression","evaluate","XPathResult","FIRST_ORDERED_NODE_TYPE","singleNodeValue","renderTemplate","data","pathHash","targetEl","dfd","Deferred","parents","length","resolve","promise","canviewfeedback","candownload","html","render","done","result","next","find","after","remove","placeHoldSelector","selector","map","c","each","url","type","regex","checkComplete","prop","toLowerCase","attr","indexOf","match","path","decodeURIComponent","undefined","query","getQuery","file","isimage","fileid","placeHoldForumModule","forumFileMapping","placeHoldAssignModule","assignFileMapping","whenTrue","placeHoldFolderModule","folderFileMapping","placeHoldGlossaryModule","glossaryFileMapping","mainAnchor","prev","addClass","iconAnchor","container","append","urlEncodeFilePath","filePath","parts","split","p","encodeURIComponent","join","placeHoldLessonGeneral","selectorPrefix","placeHoldLessonModule","lessonFileMapping","pageContentsMap","page_contents","pageAnswersMap","page_answers","pageResponsesMap","page_responses","placeHoldLessonPageContents","then","placeHoldLessonAnswersContent","placeHoldLessonResponsesContent","placeHoldResourceModule","moduleFileMapping","checkAllProcessed","Object","keys","moduleId","hasClass","moduleEl","key","element","getAttribute","buildContentIdent","component","table","field","id","annotateSections","sectionMapping","s","sectionId","ident","annotateModuleIntros","introMapping","module","additionalSelectors","i","annotation","selectors","a","push","replace","annotateLesson","mapping","intros","content","body","node","pageId","val","URLSearchParams","location","search","get","get_strings","strings","answerLabel","responseLabel","answers","processAnswerResponse","label","nodes","ANY_TYPE","iterateNext","getNodesByXpath","n","tmpArr","ansId","anum","answerid","answerWrapperId","answerEl","contentEls","nextAll","parent","responses","r","respId","rnum","responseWrapperId","annotateModules","moduleMapping","forumMapping","discussions","d","post","annotateForums","annotateMRForums","entries","e","entryFooter","entry","annotateGlossary","annotatePage","chapterId","chapterid","urlParams","ch","annotateBook","annotateSnapCourseSummary","snapFooterCourseSummary","courseId","annotateHtmlBlock","items","block_html","debounceApplyPlaceHolders","debounce","M","util","js_pending","ally_module_maps","ally_section_maps","tasks","mapVar","file_resources","method","assignment_files","folder_files","forum_files","glossary_files","lesson_files","ally_annotation_maps","ready","completed","onTaskComplete","js_complete","t","task","applyPlaceHolders","initStageTwo","jwt","config","init","targetNode","MutationObserver","mutationsList","filter","mutation","forEach","observe","attributes","childList","subtree","error","setInterval","ajaxComplete","event","xhr","settings","includes","setTimeout","style","display","children","off","pluginJSURL","cfg","wwwroot","contextid","polyfills","require","enforceDefine","paths","requires","arguments"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"main.min.js","sources":["../src/main.js"],"sourcesContent":["/**\n * This file is part of Moodle - http://moodle.org/\n *\n * Moodle is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Moodle is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Moodle. If not, see .\n *\n * Main library.\n *\n * @package\n * @author Guy Thomas\n * @copyright Copyright (c) 2016 Open LMS / 2023 Anthology Inc. and its affiliates\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n\ndefine(['jquery', 'core/templates', 'core/str', 'filter_ally/ally', 'filter_ally/imagecover', 'filter_ally/util'],\nfunction($, Templates, Strings, Ally, ImageCover, Util) {\n return new function() {\n\n var self = this;\n\n self.canViewFeedback = false;\n self.canDownload = false;\n self.initialised = false;\n self.params = {};\n\n /**\n * Get nodes by xpath.\n * @param {string} xpath\n * @returns {Array}\n */\n var getNodesByXpath = function(xpath) {\n var expression = window.document.createExpression(xpath);\n var result = expression.evaluate(window.document, XPathResult.ANY_TYPE);\n var nodes = [];\n do {\n var node = result.iterateNext();\n nodes.push(node);\n } while (node);\n return nodes;\n };\n\n /**\n * Get single node by xpath.\n * @param {string} xpath\n * @returns {Node}\n */\n var getNodeByXpath = function(xpath) {\n var expression = window.document.createExpression(xpath);\n var result = expression.evaluate(window.document, XPathResult.FIRST_ORDERED_NODE_TYPE);\n return result.singleNodeValue;\n };\n\n /**\n * Render template and insert result in appropriate place.\n * @param {object} data\n * @param {string} pathHash\n * @param {node} targetEl\n * @return {promise}\n */\n var renderTemplate = function(data, pathHash, targetEl) {\n var dfd = $.Deferred();\n\n if ($(targetEl).parents('.filter-ally-wrapper').length) {\n // This has already been processed.\n dfd.resolve();\n return dfd.promise();\n }\n\n // Too expensive to do at module level - this is a course level capability.\n data.canviewfeedback = self.canViewFeedback;\n data.candownload = self.canDownload;\n data.html = '';\n\n Templates.render('filter_ally/wrapper', data)\n .done(function(result) {\n var presentWrappers = $(targetEl).next().find('span[data-file-id=\"'+ pathHash +'\"]');\n if (presentWrappers.length == 0) {\n if ($(targetEl).parent('.inplaceeditable').length) {\n targetEl = $(targetEl).parent('.inplaceeditable');\n }\n\n $(targetEl).after(result);\n\n // We are inserting the module element next to the target as opposed to replacing the\n // target as we want to ensure any listeners attributed to the module element persist.\n $('#content-target-' + pathHash).after(targetEl);\n $('#content-target-' + pathHash).remove();\n }\n dfd.resolve();\n });\n\n return dfd.promise();\n };\n\n /**\n * Place holder items that are matched by selector.\n * @param {string} selector\n * @param {string} map\n * @return {promise}\n */\n var placeHoldSelector = function(selector, map) {\n var dfd = $.Deferred();\n\n var c = 0;\n\n var length = $(selector).length;\n if (!length) {\n dfd.resolve();\n }\n $(selector).each(function() {\n\n /**\n * Check that all selectors have been processed.\n */\n var checkComplete = function() {\n if (c === length) {\n dfd.resolve();\n }\n };\n var url,\n type;\n\n if ($(this).prop(\"tagName\").toLowerCase() === 'a') {\n url = $(this).attr('href');\n type = 'a';\n } else {\n url = $(this).attr('src');\n type = 'img';\n }\n var regex;\n if (url.indexOf('?') > -1) {\n regex = /pluginfile.php\\/(\\d*)\\/(.*)(\\?)/;\n } else {\n regex = /pluginfile.php\\/(\\d*)\\/(.*)/;\n }\n var match = url.match(regex);\n var pathHash;\n if (match) {\n var path = match[1] + '/' + match[2];\n path = decodeURIComponent(path);\n pathHash = map[path];\n }\n\n if (pathHash === undefined) {\n // Maybe 'slasharguments' setting is disabled for this host.\n // Let's see if the file URI is found in the URL query.\n var query = Util.getQuery(url);\n if (query.file) {\n var filePath = decodeURIComponent(query.file);\n regex = /\\/(\\d*)\\/(.*)/;\n\n match = filePath.match(regex);\n if (match) {\n path = match[1] + '/' + match[2];\n path = decodeURIComponent(path);\n pathHash = map[path];\n }\n }\n }\n\n // Pathhash was definitely not found :( .\n if (pathHash === undefined) {\n c++;\n checkComplete();\n return;\n }\n\n var data = {\n isimage: type === 'img',\n fileid: pathHash,\n url: url\n };\n\n renderTemplate(data, pathHash, $(this))\n .done(function(){\n c++;\n checkComplete();\n });\n });\n return dfd.promise();\n };\n\n /**\n * Add place holders for forum module image attachments (note, regular files are covered by php).\n * @param {array} forumFileMapping\n * @return {promise}\n */\n var placeHoldForumModule = function(forumFileMapping) {\n var dfd = $.Deferred();\n placeHoldSelector('.forumpost .attachedimages img[src*=\"pluginfile.php\"], ' +\n '.forumpost .body-content-container a[href*=\"pluginfile.php\"]', forumFileMapping)\n .done(function(){\n dfd.resolve();\n });\n return dfd.promise();\n };\n\n /**\n * Add place holders for assign module additional files.\n * @param {array} assignFileMapping\n * @return {promise}\n */\n var placeHoldAssignModule = function(assignFileMapping) {\n var dfd = $.Deferred();\n Util.whenTrue(function() {\n return $('div[id*=\"assign_files_tree\"] .ygtvitem').length > 0;\n }, 10)\n .done(function() {\n placeHoldSelector('div[id*=\"assign_files_tree\"] a[href*=\"pluginfile.php\"]', assignFileMapping);\n dfd.resolve();\n });\n return dfd.promise();\n };\n\n /**\n * Add place holders for folder module files.\n * @param {array} folderFileMapping\n * @return {promise}\n */\n var placeHoldFolderModule = function(folderFileMapping) {\n var dfd = $.Deferred();\n Util.whenTrue(function() {\n return $('.foldertree > .filemanager .ygtvitem').length > 0;\n }, 10)\n .done(function() {\n var unwrappedlinks = '.foldertree > .filemanager span:not(.filter-ally-wrapper) > a[href*=\"pluginfile.php\"]';\n placeHoldSelector(unwrappedlinks, folderFileMapping)\n .done(function() {\n dfd.resolve();\n });\n });\n return dfd.promise();\n };\n\n /**\n * Add place holders for glossary module files.\n * @param {array} glossaryFileMapping\n * @return {promise}\n */\n var placeHoldGlossaryModule = function(glossaryFileMapping) {\n var dfd = $.Deferred();\n\n // Glossary attachment markup is terrible!\n // The first thing we need to do is rewrite the glossary attachments so that they are encapsulated.\n $('.entry .attachments > br').each(function() {\n var mainAnchor = $(this).prev('a[href*=\"pluginfile.php\"]');\n mainAnchor.addClass('ally-glossary-attachment');\n var iconAnchor = $(mainAnchor).prev('a[href*=\"pluginfile.php\"]');\n $(this).after('');\n var container = $(this).next('.ally-glossary-attachment-row');\n container.append(iconAnchor);\n container.append(mainAnchor);\n $(this).remove();\n });\n\n var unwrappedlinks = '.entry .attachments .ally-glossary-attachment';\n placeHoldSelector(unwrappedlinks, glossaryFileMapping)\n .done(function() {\n dfd.resolve();\n });\n return dfd.promise();\n };\n\n /**\n * Encode a file path so that it can be used to find things by uri.\n * @param {string} filePath\n * @returns {string}\n */\n var urlEncodeFilePath = function(filePath) {\n var parts = filePath.split('/');\n for (var p in parts) {\n parts[p] = encodeURIComponent(parts[p]);\n }\n var encoded = parts.join('/');\n return encoded;\n };\n\n /**\n * General function for finding lesson component file elements and then add mapping.\n * @param {array} map\n * @param {string} selectorPrefix\n * @return promise\n */\n var placeHoldLessonGeneral = function(map, selectorPrefix) {\n var dfd = $.Deferred();\n if (map.length === 0) {\n dfd.resolve();\n } else {\n for (var c in map) {\n var path = urlEncodeFilePath(c);\n var sel = selectorPrefix + 'img[src*=\"' + path + '\"], ' + selectorPrefix + 'a[href*=\"' + path + '\"]';\n placeHoldSelector(sel, map).done(function() {\n dfd.resolve();\n });\n }\n }\n return dfd.promise();\n };\n\n /**\n * Placehold lesson page contents.\n * @param {array} pageContentsMap\n * @returns promise\n */\n var placeHoldLessonPageContents = function(pageContentsMap) {\n return placeHoldLessonGeneral(pageContentsMap, '');\n };\n\n /**\n * Placehold lesson answers.\n * @param {array} pageAnswersMap\n * @returns promise\n */\n var placeHoldLessonAnswersContent = function(pageAnswersMap) {\n return placeHoldLessonGeneral(pageAnswersMap,\n '.studentanswer table tr:nth-child(1) '); // Space at end of selector intended.\n };\n\n /**\n * Placehold lesson responses.\n * @param {array} pageResponsesMap\n * @returns promise\n */\n var placeHoldLessonResponsesContent = function(pageResponsesMap) {\n return placeHoldLessonGeneral(pageResponsesMap,\n '.studentanswer table tr.lastrow '); // Space at end of selector intended.\n };\n\n /**\n * Add place holders for lesson module files.\n * @param {array} lessonFileMapping\n * @return {promise}\n */\n var placeHoldLessonModule = function(lessonFileMapping) {\n var dfd = $.Deferred();\n\n var pageContentsMap = lessonFileMapping.page_contents;\n var pageAnswersMap = lessonFileMapping.page_answers;\n var pageResponsesMap = lessonFileMapping.page_responses;\n\n placeHoldLessonPageContents(pageContentsMap)\n .then(function() {\n return placeHoldLessonAnswersContent(pageAnswersMap);\n })\n .then(function() {\n return placeHoldLessonResponsesContent(pageResponsesMap);\n })\n .then(function() {\n dfd.resolve();\n });\n return dfd.promise();\n };\n\n /**\n * Add place holders for resource module.\n * @param {object} moduleFileMapping\n * @return {promise}\n */\n var placeHoldResourceModule = function(moduleFileMapping) {\n var dfd = $.Deferred();\n var c = 0;\n\n /**\n * Once all modules processed, resolve promise for this function.\n */\n var checkAllProcessed = function() {\n c++;\n // All resource modules have been dealt with.\n if (c >= Object.keys(moduleFileMapping).length) {\n dfd.resolve();\n }\n };\n for (var moduleId in moduleFileMapping) {\n const pathHash = moduleFileMapping[moduleId]['content'];\n if ($('body').hasClass('theme-snap') && !$('body').hasClass('format-tiles')) {\n var moduleEl = $('#module-' + moduleId + ':not(.snap-native) .activityinstance ' +\n '.snap-asset-link a:first-of-type:not(.clickable-region)');\n } else {\n var moduleEl = $('#module-' + moduleId + ' .activity-instance ' +\n 'a:first-of-type:not(.clickable-region,.editing_move)');\n }\n moduleEl.each((key, element) => {\n var processed = $(element).find('.filter-ally-wrapper');\n if (processed.length > 0) {\n checkAllProcessed(); // Already processed.\n return;\n }\n let data = {\n isimage: false,\n fileid: pathHash,\n url: element.getAttribute('href')\n };\n renderTemplate(data, pathHash, element).done(checkAllProcessed);\n });\n }\n return dfd.promise();\n };\n\n var buildContentIdent = function(component, table, field, id) {\n return [component, table, field, id].join(':');\n };\n\n /**\n * Add annotations to sections content.\n * @param {array} sectionMapping\n */\n var annotateSections = function(sectionMapping) {\n var dfd = $.Deferred();\n\n for (var s in sectionMapping) {\n var sectionId = sectionMapping[s];\n var ident = buildContentIdent('course', 'course_sections', 'summary', sectionId);\n\n var selectors = [\n '#' + s + ' > .content div[class*=\"summarytext\"] .no-overflow',\n 'body.theme-snap #' + s + ' > .content > .summary > div > .no-overflow' // Snap.\n ];\n $(selectors.join(',')).attr('data-ally-richcontent', ident);\n }\n\n dfd.resolve();\n return dfd.promise();\n };\n\n /**\n * Annotate module introductions.\n * @param {array} introMapping\n * @param {string} module\n * @param {array} additionalSelectors\n */\n var annotateModuleIntros = function(introMapping, module, additionalSelectors) {\n for (var i in introMapping) {\n var annotation = introMapping[i];\n var selectors = [\n 'body.path-mod-' + module + '.cmid-' + i + ' #intro > .no-overflow',\n // We need to be specific here for non course pages to skip this.\n 'li.activity.modtype_' + module + '#module-' + i + ' .description .no-overflow > .no-overflow',\n 'li.snap-activity.modtype_' + module + '#module-' + i + ' .contentafterlink > .no-overflow'\n ];\n if (additionalSelectors) {\n for (var a in additionalSelectors) {\n selectors.push(additionalSelectors[a].replace('{{i}}', i));\n }\n }\n $(selectors.join(',')).attr('data-ally-richcontent', annotation);\n }\n };\n\n /**\n * Add annotations to forums.\n * @param {array} forumMapping\n */\n var annotateForums = function(forumMapping) {\n // Annotate introductions.\n var intros = forumMapping['intros'];\n annotateModuleIntros(intros, 'forum');\n\n // Annotate discussions.\n var discussions = forumMapping['posts'];\n for (var d in discussions) {\n var post = 'p' + d;\n var annotation = discussions[d];\n var selectors = [\n \"#page-mod-forum-discuss #\" + post +\n ' div.forumpost div.no-overflow'\n ];\n $(selectors.join(',')).attr('data-ally-richcontent', annotation);\n }\n };\n\n /**\n * Add annotations to Open Forums.\n * @param {array} forumMapping\n */\n var annotateMRForums = function(forumMapping) {\n\n // Annotate introductions.\n var intros = forumMapping['intros'];\n annotateModuleIntros(intros, 'hsuforum', ['#hsuforum-header .hsuforum_introduction > .no-overflow']);\n\n var discussions = forumMapping['posts'];\n for (var d in discussions) {\n var annotation = discussions[d];\n var postSelector = 'article[id=\"p' + d + '\"] div.posting';\n $(postSelector).attr('data-ally-richcontent', annotation);\n }\n };\n\n /**\n * Add annotations to glossary.\n * @param {array} mapping\n */\n var annotateGlossary = function(mapping) {\n // Annotate introductions.\n var intros = mapping['intros'];\n annotateModuleIntros(intros, 'glossary');\n\n // Annotate entries.\n var entries = mapping['entries'];\n for (var e in entries) {\n var annotation = entries[e];\n var entryFooter = $('.entrylowersection .commands a[href*=\"id=' + e + '\"]');\n var entry = $(entryFooter).parents('.glossarypost').find('.entry .no-overflow');\n $(entry).attr('data-ally-richcontent', annotation);\n }\n };\n\n /**\n * Add annotations to page.\n * @param {array} mapping\n */\n var annotatePage = function(mapping) {\n var intros = mapping['intros'];\n annotateModuleIntros(intros, 'page', ['li.snap-native.modtype_page#module-{{i}} .contentafterlink > .summary-text']);\n\n // Annotate content.\n var content = mapping['content'];\n for (var c in content) {\n var annotation = content[c];\n var selectors = [\n '#page-mod-page-view #region-main .box.generalbox > .no-overflow',\n 'li.snap-native.modtype_page#module-' + c + ' .pagemod-content'\n ];\n $(selectors.join(',')).attr('data-ally-richcontent', annotation);\n }\n };\n\n /**\n * Add annotations to book.\n * @param {array} mapping\n */\n var annotateBook = function(mapping) {\n var intros = mapping['intros'];\n\n // For book, the only place the intro shows is on the course page when you select \"display description on course page\"\n // in the module settings.\n annotateModuleIntros(intros, 'book',\n ['li.snap-native.modtype_book#module-{{i}} .contentafterlink > .summary-text .no-overflow']);\n\n // Annotate content.\n var content = mapping['chapters'], chapterId;\n\n if (self.params.chapterid) {\n chapterId = self.params.chapterid;\n } else {\n var urlParams = new URLSearchParams(window.location.search);\n chapterId = urlParams.get('chapterid');\n }\n\n $.each(content, function(ch, annotation) {\n if (chapterId != ch) {\n return;\n }\n var selectors = [\n '#page-mod-book-view #region-main .box.generalbox.book_content > .no-overflow',\n 'li.snap-native.modtype_page#module-' + ch + ' .pagemod-content'\n ];\n $(selectors.join(',')).attr('data-ally-richcontent', annotation);\n });\n };\n\n /**\n * Add annotations to lesson.\n * @param {array} mapping\n */\n var annotateLesson = function(mapping) {\n var intros = mapping['intros'];\n\n // For lesson, the only place the intro shows is on the course page when you select \"display description on course page\"\n // in the module settings.\n annotateModuleIntros(intros, 'lesson',\n ['li.snap-native.modtype_lesson#module-{{i}} .contentafterlink > .summary-text .no-overflow']);\n\n // Annotate content.\n var content = mapping['lesson_pages'];\n for (var p in content) {\n if (document.body.id === \"page-mod-lesson-edit\") {\n var xpath = '//a[@id=\"lesson-' + p + '\"]//ancestor::table//tbody/tr/td/div[contains(@class, \"no-overflow\")]';\n var annotation = content[p];\n var node = getNodeByXpath(xpath);\n $(node).attr('data-ally-richcontent', annotation);\n } else {\n // Try get page from form.\n var node = getNodeByXpath('//form[contains(@action, \"continue.php\")]//input[@name=\"pageid\"]');\n if (node) {\n var pageId = $(node).val();\n } else {\n var urlParams = new URLSearchParams(window.location.search);\n var pageId = urlParams.get('pageid');\n }\n\n if (pageId != p) {\n continue;\n }\n var annotation = content[p];\n var selectors = [\n // Regular page.\n '#page-mod-lesson-view #region-main .box.contents > .no-overflow',\n // Question page.\n '#page-mod-lesson-view #region-main form > fieldset > .fcontainer > .contents .no-overflow',\n // Lesson page.\n 'li.snap-native.modtype_page#module-' + p + ' .pagemod-content'\n ];\n\n $(selectors.join(',')).attr('data-ally-richcontent', annotation);\n }\n }\n\n // Annotate answer answers.\n Strings.get_strings([\n {key:'answer', component:'mod_lesson'},\n {key:'response', component:'mod_lesson'}\n ]).then(function(strings) {\n var answerLabel = strings[0];\n var responseLabel = strings[1];\n var answers = mapping['lesson_answers'];\n\n var processAnswerResponse = function(pageId, i, label, annotation) {\n var xpath = '//a[@id=\"lesson-' + pageId + '\"]//ancestor::table' +\n '//td/label[contains(text(),\"' + label + ' ' + i + '\")]/ancestor::tr/td[2]';\n var nodes = getNodesByXpath(xpath);\n for (var n in nodes) {\n var node = nodes[n];\n $(node).attr('data-ally-richcontent', annotation);\n }\n };\n\n for (var a in answers) {\n // increment anum so that we can get the answer number.\n // Note, we can trust that this is correct because you can't order answers and the code in the lesson component\n // orders answers by id.\n var annotation = answers[a];\n\n var tmpArr = a.split('_');\n var pageId = tmpArr[0];\n var ansId = tmpArr[1];\n var anum = tmpArr[2];\n\n // Process answers when on lesson edit page.\n if (document.body.id === \"page-mod-lesson-edit\") {\n processAnswerResponse(pageId, anum, answerLabel, annotation);\n } else {\n // Wrap answers in labels.\n $('#page-mod-lesson-view label[for=\"id_answerid_' + ansId + '\"]').attr('data-ally-richcontent', annotation);\n\n if (self.params.answerid && self.params.answerid == ansId) {\n $('.studentanswer tr:nth-of-type(1) > td div').attr('data-ally-richcontent', annotation);\n } else {\n var answerWrapperId = 'answer_wrapper_' + ansId;\n var answerEl = $('#id_answerid_' + ansId);\n if (answerEl.data('annotated') != 1) {\n // We only want to wrap this once.\n var contentEls = answerEl.nextAll();\n answerEl.parent('label').append('');\n $('#' + answerWrapperId).append(contentEls);\n }\n answerEl.data('annotated', 1);\n }\n $('#answer_wrapper_' + a).attr('data-ally-richcontent', annotation);\n }\n }\n\n // Annotate answer responses.\n var responses = mapping['lesson_answers_response'];\n for (var r in responses) {\n var annotation = responses[r];\n\n var tmpArr = r.split('_');\n var pageId = tmpArr[0];\n var respId = tmpArr[1];\n var rnum = tmpArr[2];\n\n if (document.body.id === \"page-mod-lesson-edit\") {\n processAnswerResponse(pageId, rnum, responseLabel, annotation);\n } else if (self.params.answerid && self.params.answerid == respId) {\n // Just incase you are wondering, yes answer ids ^ are the same as response ids ;-).\n var responseWrapperId = 'response_wrapper_' + respId;\n if (!$('.studentanswer tr.lastrow > td #' + responseWrapperId).length) {\n // We only want to wrap this once, hence above ! length check.\n var contentEls = $('.studentanswer tr.lastrow > td > br').nextAll();\n $('.studentanswer tr.lastrow > td > br').after('');\n $('#' + responseWrapperId).append(contentEls);\n }\n\n $('#' + responseWrapperId).attr('data-ally-richcontent', annotation);\n }\n\n }\n });\n };\n\n /**\n * Annotate supported modules\n * @param {array} moduleMapping\n */\n var annotateModules = function(moduleMapping) {\n var dfd = $.Deferred();\n if (moduleMapping['mod_forum'] !== undefined) {\n annotateForums(moduleMapping['mod_forum']);\n }\n if (moduleMapping['mod_hsuforum'] !== undefined) {\n annotateMRForums(moduleMapping['mod_hsuforum']);\n }\n if (moduleMapping['mod_glossary'] !== undefined) {\n annotateGlossary(moduleMapping['mod_glossary']);\n }\n if (moduleMapping['mod_page'] !== undefined) {\n annotatePage(moduleMapping['mod_page']);\n }\n if (moduleMapping['mod_book'] !== undefined) {\n annotateBook(moduleMapping['mod_book']);\n }\n if (moduleMapping['mod_lesson'] !== undefined) {\n annotateLesson(moduleMapping['mod_lesson']);\n }\n dfd.resolve();\n return dfd.promise();\n };\n\n /**\n * Annotates course summary if found on footer.\n * @param {object} mapping\n */\n var annotateSnapCourseSummary = function(mapping) {\n var dfd = $.Deferred();\n var snapFooterCourseSummary = $('#snap-course-footer-summary > div.no-overflow');\n if (snapFooterCourseSummary.length) {\n var ident = buildContentIdent('course', 'course', 'summary', mapping.courseId);\n snapFooterCourseSummary.attr('data-ally-richcontent', ident);\n }\n dfd.resolve();\n return dfd.promise();\n };\n\n /**\n * Annotate html block.\n * @param {object} mapping\n */\n var annotateHtmlBlock = function(mapping) {\n var dfd = $.Deferred();\n\n var items = mapping.block_html;\n for (var i in items) {\n var ident = items[i];\n var selectors = [\n '#inst' + i + '.block_html > .card-body > .card-text > .no-overflow',\n '#inst' + i + '.block_html > .content > .no-overflow'\n ];\n var selector = selectors.join(',');\n $(selector).attr('data-ally-richcontent', ident);\n }\n dfd.resolve();\n return dfd.promise();\n };\n\n /**\n * Apply place holders and add annotations to content.\n * @return {promise}\n */\n var applyPlaceHolders = function() {\n M.util.js_pending('filter_ally_applyPlaceHolders');\n var dfd = $.Deferred();\n\n if (ally_module_maps === undefined || ally_section_maps === undefined) {\n dfd.resolve();\n return dfd.promise();\n }\n\n var tasks = [{\n mapVar: ally_module_maps.file_resources,\n method: placeHoldResourceModule\n },\n {\n mapVar: ally_module_maps.assignment_files,\n method: placeHoldAssignModule\n },\n {\n mapVar: ally_module_maps.folder_files,\n method: placeHoldFolderModule\n },\n {\n mapVar: ally_module_maps.forum_files,\n method: placeHoldForumModule\n },\n {\n mapVar: ally_module_maps.glossary_files,\n method: placeHoldGlossaryModule\n },\n {\n mapVar: ally_module_maps.lesson_files,\n method: placeHoldLessonModule\n },\n {\n mapVar: ally_section_maps,\n method: annotateSections\n },\n {\n mapVar: ally_annotation_maps,\n method: annotateModules\n },\n {\n mapVar: {courseId: self.courseId},\n method: annotateSnapCourseSummary\n },\n {\n mapVar: ally_annotation_maps,\n method: annotateHtmlBlock\n }];\n\n $(document).ready(function() {\n var completed = 0;\n /**\n * Run this once a task has resolved.\n */\n var onTaskComplete = function() {\n completed++;\n if (completed === tasks.length) {\n // All tasks completed.\n M.util.js_complete('filter_ally_applyPlaceHolders');\n dfd.resolve();\n }\n };\n\n for (var t in tasks) {\n var task = tasks[t];\n if (Object.keys(task.mapVar).length > 0) {\n task.method(task.mapVar)\n .done(onTaskComplete);\n } else {\n // Skipped this task because mappings are empty.\n onTaskComplete();\n }\n }\n });\n return dfd.promise();\n };\n\n var debounceApplyPlaceHolders = Util.debounce(function() {\n return applyPlaceHolders();\n }, 1000);\n\n /**\n * Initialise JS stage two.\n * @param {string} jwt\n * @param {object} config\n */\n this.initStageTwo = function(jwt, config) {\n if (self.canViewFeedback || self.canDownload) {\n debounceApplyPlaceHolders()\n .done(function() {\n ImageCover.init();\n Ally.init(jwt, config);\n try {\n var selector = $('.foldertree > .filemanager');\n var targetNode = selector[0];\n if (targetNode) {\n var observerConfig = { attributes: true, childList: true, subtree: true };\n var callback = function(mutationsList) {\n mutationsList.filter( function (mutation) {\n return mutation.type === 'childList';\n }).forEach( function () {\n placeHoldFolderModule(ally_module_maps.folder_files);\n });\n };\n var observer = new MutationObserver(callback);\n observer.observe(targetNode, observerConfig);\n }\n } catch (error) {\n setInterval(function() {\n placeHoldFolderModule(ally_module_maps.folder_files);\n }, 5000);\n }\n self.initialised = true;\n });\n\n $(document).ajaxComplete(function() {\n if (!self.initialised) {\n return;\n }\n debounceApplyPlaceHolders();\n });\n // For Snap theme.\n if ($('body.theme-snap').length) {\n $(document).ajaxComplete(function(event, xhr, settings) {\n // Search ally server response.\n if (settings.url.includes('ally.js')) {\n setTimeout(function() {\n // Show score icons that are hidden, see INT-18688.\n $('.ally-feedback.ally-active.ally-score-indicator-embedded span').each(function () {\n if (this.style.display == 'none') {\n this.style.display = 'block';\n if (this.getAttribute('class') == 'ally-scoreindicator-container') {\n this.style.display = 'inline-block';\n this.children[0].style.display = 'inline-block';\n }\n }\n });\n }, 5000);\n $(document).off('ajaxComplete');\n }\n });\n }\n }\n };\n\n /**\n * Init function.\n * @param {string} jwt\n * @param {object} config\n * @param {boolean} canViewFeedback\n * @param {boolean} canDownload\n * @param {int} courseId\n * @param {object} params\n */\n this.init = function(jwt, config, canViewFeedback, canDownload, courseId, params) {\n\n self.canViewFeedback = canViewFeedback;\n self.canDownload = canDownload;\n self.courseId = courseId;\n self.params = params;\n\n var pluginJSURL = function(path) {\n return M.cfg.wwwroot + \"/pluginfile.php/\" + M.cfg.contextid + \"/filter_ally/\" + path;\n };\n\n var polyfills = {};\n if (!document.evaluate) {\n polyfills['filter_ally/wgxpath'] = pluginJSURL(\"vendorjs/wgxpath.install\");\n }\n if (typeof(URLSearchParams) === 'undefined') {\n polyfills['filter_ally/urlsearchparams'] = [\n 'https://cdnjs.cloudflare.com/ajax/libs/url-search-params/1.1.0/url-search-params.amd.js',\n pluginJSURL('vendorjs/url-search-params.amd') // CDN fallback.\n ];\n }\n if (polyfills !== {}) {\n // Polyfill document.evaluate.\n require.config(\n {\n enforceDefine: false,\n paths: polyfills\n }\n );\n var requires = Object.keys(polyfills);\n\n require(requires, function() {\n if (typeof(URLSearchParams) === 'undefined') {\n window.URLSearchParams = arguments[1]; // second arg in require (which is URLSearchParams)\n }\n self.initStageTwo(jwt, config);\n });\n\n return;\n }\n self.initStageTwo(jwt, config);\n };\n };\n});\n"],"names":["define","$","Templates","Strings","Ally","ImageCover","Util","self","this","canViewFeedback","canDownload","initialised","params","getNodeByXpath","xpath","window","document","createExpression","evaluate","XPathResult","FIRST_ORDERED_NODE_TYPE","singleNodeValue","renderTemplate","data","pathHash","targetEl","dfd","Deferred","parents","length","resolve","promise","canviewfeedback","candownload","html","render","done","result","next","find","parent","after","remove","placeHoldSelector","selector","map","c","each","url","type","regex","checkComplete","prop","toLowerCase","attr","indexOf","match","path","decodeURIComponent","undefined","query","getQuery","file","isimage","fileid","placeHoldForumModule","forumFileMapping","placeHoldAssignModule","assignFileMapping","whenTrue","placeHoldFolderModule","folderFileMapping","placeHoldGlossaryModule","glossaryFileMapping","mainAnchor","prev","addClass","iconAnchor","container","append","urlEncodeFilePath","filePath","parts","split","p","encodeURIComponent","join","placeHoldLessonGeneral","selectorPrefix","placeHoldLessonModule","lessonFileMapping","pageContentsMap","page_contents","pageAnswersMap","page_answers","pageResponsesMap","page_responses","placeHoldLessonPageContents","then","placeHoldLessonAnswersContent","placeHoldLessonResponsesContent","placeHoldResourceModule","moduleFileMapping","checkAllProcessed","Object","keys","moduleId","hasClass","moduleEl","key","element","getAttribute","buildContentIdent","component","table","field","id","annotateSections","sectionMapping","s","sectionId","ident","annotateModuleIntros","introMapping","module","additionalSelectors","i","annotation","selectors","a","push","replace","annotateLesson","mapping","intros","content","body","node","pageId","val","URLSearchParams","location","search","get","get_strings","strings","answerLabel","responseLabel","answers","processAnswerResponse","label","nodes","ANY_TYPE","iterateNext","getNodesByXpath","n","tmpArr","ansId","anum","answerid","answerWrapperId","answerEl","contentEls","nextAll","responses","r","respId","rnum","responseWrapperId","annotateModules","moduleMapping","forumMapping","discussions","d","post","annotateForums","annotateMRForums","entries","e","entryFooter","entry","annotateGlossary","annotatePage","chapterId","chapterid","urlParams","ch","annotateBook","annotateSnapCourseSummary","snapFooterCourseSummary","courseId","annotateHtmlBlock","items","block_html","debounceApplyPlaceHolders","debounce","M","util","js_pending","ally_module_maps","ally_section_maps","tasks","mapVar","file_resources","method","assignment_files","folder_files","forum_files","glossary_files","lesson_files","ally_annotation_maps","ready","completed","onTaskComplete","js_complete","t","task","applyPlaceHolders","initStageTwo","jwt","config","init","targetNode","MutationObserver","mutationsList","filter","mutation","forEach","observe","attributes","childList","subtree","error","setInterval","ajaxComplete","event","xhr","settings","includes","setTimeout","style","display","children","off","pluginJSURL","cfg","wwwroot","contextid","polyfills","require","enforceDefine","paths","requires","arguments"],"mappings":"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"}
\ No newline at end of file
diff --git a/amd/src/main.js b/amd/src/main.js
index 0a991fc..53cb888 100644
--- a/amd/src/main.js
+++ b/amd/src/main.js
@@ -86,6 +86,10 @@ function($, Templates, Strings, Ally, ImageCover, Util) {
.done(function(result) {
var presentWrappers = $(targetEl).next().find('span[data-file-id="'+ pathHash +'"]');
if (presentWrappers.length == 0) {
+ if ($(targetEl).parent('.inplaceeditable').length) {
+ targetEl = $(targetEl).parent('.inplaceeditable');
+ }
+
$(targetEl).after(result);
// We are inserting the module element next to the target as opposed to replacing the