angular-rich-text-editor
Version:
A lightweight, configurable rich-text editor component for Angular applications.
81 lines • 11.3 kB
JavaScript
export function cleanToolbarString(toolbar) {
let cleaned = toolbar;
// Remove :toggle and :dropdown
cleaned = cleaned.replace(/:toggle/g, '').replace(/:dropdown/g, '');
// Fix spacing and redundancy
cleaned = cleaned
.replace(/,+/g, ',')
.replace(/\{,+/g, '{')
.replace(/,+\}/g, '}')
.replace(/\|+/g, '|')
.replace(/\{\s*\|/g, '{')
.replace(/\|\s*\}/g, '}')
.replace(/\{\s*\}/g, '')
.replace(/\s*,\s*/g, ',')
.replace(/\s*\|\s*/g, '|')
.replace(/\{\s+/g, '{')
.replace(/\s+\}/g, '}');
// Fix tool concatenation issues
cleaned = cleaned.replace(/\b([a-z]),(?=[a-z],|[a-z]\b)/g, '$1');
let previousCleaned = '';
while (previousCleaned !== cleaned) {
previousCleaned = cleaned;
cleaned = cleaned.replace(/\b([a-z]),(?=[a-z],|[a-z]\b)/g, '$1');
}
// Process sections
const sections = cleaned.split(/([/#])/);
const processedSections = [];
for (let i = 0; i < sections.length; i++) {
const section = sections[i];
if (section === '/' || section === '#') {
processedSections.push(section);
continue;
}
if (!section.trim())
continue;
const groups = section.split('|');
const processedGroups = [];
for (let group of groups) {
const hasBraces = group.includes('{') || group.includes('}');
let content = group.replace(/[{}]/g, '').trim();
if (!content)
continue;
// Fix common concatenation issues
content = content
.replace(/(?<=fontname)(?=fontsize)/g, ',')
.replace(/(?<=fontsize)(?=inlinestyle)/g, ',')
.replace(/(?<=inlinestyle)(?=lineheight)/g, ',')
.replace(/(?<=paragraphs)(?=fontname)/g, ',')
.replace(/(?<=paragraphstyle)(?=menu_)/g, ',')
.replace(/underlinefore/g, 'underline,fore')
.replace(/forecolorback/g, 'forecolor,back')
.replace(/backcolor/g, 'backcolor')
.replace(/outdentsuperscript/g, 'outdent,superscript')
.replace(/insertlinkun/g, 'insertlink,un')
.replace(/unlinkinsert/g, 'unlink,insert')
.replace(/insertblockquote/g, 'insertblockquote')
.replace(/inserttable/g, 'inserttable')
.replace(/insertimage/g, 'insertimage')
.replace(/removeformat/g, 'removeformat');
content = content.replace(/,+/g, ',').trim();
if (content) {
processedGroups.push(hasBraces ? `{${content}}` : content);
}
}
if (processedGroups.length > 0) {
processedSections.push(processedGroups.join('|'));
}
}
cleaned = processedSections.join('');
// Final cleanup
cleaned = cleaned
.replace(/\{\s*\}/g, '')
.replace(/\|+/g, '|')
.replace(/\/+/g, '/')
.replace(/#+/g, '#')
.replace(/^[|/#]+|[|/#]+$/g, '')
.replace(/\s+/g, ' ')
.trim();
return cleaned;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGJhci1jbGVhbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmljaC10ZXh0LWVkaXRvci9zcmMvbGliL3V0aWxzL3Rvb2xiYXItY2xlYW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsa0JBQWtCLENBQUMsT0FBZTtJQUNoRCxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFFdEIsK0JBQStCO0lBQy9CLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRXBFLDZCQUE2QjtJQUM3QixPQUFPLEdBQUcsT0FBTztTQUNkLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1NBQ25CLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDO1NBQ3JCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDO1NBQ3JCLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDO1NBQ3BCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDO1NBQ3hCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDO1NBQ3hCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1NBQ3ZCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDO1NBQ3hCLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDO1NBQ3pCLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO1NBQ3RCLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFMUIsZ0NBQWdDO0lBQ2hDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLCtCQUErQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBRWpFLElBQUksZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUN6QixPQUFPLGVBQWUsS0FB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QUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFckMsZ0JBQWdCO0lBQ2hCLE9BQU8sR0FBRyxPQUFPO1NBQ2QsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7U0FDdkIsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7U0FDcEIsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7U0FDcEIsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7U0FDbkIsT0FBTyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQztTQUMvQixPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQztTQUNwQixJQUFJLEVBQUUsQ0FBQztJQUVWLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gY2xlYW5Ub29sYmFyU3RyaW5nKHRvb2xiYXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBjbGVhbmVkID0gdG9vbGJhcjtcblxuICAvLyBSZW1vdmUgOnRvZ2dsZSBhbmQgOmRyb3Bkb3duXG4gIGNsZWFuZWQgPSBjbGVhbmVkLnJlcGxhY2UoLzp0b2dnbGUvZywgJycpLnJlcGxhY2UoLzpkcm9wZG93bi9nLCAnJyk7XG5cbiAgLy8gRml4IHNwYWNpbmcgYW5kIHJlZHVuZGFuY3lcbiAgY2xlYW5lZCA9IGNsZWFuZWRcbiAgICAucmVwbGFjZSgvLCsvZywgJywnKVxuICAgIC5yZXBsYWNlKC9cXHssKy9nLCAneycpXG4gICAgLnJlcGxhY2UoLywrXFx9L2csICd9JylcbiAgICAucmVwbGFjZSgvXFx8Ky9nLCAnfCcpXG4gICAgLnJlcGxhY2UoL1xce1xccypcXHwvZywgJ3snKVxuICAgIC5yZXBsYWNlKC9cXHxcXHMqXFx9L2csICd9JylcbiAgICAucmVwbGFjZSgvXFx7XFxzKlxcfS9nLCAnJylcbiAgICAucmVwbGFjZSgvXFxzKixcXHMqL2csICcsJylcbiAgICAucmVwbGFjZSgvXFxzKlxcfFxccyovZywgJ3wnKVxuICAgIC5yZXBsYWNlKC9cXHtcXHMrL2csICd7JylcbiAgICAucmVwbGFjZSgvXFxzK1xcfS9nLCAnfScpO1xuXG4gIC8vIEZpeCB0b29sIGNvbmNhdGVuYXRpb24gaXNzdWVzXG4gIGNsZWFuZWQgPSBjbGVhbmVkLnJlcGxhY2UoL1xcYihbYS16XSksKD89W2Etel0sfFthLXpdXFxiKS9nLCAnJDEnKTtcblxuICBsZXQgcHJldmlvdXNDbGVhbmVkID0gJyc7XG4gIHdoaWxlIChwcmV2aW91c0NsZWFuZWQgIT09IGNsZWFuZWQpIHtcbiAgICBwcmV2aW91c0NsZWFuZWQgPSBjbGVhbmVkO1xuICAgIGNsZWFuZWQgPSBjbGVhbmVkLnJlcGxhY2UoL1xcYihbYS16XSksKD89W2Etel0sfFthLXpdXFxiKS9nLCAnJDEnKTtcbiAgfVxuXG4gIC8vIFByb2Nlc3Mgc2VjdGlvbnNcbiAgY29uc3Qgc2VjdGlvbnMgPSBjbGVhbmVkLnNwbGl0KC8oWy8jXSkvKTtcbiAgY29uc3QgcHJvY2Vzc2VkU2VjdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBzZWN0aW9uc1tpXTtcblxuICAgIGlmIChzZWN0aW9uID09PSAnLycgfHwgc2VjdGlvbiA9PT0gJyMnKSB7XG4gICAgICBwcm9jZXNzZWRTZWN0aW9ucy5wdXNoKHNlY3Rpb24pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFzZWN0aW9uLnRyaW0oKSkgY29udGludWU7XG5cbiAgICBjb25zdCBncm91cHMgPSBzZWN0aW9uLnNwbGl0KCd8Jyk7XG4gICAgY29uc3QgcHJvY2Vzc2VkR3JvdXBzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICBjb25zdCBoYXNCcmFjZXMgPSBncm91cC5pbmNsdWRlcygneycpIHx8IGdyb3VwLmluY2x1ZGVzKCd9Jyk7XG4gICAgICBsZXQgY29udGVudCA9IGdyb3VwLnJlcGxhY2UoL1t7fV0vZywgJycpLnRyaW0oKTtcblxuICAgICAgaWYgKCFjb250ZW50KSBjb250aW51ZTtcblxuICAgICAgLy8gRml4IGNvbW1vbiBjb25jYXRlbmF0aW9uIGlzc3Vlc1xuICAgICAgY29udGVudCA9IGNvbnRlbnRcbiAgICAgICAgLnJlcGxhY2UoLyg/PD1mb250bmFtZSkoPz1mb250c2l6ZSkvZywgJywnKVxuICAgICAgICAucmVwbGFjZSgvKD88PWZvbnRzaXplKSg/PWlubGluZXN0eWxlKS9nLCAnLCcpXG4gICAgICAgIC5yZXBsYWNlKC8oPzw9aW5saW5lc3R5bGUpKD89bGluZWhlaWdodCkvZywgJywnKVxuICAgICAgICAucmVwbGFjZSgvKD88PXBhcmFncmFwaHMpKD89Zm9udG5hbWUpL2csICcsJylcbiAgICAgICAgLnJlcGxhY2UoLyg/PD1wYXJhZ3JhcGhzdHlsZSkoPz1tZW51XykvZywgJywnKVxuICAgICAgICAucmVwbGFjZSgvdW5kZXJsaW5lZm9yZS9nLCAndW5kZXJsaW5lLGZvcmUnKVxuICAgICAgICAucmVwbGFjZSgvZm9yZWNvbG9yYmFjay9nLCAnZm9yZWNvbG9yLGJhY2snKVxuICAgICAgICAucmVwbGFjZSgvYmFja2NvbG9yL2csICdiYWNrY29sb3InKVxuICAgICAgICAucmVwbGFjZSgvb3V0ZGVudHN1cGVyc2NyaXB0L2csICdvdXRkZW50LHN1cGVyc2NyaXB0JylcbiAgICAgICAgLnJlcGxhY2UoL2luc2VydGxpbmt1bi9nLCAnaW5zZXJ0bGluayx1bicpXG4gICAgICAgIC5yZXBsYWNlKC91bmxpbmtpbnNlcnQvZywgJ3VubGluayxpbnNlcnQnKVxuICAgICAgICAucmVwbGFjZSgvaW5zZXJ0YmxvY2txdW90ZS9nLCAnaW5zZXJ0YmxvY2txdW90ZScpXG4gICAgICAgIC5yZXBsYWNlKC9pbnNlcnR0YWJsZS9nLCAnaW5zZXJ0dGFibGUnKVxuICAgICAgICAucmVwbGFjZSgvaW5zZXJ0aW1hZ2UvZywgJ2luc2VydGltYWdlJylcbiAgICAgICAgLnJlcGxhY2UoL3JlbW92ZWZvcm1hdC9nLCAncmVtb3ZlZm9ybWF0Jyk7XG5cbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLywrL2csICcsJykudHJpbSgpO1xuXG4gICAgICBpZiAoY29udGVudCkge1xuICAgICAgICBwcm9jZXNzZWRHcm91cHMucHVzaChoYXNCcmFjZXMgPyBgeyR7Y29udGVudH19YCA6IGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9jZXNzZWRHcm91cHMubGVuZ3RoID4gMCkge1xuICAgICAgcHJvY2Vzc2VkU2VjdGlvbnMucHVzaChwcm9jZXNzZWRHcm91cHMuam9pbignfCcpKTtcbiAgICB9XG4gIH1cblxuICBjbGVhbmVkID0gcHJvY2Vzc2VkU2VjdGlvbnMuam9pbignJyk7XG5cbiAgLy8gRmluYWwgY2xlYW51cFxuICBjbGVhbmVkID0gY2xlYW5lZFxuICAgIC5yZXBsYWNlKC9cXHtcXHMqXFx9L2csICcnKVxuICAgIC5yZXBsYWNlKC9cXHwrL2csICd8JylcbiAgICAucmVwbGFjZSgvXFwvKy9nLCAnLycpXG4gICAgLnJlcGxhY2UoLyMrL2csICcjJylcbiAgICAucmVwbGFjZSgvXlt8LyNdK3xbfC8jXSskL2csICcnKVxuICAgIC5yZXBsYWNlKC9cXHMrL2csICcgJylcbiAgICAudHJpbSgpO1xuXG4gIHJldHVybiBjbGVhbmVkO1xufVxuIl19