49 lines
1 KiB
Text
49 lines
1 KiB
Text
---
|
|
export interface Props {
|
|
content?: string;
|
|
}
|
|
|
|
const dedent = (str: string) => {
|
|
const _str = str.split('\n').filter(s => s.trimStart().length > 0);
|
|
if (_str.length === 0) {
|
|
return str.trimStart();
|
|
}
|
|
const trimmedSpace = _str[0].replace(_str[0].trimStart(), '');
|
|
return str
|
|
.split('\n')
|
|
.map((ln) => ln.startsWith(trimmedSpace) ? ln.replace(trimmedSpace, '') : ln)
|
|
.join('\n');
|
|
}
|
|
|
|
// Internal props that should not be part of the external interface.
|
|
interface InternalProps extends Props {
|
|
class: string;
|
|
$scope: string;
|
|
}
|
|
|
|
let { content, class: className } = Astro.props as InternalProps;
|
|
let html = null;
|
|
let htmlContent = '';
|
|
|
|
// If no content prop provided, use the slot.
|
|
if (!content) {
|
|
content = await Astro.slots.render('default');
|
|
if (content !== undefined && content !== null) {
|
|
content = dedent(content);
|
|
}
|
|
}
|
|
|
|
if (content) {
|
|
htmlContent = await (Astro as any).__renderMarkdown(content, {
|
|
$: {
|
|
scopedClassName: className,
|
|
},
|
|
});
|
|
}
|
|
|
|
html = htmlContent;
|
|
---
|
|
|
|
<>
|
|
{html ? <Fragment set:html={html} /> : <slot />}
|
|
</>
|