Skip to content

Commit c48d8ba

Browse files
committed
Refactor to move implementation to lib/
1 parent f0fc24a commit c48d8ba

File tree

3 files changed

+99
-92
lines changed

3 files changed

+99
-92
lines changed

index.js

Lines changed: 3 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -1,95 +1,6 @@
11
/**
2-
* @typedef {import('mdast').Root|import('mdast').Content} Node
3-
* @typedef {Extract<Node, import('mdast').Parent>} Parent
4-
*
5-
* @typedef ZoneInfo
6-
* Extra info.
7-
* @property {Parent} parent
8-
* Parent of the range.
9-
* @property {number} start
10-
* Index of `start` in `parent`
11-
* @property {number} end
12-
* Index of `end` in `parent`
13-
*
14-
* @callback Handler
15-
* Callback called when a range is found.
16-
* @param {Node} start
17-
* Start of range.
18-
* @param {Array<Node>} between
19-
* Nodes between `start` and `end`.
20-
* @param {Node} end
21-
* End of range.
22-
* @param {ZoneInfo} info
23-
* Extra info.
24-
* @returns {Array<Node>|null|undefined|void}
25-
* Nodes to replace.
2+
* @typedef {import('./lib/index.js').Handler} Handler
3+
* @typedef {import('./lib/index.js').ZoneInfo} ZoneInfo
264
*/
275

28-
import {commentMarker} from 'mdast-comment-marker'
29-
import {visit} from 'unist-util-visit'
30-
31-
/**
32-
* @param {Node} node
33-
* Tree to search.
34-
* @param {string} name
35-
* Comment name to look for.
36-
* @param {Handler} callback
37-
* Callback called when a range is found.
38-
*/
39-
export function zone(node, name, callback) {
40-
/** @type {number|undefined} */
41-
let level
42-
/** @type {Node|undefined} */
43-
let marker
44-
/** @type {Parent|undefined} */
45-
let scope
46-
47-
visit(
48-
node,
49-
/**
50-
* Gather one dimensional zones.
51-
*/
52-
(node, index, parent) => {
53-
const info = commentMarker(node)
54-
const match =
55-
info && info.name === name && info.attributes.match(/(start|end)\b/)
56-
const type = match && match[0]
57-
58-
if (parent && index !== null && type) {
59-
if (!scope && type === 'start') {
60-
level = 0
61-
marker = node
62-
scope = /** @type {Parent} */ (parent)
63-
}
64-
65-
if (typeof level === 'number' && marker && scope && parent === scope) {
66-
if (type === 'start') {
67-
level++
68-
} else {
69-
level--
70-
}
71-
72-
if (type === 'end' && !level) {
73-
// @ts-expect-error: Assume `scope` is a valid parent of `node`.
74-
const start = scope.children.indexOf(marker)
75-
76-
const result = callback(
77-
marker,
78-
scope.children.slice(start + 1, index),
79-
node,
80-
{start, end: index, parent: scope}
81-
)
82-
83-
if (result) {
84-
// @ts-expect-error: Assume the correct children are passed.
85-
scope.children.splice(start, index - start + 1, ...result)
86-
}
87-
88-
marker = undefined
89-
scope = undefined
90-
}
91-
}
92-
}
93-
}
94-
)
95-
}
6+
export {zone} from './lib/index.js'

lib/index.js

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/**
2+
* @typedef {import('mdast').Root|import('mdast').Content} Node
3+
* @typedef {Extract<Node, import('mdast').Parent>} Parent
4+
*
5+
* @typedef ZoneInfo
6+
* Extra info.
7+
* @property {Parent} parent
8+
* Parent of the range.
9+
* @property {number} start
10+
* Index of `start` in `parent`
11+
* @property {number} end
12+
* Index of `end` in `parent`
13+
*
14+
* @callback Handler
15+
* Callback called when a range is found.
16+
* @param {Node} start
17+
* Start of range.
18+
* @param {Array<Node>} between
19+
* Nodes between `start` and `end`.
20+
* @param {Node} end
21+
* End of range.
22+
* @param {ZoneInfo} info
23+
* Extra info.
24+
* @returns {Array<Node>|null|undefined|void}
25+
* Nodes to replace.
26+
*/
27+
28+
import {commentMarker} from 'mdast-comment-marker'
29+
import {visit} from 'unist-util-visit'
30+
31+
/**
32+
* @param {Node} node
33+
* Tree to search.
34+
* @param {string} name
35+
* Comment name to look for.
36+
* @param {Handler} callback
37+
* Callback called when a range is found.
38+
*/
39+
export function zone(node, name, callback) {
40+
/** @type {number|undefined} */
41+
let level
42+
/** @type {Node|undefined} */
43+
let marker
44+
/** @type {Parent|undefined} */
45+
let scope
46+
47+
visit(
48+
node,
49+
/**
50+
* Gather one dimensional zones.
51+
*/
52+
(node, index, parent) => {
53+
const info = commentMarker(node)
54+
const match =
55+
info && info.name === name && info.attributes.match(/(start|end)\b/)
56+
const type = match && match[0]
57+
58+
if (parent && index !== null && type) {
59+
if (!scope && type === 'start') {
60+
level = 0
61+
marker = node
62+
scope = /** @type {Parent} */ (parent)
63+
}
64+
65+
if (typeof level === 'number' && marker && scope && parent === scope) {
66+
if (type === 'start') {
67+
level++
68+
} else {
69+
level--
70+
}
71+
72+
if (type === 'end' && !level) {
73+
// @ts-expect-error: Assume `scope` is a valid parent of `node`.
74+
const start = scope.children.indexOf(marker)
75+
76+
const result = callback(
77+
marker,
78+
scope.children.slice(start + 1, index),
79+
node,
80+
{start, end: index, parent: scope}
81+
)
82+
83+
if (result) {
84+
// @ts-expect-error: Assume the correct children are passed.
85+
scope.children.splice(start, index - start + 1, ...result)
86+
}
87+
88+
marker = undefined
89+
scope = undefined
90+
}
91+
}
92+
}
93+
}
94+
)
95+
}

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"main": "index.js",
3232
"types": "index.d.ts",
3333
"files": [
34+
"lib/",
3435
"index.d.ts",
3536
"index.js"
3637
],

0 commit comments

Comments
 (0)