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