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