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