html2any 0.0.7 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,255 @@
1
+ function transform(ast, rule) {
2
+ function next(node, index) {
3
+ if (node) {
4
+ if (typeof node === 'string') {
5
+ return rule(node, undefined, index);
6
+ }
7
+ if (Array.isArray(node)) {
8
+ return node.map((n, index)=>{
9
+ if (typeof n !== 'string') {
10
+ n.index = index; // critical array element index
11
+ }
12
+ return rule(n, next(n.children), index);
13
+ });
14
+ } else {
15
+ return rule(node, next(node.children), index);
16
+ }
17
+ }
18
+ return null;
19
+ }
20
+ return next(ast);
21
+ }
22
+
23
+ const voidElementTags = [
24
+ 'area',
25
+ 'base',
26
+ 'br',
27
+ 'col',
28
+ 'embed',
29
+ 'hr',
30
+ 'img',
31
+ 'input',
32
+ 'link',
33
+ 'meta',
34
+ 'param',
35
+ 'source',
36
+ 'track',
37
+ 'wbr'
38
+ ];
39
+ function isSelfClose(tagName) {
40
+ return voidElementTags.indexOf(tagName.toLowerCase()) > -1;
41
+ }
42
+ function isPair(tagX, tagY) {
43
+ return tagX.name === tagY.name && tagX.type === 'start' && tagY.type === 'end';
44
+ }
45
+ var utils = {
46
+ isPair,
47
+ isSelfClose
48
+ };
49
+
50
+ const RAW_TEXT_TAGS = [
51
+ 'script',
52
+ 'style',
53
+ 'textarea',
54
+ 'title'
55
+ ];
56
+ function extraAttrs(str) {
57
+ let i = 0;
58
+ const attrs = {};
59
+ while(i < str.length){
60
+ while(/\s/.test(str[i]))i++;
61
+ if (!str[i] || str[i] === '/') {
62
+ break;
63
+ }
64
+ const nameStart = i;
65
+ while(str[i] && !/[\s=/>]/.test(str[i]))i++;
66
+ const key = str.slice(nameStart, i);
67
+ let value = true;
68
+ while(/\s/.test(str[i]))i++;
69
+ if (str[i] === '=') {
70
+ i++;
71
+ while(/\s/.test(str[i]))i++;
72
+ const quote = str[i];
73
+ if (quote === '"' || quote === "'") {
74
+ i++;
75
+ const valueStart = i;
76
+ while(str[i] && str[i] !== quote)i++;
77
+ value = str.slice(valueStart, i);
78
+ if (str[i] === quote) i++;
79
+ } else {
80
+ const valueStart = i;
81
+ while(str[i] && !/[\s>]/.test(str[i]))i++;
82
+ value = str.slice(valueStart, i);
83
+ }
84
+ }
85
+ if (key) {
86
+ attrs[key] = value;
87
+ }
88
+ }
89
+ return attrs;
90
+ }
91
+ function makeToken(tag) {
92
+ const isTag = tag[0] === '<' && tag[tag.length - 1] === '>';
93
+ if (!isTag) {
94
+ return {
95
+ type: 'string',
96
+ value: tag
97
+ };
98
+ } else if (/^<!--/.test(tag) || /^<!doctype/i.test(tag) || /^<\?/.test(tag)) {
99
+ return null;
100
+ } else if (tag.startsWith('</')) {
101
+ return {
102
+ type: 'end',
103
+ name: tag.slice(2, -1).trim().split(/\s+/)[0]
104
+ };
105
+ } else {
106
+ const body = tag.slice(1, -1).trim();
107
+ const match = body.match(/^([^\s/>]+)/);
108
+ if (!match) {
109
+ return null;
110
+ }
111
+ const tagName = match[1];
112
+ const tagBody = body.slice(tagName.length);
113
+ return {
114
+ type: utils.isSelfClose(tagName) || tagBody[tagBody.length - 1] === '/' ? 'self-close' : 'start',
115
+ name: tagName,
116
+ attributes: extraAttrs(tagBody)
117
+ };
118
+ }
119
+ }
120
+ function findTagEnd(html, start) {
121
+ let quote = null;
122
+ for(let i = start + 1; i < html.length; i++){
123
+ const curr = html[i];
124
+ if (quote) {
125
+ if (curr === quote) quote = null;
126
+ } else if (curr === '"' || curr === "'") {
127
+ quote = curr;
128
+ } else if (curr === '>') {
129
+ return i;
130
+ }
131
+ }
132
+ return -1;
133
+ }
134
+ function getStartTagName(tag) {
135
+ if (tag.startsWith('</') || tag.startsWith('<!') || tag.startsWith('<?')) {
136
+ return null;
137
+ }
138
+ const match = tag.slice(1, -1).trim().match(/^([^\s/>]+)/);
139
+ return match && match[1];
140
+ }
141
+ function splitTokens(html) {
142
+ let i = 0;
143
+ let j = 0;
144
+ const tokens = [];
145
+ while(i < html.length){
146
+ const curr = html[i];
147
+ if (curr === '<') {
148
+ if (html.startsWith('<!--', i)) {
149
+ const k = html.indexOf('-->', i + 4);
150
+ if (k === -1) break;
151
+ if (j < i) {
152
+ tokens.push(html.slice(j, i));
153
+ }
154
+ tokens.push(html.slice(i, k + 3));
155
+ i = j = k + 3;
156
+ continue;
157
+ }
158
+ if (j < i) {
159
+ tokens.push(html.slice(j, i));
160
+ j = i;
161
+ }
162
+ const k = findTagEnd(html, i);
163
+ if (k === -1) {
164
+ break;
165
+ }
166
+ tokens.push(html.slice(i, k + 1));
167
+ const tagName = getStartTagName(html.slice(i, k + 1));
168
+ if (tagName && RAW_TEXT_TAGS.indexOf(tagName.toLowerCase()) > -1) {
169
+ const closeTagStart = html.toLowerCase().indexOf(`</${tagName.toLowerCase()}`, k + 1);
170
+ if (closeTagStart > -1) {
171
+ const closeTagEnd = findTagEnd(html, closeTagStart);
172
+ if (closeTagEnd > -1) {
173
+ if (k + 1 < closeTagStart) {
174
+ tokens.push(html.slice(k + 1, closeTagStart));
175
+ }
176
+ tokens.push(html.slice(closeTagStart, closeTagEnd + 1));
177
+ i = j = closeTagEnd + 1;
178
+ continue;
179
+ }
180
+ }
181
+ }
182
+ i = j = k + 1;
183
+ continue;
184
+ }
185
+ i++;
186
+ }
187
+ if (j < html.length) {
188
+ tokens.push(html.slice(j));
189
+ }
190
+ return tokens;
191
+ }
192
+ function tokenize(html) {
193
+ return splitTokens(html).map((s)=>s.replace(/^\n+$/g, '')).map((s)=>s.trim()).filter(Boolean).map(makeToken).filter(Boolean);
194
+ }
195
+
196
+ function isEmpty(stack) {
197
+ return stack.length === 0;
198
+ }
199
+ function getTop(stack) {
200
+ return stack[stack.length - 1];
201
+ }
202
+ function appendChild(node, child) {
203
+ if (!node.children) {
204
+ node.children = [];
205
+ }
206
+ node.children.push(filterProps(child));
207
+ }
208
+ function filterProps(node) {
209
+ if (typeof node === 'string') {
210
+ return node;
211
+ }
212
+ return [
213
+ 'name',
214
+ 'children',
215
+ 'attributes'
216
+ ].reduce((r, c)=>Object.assign({}, r, {
217
+ [c]: node[c]
218
+ }), {});
219
+ }
220
+ function parse(src) {
221
+ const tokens = tokenize(src);
222
+ const stack = [];
223
+ const tree = {
224
+ type: 'root',
225
+ children: []
226
+ };
227
+ stack.push(tree);
228
+ while(!isEmpty(stack) && !isEmpty(tokens)){
229
+ const curr = tokens.shift();
230
+ const top = getTop(stack);
231
+ if (curr.type === 'string') {
232
+ appendChild(top, curr.value);
233
+ } else if (utils.isPair(top, curr)) {
234
+ const node = stack.pop();
235
+ if (!isEmpty(stack)) {
236
+ appendChild(getTop(stack), node);
237
+ }
238
+ } else if (curr.type === 'self-close') {
239
+ appendChild(top, curr);
240
+ } else if (curr.type === 'start') {
241
+ stack.push(curr);
242
+ }
243
+ }
244
+ while(stack.length > 1){
245
+ const node = stack.pop();
246
+ appendChild(getTop(stack), node);
247
+ }
248
+ return tree.children;
249
+ }
250
+
251
+ function html2any(html, rule) {
252
+ return transform(parse(html)[0], rule);
253
+ }
254
+
255
+ export { html2any as default, parse, transform };
package/package.json CHANGED
@@ -1,30 +1,50 @@
1
1
  {
2
2
  "name": "html2any",
3
- "version": "0.0.7",
4
- "description": "parse html to ast and transform to anything you need",
5
- "main": "./lib/index.js",
6
- "exports": {
7
- "import": "./lib/index.mjs",
8
- "require": "./lib/index.js"
3
+ "version": "0.1.1",
4
+ "description": "understand html with flexible transform",
5
+ "keywords": [
6
+ "html",
7
+ "parser",
8
+ "transform",
9
+ "html-transform",
10
+ "html-parser"
11
+ ],
12
+ "homepage": "https://github.com/huozhi/html2any#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/huozhi/html2any/issues"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/huozhi/html2any.git"
9
19
  },
20
+ "type": "module",
21
+ "main": "dist/index.js",
10
22
  "scripts": {
11
- "test": "yarn node --experimental-vm-modules $(yarn bin jest)",
12
- "build": "rm -rf lib && bunchee src/index.js"
23
+ "test": "bun test",
24
+ "build": "bunchee",
25
+ "prepublishOnly": "bun run build",
26
+ "web:dev": "next dev web",
27
+ "web:build": "next build web",
28
+ "web:check-load": "node web/scripts/check-load.mjs",
29
+ "web:start": "next start web"
13
30
  },
14
31
  "files": [
15
32
  "*.md",
16
- "lib"
33
+ "dist"
17
34
  ],
18
- "type": "module",
19
- "jest": {
20
- "transform": {}
21
- },
22
35
  "author": "huozhi",
23
36
  "license": "MIT",
24
37
  "devDependencies": {
25
- "bunchee": "^1.8.2",
26
- "jest": "^27.4.7",
27
- "react": "^17.0.2",
28
- "react-test-renderer": "^17.0.2"
38
+ "bunchee": "^6.10.0",
39
+ "react": "^19.2.6",
40
+ "next": "^16.2.6",
41
+ "react-dom": "^19.2.6",
42
+ "tailwindcss": "^4.3.0",
43
+ "@tailwindcss/postcss": "^4.3.0",
44
+ "sugar-high": "^1.2.0",
45
+ "typescript": "^6.0.3",
46
+ "@types/node": "^25.9.1",
47
+ "@types/react": "^19.2.15",
48
+ "@types/react-dom": "^19.2.3"
29
49
  }
30
50
  }
