https://github.com/gofunky/trumpet
parse and transform streaming html using css selectors
https://github.com/gofunky/trumpet
html-stream js library modifier node parser selector stream
Last synced: 6 months ago
JSON representation
parse and transform streaming html using css selectors
- Host: GitHub
- URL: https://github.com/gofunky/trumpet
- Owner: gofunky
- License: mit
- Created: 2019-02-17T14:56:13.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2026-01-19T18:27:12.000Z (6 months ago)
- Last Synced: 2026-01-20T00:48:10.522Z (6 months ago)
- Topics: html-stream, js, library, modifier, node, parser, selector, stream
- Language: JavaScript
- Homepage: https://trumpet.gofunky.fun
- Size: 720 KB
- Stars: 14
- Watchers: 1
- Forks: 1
- Open Issues: 26
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# trumpet
[](https://github.com/gofunky/trumpet/actions)
[](https://codecov.io/gh/gofunky/trumpet)
[](https://app.renovatebot.com/dashboard#github/gofunky/trumpet)
[](https://libraries.io/npm/@gofunky%2Ftrumpet)
[](https://snyk.io/test/github/gofunky/trumpet)
[](https://standardjs.com)
[](https://www.codefactor.io/repository/github/gofunky/trumpet)
[](https://www.npmjs.com/package/@gofunky/trumpet)
[](https://www.npmjs.com/package/@gofunky/trumpet)
[](https://www.npmjs.com/package/@gofunky/trumpet)
[](https://github.com/gofunky/trumpet/blob/master/LICENSE)
[](https://github.com/gofunky/trumpet/commits/master)
the maintained version of [trumpet](https://github.com/substack/node-trumpet)
## Examples
### Replace inner
#### Input HTML
```html
blah blah blah
there
it
is
```
#### Code
```js
const trumpet = require('@gofunky/trumpet')
const tr = trumpet()
tr.pipe(process.stdout)
const ws = tr.select('tbody').createWriteStream()
ws.end('rawr')
const fs = require('fs')
fs.createReadStream(__dirname + '/html/table.html').pipe(tr)
```
#### Output
```html
rawr
there
it
is
```
### Read all
#### Input HTML
```html
beep
¡¡¡
tacos
y
burritos
!!!
```
#### Code
```js
const trumpet = require('@gofunky/trumpet')
const tr = trumpet()
tr.selectAll('.b span', (span) => {
span.createReadStream().pipe(process.stdout)
})
const fs = require('fs')
fs.createReadStream(__dirname + '/html/read_all.html').pipe(tr)
```
#### Output
```html
tacos y burritos
```
### Read, modify, and write
#### Input HTML
```html
hack
the
planet
```
#### Code
```js
const trumpet = require('@gofunky/trumpet')
const through = require('through2')
const tr = trumpet()
//select all element and apply transformation function to selections
tr.selectAll('.x span', (element) => {
//define function to transform input
const upper = through((buf) => {
this.queue(String(buf).toUpperCase())
})
//create a read/write stream for selected selement
const stream = element.createStream()
//stream the element's inner html to transformation function
//then stream the transformed output back into the element stream
stream.pipe(upper).pipe(stream)
//stream in html to trumpet and stream processed output to stdout
const fs = require('fs')
fs.createReadStream(__dirname + '/html/uppercase.html').pipe(tr).pipe(process.stdout)
```
#### Output
```html
HACK
THE
PLANET
```
## Methods
```js
const trumpet = require('@gofunky/trumpet')
```
### `const tr = trumpet(opts)`
Create a new trumpet stream. This stream is readable and writable.
Pipe an html stream into `tr` and get back a transformed html stream.
Parse errors are emitted by `tr` in an `'error'` event.
### `const elem = tr.select(selector)`
Return a result object `elem` for the first element matching `selector`.
### `tr.selectAll(selector, (elem) => {})`
Get a result object `elem` for every element matching `selector`.
### `elem.getAttribute(name, cb)`
When the selector for `elem` matches, query the case-insensitive attribute
called `name` with `cb(value)`.
Returns `elem`.
### `elem.getAttributes(name, cb)`
Get all the elements in `cb(attributes)` as an object `attributes` with
lower-case keys.
Returns `elem`.
### `elem.setAttribute(name, value)`
When the selector for `elem` matches, replace the case-insensitive attribute
called `name` with `value`.
If the attribute doesn't exist, it will be created in the output stream.
Returns `elem`.
### `elem.removeAttribute(name)`
When the selector for `elem` matches, remove the attribute called `name` if it
exists.
Returns `elem`.
### `elem.createReadStream(opts)`
Create a new readable stream with the inner html content under `elem`.
To use the outer html content instead of the inner, set `opts.outer` to `true`.
### `elem.createWriteStream(opts)`
Create a new write stream to replace the inner html content under `elem`.
To use the outer html content instead of the inner, set `opts.outer` to `true`.
### `elem.createStream(opts)`
Create a new readable writable stream that outputs the content under `elem` and
replaces the content with the data written to it.
To use the outer html content instead of the inner, set `opts.outer` to `true`.
### `tr.createStream(sel, opts)`
Short-hand for `tr.select(sel).createStream(opts)`.
### `tr.createReadStream(sel, opts)`
Short-hand for `tr.select(sel).createReadStream(opts)`.
### `tr.createWriteStream(sel, opts)`
Short-hand for `tr.select(sel).createWriteStream(opts)`.
## Attributes
### `elem.name`
The element name as a lower-case string. For example: `'div'`.
## Selector syntax
Currently, these [css selectors](http://www.w3.org/TR/CSS2/selector.html) work:
- `*`
- `E`
- `E F`
- `E > F`
- `E + F`
- `E.class`
- `E#id`
- `E[attr=value]`
- `E[attr~=search]`
- `E[attr|=prefix]`
- `E[attr^=prefix]`
- `E[attr$=suffix]`
- `E[attr*=search]`