https://github.com/webreflection/domtagger
The hyperHTML's template literal parser
https://github.com/webreflection/domtagger
Last synced: about 1 year ago
JSON representation
The hyperHTML's template literal parser
- Host: GitHub
- URL: https://github.com/webreflection/domtagger
- Owner: WebReflection
- License: isc
- Created: 2018-11-28T09:42:57.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2023-04-05T14:28:56.000Z (over 3 years ago)
- Last Synced: 2025-06-15T08:56:37.335Z (about 1 year ago)
- Language: JavaScript
- Size: 130 KB
- Stars: 45
- Watchers: 2
- Forks: 3
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# domtagger
[](https://travis-ci.com/WebReflection/domtagger) [](https://coveralls.io/github/WebReflection/domtagger?branch=master) [](https://greenkeeper.io/) 
The [hyperHTML](https://github.com/WebReflection/hyperHTML#hyperhtml)'s template literal parser, used to handle all repeated updates per each attribute or node.
* CDN as global utility, via https://unpkg.com/domtagger
* ESM via `import domtagger from 'domtagger'`
* CJS via `const domtagger = require('domtagger')`
[Live test](https://webreflection.github.io/domtagger/test/)
### Example
The tagger accepts a configuration object with mandatory methods that should return a function to invoke per each update.
Optionally, the object could have a `type` property, as either `html` or `svg` string, and a `transform` method that must return some string as content, after receiving the markup that is going to be used.
```js
var html = domtagger({
// can be html or svg
type: 'html',
// how to handle attributes
// Note: this callback is simplified for example purpose.
// The node is the attribute owner
attribute: function (node, name, attribute) {
return function (value) {
var type = typeof value;
if (type === 'boolean' || type === 'function')
node[name] = value;
else if (value == null)
node.removeAttribute(name);
else
node.setAttribute(name, value);
}
},
// how to handle generic content
// Note: this callback is simplified for example purpose.
// The comment node is the hole placeholder
// use domdiff or other techniques to handle nodes
any: function (comment, childNodes) {
var parentNode = comment.parentNode;
return function (html) {
parentNode.innerHTML = html;
};
},
// how to handle cases where content
// can only be some text
// The node is one that can only have text
text: function (node) {
return function (textContent) {
node.textContent = textContent;
};
},
// OPTIONAL
// a man in the middle for the output
// The html string is what will be used to generate the content
// this is always invoked after sanitizing the template parts
transform: function (html) {
// it must return the eventually transformed html
return html;
},
// for adventurous 3rd parts libraries only:
// previously internally known as `sanitize`,
// it will run before transform and it must return a *string*
// that contains domconstants.UID/UIDC in the right place
// or the whole library will break
convert: function (template) {
// see domsanitizer logic
// https://github.com/WebReflection/domsanitizer/blob/master/esm/index.js
// or see a possible wrap solution/hint/workaround
// https://github.com/WebReflection/domtagger/issues/17#issuecomment-526151473
return template.join(domconstants.UIDC).replace(sani, tize);
}
});
document.body.appendChild(
render({
onclick: function (e) {
alert(e.currentTarget.outerHTML);
},
html: 'Hello domtagger!',
text: "isn't this cool?"
})
);
// render example
function render(model) {
return html`
${model.html}
${model.text}
`;
}
```
#### About devs-only comments
If you'd like to create a dev only comment that will be removed at runtime once parsed, you can either start the comment with a ghost emoji 👻 or use `/*` and `*/` right at the boundaries of the comment.
```html
```