style: Improve markdown editor styling and functionality
- Update dark mode button icon and styling - Add styling for new collection button - Apply default iframe styles in preview pane - Adjust vertical divider height in header buttons - Improve handling of JSX-like attributes in markdown - Add support for new collection functionality - Refine file loading logic in view mode - Improve dark mode toggle icon and integration - Update UI for edit/view mode toggle button
This commit is contained in:
@@ -336,6 +336,60 @@ class MarkdownEditor {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert JSX-style attributes to HTML attributes
|
||||
* Handles style={{...}} and boolean attributes like allowFullScreen={true}
|
||||
*/
|
||||
convertJSXToHTML(content) {
|
||||
Logger.debug('Converting JSX to HTML...');
|
||||
|
||||
// Convert style={{...}} to style="..."
|
||||
// This regex finds style={{...}} and converts the object notation to CSS string
|
||||
content = content.replace(/style=\{\{([^}]+)\}\}/g, (match, styleContent) => {
|
||||
Logger.debug(`Found JSX style: ${match}`);
|
||||
|
||||
// Parse the object-like syntax and convert to CSS
|
||||
const cssRules = styleContent
|
||||
.split(',')
|
||||
.map(rule => {
|
||||
const colonIndex = rule.indexOf(':');
|
||||
if (colonIndex === -1) return '';
|
||||
|
||||
const key = rule.substring(0, colonIndex).trim();
|
||||
const value = rule.substring(colonIndex + 1).trim();
|
||||
|
||||
if (!key || !value) return '';
|
||||
|
||||
// Convert camelCase to kebab-case (e.g., paddingTop -> padding-top)
|
||||
const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();
|
||||
|
||||
// Remove quotes from value
|
||||
let cssValue = value.replace(/^['"]|['"]$/g, '');
|
||||
|
||||
return `${cssKey}: ${cssValue}`;
|
||||
})
|
||||
.filter(rule => rule)
|
||||
.join('; ');
|
||||
|
||||
Logger.debug(`Converted to CSS: style="${cssRules}"`);
|
||||
return `style="${cssRules}"`;
|
||||
});
|
||||
|
||||
// Convert boolean attributes like allowFullScreen={true} to allowfullscreen
|
||||
content = content.replace(/(\w+)=\{true\}/g, (match, attrName) => {
|
||||
Logger.debug(`Found boolean attribute: ${match}`);
|
||||
// Convert camelCase to lowercase for HTML attributes
|
||||
const htmlAttr = attrName.toLowerCase();
|
||||
Logger.debug(`Converted to: ${htmlAttr}`);
|
||||
return htmlAttr;
|
||||
});
|
||||
|
||||
// Remove attributes set to {false}
|
||||
content = content.replace(/\s+\w+=\{false\}/g, '');
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Render preview from markdown content
|
||||
* Can be called with explicit content (for view mode) or from editor (for edit mode)
|
||||
@@ -355,11 +409,12 @@ class MarkdownEditor {
|
||||
}
|
||||
|
||||
try {
|
||||
// Step 1: Process macros
|
||||
let processedContent = markdown;
|
||||
// Step 0: Convert JSX-style syntax to HTML
|
||||
let processedContent = this.convertJSXToHTML(markdown);
|
||||
|
||||
// Step 1: Process macros
|
||||
if (this.macroProcessor) {
|
||||
const processingResult = await this.macroProcessor.processMacros(markdown);
|
||||
const processingResult = await this.macroProcessor.processMacros(processedContent);
|
||||
processedContent = processingResult.content;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user