const format = {
html: (html: string) => {
const formatted = []
const reg = /(>)(<)(\/*)/g
const tab = ' '
let level = 0
html = html.replace(reg, '$1\n$2$3')
const lines = html.split('\n')
for (const line of lines) {
if (line.match(/<\/\w+/) && !line.match(/\/>/)) {
level--
}
formatted.push(tab.repeat(Math.max(level, 0)) + line)
if (line.match(/<\w[^>]*[^/]>/)) {
level++
}
}
return formatted.join('\n')
},
json: (jsonString: string, indent = 4) => {
try {
const jsonObject = JSON.parse(jsonString)
return JSON.stringify(jsonObject, null, indent)
} catch (error) {
return `Invalid JSON: ${(error as Error).message}`
}
},
javascript: (jsCode: string, indent = 4) => {
try {
const tab = ' '.repeat(indent)
let formatted = ''
let level = 0
let inString = ''
for (let i = 0; i < jsCode.length; i++) {
const char = jsCode[i]
const nextChar = jsCode[i + 1]
if (char === '"' || char === '\'' || char === '`') {
formatted += char
if (inString.length && inString === char) {
inString = ''
} else if (!inString.length) {
inString = char
}
continue
}
if (inString) {
formatted += char
continue
}
if (char === '{' || char === '[') {
formatted += `${char}\n${tab.repeat(++level)}`
continue
}
if (char === '}' || char === ']') {
formatted += `\n${tab.repeat(--level)}${char}`
continue
}
if (char === ';' || char === ',') {
formatted += `${char}\n${tab.repeat(level)}`
continue
}
if (char === '\n') {
formatted += `\n${tab.repeat(level)}`
continue
}
if (
(char === ')' && nextChar === '{')
|| (char === ')' && nextChar === ' ')
) {
formatted += `${char}\n${tab.repeat(level)}`
continue
}
formatted += char
}
return formatted
} catch (error) {
return `Error formatting JavaScript: ${(error as Error).message}`
}
}
}
export function formatCode(code: string, language: string) {
switch (language) {
case 'html':
return format.html(code)
case 'json':
return format.json(code)
case 'javascript':
return format.javascript(code)
default:
return code
}
}