package/lib/index.js DELETED
@@ -1,198 +0,0 @@
1
- function transform(ast, rule) {
2
- function next(node) {
3
- if (node) {
4
- if (typeof node === 'string') {
5
- return rule(node);
6
- }
7
-
8
- if (Array.isArray(node)) {
9
- return node.map(function (n, index) {
10
- if (typeof n !== 'string') {
11
- n.index = index; // critical array element index
12
- }
13
-
14
- return rule(n, next(n.children));
15
- });
16
- } else {
17
- return rule(node, next(node.children));
18
- }
19
- }
20
-
21
- return null;
22
- }
23
-
24
- return next(ast);
25
- }
26
-
27
- var voidElementTags = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'];
28
-
29
- function isSelfClose(tagName) {
30
- return voidElementTags.indexOf(tagName) > -1;
31
- }
32
-
33
- function isPair(tagX, tagY) {
34
- return tagX.name === tagY.name && tagX.type === 'start' && tagY.type === 'end';
35
- }
36
-
37
- var utils = {
38
- isPair: isPair,
39
- isSelfClose: isSelfClose
40
- };
41
-
42
- var ATTR_FIND = /((^\w|\s+)[a-zA-Z-:]+)(="[^"]+"|\s+|\s*$)?/;
43
-
44
- function extraAttrs(str) {
45
- var i = 0;
46
- var attrs = {};
47
-
48
- while (i < str.length) {
49
- var suffix = str.slice(i);
50
- var match = ATTR_FIND.exec(suffix);
51
-
52
- if (!match || !match[1]) {
53
- break;
54
- }
55
-
56
- var result = match[0];
57
- var key = match[1];
58
- var value = match[3];
59
- key = key.trim();
60
- value = value && value.trim();
61
- attrs[key] = value && value[0] === '=' ? value.slice(2, -1) : true;
62
- i += result.length;
63
- }
64
-
65
- return attrs;
66
- }
67
-
68
- function makeToken(tag) {
69
- var isTag = tag[0] === '<' && tag[tag.length - 1] === '>';
70
-
71
- if (!isTag) {
72
- return {
73
- type: 'string',
74
- value: tag
75
- };
76
- } else if (tag.startsWith('</')) {
77
- return {
78
- type: 'end',
79
- name: tag.slice(2, -1)
80
- };
81
- } else {
82
- var match = tag.match(/<([\w+:?\w*]+)\s*([^>]*)/);
83
- var tagName = match[1];
84
- var tagBody = match[2];
85
- return {
86
- type: utils.isSelfClose(tagName) || tagBody[tagBody.length - 1] === '/' ? 'self-close' : 'start',
87
- name: tagName,
88
- attributes: extraAttrs(tagBody)
89
- };
90
- }
91
- }
92
-
93
- function splitTokens(html) {
94
- var i = 0;
95
- var j = 0;
96
- var tokens = [];
97
-
98
- while (i < html.length) {
99
- var curr = html[i];
100
-
101
- if (curr === '<') {
102
- if (j < i) {
103
- tokens.push(html.slice(j, i));
104
- j = i;
105
- }
106
-
107
- var k = i;
108
-
109
- while (html[k] !== '>') {
110
- k++;
111
- }
112
-
113
- tokens.push(html.slice(i, k + 1));
114
- i = j = k + 1;
115
- continue;
116
- }
117
-
118
- i++;
119
- }
120
-
121
- return tokens;
122
- }
123
-
124
- function tokenize(html) {
125
- return splitTokens(html).map(function (s) {
126
- return s.replace(/^\n+$/g, '');
127
- }).map(function (s) {
128
- return s.trim();
129
- }).filter(Boolean).map(makeToken);
130
- }
131
-
132
- function isEmpty(stack) {
133
- return stack.length === 0;
134
- }
135
-
136
- function getTop(stack) {
137
- return stack[stack.length - 1];
138
- }
139
-
140
- function appendChild(node, child) {
141
- if (!node.children) {
142
- node.children = [];
143
- }
144
-
145
- node.children.push(filterProps(child));
146
- }
147
-
148
- function filterProps(node) {
149
- if (typeof node === 'string') {
150
- return node;
151
- }
152
-
153
- return ['name', 'children', 'attributes'].reduce(function (r, c) {
154
- var _Object$assign;
155
-
156
- return Object.assign({}, r, (_Object$assign = {}, _Object$assign[c] = node[c], _Object$assign));
157
- }, {});
158
- }
159
-
160
- function parse(src) {
161
- var tokens = tokenize(src);
162
- var stack = [];
163
- var tree = {
164
- type: 'root',
165
- children: []
166
- };
167
- stack.push(tree);
168
-
169
- while (!isEmpty(stack) && !isEmpty(tokens)) {
170
- var curr = tokens.shift();
171
- var top = getTop(stack);
172
-
173
- if (curr.type === 'string') {
174
- appendChild(top, curr.value);
175
- } else if (utils.isPair(top, curr)) {
176
- var node = stack.pop();
177
-
178
- if (!isEmpty(stack)) {
179
- appendChild(getTop(stack), node);
180
- }
181
- } else if (curr.type === 'self-close') {
182
- appendChild(top, curr);
183
- } else if (curr.type === 'start') {
184
- stack.push(curr);
185
- }
186
- }
187
-
188
- return tree.children;
189
- }
190
-
191
- function html2any(html, rule) {
192
- return transform(parse(html)[0], rule);
193
- }
194
-
195
- exports['default'] = html2any;
196
- exports.parse = parse;
197
- exports.transform = transform;
198
- //# sourceMappingURL=index.js.map
package/lib/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../src/transform.js","../src/utils.js","../src/tokenize.js","../src/parse.js","../src/index.js"],"sourcesContent":["function transform(ast, rule) {\n function next(node) {\n if (node) {\n if (typeof node === 'string') {\n return rule(node)\n }\n if (Array.isArray(node)) {\n return node.map((n, index) => {\n if (typeof n !== 'string') {\n n.index = index // critical array element index\n }\n return rule(n, next(n.children))\n })\n } else {\n return rule(node, next(node.children))\n }\n }\n return null\n }\n return next(ast)\n}\n\nexport default transform\n","const voidElementTags = [\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]\n\nfunction isSelfClose(tagName) {\n return voidElementTags.indexOf(tagName) > -1\n}\n\nfunction isPair(tagX, tagY) {\n return tagX.name === tagY.name && tagX.type === 'start' && tagY.type === 'end'\n}\n\nexport default { isPair, isSelfClose }\n","import utils from './utils'\n\n// assuming that quato always following equation - `=\"\"`\nconst ATTR_FIND = /((^\\w|\\s+)[a-zA-Z-:]+)(=\"[^\"]+\"|\\s+|\\s*$)?/\n\nfunction extraAttrs(str) {\n let i = 0\n const attrs = {}\n while (i < str.length) {\n const suffix = str.slice(i)\n const match = ATTR_FIND.exec(suffix)\n if (!match || !match[1]) {\n break\n }\n const result = match[0]\n let key = match[1]\n let value = match[3]\n\n key = key.trim()\n value = value && value.trim()\n\n attrs[key] = (value && value[0] === '=') ? value.slice(2, -1) : true\n i += result.length\n }\n return attrs\n}\n\nfunction makeToken(tag) {\n const isTag = tag[0] === '<' && tag[tag.length - 1] === '>'\n\n if (!isTag) {\n return {\n type: 'string',\n value: tag,\n }\n } else if (tag.startsWith('</')) {\n return {\n type: 'end',\n name: tag.slice(2, -1),\n }\n } else {\n const match = tag.match(/<([\\w+:?\\w*]+)\\s*([^>]*)/)\n const tagName = match[1]\n const tagBody = match[2]\n return {\n type: (utils.isSelfClose(tagName) || tagBody[tagBody.length - 1] === '/') ? 'self-close' : 'start',\n name: tagName,\n attributes: extraAttrs(tagBody),\n }\n }\n}\n\nfunction splitTokens(html) {\n let i = 0\n let j = 0\n const tokens = []\n while (i < html.length) {\n const curr = html[i]\n if (curr === '<') {\n if (j < i) {\n tokens.push(html.slice(j, i))\n j = i\n }\n let k = i\n while (html[k] !== '>') k++\n tokens.push(html.slice(i, k + 1))\n i = j = k + 1\n continue\n }\n i++\n }\n return tokens\n}\n\nfunction tokenize(html) {\n return splitTokens(html)\n .map(s => s.replace(/^\\n+$/g, ''))\n .map(s => s.trim())\n .filter(Boolean)\n .map(makeToken)\n}\n\nexport default tokenize\n","import tokenize from './tokenize'\nimport utils from './utils'\n\nfunction isEmpty(stack) {\n return stack.length === 0\n}\n\nfunction getTop(stack) {\n return stack[stack.length - 1]\n}\n\nfunction appendChild(node, child) {\n if (!node.children) {\n node.children = []\n }\n node.children.push(filterProps(child))\n}\n\nfunction filterProps(node) {\n if (typeof node === 'string') {\n return node\n }\n return ['name', 'children', 'attributes'].reduce(\n (r, c) => Object.assign({}, r, {[c]: node[c]}),\n {},\n )\n}\n\nfunction parse(src) {\n const tokens = tokenize(src)\n const stack = []\n const tree = {\n type: 'root',\n children: [],\n }\n\n stack.push(tree)\n while (!isEmpty(stack) && !isEmpty(tokens)) {\n const curr = tokens.shift()\n const top = getTop(stack)\n\n if (curr.type === 'string') {\n appendChild(top, curr.value)\n } else if (utils.isPair(top, curr)) {\n const node = stack.pop()\n if (!isEmpty(stack)) {\n appendChild(getTop(stack), node)\n }\n } else if (curr.type === 'self-close') {\n appendChild(top, curr)\n } else if (curr.type === 'start') {\n stack.push(curr)\n }\n }\n return tree.children\n}\n\nexport default parse\n","import transform from './transform'\nimport parse from './parse'\n\nfunction html2any(html, rule) {\n return transform(parse(html)[0], rule)\n}\n\nexport { parse, transform }\nexport default html2any\n"],"names":["transform","ast","rule","next","node","Array","isArray","map","n","index","children","voidElementTags","isSelfClose","tagName","indexOf","isPair","tagX","tagY","name","type","ATTR_FIND","extraAttrs","str","i","attrs","length","suffix","slice","match","exec","result","key","value","trim","makeToken","tag","isTag","startsWith","tagBody","utils","attributes","splitTokens","html","j","tokens","curr","push","k","tokenize","s","replace","filter","Boolean","isEmpty","stack","getTop","appendChild","child","filterProps","reduce","r","c","Object","assign","parse","src","tree","shift","top","pop","html2any"],"mappings":"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"}
package/lib/index.mjs DELETED
@@ -1,196 +0,0 @@
1
- function transform(ast, rule) {
2
- function next(node) {
3
- if (node) {
4
- if (typeof node === 'string') {
5
- return rule(node);
6
- }
7
-
8
- if (Array.isArray(node)) {
9
- return node.map(function (n, index) {
10
- if (typeof n !== 'string') {
11
- n.index = index; // critical array element index
12
- }
13
-
14
- return rule(n, next(n.children));
15
- });
16
- } else {
17
- return rule(node, next(node.children));
18
- }
19
- }
20
-
21
- return null;
22
- }
23
-
24
- return next(ast);
25
- }
26
-
27
- var voidElementTags = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'];
28
-
29
- function isSelfClose(tagName) {
30
- return voidElementTags.indexOf(tagName) > -1;
31
- }
32
-
33
- function isPair(tagX, tagY) {
34
- return tagX.name === tagY.name && tagX.type === 'start' && tagY.type === 'end';
35
- }
36
-
37
- var utils = {
38
- isPair: isPair,
39
- isSelfClose: isSelfClose
40
- };
41
-
42
- var ATTR_FIND = /((^\w|\s+)[a-zA-Z-:]+)(="[^"]+"|\s+|\s*$)?/;
43
-
44
- function extraAttrs(str) {
45
- var i = 0;
46
- var attrs = {};
47
-
48
- while (i < str.length) {
49
- var suffix = str.slice(i);
50
- var match = ATTR_FIND.exec(suffix);
51
-
52
- if (!match || !match[1]) {
53
- break;
54
- }
55
-
56
- var result = match[0];
57
- var key = match[1];
58
- var value = match[3];
59
- key = key.trim();
60
- value = value && value.trim();
61
- attrs[key] = value && value[0] === '=' ? value.slice(2, -1) : true;
62
- i += result.length;
63
- }
64
-
65
- return attrs;
66
- }
67
-
68
- function makeToken(tag) {
69
- var isTag = tag[0] === '<' && tag[tag.length - 1] === '>';
70
-
71
- if (!isTag) {
72
- return {
73
- type: 'string',
74
- value: tag
75
- };
76
- } else if (tag.startsWith('</')) {
77
- return {
78
- type: 'end',
79
- name: tag.slice(2, -1)
80
- };
81
- } else {
82
- var match = tag.match(/<([\w+:?\w*]+)\s*([^>]*)/);
83
- var tagName = match[1];
84
- var tagBody = match[2];
85
- return {
86
- type: utils.isSelfClose(tagName) || tagBody[tagBody.length - 1] === '/' ? 'self-close' : 'start',
87
- name: tagName,
88
- attributes: extraAttrs(tagBody)
89
- };
90
- }
91
- }
92
-
93
- function splitTokens(html) {
94
- var i = 0;
95
- var j = 0;
96
- var tokens = [];
97
-
98
- while (i < html.length) {
99
- var curr = html[i];
100
-
101
- if (curr === '<') {
102
- if (j < i) {
103
- tokens.push(html.slice(j, i));
104
- j = i;
105
- }
106
-
107
- var k = i;
108
-
109
- while (html[k] !== '>') {
110
- k++;
111
- }
112
-
113
- tokens.push(html.slice(i, k + 1));
114
- i = j = k + 1;
115
- continue;
116
- }
117
-
118
- i++;
119
- }
120
-
121
- return tokens;
122
- }
123
-
124
- function tokenize(html) {
125
- return splitTokens(html).map(function (s) {
126
- return s.replace(/^\n+$/g, '');
127
- }).map(function (s) {
128
- return s.trim();
129
- }).filter(Boolean).map(makeToken);
130
- }
131
-
132
- function isEmpty(stack) {
133
- return stack.length === 0;
134
- }
135
-
136
- function getTop(stack) {
137
- return stack[stack.length - 1];
138
- }
139
-
140
- function appendChild(node, child) {
141
- if (!node.children) {
142
- node.children = [];
143
- }
144
-
145
- node.children.push(filterProps(child));
146
- }
147
-
148
- function filterProps(node) {
149
- if (typeof node === 'string') {
150
- return node;
151
- }
152
-
153
- return ['name', 'children', 'attributes'].reduce(function (r, c) {
154
- var _Object$assign;
155
-
156
- return Object.assign({}, r, (_Object$assign = {}, _Object$assign[c] = node[c], _Object$assign));
157
- }, {});
158
- }
159
-
160
- function parse(src) {
161
- var tokens = tokenize(src);
162
- var stack = [];
163
- var tree = {
164
- type: 'root',
165
- children: []
166
- };
167
- stack.push(tree);
168
-
169
- while (!isEmpty(stack) && !isEmpty(tokens)) {
170
- var curr = tokens.shift();
171
- var top = getTop(stack);
172
-
173
- if (curr.type === 'string') {
174
- appendChild(top, curr.value);
175
- } else if (utils.isPair(top, curr)) {
176
- var node = stack.pop();
177
-
178
- if (!isEmpty(stack)) {
179
- appendChild(getTop(stack), node);
180
- }
181
- } else if (curr.type === 'self-close') {
182
- appendChild(top, curr);
183
- } else if (curr.type === 'start') {
184
- stack.push(curr);
185
- }
186
- }
187
-
188
- return tree.children;
189
- }
190
-
191
- function html2any(html, rule) {
192
- return transform(parse(html)[0], rule);
193
- }
194
-
195
- export { html2any as default, parse, transform };
196
- //# sourceMappingURL=index.mjs.map
package/lib/index.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/transform.js","../src/utils.js","../src/tokenize.js","../src/parse.js","../src/index.js"],"sourcesContent":["function transform(ast, rule) {\n function next(node) {\n if (node) {\n if (typeof node === 'string') {\n return rule(node)\n }\n if (Array.isArray(node)) {\n return node.map((n, index) => {\n if (typeof n !== 'string') {\n n.index = index // critical array element index\n }\n return rule(n, next(n.children))\n })\n } else {\n return rule(node, next(node.children))\n }\n }\n return null\n }\n return next(ast)\n}\n\nexport default transform\n","const voidElementTags = [\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]\n\nfunction isSelfClose(tagName) {\n return voidElementTags.indexOf(tagName) > -1\n}\n\nfunction isPair(tagX, tagY) {\n return tagX.name === tagY.name && tagX.type === 'start' && tagY.type === 'end'\n}\n\nexport default { isPair, isSelfClose }\n","import utils from './utils'\n\n// assuming that quato always following equation - `=\"\"`\nconst ATTR_FIND = /((^\\w|\\s+)[a-zA-Z-:]+)(=\"[^\"]+\"|\\s+|\\s*$)?/\n\nfunction extraAttrs(str) {\n let i = 0\n const attrs = {}\n while (i < str.length) {\n const suffix = str.slice(i)\n const match = ATTR_FIND.exec(suffix)\n if (!match || !match[1]) {\n break\n }\n const result = match[0]\n let key = match[1]\n let value = match[3]\n\n key = key.trim()\n value = value && value.trim()\n\n attrs[key] = (value && value[0] === '=') ? value.slice(2, -1) : true\n i += result.length\n }\n return attrs\n}\n\nfunction makeToken(tag) {\n const isTag = tag[0] === '<' && tag[tag.length - 1] === '>'\n\n if (!isTag) {\n return {\n type: 'string',\n value: tag,\n }\n } else if (tag.startsWith('</')) {\n return {\n type: 'end',\n name: tag.slice(2, -1),\n }\n } else {\n const match = tag.match(/<([\\w+:?\\w*]+)\\s*([^>]*)/)\n const tagName = match[1]\n const tagBody = match[2]\n return {\n type: (utils.isSelfClose(tagName) || tagBody[tagBody.length - 1] === '/') ? 'self-close' : 'start',\n name: tagName,\n attributes: extraAttrs(tagBody),\n }\n }\n}\n\nfunction splitTokens(html) {\n let i = 0\n let j = 0\n const tokens = []\n while (i < html.length) {\n const curr = html[i]\n if (curr === '<') {\n if (j < i) {\n tokens.push(html.slice(j, i))\n j = i\n }\n let k = i\n while (html[k] !== '>') k++\n tokens.push(html.slice(i, k + 1))\n i = j = k + 1\n continue\n }\n i++\n }\n return tokens\n}\n\nfunction tokenize(html) {\n return splitTokens(html)\n .map(s => s.replace(/^\\n+$/g, ''))\n .map(s => s.trim())\n .filter(Boolean)\n .map(makeToken)\n}\n\nexport default tokenize\n","import tokenize from './tokenize'\nimport utils from './utils'\n\nfunction isEmpty(stack) {\n return stack.length === 0\n}\n\nfunction getTop(stack) {\n return stack[stack.length - 1]\n}\n\nfunction appendChild(node, child) {\n if (!node.children) {\n node.children = []\n }\n node.children.push(filterProps(child))\n}\n\nfunction filterProps(node) {\n if (typeof node === 'string') {\n return node\n }\n return ['name', 'children', 'attributes'].reduce(\n (r, c) => Object.assign({}, r, {[c]: node[c]}),\n {},\n )\n}\n\nfunction parse(src) {\n const tokens = tokenize(src)\n const stack = []\n const tree = {\n type: 'root',\n children: [],\n }\n\n stack.push(tree)\n while (!isEmpty(stack) && !isEmpty(tokens)) {\n const curr = tokens.shift()\n const top = getTop(stack)\n\n if (curr.type === 'string') {\n appendChild(top, curr.value)\n } else if (utils.isPair(top, curr)) {\n const node = stack.pop()\n if (!isEmpty(stack)) {\n appendChild(getTop(stack), node)\n }\n } else if (curr.type === 'self-close') {\n appendChild(top, curr)\n } else if (curr.type === 'start') {\n stack.push(curr)\n }\n }\n return tree.children\n}\n\nexport default parse\n","import transform from './transform'\nimport parse from './parse'\n\nfunction html2any(html, rule) {\n return transform(parse(html)[0], rule)\n}\n\nexport { parse, transform }\nexport default html2any\n"],"names":["transform","ast","rule","next","node","Array","isArray","map","n","index","children","voidElementTags","isSelfClose","tagName","indexOf","isPair","tagX","tagY","name","type","ATTR_FIND","extraAttrs","str","i","attrs","length","suffix","slice","match","exec","result","key","value","trim","makeToken","tag","isTag","startsWith","tagBody","utils","attributes","splitTokens","html","j","tokens","curr","push","k","tokenize","s","replace","filter","Boolean","isEmpty","stack","getTop","appendChild","child","filterProps","reduce","r","c","Object","assign","parse","src","tree","shift","top","pop","html2any"],"mappings":"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"}