This commit is contained in:
235
node_modules/hast-util-from-parse5/index.js
generated
vendored
Normal file
235
node_modules/hast-util-from-parse5/index.js
generated
vendored
Normal file
@@ -0,0 +1,235 @@
|
||||
'use strict'
|
||||
|
||||
var html = require('property-information/html')
|
||||
var svg = require('property-information/svg')
|
||||
var find = require('property-information/find')
|
||||
var ns = require('web-namespaces')
|
||||
var s = require('hastscript/svg')
|
||||
var h = require('hastscript')
|
||||
var xtend = require('xtend')
|
||||
var count = require('ccount')
|
||||
|
||||
module.exports = wrapper
|
||||
|
||||
var own = {}.hasOwnProperty
|
||||
|
||||
// Handlers.
|
||||
var map = {
|
||||
'#document': root,
|
||||
'#document-fragment': root,
|
||||
'#text': text,
|
||||
'#comment': comment,
|
||||
'#documentType': doctype
|
||||
}
|
||||
|
||||
// Wrapper to normalise options.
|
||||
function wrapper(ast, options) {
|
||||
var settings = options || {}
|
||||
var file
|
||||
|
||||
if (settings.messages) {
|
||||
file = settings
|
||||
settings = {}
|
||||
} else {
|
||||
file = settings.file
|
||||
}
|
||||
|
||||
return transform(ast, {
|
||||
schema: settings.space === 'svg' ? svg : html,
|
||||
file: file,
|
||||
verbose: settings.verbose,
|
||||
location: false
|
||||
})
|
||||
}
|
||||
|
||||
// Transform a node.
|
||||
function transform(ast, config) {
|
||||
var schema = config.schema
|
||||
var fn = own.call(map, ast.nodeName) ? map[ast.nodeName] : element
|
||||
var children
|
||||
var node
|
||||
var pos
|
||||
|
||||
if (fn === element) {
|
||||
config.schema = ast.namespaceURI === ns.svg ? svg : html
|
||||
}
|
||||
|
||||
if (ast.childNodes) {
|
||||
children = nodes(ast.childNodes, config)
|
||||
}
|
||||
|
||||
node = fn(ast, children, config)
|
||||
|
||||
if (ast.sourceCodeLocation && config.file) {
|
||||
pos = location(node, ast.sourceCodeLocation, config)
|
||||
|
||||
if (pos) {
|
||||
config.location = true
|
||||
node.position = pos
|
||||
}
|
||||
}
|
||||
|
||||
config.schema = schema
|
||||
|
||||
return node
|
||||
}
|
||||
|
||||
// Transform children.
|
||||
function nodes(children, config) {
|
||||
var length = children.length
|
||||
var index = -1
|
||||
var result = []
|
||||
|
||||
while (++index < length) {
|
||||
result[index] = transform(children[index], config)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
// Transform a document.
|
||||
// Stores `ast.quirksMode` in `node.data.quirksMode`.
|
||||
function root(ast, children, config) {
|
||||
var node = {type: 'root', children: children, data: {}}
|
||||
var doc
|
||||
|
||||
node.data.quirksMode = ast.mode === 'quirks' || ast.mode === 'limited-quirks'
|
||||
|
||||
if (config.file && config.location) {
|
||||
doc = String(config.file)
|
||||
|
||||
node.position = {
|
||||
start: {line: 1, column: 1, offset: 0},
|
||||
end: {
|
||||
line: count(doc, '\n') + 1,
|
||||
column: doc.length - doc.lastIndexOf('\n'),
|
||||
offset: doc.length
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return node
|
||||
}
|
||||
|
||||
// Transform a doctype.
|
||||
function doctype(ast) {
|
||||
return {
|
||||
type: 'doctype',
|
||||
name: ast.name || '',
|
||||
public: ast.publicId || null,
|
||||
system: ast.systemId || null
|
||||
}
|
||||
}
|
||||
|
||||
// Transform a text.
|
||||
function text(ast) {
|
||||
return {type: 'text', value: ast.value}
|
||||
}
|
||||
|
||||
// Transform a comment.
|
||||
function comment(ast) {
|
||||
return {type: 'comment', value: ast.data}
|
||||
}
|
||||
|
||||
// Transform an element.
|
||||
function element(ast, children, config) {
|
||||
var fn = config.schema.space === 'svg' ? s : h
|
||||
var name = ast.tagName
|
||||
var attributes = ast.attrs
|
||||
var length = attributes.length
|
||||
var props = {}
|
||||
var index = -1
|
||||
var attribute
|
||||
var prop
|
||||
var node
|
||||
var pos
|
||||
var start
|
||||
var end
|
||||
|
||||
while (++index < length) {
|
||||
attribute = attributes[index]
|
||||
prop = (attribute.prefix ? attribute.prefix + ':' : '') + attribute.name
|
||||
props[prop] = attribute.value
|
||||
}
|
||||
|
||||
node = fn(name, props, children)
|
||||
|
||||
if (name === 'template' && 'content' in ast) {
|
||||
pos = ast.sourceCodeLocation
|
||||
start = pos && pos.startTag && position(pos.startTag).end
|
||||
end = pos && pos.endTag && position(pos.endTag).start
|
||||
|
||||
node.content = transform(ast.content, config)
|
||||
|
||||
if ((start || end) && config.file) {
|
||||
node.content.position = {start: start, end: end}
|
||||
}
|
||||
}
|
||||
|
||||
return node
|
||||
}
|
||||
|
||||
// Create clean positional information.
|
||||
function location(node, location, config) {
|
||||
var schema = config.schema
|
||||
var verbose = config.verbose
|
||||
var pos = position(location)
|
||||
var reference
|
||||
var attributes
|
||||
var attribute
|
||||
var props
|
||||
var prop
|
||||
|
||||
if (node.type === 'element') {
|
||||
reference = node.children[node.children.length - 1]
|
||||
|
||||
// Bug for unclosed with children.
|
||||
// See: <https://github.com/inikulin/parse5/issues/109>.
|
||||
if (
|
||||
!location.endTag &&
|
||||
reference &&
|
||||
reference.position &&
|
||||
reference.position.end
|
||||
) {
|
||||
pos.end = xtend(reference.position.end)
|
||||
}
|
||||
|
||||
if (verbose) {
|
||||
attributes = location.attrs
|
||||
props = {}
|
||||
|
||||
for (attribute in attributes) {
|
||||
prop = find(schema, attribute).property
|
||||
props[prop] = position(attributes[attribute])
|
||||
}
|
||||
|
||||
node.data = {
|
||||
position: {
|
||||
opening: position(location.startTag),
|
||||
closing: location.endTag ? position(location.endTag) : null,
|
||||
properties: props
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return pos
|
||||
}
|
||||
|
||||
function position(loc) {
|
||||
var start = point({
|
||||
line: loc.startLine,
|
||||
column: loc.startCol,
|
||||
offset: loc.startOffset
|
||||
})
|
||||
var end = point({
|
||||
line: loc.endLine,
|
||||
column: loc.endCol,
|
||||
offset: loc.endOffset
|
||||
})
|
||||
return start || end ? {start: start, end: end} : null
|
||||
}
|
||||
|
||||
function point(point) {
|
||||
return point.line && point.column ? point : null
|
||||
}
|
||||
22
node_modules/hast-util-from-parse5/license
generated
vendored
Normal file
22
node_modules/hast-util-from-parse5/license
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
'Software'), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
89
node_modules/hast-util-from-parse5/package.json
generated
vendored
Normal file
89
node_modules/hast-util-from-parse5/package.json
generated
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
{
|
||||
"name": "hast-util-from-parse5",
|
||||
"version": "5.0.3",
|
||||
"description": "hast utility to transform from Parse5’s AST",
|
||||
"license": "MIT",
|
||||
"keywords": [
|
||||
"unist",
|
||||
"hast",
|
||||
"hast-util",
|
||||
"util",
|
||||
"utility",
|
||||
"transform",
|
||||
"change",
|
||||
"ast"
|
||||
],
|
||||
"repository": "syntax-tree/hast-util-from-parse5",
|
||||
"bugs": "https://github.com/syntax-tree/hast-util-from-parse5/issues",
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/unified"
|
||||
},
|
||||
"author": "Titus Wormer <tituswormer@gmail.com> (https://wooorm.com)",
|
||||
"contributors": [
|
||||
"Titus Wormer <tituswormer@gmail.com> (https://wooorm.com)"
|
||||
],
|
||||
"files": [
|
||||
"index.js"
|
||||
],
|
||||
"dependencies": {
|
||||
"ccount": "^1.0.3",
|
||||
"hastscript": "^5.0.0",
|
||||
"property-information": "^5.0.0",
|
||||
"web-namespaces": "^1.1.2",
|
||||
"xtend": "^4.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"browserify": "^16.0.0",
|
||||
"is-hidden": "^1.0.0",
|
||||
"not": "^0.1.0",
|
||||
"nyc": "^15.0.0",
|
||||
"parse5": "^5.0.0",
|
||||
"prettier": "^1.0.0",
|
||||
"remark-cli": "^7.0.0",
|
||||
"remark-preset-wooorm": "^6.0.0",
|
||||
"tape": "^4.0.0",
|
||||
"tinyify": "^2.0.0",
|
||||
"to-vfile": "^6.0.0",
|
||||
"unist-util-visit": "^2.0.0",
|
||||
"xo": "^0.27.0"
|
||||
},
|
||||
"scripts": {
|
||||
"format": "remark . -qfo && prettier --write \"**/*.js\" && xo --fix",
|
||||
"build-bundle": "browserify index.js -s hastUtilFromParse5 > hast-util-from-parse5.js",
|
||||
"build-mangle": "browserify index.js -p tinyify -s hastUtilFromParse5 > hast-util-from-parse5.min.js",
|
||||
"build": "npm run build-bundle && npm run build-mangle",
|
||||
"test-api": "node test",
|
||||
"test-coverage": "nyc --reporter lcov tape test",
|
||||
"test": "npm run format && npm run build && npm run test-coverage"
|
||||
},
|
||||
"prettier": {
|
||||
"tabWidth": 2,
|
||||
"useTabs": false,
|
||||
"singleQuote": true,
|
||||
"bracketSpacing": false,
|
||||
"semi": false,
|
||||
"trailingComma": "none"
|
||||
},
|
||||
"xo": {
|
||||
"prettier": true,
|
||||
"esnext": false,
|
||||
"rules": {
|
||||
"guard-for-in": "off"
|
||||
},
|
||||
"ignores": [
|
||||
"hast-util-from-parse5.js"
|
||||
]
|
||||
},
|
||||
"nyc": {
|
||||
"check-coverage": true,
|
||||
"lines": 100,
|
||||
"functions": 100,
|
||||
"branches": 100
|
||||
},
|
||||
"remarkConfig": {
|
||||
"plugins": [
|
||||
"preset-wooorm"
|
||||
]
|
||||
}
|
||||
}
|
||||
212
node_modules/hast-util-from-parse5/readme.md
generated
vendored
Normal file
212
node_modules/hast-util-from-parse5/readme.md
generated
vendored
Normal file
@@ -0,0 +1,212 @@
|
||||
# hast-util-from-parse5
|
||||
|
||||
[![Build][build-badge]][build]
|
||||
[![Coverage][coverage-badge]][coverage]
|
||||
[![Downloads][downloads-badge]][downloads]
|
||||
[![Size][size-badge]][size]
|
||||
[![Sponsors][sponsors-badge]][collective]
|
||||
[![Backers][backers-badge]][collective]
|
||||
[![Chat][chat-badge]][chat]
|
||||
|
||||
[**hast**][hast] utility to transform [Parse5’s AST][ast] to a hast
|
||||
[*tree*][tree].
|
||||
|
||||
## Install
|
||||
|
||||
[npm][]:
|
||||
|
||||
```sh
|
||||
npm install hast-util-from-parse5
|
||||
```
|
||||
|
||||
## Use
|
||||
|
||||
Say we have the following file, `example.html`:
|
||||
|
||||
```html
|
||||
<!doctype html><title>Hello!</title><h1 id="world">World!<!--after-->
|
||||
```
|
||||
|
||||
And our script, `example.js`, looks as follows:
|
||||
|
||||
```js
|
||||
var vfile = require('to-vfile')
|
||||
var parse5 = require('parse5')
|
||||
var inspect = require('unist-util-inspect')
|
||||
var fromParse5 = require('hast-util-from-parse5')
|
||||
|
||||
var doc = vfile.readSync('example.html')
|
||||
var ast = parse5.parse(String(doc), {sourceCodeLocationInfo: true})
|
||||
var hast = fromParse5(ast, doc)
|
||||
|
||||
console.log(inspect(hast))
|
||||
```
|
||||
|
||||
Now, running `node example` yields:
|
||||
|
||||
```text
|
||||
root[2] (1:1-2:1, 0-70) [data={"quirksMode":false}]
|
||||
├─ doctype (1:1-1:16, 0-15) [name="html"]
|
||||
└─ element[2] [tagName="html"]
|
||||
├─ element[1] [tagName="head"]
|
||||
│ └─ element[1] (1:16-1:37, 15-36) [tagName="title"]
|
||||
│ └─ text: "Hello!" (1:23-1:29, 22-28)
|
||||
└─ element[1] [tagName="body"]
|
||||
└─ element[3] (1:37-2:1, 36-70) [tagName="h1"][properties={"id":"world"}]
|
||||
├─ text: "World!" (1:52-1:58, 51-57)
|
||||
├─ comment: "after" (1:58-1:70, 57-69)
|
||||
└─ text: "\n" (1:70-2:1, 69-70)
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
### `fromParse5(ast[, options])`
|
||||
|
||||
Transform [Parse5’s AST][ast] to a [**hast**][hast] [*tree*][tree].
|
||||
|
||||
##### `options`
|
||||
|
||||
If `options` is a [`VFile`][vfile], it’s treated as `{file: options}`.
|
||||
|
||||
###### `options.space`
|
||||
|
||||
Whether the [*root*][root] of the [*tree*][tree] is in the `'html'` or `'svg'`
|
||||
space (enum, `'svg'` or `'html'`, default: `'html'`).
|
||||
|
||||
If an element in with the SVG namespace is found in `ast`, `fromParse5`
|
||||
automatically switches to the SVG space when entering the element, and switches
|
||||
back when leaving.
|
||||
|
||||
###### `options.file`
|
||||
|
||||
[`VFile`][vfile], used to add [positional information][positional-information]
|
||||
to [*nodes*][node].
|
||||
If given, the [*file*][file] should have the original HTML source as its
|
||||
contents.
|
||||
|
||||
###### `options.verbose`
|
||||
|
||||
Whether to add extra positional information about starting tags, closing tags,
|
||||
and attributes to elements (`boolean`, default: `false`).
|
||||
Note: not used without `file`.
|
||||
|
||||
For the following HTML:
|
||||
|
||||
```html
|
||||
<img src="http://example.com/fav.ico" alt="foo" title="bar">
|
||||
```
|
||||
|
||||
The verbose info would looks as follows:
|
||||
|
||||
```js
|
||||
{
|
||||
type: 'element',
|
||||
tagName: 'img',
|
||||
properties: {src: 'http://example.com/fav.ico', alt: 'foo', title: 'bar'},
|
||||
children: [],
|
||||
data: {
|
||||
position: {
|
||||
opening: {
|
||||
start: {line: 1, column: 1, offset: 0},
|
||||
end: {line: 1, column: 61, offset: 60}
|
||||
},
|
||||
closing: null,
|
||||
properties: {
|
||||
src: {
|
||||
start: {line: 1, column: 6, offset: 5},
|
||||
end: {line: 1, column: 38, offset: 37}
|
||||
},
|
||||
alt: {
|
||||
start: {line: 1, column: 39, offset: 38},
|
||||
end: {line: 1, column: 48, offset: 47}
|
||||
},
|
||||
title: {
|
||||
start: {line: 1, column: 49, offset: 48},
|
||||
end: {line: 1, column: 60, offset: 59}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
position: {
|
||||
start: {line: 1, column: 1, offset: 0},
|
||||
end: {line: 1, column: 61, offset: 60}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Security
|
||||
|
||||
Use of `hast-util-from-parse5` can open you up to a
|
||||
[cross-site scripting (XSS)][xss] attack if Parse5’s AST is unsafe.
|
||||
|
||||
## Contribute
|
||||
|
||||
See [`contributing.md` in `syntax-tree/.github`][contributing] for ways to get
|
||||
started.
|
||||
See [`support.md`][support] for ways to get help.
|
||||
|
||||
This project has a [code of conduct][coc].
|
||||
By interacting with this repository, organization, or community you agree to
|
||||
abide by its terms.
|
||||
|
||||
## License
|
||||
|
||||
[MIT][license] © [Titus Wormer][author]
|
||||
|
||||
<!-- Definitions -->
|
||||
|
||||
[build-badge]: https://img.shields.io/travis/syntax-tree/hast-util-from-parse5.svg
|
||||
|
||||
[build]: https://travis-ci.org/syntax-tree/hast-util-from-parse5
|
||||
|
||||
[coverage-badge]: https://img.shields.io/codecov/c/github/syntax-tree/hast-util-from-parse5.svg
|
||||
|
||||
[coverage]: https://codecov.io/github/syntax-tree/hast-util-from-parse5
|
||||
|
||||
[downloads-badge]: https://img.shields.io/npm/dm/hast-util-from-parse5.svg
|
||||
|
||||
[downloads]: https://www.npmjs.com/package/hast-util-from-parse5
|
||||
|
||||
[size-badge]: https://img.shields.io/bundlephobia/minzip/hast-util-from-parse5.svg
|
||||
|
||||
[size]: https://bundlephobia.com/result?p=hast-util-from-parse5
|
||||
|
||||
[sponsors-badge]: https://opencollective.com/unified/sponsors/badge.svg
|
||||
|
||||
[backers-badge]: https://opencollective.com/unified/backers/badge.svg
|
||||
|
||||
[collective]: https://opencollective.com/unified
|
||||
|
||||
[chat-badge]: https://img.shields.io/badge/chat-spectrum-7b16ff.svg
|
||||
|
||||
[chat]: https://spectrum.chat/unified/syntax-tree
|
||||
|
||||
[npm]: https://docs.npmjs.com/cli/install
|
||||
|
||||
[license]: license
|
||||
|
||||
[author]: https://wooorm.com
|
||||
|
||||
[contributing]: https://github.com/syntax-tree/.github/blob/master/contributing.md
|
||||
|
||||
[support]: https://github.com/syntax-tree/.github/blob/master/support.md
|
||||
|
||||
[coc]: https://github.com/syntax-tree/.github/blob/master/code-of-conduct.md
|
||||
|
||||
[ast]: https://github.com/inikulin/parse5/blob/master/packages/parse5/docs/tree-adapter/default/interface-list.md
|
||||
|
||||
[vfile]: https://github.com/vfile/vfile
|
||||
|
||||
[tree]: https://github.com/syntax-tree/unist#tree
|
||||
|
||||
[root]: https://github.com/syntax-tree/unist#root
|
||||
|
||||
[positional-information]: https://github.com/syntax-tree/unist#positional-information
|
||||
|
||||
[file]: https://github.com/syntax-tree/unist#file
|
||||
|
||||
[hast]: https://github.com/syntax-tree/hast
|
||||
|
||||
[node]: https://github.com/syntax-tree/hast#nodes
|
||||
|
||||
[xss]: https://en.wikipedia.org/wiki/Cross-site_scripting
|
||||
Reference in New Issue
Block a user