53 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			53 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | /** | ||
|  |  * @dgProcessor renderLinkInfo | ||
|  |  * @description For each doc that has one of the specified docTypes, | ||
|  |  * add HTML comments that describe the links to and from the doc. | ||
|  |  */ | ||
|  | module.exports = function renderLinkInfo(extractLinks) { | ||
|  |   return { | ||
|  |     docTypes: [], | ||
|  |     $runBefore: ['convertToJsonProcessor'], | ||
|  |     $runAfter: ['fixInternalDocumentLinks'], | ||
|  |     $process(docs) { | ||
|  |       const toLinks = {}; | ||
|  |       const fromLinks = {}; | ||
|  |       const docsToCheck = docs.filter(doc => this.docTypes.indexOf(doc.docType) !==  -1); | ||
|  | 
 | ||
|  |       // Extract and store all links found in each doc in hashes
 | ||
|  |       docsToCheck.forEach(doc => { | ||
|  |         const linksFromDoc = extractLinks(doc.renderedContent).hrefs; | ||
|  |         // Update the hashes
 | ||
|  |         fromLinks[doc.path] = linksFromDoc; | ||
|  |         linksFromDoc.forEach(linkPath => { | ||
|  |           linkPath = linkPath.match(/^[^#?]+/)[0]; // remove the query and hash from the link
 | ||
|  |           (toLinks[linkPath] = toLinks[linkPath] || []).push(doc.path); | ||
|  |         }); | ||
|  |       }); | ||
|  | 
 | ||
|  |       // Add HTML comments to the end of the rendered content that list the links found above
 | ||
|  |       docsToCheck.forEach(doc => { | ||
|  |         const linksFromDoc = getLinks(fromLinks, doc.path); | ||
|  |         const linksToDoc = getLinks(toLinks, doc.path); | ||
|  |         doc.renderedContent += | ||
|  |         `\n<!-- links to this doc:${linksToDoc.map(link => `\n - ${link}`).join('')}\n-->\n` + | ||
|  |         `<!-- links from this doc:${linksFromDoc.map(link => `\n - ${link}`).join('')}\n-->`; | ||
|  |       }); | ||
|  |     } | ||
|  |   }; | ||
|  | }; | ||
|  | 
 | ||
|  | function getLinks(hash, docPath) { | ||
|  |   const links = (hash[docPath] || []).filter(link => link !== docPath); | ||
|  |   const internal = {}; | ||
|  |   const external = {}; | ||
|  |   links.forEach(link => { | ||
|  |     if (/^[^:/#?]+:/.test(link)) { | ||
|  |       external[link] = true; | ||
|  |     } else { | ||
|  |       internal[link] = true; | ||
|  |     } | ||
|  |   }); | ||
|  |   return Object.keys(internal).sort() | ||
|  |         .concat(Object.keys(external).sort()); | ||
|  | } |