lion/packages-node/rocket-preset-extend-lion-docs/src/remarkUrlToLocal.js

58 lines
1.4 KiB
JavaScript

/* eslint-disable no-param-reassign */
import path from 'path';
import visit from 'unist-util-visit';
/** @typedef {import('vfile').VFileOptions} VFileOptions */
/** @typedef {import('unist').Node} Node */
/**
* @typedef {Object} UrlProperty
* @property {string} url
*/
/** @typedef {Node & UrlProperty} UrlNode */
/**
* @param {object} opts
* @param {string} opts.gitHubUrl
* @param {object} opts.page
* @param {string} opts.page.inputPath
* @param {string} opts.rootDir
* @returns
*/
export function remarkUrlToLocal({ gitHubUrl, page, rootDir }) {
/**
* @param {UrlNode} node
*/
const visitor = node => {
if (node.type === 'link' || node.type === 'image') {
if (node.url.startsWith(gitHubUrl)) {
const urlPart = node.url.substring(gitHubUrl.length);
const urlParts = urlPart.split('/');
if (urlParts[0] === 'blob') {
urlParts.shift();
urlParts.shift();
const fullUrlPath = path.join(rootDir, urlParts.join('/'));
const fullInputPath =
page.inputPath[0] === '/' ? page.inputPath : path.join(rootDir, page.inputPath);
const newPath = path.relative(path.dirname(fullInputPath), fullUrlPath);
node.url = newPath;
}
}
}
return node;
};
/**
* @param {Node} tree
*/
function transformer(tree) {
// @ts-ignore
visit(tree, visitor);
return tree;
}
return transformer;
}