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());
 | |
| }
 |