@marvalt/wparser 0.1.35 → 0.1.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js
CHANGED
|
@@ -1756,7 +1756,17 @@ function extractImageUrl(block) {
|
|
|
1756
1756
|
* Extract image attributes (url, alt, width, height)
|
|
1757
1757
|
*/
|
|
1758
1758
|
function extractImageAttributes(block) {
|
|
1759
|
-
|
|
1759
|
+
const attrs = getImageAttributes(block);
|
|
1760
|
+
// Convert width to number if it's a string
|
|
1761
|
+
const width = typeof attrs.width === 'string'
|
|
1762
|
+
? (parseInt(attrs.width, 10) || undefined)
|
|
1763
|
+
: attrs.width;
|
|
1764
|
+
return {
|
|
1765
|
+
url: attrs.url,
|
|
1766
|
+
alt: attrs.alt,
|
|
1767
|
+
width,
|
|
1768
|
+
height: attrs.height,
|
|
1769
|
+
};
|
|
1760
1770
|
}
|
|
1761
1771
|
/**
|
|
1762
1772
|
* Extract title/heading text from a block
|
|
@@ -2260,16 +2270,63 @@ function getHeadingSpacing(spacingConfig, level) {
|
|
|
2260
2270
|
return headingConfig?.h3 || 'mt-6 mb-4';
|
|
2261
2271
|
}
|
|
2262
2272
|
const Paragraph = ({ block, context }) => {
|
|
2263
|
-
const content = getBlockTextContent(block);
|
|
2264
2273
|
const attrs = block.attributes || {};
|
|
2265
2274
|
const textAlign = getTextAlignClasses(attrs['align']);
|
|
2266
2275
|
const spacing = getSpacing(context.spacingConfig || context.registry.spacingConfig, 'paragraph', 'my-6');
|
|
2267
|
-
// Check if
|
|
2276
|
+
// Check if innerHTML contains HTML elements (like links, strong, em, etc.)
|
|
2277
|
+
const hasHTML = block.innerHTML && /<[a-z][\s\S]*>/i.test(block.innerHTML);
|
|
2278
|
+
// If innerHTML contains HTML elements, render it directly (preserves links, formatting, etc.)
|
|
2279
|
+
if (hasHTML && block.innerHTML) {
|
|
2280
|
+
const htmlContent = block.innerHTML;
|
|
2281
|
+
// Check if HTML contains shortcodes
|
|
2282
|
+
const hasShortcodes = /\[(\w+)/.test(htmlContent);
|
|
2283
|
+
if (hasShortcodes && context.registry.shortcodes) {
|
|
2284
|
+
// For HTML with shortcodes, we need to process shortcodes first
|
|
2285
|
+
// Extract text content to process shortcodes, then reconstruct
|
|
2286
|
+
const textContent = getBlockTextContent(block);
|
|
2287
|
+
const parts = renderTextWithShortcodes(textContent, context.registry);
|
|
2288
|
+
// Check if any part is a block-level element (section, div, etc.)
|
|
2289
|
+
const isBlockLevelElement = (element) => {
|
|
2290
|
+
if (!React.isValidElement(element)) {
|
|
2291
|
+
return false;
|
|
2292
|
+
}
|
|
2293
|
+
const type = element.type;
|
|
2294
|
+
// Check for block-level HTML elements
|
|
2295
|
+
if (typeof type === 'string' && ['section', 'div', 'article', 'header', 'footer', 'aside', 'nav'].includes(type)) {
|
|
2296
|
+
return true;
|
|
2297
|
+
}
|
|
2298
|
+
// Check if it's React.Fragment - recursively check its children
|
|
2299
|
+
if (type === React.Fragment) {
|
|
2300
|
+
const fragmentProps = element.props;
|
|
2301
|
+
const children = React.Children.toArray(fragmentProps.children);
|
|
2302
|
+
return children.some((child) => isBlockLevelElement(child));
|
|
2303
|
+
}
|
|
2304
|
+
// Check if it's a React component (likely block-level)
|
|
2305
|
+
if (typeof type === 'function' || (typeof type === 'object' && type !== null && type !== React.Fragment)) {
|
|
2306
|
+
return true;
|
|
2307
|
+
}
|
|
2308
|
+
return false;
|
|
2309
|
+
};
|
|
2310
|
+
const hasBlockLevelContent = React.Children.toArray(parts).some((part) => isBlockLevelElement(part));
|
|
2311
|
+
if (hasBlockLevelContent) {
|
|
2312
|
+
// Render block-level content without <p> wrapper, but add spacing wrapper
|
|
2313
|
+
return jsxRuntimeExports.jsx("div", { className: spacing, children: parts });
|
|
2314
|
+
}
|
|
2315
|
+
// For mixed HTML and shortcodes, render shortcode parts but this is complex
|
|
2316
|
+
// For now, fall back to rendering HTML with shortcodes processed in text
|
|
2317
|
+
// This is a limitation - shortcodes in HTML paragraphs with links won't work perfectly
|
|
2318
|
+
// But links will be preserved
|
|
2319
|
+
return jsxRuntimeExports.jsx("p", { className: buildClassName(spacing, textAlign), dangerouslySetInnerHTML: { __html: htmlContent } });
|
|
2320
|
+
}
|
|
2321
|
+
// No shortcodes, just render HTML directly (preserves links, formatting, etc.)
|
|
2322
|
+
return jsxRuntimeExports.jsx("p", { className: buildClassName(spacing, textAlign), dangerouslySetInnerHTML: { __html: htmlContent } });
|
|
2323
|
+
}
|
|
2324
|
+
// No HTML, use text content (existing logic for shortcodes)
|
|
2325
|
+
const content = getBlockTextContent(block);
|
|
2268
2326
|
const hasShortcodes = /\[(\w+)/.test(content);
|
|
2269
2327
|
if (hasShortcodes && context.registry.shortcodes) {
|
|
2270
2328
|
const parts = renderTextWithShortcodes(content, context.registry);
|
|
2271
2329
|
// Check if any part is a block-level element (section, div, etc.)
|
|
2272
|
-
// If so, render without wrapping in <p> to avoid DOM nesting violations
|
|
2273
2330
|
const isBlockLevelElement = (element) => {
|
|
2274
2331
|
if (!React.isValidElement(element)) {
|
|
2275
2332
|
return false;
|
|
@@ -2286,7 +2343,6 @@ const Paragraph = ({ block, context }) => {
|
|
|
2286
2343
|
return children.some((child) => isBlockLevelElement(child));
|
|
2287
2344
|
}
|
|
2288
2345
|
// Check if it's a React component (likely block-level)
|
|
2289
|
-
// Most custom components render block-level content
|
|
2290
2346
|
if (typeof type === 'function' || (typeof type === 'object' && type !== null && type !== React.Fragment)) {
|
|
2291
2347
|
return true;
|
|
2292
2348
|
}
|