mdream 0.16.0 → 0.17.0

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/README.md CHANGED
@@ -545,12 +545,3 @@ Custom notes
545
545
 
546
546
  Licensed under the [MIT license](https://github.com/harlan-zw/mdream/blob/main/LICENSE.md).
547
547
 
548
- <!-- Badges -->
549
- [npm-version-src]: https://img.shields.io/npm/v/mdream/latest.svg?style=flat&colorA=18181B&colorB=4C9BE0
550
- [npm-version-href]: https://npmjs.com/package/mdream
551
-
552
- [npm-downloads-src]: https://img.shields.io/npm/dm/mdream.svg?style=flat&colorA=18181B&colorB=4C9BE0
553
- [npm-downloads-href]: https://npmjs.com/package/mdream
554
-
555
- [license-src]: https://img.shields.io/github/license/harlan-zw/mdream.svg?style=flat&colorA=18181B&colorB=4C9BE0
556
- [license-href]: https://github.com/harlan-zw/mdream/blob/main/LICENSE.md
@@ -1,112 +1,3 @@
1
- const TAG_HTML = 0;
2
- const TAG_HEAD = 1;
3
- const TAG_DETAILS = 2;
4
- const TAG_SUMMARY = 3;
5
- const TAG_TITLE = 4;
6
- const TAG_META = 5;
7
- const TAG_BR = 6;
8
- const TAG_H1 = 7;
9
- const TAG_H2 = 8;
10
- const TAG_H3 = 9;
11
- const TAG_H4 = 10;
12
- const TAG_H5 = 11;
13
- const TAG_H6 = 12;
14
- const TAG_HR = 13;
15
- const TAG_STRONG = 14;
16
- const TAG_B = 15;
17
- const TAG_EM = 16;
18
- const TAG_I = 17;
19
- const TAG_DEL = 18;
20
- const TAG_SUB = 19;
21
- const TAG_SUP = 20;
22
- const TAG_INS = 21;
23
- const TAG_BLOCKQUOTE = 22;
24
- const TAG_CODE = 23;
25
- const TAG_UL = 24;
26
- const TAG_LI = 25;
27
- const TAG_A = 26;
28
- const TAG_IMG = 27;
29
- const TAG_TABLE = 28;
30
- const TAG_THEAD = 29;
31
- const TAG_TR = 30;
32
- const TAG_TH = 31;
33
- const TAG_TD = 32;
34
- const TAG_OL = 33;
35
- const TAG_PRE = 34;
36
- const TAG_P = 35;
37
- const TAG_DIV = 36;
38
- const TAG_SPAN = 37;
39
- const TAG_TBODY = 38;
40
- const TAG_TFOOT = 39;
41
- const TAG_FORM = 40;
42
- const TAG_NAV = 41;
43
- const TAG_LABEL = 42;
44
- const TAG_BUTTON = 43;
45
- const TAG_BODY = 44;
46
- const TAG_CENTER = 45;
47
- const TAG_KBD = 46;
48
- const TAG_FOOTER = 47;
49
- const TAG_PATH = 48;
50
- const TAG_SVG = 49;
51
- const TAG_ARTICLE = 50;
52
- const TAG_SECTION = 51;
53
- const TAG_SCRIPT = 52;
54
- const TAG_STYLE = 53;
55
- const TAG_LINK = 54;
56
- const TAG_AREA = 55;
57
- const TAG_BASE = 56;
58
- const TAG_COL = 57;
59
- const TAG_EMBED = 58;
60
- const TAG_INPUT = 59;
61
- const TAG_KEYGEN = 60;
62
- const TAG_PARAM = 61;
63
- const TAG_SOURCE = 62;
64
- const TAG_TRACK = 63;
65
- const TAG_WBR = 64;
66
- const TAG_SELECT = 65;
67
- const TAG_TEXTAREA = 66;
68
- const TAG_OPTION = 67;
69
- const TAG_FIELDSET = 68;
70
- const TAG_LEGEND = 69;
71
- const TAG_AUDIO = 70;
72
- const TAG_VIDEO = 71;
73
- const TAG_CANVAS = 72;
74
- const TAG_IFRAME = 73;
75
- const TAG_MAP = 74;
76
- const TAG_DIALOG = 75;
77
- const TAG_METER = 76;
78
- const TAG_PROGRESS = 77;
79
- const TAG_TEMPLATE = 78;
80
- const TAG_ABBR = 79;
81
- const TAG_MARK = 80;
82
- const TAG_Q = 81;
83
- const TAG_SAMP = 82;
84
- const TAG_SMALL = 83;
85
- const TAG_NOSCRIPT = 84;
86
- const TAG_NOFRAMES = 85;
87
- const TAG_XMP = 86;
88
- const TAG_PLAINTEXT = 87;
89
- const TAG_ASIDE = 88;
90
- const TAG_U = 89;
91
- const TAG_CITE = 90;
92
- const TAG_DFN = 91;
93
- const TAG_VAR = 92;
94
- const TAG_TIME = 93;
95
- const TAG_BDO = 94;
96
- const TAG_RUBY = 95;
97
- const TAG_RT = 96;
98
- const TAG_RP = 97;
99
- const TAG_DD = 98;
100
- const TAG_DT = 99;
101
- const TAG_ADDRESS = 100;
102
- const TAG_DL = 101;
103
- const TAG_FIGURE = 102;
104
- const TAG_OBJECT = 103;
105
- const TAG_MAIN = 104;
106
- const TAG_HEADER = 105;
107
- const TAG_FIGCAPTION = 106;
108
- const TAG_CAPTION = 107;
109
- const MAX_TAG_ID = 108;
110
1
  const HTML_ENTITIES = {
111
2
  "&amp;": "&",
112
3
  "&lt;": "<",
@@ -116,129 +7,120 @@ const HTML_ENTITIES = {
116
7
  "&apos;": "'",
117
8
  "&nbsp;": " "
118
9
  };
119
- const ELEMENT_NODE = 1;
120
- const TEXT_NODE = 2;
121
- const NodeEventEnter = 0;
122
- const NodeEventExit = 1;
123
10
  const TagIdMap = {
124
- html: TAG_HTML,
125
- head: TAG_HEAD,
126
- details: TAG_DETAILS,
127
- summary: TAG_SUMMARY,
128
- title: TAG_TITLE,
129
- meta: TAG_META,
130
- br: TAG_BR,
131
- h1: TAG_H1,
132
- h2: TAG_H2,
133
- h3: TAG_H3,
134
- h4: TAG_H4,
135
- h5: TAG_H5,
136
- h6: TAG_H6,
137
- hr: TAG_HR,
138
- strong: TAG_STRONG,
139
- b: TAG_B,
140
- em: TAG_EM,
141
- i: TAG_I,
142
- del: TAG_DEL,
143
- sub: TAG_SUB,
144
- sup: TAG_SUP,
145
- ins: TAG_INS,
146
- blockquote: TAG_BLOCKQUOTE,
147
- code: TAG_CODE,
148
- ul: TAG_UL,
149
- li: TAG_LI,
150
- a: TAG_A,
151
- img: TAG_IMG,
152
- table: TAG_TABLE,
153
- thead: TAG_THEAD,
154
- tr: TAG_TR,
155
- th: TAG_TH,
156
- td: TAG_TD,
157
- ol: TAG_OL,
158
- pre: TAG_PRE,
159
- p: TAG_P,
160
- div: TAG_DIV,
161
- span: TAG_SPAN,
162
- tbody: TAG_TBODY,
163
- tfoot: TAG_TFOOT,
164
- form: TAG_FORM,
165
- nav: TAG_NAV,
166
- label: TAG_LABEL,
167
- button: TAG_BUTTON,
168
- body: TAG_BODY,
169
- center: TAG_CENTER,
170
- kbd: TAG_KBD,
171
- footer: TAG_FOOTER,
172
- path: TAG_PATH,
173
- svg: TAG_SVG,
174
- article: TAG_ARTICLE,
175
- section: TAG_SECTION,
176
- script: TAG_SCRIPT,
177
- style: TAG_STYLE,
178
- link: TAG_LINK,
179
- area: TAG_AREA,
180
- base: TAG_BASE,
181
- col: TAG_COL,
182
- embed: TAG_EMBED,
183
- input: TAG_INPUT,
184
- keygen: TAG_KEYGEN,
185
- param: TAG_PARAM,
186
- source: TAG_SOURCE,
187
- track: TAG_TRACK,
188
- wbr: TAG_WBR,
189
- select: TAG_SELECT,
190
- textarea: TAG_TEXTAREA,
191
- option: TAG_OPTION,
192
- fieldset: TAG_FIELDSET,
193
- legend: TAG_LEGEND,
194
- audio: TAG_AUDIO,
195
- video: TAG_VIDEO,
196
- canvas: TAG_CANVAS,
197
- iframe: TAG_IFRAME,
198
- map: TAG_MAP,
199
- dialog: TAG_DIALOG,
200
- meter: TAG_METER,
201
- progress: TAG_PROGRESS,
202
- template: TAG_TEMPLATE,
203
- abbr: TAG_ABBR,
204
- mark: TAG_MARK,
205
- q: TAG_Q,
206
- samp: TAG_SAMP,
207
- small: TAG_SMALL,
208
- noscript: TAG_NOSCRIPT,
209
- noframes: TAG_NOFRAMES,
210
- xmp: TAG_XMP,
211
- plaintext: TAG_PLAINTEXT,
212
- aside: TAG_ASIDE,
213
- u: TAG_U,
214
- cite: TAG_CITE,
215
- dfn: TAG_DFN,
216
- var: TAG_VAR,
217
- time: TAG_TIME,
218
- bdo: TAG_BDO,
219
- ruby: TAG_RUBY,
220
- rt: TAG_RT,
221
- rp: TAG_RP,
222
- dd: TAG_DD,
223
- dt: TAG_DT,
224
- dl: TAG_DL,
225
- address: TAG_ADDRESS,
226
- figure: TAG_FIGURE,
227
- object: TAG_OBJECT,
228
- main: TAG_MAIN,
229
- header: TAG_HEADER,
230
- figcaption: TAG_FIGCAPTION,
231
- caption: TAG_CAPTION
11
+ html: 0,
12
+ head: 1,
13
+ details: 2,
14
+ summary: 3,
15
+ title: 4,
16
+ meta: 5,
17
+ br: 6,
18
+ h1: 7,
19
+ h2: 8,
20
+ h3: 9,
21
+ h4: 10,
22
+ h5: 11,
23
+ h6: 12,
24
+ hr: 13,
25
+ strong: 14,
26
+ b: 15,
27
+ em: 16,
28
+ i: 17,
29
+ del: 18,
30
+ sub: 19,
31
+ sup: 20,
32
+ ins: 21,
33
+ blockquote: 22,
34
+ code: 23,
35
+ ul: 24,
36
+ li: 25,
37
+ a: 26,
38
+ img: 27,
39
+ table: 28,
40
+ thead: 29,
41
+ tr: 30,
42
+ th: 31,
43
+ td: 32,
44
+ ol: 33,
45
+ pre: 34,
46
+ p: 35,
47
+ div: 36,
48
+ span: 37,
49
+ tbody: 38,
50
+ tfoot: 39,
51
+ form: 40,
52
+ nav: 41,
53
+ label: 42,
54
+ button: 43,
55
+ body: 44,
56
+ center: 45,
57
+ kbd: 46,
58
+ footer: 47,
59
+ path: 48,
60
+ svg: 49,
61
+ article: 50,
62
+ section: 51,
63
+ script: 52,
64
+ style: 53,
65
+ link: 54,
66
+ area: 55,
67
+ base: 56,
68
+ col: 57,
69
+ embed: 58,
70
+ input: 59,
71
+ keygen: 60,
72
+ param: 61,
73
+ source: 62,
74
+ track: 63,
75
+ wbr: 64,
76
+ select: 65,
77
+ textarea: 66,
78
+ option: 67,
79
+ fieldset: 68,
80
+ legend: 69,
81
+ audio: 70,
82
+ video: 71,
83
+ canvas: 72,
84
+ iframe: 73,
85
+ map: 74,
86
+ dialog: 75,
87
+ meter: 76,
88
+ progress: 77,
89
+ template: 78,
90
+ abbr: 79,
91
+ mark: 80,
92
+ q: 81,
93
+ samp: 82,
94
+ small: 83,
95
+ noscript: 84,
96
+ noframes: 85,
97
+ xmp: 86,
98
+ plaintext: 87,
99
+ aside: 88,
100
+ u: 89,
101
+ cite: 90,
102
+ dfn: 91,
103
+ var: 92,
104
+ time: 93,
105
+ bdo: 94,
106
+ ruby: 95,
107
+ rt: 96,
108
+ rp: 97,
109
+ dd: 98,
110
+ dt: 99,
111
+ dl: 101,
112
+ address: 100,
113
+ figure: 102,
114
+ object: 103,
115
+ main: 104,
116
+ header: 105,
117
+ figcaption: 106,
118
+ caption: 107
232
119
  };
233
- const MARKDOWN_STRONG = "**";
234
- const MARKDOWN_EMPHASIS = "_";
235
- const MARKDOWN_STRIKETHROUGH = "~~";
236
- const MARKDOWN_CODE_BLOCK = "```";
237
- const MARKDOWN_INLINE_CODE = "`";
238
- const MARKDOWN_HORIZONTAL_RULE = "---";
239
120
  const NO_SPACING = [0, 0];
240
121
  const DEFAULT_BLOCK_SPACING = [2, 2];
241
122
  const BLOCKQUOTE_SPACING = [1, 1];
242
123
  const LIST_ITEM_SPACING = [1, 0];
243
124
  const TABLE_ROW_SPACING = [0, 1];
244
- export { TAG_H5 as $, TAG_TH as $t, TAG_CANVAS as A, TAG_PROGRESS as At, TAG_DIV as B, TAG_SPAN as Bt, TAG_B as C, TAG_OBJECT as Ct, TAG_BODY as D, TAG_PARAM as Dt, TAG_BLOCKQUOTE as E, TAG_P as Et, TAG_DD as F, TAG_SAMP as Ft, TAG_FIELDSET as G, TAG_SUP as Gt, TAG_DT as H, TAG_STYLE as Ht, TAG_DEL as I, TAG_SCRIPT as It, TAG_FORM as J, TAG_TBODY as Jt, TAG_FIGURE as K, TAG_SVG as Kt, TAG_DETAILS as L, TAG_SELECT as Lt, TAG_CITE as M, TAG_RP as Mt, TAG_CODE as N, TAG_RT as Nt, TAG_BR as O, TAG_PLAINTEXT as Ot, TAG_COL as P, TAG_RUBY as Pt, TAG_H4 as Q, TAG_TFOOT as Qt, TAG_DFN as R, TAG_SMALL as Rt, TAG_AUDIO as S, TAG_NOSCRIPT as St, TAG_BDO as T, TAG_OPTION as Tt, TAG_EM as U, TAG_SUB as Ut, TAG_DL as V, TAG_STRONG as Vt, TAG_EMBED as W, TAG_SUMMARY as Wt, TAG_H2 as X, TAG_TEMPLATE as Xt, TAG_H1 as Y, TAG_TD as Yt, TAG_H3 as Z, TAG_TEXTAREA as Zt, TAG_A as _, TAG_MARK as _t, LIST_ITEM_SPACING as a, TAG_U as an, TAG_IFRAME as at, TAG_AREA as b, TAG_NAV as bt, MARKDOWN_HORIZONTAL_RULE as c, TAG_VIDEO as cn, TAG_INS as ct, MARKDOWN_STRONG as d, TEXT_NODE as dn, TAG_LABEL as dt, TAG_THEAD as en, TAG_H6 as et, MAX_TAG_ID as f, TagIdMap as fn, TAG_LEGEND as ft, TABLE_ROW_SPACING as g, TAG_MAP as gt, NodeEventExit as h, TAG_MAIN as ht, HTML_ENTITIES as i, TAG_TRACK as in, TAG_I as it, TAG_CENTER as j, TAG_Q as jt, TAG_BUTTON as k, TAG_PRE as kt, MARKDOWN_INLINE_CODE as l, TAG_WBR as ln, TAG_KBD as lt, NodeEventEnter as m, TAG_LINK as mt, DEFAULT_BLOCK_SPACING as n, TAG_TITLE as nn, TAG_HEADER as nt, MARKDOWN_CODE_BLOCK as o, TAG_UL as on, TAG_IMG as ot, NO_SPACING as p, TAG_LI as pt, TAG_FOOTER as q, TAG_TABLE as qt, ELEMENT_NODE as r, TAG_TR as rn, TAG_HR as rt, MARKDOWN_EMPHASIS as s, TAG_VAR as sn, TAG_INPUT as st, BLOCKQUOTE_SPACING as t, TAG_TIME as tn, TAG_HEAD as tt, MARKDOWN_STRIKETHROUGH as u, TAG_XMP as un, TAG_KEYGEN as ut, TAG_ABBR as v, TAG_META as vt, TAG_BASE as w, TAG_OL as wt, TAG_ASIDE as x, TAG_NOFRAMES as xt, TAG_ADDRESS as y, TAG_METER as yt, TAG_DIALOG as z, TAG_SOURCE as zt };
125
+ //#endregion
126
+ export { NO_SPACING as a, LIST_ITEM_SPACING as i, DEFAULT_BLOCK_SPACING as n, TABLE_ROW_SPACING as o, HTML_ENTITIES as r, TagIdMap as s, BLOCKQUOTE_SPACING as t };
@@ -1,10 +1,17 @@
1
1
  import { t as createPlugin } from "./plugin.mjs";
2
+ //#region src/libs/query-selector.ts
3
+ /**
4
+ * Creates a tag selector matcher (e.g., 'div', 'p', 'h1')
5
+ */
2
6
  function createTagSelector(tagName) {
3
7
  return {
4
8
  matches: (element) => element.name === tagName,
5
9
  toString: () => tagName
6
10
  };
7
11
  }
12
+ /**
13
+ * Creates an ID selector matcher (e.g., '#main', '#content')
14
+ */
8
15
  function createIdSelector(selector) {
9
16
  const id = selector.slice(1);
10
17
  return {
@@ -12,6 +19,9 @@ function createIdSelector(selector) {
12
19
  toString: () => `#${id}`
13
20
  };
14
21
  }
22
+ /**
23
+ * Creates a class selector matcher (e.g., '.container', '.header')
24
+ */
15
25
  function createClassSelector(selector) {
16
26
  const className = selector.slice(1);
17
27
  return {
@@ -22,8 +32,12 @@ function createClassSelector(selector) {
22
32
  toString: () => `.${className}`
23
33
  };
24
34
  }
35
+ const ATTR_SELECTOR_RE = /\[([^\]=~|^$*]+)(?:([=~|^$*]+)["']?([^"'\]]+)["']?)?\]/;
36
+ /**
37
+ * Creates an attribute selector matcher (e.g., '[data-id]', '[href="https://example.com"]')
38
+ */
25
39
  function createAttributeSelector(selector) {
26
- const match = selector.match(/\[([^\]=~|^$*]+)(?:([=~|^$*]+)["']?([^"'\]]+)["']?)?\]/);
40
+ const match = selector.match(ATTR_SELECTOR_RE);
27
41
  const attrName = match ? match[1] : selector.slice(1, -1);
28
42
  const operator = match?.[2];
29
43
  const attrValue = match?.[3];
@@ -48,12 +62,18 @@ function createAttributeSelector(selector) {
48
62
  }
49
63
  };
50
64
  }
65
+ /**
66
+ * Creates a compound selector that combines multiple selectors (e.g., 'div.container', 'h1#title')
67
+ */
51
68
  function createCompoundSelector(selectors) {
52
69
  return {
53
70
  matches: (element) => selectors.every((selector) => selector.matches(element)),
54
71
  toString: () => selectors.map((s) => s.toString()).join("")
55
72
  };
56
73
  }
74
+ /**
75
+ * Parses a CSS selector into a matcher
76
+ */
57
77
  function parseSelector(selector) {
58
78
  selector = selector.trim();
59
79
  if (!selector) throw new Error("Empty selector");
@@ -80,6 +100,8 @@ function parseSelector(selector) {
80
100
  if (selectorParts.length === 1) return selectorParts[0];
81
101
  return createCompoundSelector(selectorParts);
82
102
  }
103
+ //#endregion
104
+ //#region src/plugins/extraction.ts
83
105
  function extractionPlugin(selectors) {
84
106
  const matcherCallbacks = Object.entries(selectors).map(([selector, callback]) => ({
85
107
  matcher: parseSelector(selector),
@@ -116,4 +138,5 @@ function extractionPlugin(selectors) {
116
138
  }
117
139
  });
118
140
  }
141
+ //#endregion
119
142
  export { parseSelector as n, extractionPlugin as t };