# preact-markup [![NPM](http://img.shields.io/npm/v/preact-markup.svg)](https://www.npmjs.com/package/preact-markup) [![travis-ci](https://travis-ci.org/developit/preact-markup.svg)](https://travis-ci.org/developit/preact-markup) A `` component that renders HTML (or XML) using Virtual DOM, mapping a set of element names to Components. Works beautifully with [Preact]. > **Think of this like an HTML5 renderer where Web Components are implemented as [Preact] Components**. ### :zap: **[JSFiddle Demo](https://jsfiddle.net/developit/narb8qmo/)** :zap: demo preview ## Use Cases - Component-base app design and/or layout via HTML - Define app structure using a standard HTML CMS - Support arbitrary component extensions by allowing safe HTML - Build using Custom Elements, implemented using React's API --- ### Overview The `` component takes some `markup`, an optional mapping of custom element names to `components`, and an optional `type` of either `xml` or `html`. In it's simplest form, `` is just a diffing XML/HTML renderer. It only re-renders when you change the `markup` prop. ```js import Markup from 'preact-markup'; let html = `

hello

Testing 1 2 3...

`; render(, document.body); ``` > **Note:** by default, content is parsed as XML, which may be too strict for your content but is the fastest option. Pass `type="html"` to parse as HTML. ### Custom Elements via Components The real value of `` is seen when passing a `components` prop. This prop is an Object that lets us map any HTML/XML element name to a preact Component. The mapped component is injected and rendered as if it had been referenced from within JSX. HTML attributes defined on the custom element in `markup` get passed to the mapped Component as `props`. ```js import Markup from 'preact-markup'; const Sidebar = ({ title, children }) => ( ); let html = `

Hello, World

Sidebar contents.

`; render(, document.body); ``` When `render()` is invoked, Our `` component is substituted for the `` element, which means it gets mounted and rendered like a normal Preact Component. The result is this HTML DOM: ```html

Hello, World

``` Subsequent `render()`s diff against that DOM just like a normal JSX rendering flow would. ### Optional properties `type` - By default, content is parsed as XML. Pass `type="html"` to use an HTML parser. `onError` - Suppress XML/HTML parse errors and instead pass them to this function. `allow-scripts` - By default, preact-markup sanitizes the rendered HTML by removing script tags. The `allow-scripts` property re-enables script tags, _executing any JavaScript code within them_. > ##### Example > > ```js > let markup = `hello!

asdflkj

`; > render(, document.body); > ``` --- ### License [MIT] [Preact]: https://github.com/developit/preact [MIT]: http://choosealicense.com/licenses/mit/