@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
127 lines • 6.28 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConstantWikiLinkInfo = void 0;
exports.makeDocContextForTypes = makeDocContextForTypes;
const doc_types_1 = require("../doc-util/doc-types");
const path_1 = __importDefault(require("path"));
const assert_1 = require("../../util/assert");
const doc_auto_gen_1 = require("../doc-util/doc-auto-gen");
const doc_files_1 = require("../doc-util/doc-files");
const doc_cli_option_1 = require("../doc-util/doc-cli-option");
function getNameFromElementIdOrRef(element) {
if (typeof element === 'function') {
return element.name;
}
else if (typeof element === 'object' && 'name' in element) {
return element.name;
}
else {
return element;
}
}
exports.ConstantWikiLinkInfo = {
'flowr:npm': { url: doc_files_1.FlowrNpmRef, name: 'flowR on npm' },
'flowr:github': { url: doc_files_1.FlowrGithubRef, name: 'flowR\'s GitHub' },
'flowr:wiki': { url: doc_files_1.FlowrWikiBaseRef, name: 'flowR\'s wiki' },
'flowr:docker': { url: doc_files_1.FlowrDockerRef, name: 'flowR\'s Docker Image' },
'flowr:vscode': { url: doc_files_1.FlowrVsCode, name: 'flowR extension for VS Code' },
'flowr:positron': { url: doc_files_1.FlowrPositron, name: 'flowR extension for Positron' },
'flowr:rstudio-addin': { url: doc_files_1.FlowrRStudioAddin, name: 'flowR RStudio Addin' },
'flowr:radapter': { url: doc_files_1.FlowrRAdapter, name: 'flowR R Adapter' },
'flowr:benchmarks': { url: 'https://flowr-analysis.github.io/flowr/wiki/stats/benchmark', name: 'flowR benchmark page' },
'flowr:docs': { url: 'https://flowr-analysis.github.io/flowr/docs', name: 'flowR code docs' },
'flowr:zenodo': { url: 'https://zenodo.org/doi/10.5281/zenodo.13319290', name: 'flowR on Zenodo' },
};
/**
* Creates a wiki context for generating documentation for code elements.
* This context provides methods to create links, code snippets, and documentation for code elements.
* @param shell - An optional RShell instance to retrieve the R version for the auto-generation header.
* @param rootFolders - The root folder(s) of the code base to analyze. Defaults to flower's `src/` **and** `test/` folder.
* @example
* ```ts
* const ctx = makeContextForTypes();
* const linkToFn = ctx.link('myFunction');
* const fnDoc = ctx.doc('myFunction');
* ```
*/
function makeDocContextForTypes(shell, ...rootFolders) {
if (rootFolders.length === 0) {
rootFolders.push(path_1.default.resolve(__dirname, '../../../src'), path_1.default.resolve(__dirname, '../../../test/functionality'));
}
const { info, program } = (0, doc_types_1.getTypesFromFolder)({ rootFolder: rootFolders, typeNameForMermaid: undefined });
return {
doc(element, filter) {
return (0, doc_types_1.getDocumentationForType)(getNameFromElementIdOrRef(element), info, '', filter);
},
link(element, fmt, filter) {
(0, assert_1.guard)(filter?.file === undefined, 'filtering for files is not yet supported for link');
return (0, doc_types_1.shortLink)(getNameFromElementIdOrRef(element), info, fmt?.codeFont, fmt?.realNameWrapper, filter?.fuzzy, filter?.type);
},
linkM(cls, element, fmt, filter) {
const className = cls.prototype.constructor.name;
const sep = (fmt?.hideClass) ? ':::' : '::';
const fullName = `${className}${sep}${String(element)}`;
return this.link(fullName, fmt, filter);
},
linkO(obj, element, fmt, filter) {
const fullName = `${obj.name}::${String(element)}`;
return this.link(fullName, fmt, filter);
},
linkFile(element) {
return (0, doc_types_1.shortLinkFile)(getNameFromElementIdOrRef(element), info);
},
hierarchy(element, fmt, filter) {
(0, assert_1.guard)(filter === undefined, 'ElementFilter is not yet supported for hierarchy');
return (0, doc_types_1.printHierarchy)({
program, info,
root: getNameFromElementIdOrRef(element),
...fmt
});
},
code(element, fmt, filter) {
(0, assert_1.guard)(filter === undefined, 'ElementFilter is not yet supported for code');
return (0, doc_types_1.printCodeOfElement)({
program, info,
...fmt,
}, getNameFromElementIdOrRef(element));
},
async header(filename, purpose) {
const rVersion = (await shell?.usedRVersion())?.format();
return (0, doc_auto_gen_1.autoGenHeader)({ filename, purpose, rVersion });
},
mermaid(element, options) {
return (0, doc_types_1.visualizeMermaidClassDiagram)(info, {
typeNameForMermaid: getNameFromElementIdOrRef(element),
...options
});
},
linkPage(pageName, linkText, segment) {
let link;
let text = linkText;
if (pageName in exports.ConstantWikiLinkInfo) {
const i = exports.ConstantWikiLinkInfo[pageName];
link = i.url;
text ??= i.name;
}
else {
link = `${doc_files_1.FlowrGithubRef}/${pageName.toLowerCase().replaceAll(' ', '-')}`;
}
text ??= pageName.split('/').pop() ?? pageName;
return `[${text}](${link}${segment ? '#' + segment : ''})`;
},
linkCode(path, lineNumber) {
const lnk = lineNumber ? `${path.toString()}#L${lineNumber}` : path.toString();
return `[${path.toString()}](${encodeURIComponent(lnk)})`;
},
cliOption(scriptName, optionName, withAlias = false, quote = true) {
return (0, doc_cli_option_1.getCliLongOptionOf)(scriptName, optionName, withAlias, quote);
},
replCmd(commandName, quote = true, showStar = false) {
return (0, doc_cli_option_1.getReplCommand)(commandName, quote, showStar);
}
};
}
//# sourceMappingURL=doc-context.js.map