-
-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: better built-in components, improved docs
- Loading branch information
1 parent
f99b52b
commit df3e783
Showing
11 changed files
with
654 additions
and
80 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
"astro-remote": minor | ||
--- | ||
|
||
Add support for custom Heading, CodeBlock, and CodeSpan components. Improve documentation. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,136 @@ | ||
# Astro Remote | ||
|
||
Render (and customize) remote HTML or Markdown content with Astro | ||
Render remote HTML or Markdown content in Astro with full control over the output. | ||
|
||
Powered by [`ultrahtml`](https://github.com/natemoo-re/ultrahtml) and [`marked`](https://github.com/markedjs/marked). | ||
|
||
## Rendering Remote Content | ||
|
||
The most basic function of `astro-remote` is to convert a string of HTML or Markdown to HTML. Use the `Markup` and `Markdown` components depending on your input. | ||
|
||
```astro | ||
--- | ||
import { Markup, Markdown } from 'astro-remote'; | ||
const { html, markdown } = await fetch('http://my-site.com/api/v1/post').then(res => res.json()); | ||
--- | ||
<Markup content={html} /> | ||
<Markdown content={markdown} /> | ||
``` | ||
|
||
### Sanitization | ||
|
||
By default, all content will be sanitized with sensible defaults (`script` blocks are dropped). This can be controlled using the [`SanitizeOptions`](https://github.com/natemoo-re/ultrahtml/blob/71e723f6093abea2584c9ea3bfecc0ce68d02d8d/src/index.ts#L251-L268) available in `ultrahtml`. Set to `false` to disable sanitization. | ||
|
||
```astro | ||
--- | ||
import { Markdown } from 'astro-remote'; | ||
const content = await fetch('http://my-site.com/api/v1/post').then(res => res.text()); | ||
--- | ||
<!-- Disallow inline `style` attributes, but allow HTML comments --> | ||
<Markdown content={content} sanitize={{ dropAttributes: { "style": ["*"] }, allowComments: true }} /> | ||
``` | ||
|
||
### Customization | ||
|
||
Both `Markup` and `Markdown` allow full control over the rendering of output. The `components` option allows you to replace a standard HTML element with a custom component. | ||
|
||
```astro | ||
--- | ||
import { Markdown } from 'astro-remote'; | ||
import Title from '../components/Title.astro'; | ||
const content = await fetch('http://my-site.com/api/v1/post').then(res => res.text()); | ||
--- | ||
<!-- Render <h1> as custom <Title> component --> | ||
<Markdown content={content} components={{ h1: Title }} /> | ||
``` | ||
|
||
In addition to built-in HTML Elements, `Markdown` also supports a few custom components for convenience. | ||
|
||
#### `<Heading />` | ||
|
||
The `Heading` component renders all `h1` through `h6` elements. It receives the following props: | ||
|
||
- `as`, the `h1` through `h6` tag | ||
- `href`, a pre-generated, slugified `href` | ||
- `text`, the text content of the children (for generating a custom slug) | ||
|
||
```astro | ||
--- | ||
import { Markdown } from 'astro-remote'; | ||
import Heading from '../components/Heading.astro'; | ||
const content = await fetch('http://my-site.com/api/v1/post').then(res => res.text()); | ||
--- | ||
<!-- Render all <h1> through <h6> using custom <Heading> component --> | ||
<Markdown content={content} components={{ Heading }} /> | ||
``` | ||
|
||
A sample `Heading` component might look something like this. | ||
|
||
```astro | ||
--- | ||
const { as: Component, href } = Astro.props; | ||
--- | ||
<Component><a href={href}><slot /></a></Component> | ||
``` | ||
|
||
#### `<CodeBlock />` | ||
|
||
The `CodeBlock` component allows you customize the rendering of code blocks. It receives the following props: | ||
|
||
- `lang`, the language specified after the three backticks (defaults to `plaintext`) | ||
- `code`, the raw code to be highlighted. **Be sure to escape the output!** | ||
- `...props`, any other attributes passed to the three backticks. These should follow HTML attribute format (`name="value"`) | ||
|
||
A sample `CodeBlock` component might look something like this. | ||
|
||
```astro | ||
--- | ||
const { lang, code, ...props } = Astro.props; | ||
const highlighted = await highlight(code, { lang }); | ||
--- | ||
<pre class={`language-${lang}`}><code set:html={highlighted} /></pre> | ||
``` | ||
|
||
#### `<CodeSpan />` | ||
|
||
The `CodeSpan` component allows you customize the rendering of inline code spans. It receives the following props: | ||
|
||
- `code`, the value of the code span | ||
|
||
A sample `CodeSpan` component might look something like this. | ||
|
||
```astro | ||
--- | ||
const { code } = Astro.props; | ||
--- | ||
<code set:text={code} /> | ||
``` | ||
|
||
### Custom Components in Markdown | ||
|
||
If you'd like to allow custom components in Markdown, you can do so using a combination of the `sanitize` and `components` options. By default, sanitization removes components. | ||
|
||
Given the following markdown source: | ||
|
||
```markdown | ||
# Hello world! | ||
|
||
<MyCustomComponent a="1" b="2" c="3">It works!</MyCustomComponent> | ||
``` | ||
|
||
```astro | ||
--- | ||
import { Markdown } from 'astro-remote'; | ||
import MyCustomComponent from '../components/MyCustomComponent.astro'; | ||
const content = await fetch('http://my-site.com/api/v1/post').then(res => res.text()); | ||
--- | ||
<Markdown content={content} sanitize={{ allowComponents: true }} components={{ MyCustomComponent }} /> | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
const { lang, code, ...props } = Astro.props; | ||
--- | ||
|
||
<pre><code set:text={code} /></pre> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
const { code } = Astro.props; | ||
--- | ||
|
||
<code data-code set:text={code}></code> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
--- | ||
const { as: Component, href } = Astro.props; | ||
--- | ||
|
||
<Component><a href={href}><slot /></a></Component> | ||
|
||
<style> | ||
h2 { | ||
color: red; | ||
} | ||
</style> |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,26 +1,50 @@ | ||
--- | ||
import { Markdown, Markup } from 'astro-remote'; | ||
import Title from '../components/Title.astro'; | ||
import { Markdown, Markup } from "astro-remote"; | ||
import CodeSpan from "../components/CodeSpan.astro"; | ||
import CodeBlock from "../components/CodeBlock.astro"; | ||
import Heading from "../components/Heading.astro"; | ||
const example = await fetch('https://example.com/').then(res => res.text()); | ||
const readme = await fetch('https://raw.githubusercontent.com/natemoo-re/astro-remote/main/README.md').then(res => res.text()); | ||
const example = await fetch("https://example.com/").then((res) => res.text()); | ||
const readme = ` | ||
# Hello \`world\` | ||
"Nice" | ||
\`inline\` | ||
\`\`\`html filename="cool" | ||
<div>Hello world!</div> | ||
\`\`\` | ||
`; | ||
// const readme = await fetch( | ||
// "https://raw.githubusercontent.com/natemoo-re/astro-remote/main/packages/astro-remote/README.md" | ||
// ).then((res) => res.text()); | ||
--- | ||
|
||
<html lang="en"> | ||
<head> | ||
<meta charset="utf-8" /> | ||
<meta name="viewport" content="width=device-width" /> | ||
<title>Astro</title> | ||
</head> | ||
<body> | ||
<div class="markup"> | ||
<h1>Markup</h1> | ||
<Markup content={example} sanitize={{ dropElements: ['head'], blockElements: ['html', 'body', 'div'] }} components={{ h1: Title }} /> | ||
</div> | ||
|
||
<div class="markdown"> | ||
<h1>Markdown</h1> | ||
<Markdown content={readme} components={{ h1: Title }} /> | ||
</div> | ||
</body> | ||
<head> | ||
<meta charset="utf-8" /> | ||
<meta name="viewport" content="width=device-width" /> | ||
<title>Astro</title> | ||
</head> | ||
<body> | ||
<div class="markup"> | ||
<h1>Markup</h1> | ||
<Markup | ||
content={example} | ||
sanitize={{ | ||
dropElements: ["head"], | ||
blockElements: ["html", "body", "div"], | ||
}} | ||
/> | ||
</div> | ||
|
||
<div class="markdown"> | ||
<h1>Markdown</h1> | ||
<Markdown | ||
content={readme} | ||
components={{ Heading, CodeBlock, CodeSpan }} | ||
/> | ||
</div> | ||
</body> | ||
</html> |
Oops, something went wrong.