Command-line tool and library for generating table of contents for markdown files with multi-platform support
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
DocToc's file system utilities provide functionality for discovering and processing markdown files in directory structures with intelligent filtering and recursive search capabilities.
Recursively discovers all markdown files in a directory structure.
/**
* Recursively finds all markdown files in the specified directory
* @param {string} dir - Absolute directory path to search
* @returns {Array<FileInfo>} Array of file information objects
*/
function findMarkdownFiles(dir);interface FileInfo {
/** Absolute path to the markdown file */
path: string;
/** File name (including extension) */
name: string;
}Markdown files are identified by their file extensions.
// Supported markdown extensions
const markdownExts = ['.md', '.markdown'];Usage Examples:
const { findMarkdownFiles } = require('doctoc/lib/file');
// Find all markdown files in current directory
const files = findMarkdownFiles(process.cwd());
// Find files in specific directory
const docsFiles = findMarkdownFiles('/path/to/docs');
// Process found files
files.forEach(file => {
console.log(`Found: ${file.name} at ${file.path}`);
});Certain directories are automatically excluded from the search.
// Ignored directories during search
const ignoredDirs = ['.', '..', '.git', 'node_modules'];Filtering Behavior:
. (except .git which is explicitly listed).git directories are skippednode_modules directories are ignored.) and parent (..) directory referencesRecursive directory traversal with intelligent filtering.
Search Process:
fs.readdirSync()File Discovery Examples:
const { findMarkdownFiles } = require('doctoc/lib/file');
// Typical project structure search
const files = findMarkdownFiles('/project');
/*
Discovers:
- /project/README.md
- /project/docs/api.md
- /project/docs/guide.md
- /project/src/components/README.md
Ignores:
- /project/.git/config
- /project/node_modules/package/README.md
- /project/.hidden/docs.md
*/The file utilities integrate seamlessly with DocToc's main CLI functionality.
CLI Integration Example:
// From doctoc.js main executable
const file = require('./lib/file');
// Process directory
if (stat.isDirectory()) {
console.log('DocToccing "%s" and its sub directories for %s.', target, mode);
files = file.findMarkdownFiles(target);
} else {
console.log('DocToccing single file "%s" for %s.', target, mode);
files = [{ path: target }];
}The search process provides informative console output.
Search Progress Output:
// During search, outputs progress for each directory:
// Found README.md, guide.md in "/project/docs"
// Found nothing in "/project/src/empty-dir"
// Found API.md in "/project/api"Output Format:
Robust error handling for file system operations.
Common Error Scenarios:
Error Behavior:
Optimized for efficient directory traversal.
Performance Features:
fs.statSync() and fs.readdirSync() for simplicityUsage Tips:
Comprehensive File Discovery and Processing:
const { findMarkdownFiles } = require('doctoc/lib/file');
const { transform } = require('doctoc');
const fs = require('fs');
const path = require('path');
// Find all markdown files in project
const projectPath = path.resolve('./docs');
const files = findMarkdownFiles(projectPath);
console.log(`Found ${files.length} markdown files`);
// Process each file
files.forEach(fileInfo => {
try {
const content = fs.readFileSync(fileInfo.path, 'utf8');
const result = transform(content, 'github.com', 4);
if (result.transformed) {
fs.writeFileSync(fileInfo.path, result.data, 'utf8');
console.log(`✓ Updated TOC in ${fileInfo.name}`);
} else {
console.log(`- No changes needed in ${fileInfo.name}`);
}
} catch (error) {
console.error(`✗ Error processing ${fileInfo.name}:`, error.message);
}
});Custom Directory Processing:
const { findMarkdownFiles } = require('doctoc/lib/file');
// Process multiple directories
const directories = ['./docs', './guides', './api'];
directories.forEach(dir => {
if (fs.existsSync(dir)) {
const files = findMarkdownFiles(path.resolve(dir));
console.log(`\n${dir}: Found ${files.length} markdown files`);
files.forEach(file => {
console.log(` - ${path.relative(dir, file.path)}`);
});
}
});Install with Tessl CLI
npx tessl i tessl/npm-doctoc