@@ -85,6 +85,39 @@ export function analyzeReport(report, ISSUE_STATE) {
8585 let millisecondsInADay = 86400000 // 1000 * 60 * 60 * 24
8686
8787 const parser = new DOMParser ( )
88+ const fileReferences = { }
89+
90+ // Parse every document only once. Not every content item will have issues, but we need to parse each one anyway
91+ // so we can scan them for references to course files.
92+ Object . values ( report . contentItems ) . forEach ( ( contentItem ) => {
93+ if ( contentItem . body ) {
94+ let tempBody = parser . parseFromString ( contentItem . body , 'text/html' )
95+
96+ // Get all of the links to files in the content item.
97+ let links = tempBody . getElementsByTagName ( 'a' )
98+ const fileUrlPattern = / \/ f i l e s \/ ( \d + ) /
99+ for ( let i = 0 ; i < links . length ; i ++ ) {
100+ let link = links [ i ]
101+ let href = link . getAttribute ( 'href' )
102+ if ( href ) {
103+ let match = href . match ( fileUrlPattern )
104+ if ( match && match [ 1 ] ) {
105+ let fileId = match [ 1 ]
106+ if ( ! fileReferences [ fileId ] ) {
107+ fileReferences [ fileId ] = [ ]
108+ }
109+ fileReferences [ fileId ] . push ( {
110+ contentItemTitle : contentItem . title ,
111+ contentItemUrl : contentItem . url ,
112+ contentType : contentItem . contentType ,
113+ } )
114+ }
115+ }
116+ }
117+
118+ parsedDocuments [ contentItem . id ] = tempBody
119+ }
120+ } )
88121
89122 report . issues . forEach ( ( issue ) => {
90123
@@ -98,21 +131,9 @@ export function analyzeReport(report, ISSUE_STATE) {
98131 // Get the relevant content item
99132 let contentItemId = issue . contentItemId
100133
101- // We're quickly caching all of the parsed documents so we don't have to parse them for each issue.
102- let parsedDocument = null
103134 if ( parsedDocuments [ contentItemId ] ) {
104- parsedDocument = parsedDocuments [ contentItemId ]
105- }
106- else {
107- if ( report ?. contentItems [ contentItemId ] ?. body ) {
108- parsedDocuments [ contentItemId ] = parser . parseFromString ( report . contentItems [ contentItemId ] . body , 'text/html' )
109- parsedDocument = parsedDocuments [ contentItemId ]
110- }
111- }
112-
113- if ( parsedDocument ) {
114135 // In the initial scan, whatever comes back is saved to both the issue.xpath and issue.sourceHtml variables.
115- let element = Html . findElementWithIssue ( parsedDocument , issue )
136+ let element = Html . findElementWithIssue ( parsedDocuments [ contentItemId ] , issue )
116137 if ( element ) {
117138 issue . sourceHtml = Html . toString ( element )
118139 let elementClasses = element . getAttribute ( 'class' )
@@ -169,6 +190,10 @@ export function analyzeReport(report, ISSUE_STATE) {
169190 }
170191 } )
171192
193+ report . files . forEach ( ( file ) => {
194+ file . references = fileReferences [ parseInt ( file . lmsFileId ) ] || [ ]
195+ } )
196+
172197 let tempFilesReviewed = 0
173198 Object . values ( report . files ) . forEach ( ( file ) => {
174199 if ( file . reviewed ) {
@@ -182,6 +207,7 @@ export function analyzeReport(report, ISSUE_STATE) {
182207 tempReport . issues = activeIssues
183208 tempReport . scanCounts = scanCounts
184209 tempReport . scanRules = scanRules
210+ tempReport . files = { ...report . files }
185211 tempReport . contentItems = usedContentItems
186212 tempReport . sessionIssues = sessionIssues
187213 tempReport . filesReviewed = tempFilesReviewed
0 commit comments