@wonderwhy-er/desktop-commander
Version:
MCP server for terminal operations and file editing
74 lines (73 loc) • 2.28 kB
JavaScript
/**
* Code/text viewer renderer responsible for escaping, optional formatting, and syntax-highlight output wrappers. It provides a safe default for non-rich preview content.
*/
import { highlightSource } from './highlighting.js';
const EXTENSION_LANGUAGE_MAP = {
js: 'javascript',
cjs: 'javascript',
mjs: 'javascript',
ts: 'typescript',
jsx: 'javascript',
tsx: 'typescript',
json: 'json',
yaml: 'yaml',
yml: 'yaml',
toml: 'toml',
ini: 'ini',
xml: 'xml',
html: 'html',
htm: 'html',
css: 'css',
scss: 'css',
less: 'css',
sh: 'bash',
bash: 'bash',
zsh: 'bash',
py: 'python',
rb: 'ruby',
java: 'java',
go: 'go',
rs: 'rust',
sql: 'sql',
md: 'markdown',
markdown: 'markdown'
};
function getFileExtension(filePath) {
const match = filePath.toLowerCase().match(/\.([a-z0-9]+)$/);
return match ? match[1] : '';
}
export function inferLanguageFromPath(filePath) {
const extension = getFileExtension(filePath);
return EXTENSION_LANGUAGE_MAP[extension] ?? 'text';
}
export function formatJsonIfPossible(content, filePath) {
if (inferLanguageFromPath(filePath) !== 'json') {
return { content };
}
try {
return {
content: `${JSON.stringify(JSON.parse(content), null, 2)}\n`
};
}
catch {
return {
content,
notice: 'Invalid JSON. Showing raw source.'
};
}
}
export function renderCodeViewer(code, language = 'text', startLine = 1) {
const normalizedLanguage = language || 'text';
const highlighted = highlightSource(code, normalizedLanguage);
// Wrap each line with line number gutter
const lines = highlighted.split('\n');
// Remove trailing empty line from trailing newline
if (lines.length > 0 && lines[lines.length - 1] === '') {
lines.pop();
}
const lineHtml = lines.map((line, i) => {
const lineNum = startLine + i;
return `<tr class="code-line" data-line="${lineNum}"><td class="line-num" data-line="${lineNum}">${lineNum}</td><td class="line-content">${line || ' '}</td></tr>`;
}).join('\n');
return `<pre class="code-viewer"><table class="code-table"><tbody>${lineHtml}</tbody></table></pre>`;
}