#!/usr/bin/env node
/**
* @description The entry point for the __CLI__ version of ipynb2web.
*
* Install:
* ```
* npm install ipynb2web
* ```
* Usage:
* ```
* ipynb2web <COMMAND> <SAVETO> <FROM/or/SitemapName>
* ```
*
* Get help:
* ```
* ipynb2web help
* ```
*
* It provides a command line interface function that processes given arguments and calls [createSitemap](module-prerender.html#.createSitemap),
* [createAudio](module-prerender.html#.createAudio), or [cli_nbs2html](module-prerender.html#.cli_nbs2html), based on the first argument.
* @module Ipynb2web:cli
* @exports cli
* @author Charles Karpati
*/
import { createAudio, createSitemap, cli_nbs2html } from './prerender.mjs';
/**
* Displays documentation on how to use the CLI when 'help' argument is provided.
* @memberof module:Ipynb2web:cli
*/
function help() {
console.log(`Usage: ipynb2web <COMMAND> <SAVETO> <FROM/or/SitemapName> [PathPrefix] [Domain]
Commands:
sitemap Create a sitemap.
audio Create audio assets.
help Display this help message.
For sitemap command:
PathPrefix Optional prefix to add to all URLs (e.g., '/docs')
Example: ipynb2web sitemap ./ ./sitemap.txt /docs
Domain Optional domain to prefix all sitemap URLs (e.g., 'https://example.com')
Example: ipynb2web sitemap ./ ./sitemap.txt /docs example.com
For processing notebooks (non-sitemap, non-audio commands):
--trusted Preserve active HTML/JS only for host-approved notebooks.
Without this flag, rich content uses inert representations.
AssetsDir Optional directory path for saving static assets separately
instead of inlining them. When provided, images and other
assets will be saved as separate files in this directory.
Example: ipynb2web notebooks ./output ./input '' ./assets
Examples:
ipynb2web help
ipynb2web sitemap ./ ./sitemap.txt /docs
ipynb2web sitemap ./ ./sitemap.txt /docs example.com
ipynb2web audio ./input ./output
ipynb2web notebooks ./output ./input
ipynb2web notebooks ./output ./input '' ./static-assets
`);
}
/**
* Command line interface function that processes given arguments and calls the appropriate function based on the first argument.
*
* @param {string[]} args - An array of command line arguments.
* - args[0]: 'Command' - Enter ['sitemap', 'audio'] to create these assets. If neither, it will the value be appended to the SAVETO and FROM paths for processing nb2json on.
* - args[1]: 'SAVETO' - This directory path, used as a target directory for saving files.
* - args[2]: 'FROM' - This directory path, used as an output directory for processing files (Whenever args[0] is NOT 'sitemap').
* - args[2]: 'sitemapFile' - The file path for saving the sitemap (ONLY when args[0] is 'sitemap').
* - args[3]: 'pathPrefix' - Optional prefix to add to all URLs in the sitemap (ONLY when args[0] is 'sitemap').
* - args[4]: 'domain' - Optional domain to prefix all URLs in the sitemap (ONLY when args[0] is 'sitemap').
* - args[4]: 'assetsDir' - Optional directory path for saving static assets separately instead of inlining them (NOT applicable for 'sitemap' and 'audio' commands).
* @memberof module:Ipynb2web:cli
*/
function cli(args) {
const trusted = args.includes('--trusted');
args = args.filter(arg => arg !== '--trusted');
const directory = args[0] || '';
const SAVETO = args[1] || false;
const FROM = args[2] || false;
const sitemapFile = args[2] || false;
const pathPrefix = args[3] || '';
const domain = args[4] || '';
const assetsDir = args[4] || null;
console.log('CLI RECEIVED ARGS:'); //, { directory, SAVETO, FROM, sitemapFile, assetsDir });
/**
* Based on the first argument, call the appropriate function.
* If 'sitemap', call createSitemap.
* If 'audio', call createAudio.
* Otherwise, call cli_nbs2html.
*/
if (directory === 'sitemap') {
// New signature:
// ipynb2web sitemap <searchDir> <sitemapFile> [pathPrefix] [domain]
// Legacy signature (kept for compatibility with older usage):
// ipynb2web sitemap '' <sitemapFile> <searchDir> <pathPrefix> [domain]
let searchDir = SAVETO || './';
let sitemapOutFile = sitemapFile || './sitemap.txt';
let sitemapPathPrefix = pathPrefix || '';
let sitemapDomain = domain || '';
if ((SAVETO === '' || SAVETO === false) && typeof pathPrefix === 'string' && pathPrefix.trim().startsWith('.') && args[4]) {
// Your legacy call style puts searchDir in args[3] and pathPrefix in args[4]
searchDir = args[3] || './';
sitemapPathPrefix = args[4] || '';
sitemapDomain = args[5] || '';
}
createSitemap(searchDir, sitemapOutFile, sitemapPathPrefix, sitemapDomain);
}
else if (directory === 'audio') { createAudio(FROM, SAVETO); }
else { cli_nbs2html(FROM, directory, SAVETO, true, assetsDir, { trusted }); }
}
/**
* CJS: If this module is the main module (i.e., the script being run), call the cli or help function with the command line arguments.
*/
/*
if (require.main === module) { }
*/
if (import.meta.url.includes('ipynb2web')) {
const args = process.argv.slice(2);
if (args[0] === 'help' || args.length === 0) {
help();
} else {
cli(args);
}
}
// MJS
export default cli;