c15cb36636
* Fix shape of Markdown component to work with the language-server * Add changeset
55 lines
1.4 KiB
Text
55 lines
1.4 KiB
Text
---
|
|
export interface Props {
|
|
content?: string;
|
|
}
|
|
|
|
// NOTE(fks): We are most likely moving this component out of Astro core
|
|
// in a few weeks. Checking the name like this is a bit of a hack, but we
|
|
// intentionally don't want to add an SSR flag for others to read from, just yet.
|
|
if (Astro.redirect.name !== '_onlyAvailableInSSR') {
|
|
console.error(`\x1B[31mThe <Markdown> component is not available in SSR. See https://github.com/withastro/rfcs/discussions/179 for more info.\x1B[39m`);
|
|
}
|
|
|
|
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 {
|
|
$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 />}
|
|
</>
|