https://github.com/cryptpad/hyperjson
An abstract datatype compatible with the hyperscript API
https://github.com/cryptpad/hyperjson
cryptpad
Last synced: 10 months ago
JSON representation
An abstract datatype compatible with the hyperscript API
- Host: GitHub
- URL: https://github.com/cryptpad/hyperjson
- Owner: cryptpad
- License: lgpl-2.1
- Created: 2016-02-10T15:19:08.000Z (over 10 years ago)
- Default Branch: master
- Last Pushed: 2024-02-14T14:20:31.000Z (about 2 years ago)
- Last Synced: 2025-07-08T07:44:20.818Z (10 months ago)
- Topics: cryptpad
- Language: JavaScript
- Homepage:
- Size: 33.2 KB
- Stars: 3
- Watchers: 10
- Forks: 3
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# hyperjson
An abstract datatype compatible with the [hyperscript](https://github.com/dominictarr/hyperscript "Hyperscript on github") API.
## What's _hyperscript_?
Hyperscript is everything you need to know about a dom element to be able to recreate it.
Instead of writing `
Hello!
` you write `h('h1', 'Hello!')`.
Hyperscript works clientside and serverside, and there are now several other projects adhering to the same API.
## What's _hyperjson_?
Hyperjson is an abstraction of the data component (the arguments passed to the `h` function) from the function itself.
It is intended to be used clientside.
It provides two functions:
### `fromDOM(domElement[, predicate, filter])`
Accepts any DOM element and returns JSON (HyperJSON) representing all the relevant attributes of that DOM element and its children.
`fromDOM` accepts two optional arguments, both of which are functions:
#### predicate(DOMElement)
If you provide this function, `fromDOM` will call it for every element which it will attempt to serialize.
If the predicate returns a truthy value, it will proceed to serialize it and its children.
If the predicate returns a falsey value, it will terminate.
```
var hj = Hyperjson.fromDOM(document.body, function (el) {
// suppose you don't want to serialize h4 elements or their children
return el.tagName !== 'H4';
});
```
#### filter(hyperjson)
After having serialized the tree, but before returning the results, `fromDOM` will run the contents through `filter`.
At this point, you are free to modify the hyperjson in any way, adding/removing/modifying elements as necessary for your purposes.
Anything that you don't want serialized should be filtered here.
```
var hj = Hyperjson.fromDOM(document.body, null, function (h) {
// suppose you want to serialize 'STRIKE' as 'S' elements
if (h[0] === 'STRIKE') {
// this will replace recursively
h[0] === 'S';
}
return h;
});
```
### `callOn(hyperJSON, callback)`
Accepts valid hyperjson and a callback which adheres to the Hyperscript API:
```
function myCallback (tagType, attributes, children) {
/* your code here */
};
```
The most prominent examples of callbacks are [hyperscript](https://github.com/dominictarr/hyperscript) and [virtual-hyperscript](https://github.com/Matt-Esch/virtual-dom), which produce DOM elements or virtual-DOM elements, respectively.
You can create custom plugins for filtering or modifying elements, or for producing alternative data structures that adhere to a similar structure.
## License
This library is currently licensed as LGPL-2.1. Previous versions of this library (v1.4.0 and below) were licensed as AGPL-3.0.