@nkardaz/typography-rules 1.0.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.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +911 -0
  3. package/dist/api/blacklist.d.ts +72 -0
  4. package/dist/api/htmlNodes.d.ts +30 -0
  5. package/dist/api/index.d.ts +6 -0
  6. package/dist/api/newRule.d.ts +51 -0
  7. package/dist/api/registerRule.d.ts +27 -0
  8. package/dist/api/rulesInit.d.ts +49 -0
  9. package/dist/functions/chemNotation.d.ts +10 -0
  10. package/dist/functions/clearSpaces.d.ts +16 -0
  11. package/dist/functions/index.cjs +514 -0
  12. package/dist/functions/index.d.ts +8 -0
  13. package/dist/functions/index.mjs +491 -0
  14. package/dist/functions/rubyText.d.ts +11 -0
  15. package/dist/functions/runt.d.ts +3 -0
  16. package/dist/functions/smartNumberGrouping.d.ts +25 -0
  17. package/dist/functions/smartQuotes.d.ts +29 -0
  18. package/dist/functions/wrapWithTag.d.ts +42 -0
  19. package/dist/glyphs/index.cjs +737 -0
  20. package/dist/glyphs/index.d.ts +53 -0
  21. package/dist/glyphs/index.mjs +714 -0
  22. package/dist/glyphs/proto.d.ts +11 -0
  23. package/dist/glyphs/registry.d.ts +728 -0
  24. package/dist/glyphs/types.d.ts +151 -0
  25. package/dist/helpers/index.cjs +268 -0
  26. package/dist/helpers/index.d.ts +133 -0
  27. package/dist/helpers/index.mjs +245 -0
  28. package/dist/helpers/types.d.ts +71 -0
  29. package/dist/index.cjs +985 -0
  30. package/dist/index.d.ts +5 -0
  31. package/dist/index.mjs +977 -0
  32. package/dist/style/index.d.ts +2 -0
  33. package/dist/style/main.css +16 -0
  34. package/dist/types.d.ts +223 -0
  35. package/dist/typography/aliases.d.ts +129 -0
  36. package/dist/typography/expressions/common.d.ts +29 -0
  37. package/dist/typography/expressions/en.d.ts +25 -0
  38. package/dist/typography/expressions/ru.d.ts +29 -0
  39. package/dist/typography/markup/common.d.ts +17 -0
  40. package/dist/typography/markup/en.d.ts +3 -0
  41. package/dist/typography/markup/index.d.ts +4 -0
  42. package/dist/typography/markup/ru.d.ts +3 -0
  43. package/dist/typography/sets/ang.d.ts +3 -0
  44. package/dist/typography/sets/common.d.ts +17 -0
  45. package/dist/typography/sets/en.d.ts +14 -0
  46. package/dist/typography/sets/index.d.ts +5 -0
  47. package/dist/typography/sets/ru.d.ts +16 -0
  48. package/dist/typography/store.d.ts +63 -0
  49. package/package.json +92 -0
@@ -0,0 +1,514 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/functions/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ chemNotation: () => chemNotation,
24
+ clearSpaces: () => clearSpaces,
25
+ resolvePlacement: () => resolvePlacement,
26
+ rubyText: () => rubyText,
27
+ runt: () => runt,
28
+ smartNumberGrouping: () => smartNumberGrouping,
29
+ smartQuotes: () => smartQuotes,
30
+ wrapWithTag: () => wrapWithTag,
31
+ wrapWithTagExpression: () => wrapWithTagExpression
32
+ });
33
+ module.exports = __toCommonJS(index_exports);
34
+
35
+ // src/functions/smartNumberGrouping.ts
36
+ function smartNumberGrouping(text, { locale = "en-US", minLength = 5 }) {
37
+ return text.replace(
38
+ /(?<![\p{L}\d])([+\-\u2212]?)(\d(?:[\u00A0]?\d)*)([.,]\d+)?(?!\d)/gu,
39
+ (match, sign, rawInt, floatPart) => {
40
+ const intPart = rawInt.replace(/\u00A0/g, "");
41
+ if (intPart.length < minLength) return match;
42
+ const decimalDigits = floatPart ? floatPart.slice(1) : "";
43
+ const normalised = decimalDigits ? `${intPart}.${decimalDigits}` : intPart;
44
+ const num = Number(normalised);
45
+ if (!Number.isFinite(num)) return match;
46
+ const formatter = new Intl.NumberFormat(locale, {
47
+ maximumFractionDigits: decimalDigits.length,
48
+ minimumFractionDigits: decimalDigits.length
49
+ });
50
+ return (sign === "\u2212" ? "\u2212" : sign) + formatter.format(num);
51
+ }
52
+ );
53
+ }
54
+
55
+ // src/functions/smartQuotes.ts
56
+ var import_glyphs = require("../glyphs/index.cjs");
57
+ function smartQuotes(text, {
58
+ outer = [import_glyphs.PUNCTUATION.en.leftSided.outerQuoteOpen, import_glyphs.PUNCTUATION.en.rightSided.outerQuoteClose],
59
+ inner = [import_glyphs.PUNCTUATION.en.leftSided.innerQuoteOpen, import_glyphs.PUNCTUATION.en.rightSided.innerQuoteClose]
60
+ } = {}) {
61
+ let result = "";
62
+ const stack = [];
63
+ for (let i = 0; i < text.length; i++) {
64
+ const char = text[i];
65
+ const prev = text[i - 1] ?? "";
66
+ const next = text[i + 1] ?? "";
67
+ if (char === '"') {
68
+ const afterSpace = prev === "" || /\s/.test(prev);
69
+ const beforeSpace = next === "" || /\s/.test(next);
70
+ let isOpen;
71
+ if (stack.length === 0) {
72
+ isOpen = true;
73
+ } else if (afterSpace && !beforeSpace) {
74
+ isOpen = true;
75
+ } else if (!afterSpace && beforeSpace) {
76
+ isOpen = false;
77
+ } else if (!afterSpace && !beforeSpace) {
78
+ isOpen = false;
79
+ } else {
80
+ isOpen = false;
81
+ }
82
+ if (isOpen) {
83
+ const q = stack.length === 0 ? outer : inner;
84
+ result += q[0];
85
+ stack.push('"');
86
+ } else {
87
+ const matchIdx = [...stack].reverse().indexOf('"');
88
+ if (matchIdx !== -1) {
89
+ stack.splice(stack.length - 1 - matchIdx, 1);
90
+ }
91
+ const q = stack.length === 0 ? outer : inner;
92
+ result += q[1];
93
+ }
94
+ continue;
95
+ }
96
+ if (char === "'") {
97
+ const insideDoubleQuotes = stack.includes('"');
98
+ const isApostrophe = /[a-zA-Z\u0430-\u044F\u0410-\u042F\u0451\u0401]/.test(prev) && /[a-zA-Z\u0430-\u044F\u0410-\u042F\u0451\u04010-9]/.test(next);
99
+ if (isApostrophe || !insideDoubleQuotes) {
100
+ result += char;
101
+ continue;
102
+ }
103
+ const lastDoubleIdx = stack.lastIndexOf('"');
104
+ const hasOpenSingle = stack.slice(lastDoubleIdx + 1).includes("'");
105
+ const isOpen = !hasOpenSingle;
106
+ if (isOpen) {
107
+ result += inner[0];
108
+ stack.push("'");
109
+ } else {
110
+ const matchIdx = [...stack].reverse().indexOf("'");
111
+ if (matchIdx !== -1) {
112
+ stack.splice(stack.length - 1 - matchIdx, 1);
113
+ }
114
+ result += inner[1];
115
+ }
116
+ continue;
117
+ }
118
+ result += char;
119
+ }
120
+ return result;
121
+ }
122
+
123
+ // src/functions/clearSpaces.ts
124
+ var import_glyphs2 = require("../glyphs/index.cjs");
125
+ function clearSpaces(text, { spaces = import_glyphs2.SPACES.find("noBreak", "hair", "thin") ?? [import_glyphs2.SPACES._] } = {}) {
126
+ let result = text;
127
+ spaces.forEach((s) => {
128
+ const escaped = s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
129
+ const regex = new RegExp(`${escaped}{2,}`, "g");
130
+ result = result.replace(regex, s);
131
+ });
132
+ return result;
133
+ }
134
+
135
+ // src/functions/runt.ts
136
+ var import_glyphs3 = require("../glyphs/index.cjs");
137
+
138
+ // src/functions/wrapWithTag.ts
139
+ function wrapWithTag(text, settings = {}, tagSettings = {}) {
140
+ if ("expression" in settings) {
141
+ return wrapWithTagExpression(text, settings, tagSettings);
142
+ }
143
+ const { marker = "^", tag = "sup", wrapper = ["[", "]"] } = settings;
144
+ const result = [];
145
+ let i = 0;
146
+ while (i < text.length) {
147
+ const start = text.indexOf(wrapper[0] + marker, i);
148
+ if (start === -1) {
149
+ result.push({ type: "text", value: text.slice(i) });
150
+ break;
151
+ }
152
+ if (start > i) {
153
+ result.push({ type: "text", value: text.slice(i, start) });
154
+ }
155
+ let depth = 0;
156
+ let j = start;
157
+ let end = -1;
158
+ while (j < text.length) {
159
+ if (text[j] === wrapper[0]) depth++;
160
+ else if (text[j] === wrapper[1]) {
161
+ depth--;
162
+ if (depth === 0) {
163
+ end = j;
164
+ break;
165
+ }
166
+ }
167
+ j++;
168
+ }
169
+ if (end === -1) {
170
+ result.push({ type: "text", value: text.slice(start) });
171
+ break;
172
+ }
173
+ result.push({
174
+ type: tag,
175
+ data: { skipTypography: true },
176
+ ...tagSettings.className && { className: tagSettings.className },
177
+ ...tagSettings.attrs && { attrs: tagSettings.attrs },
178
+ children: wrapWithTag(text.slice(start + 2, end))
179
+ });
180
+ i = end + 1;
181
+ }
182
+ return result;
183
+ }
184
+ var TAG_OPEN = "<TAG>";
185
+ var TAG_CLOSE = "</TAG>";
186
+ function wrapWithTagExpression(text, { expression, tag = "sup", placement }, tagSettings = {}) {
187
+ const result = [];
188
+ const regex = new RegExp(
189
+ expression.source,
190
+ expression.flags.includes("g") ? expression.flags : expression.flags + "g"
191
+ );
192
+ let lastIndex = 0;
193
+ let match;
194
+ while ((match = regex.exec(text)) !== null) {
195
+ if (match[0].length === 0) {
196
+ regex.lastIndex++;
197
+ continue;
198
+ }
199
+ if (match.index > lastIndex) {
200
+ result.push({ type: "text", value: text.slice(lastIndex, match.index) });
201
+ }
202
+ if (placement) {
203
+ result.push(...resolvePlacement(match, placement, tag, tagSettings));
204
+ } else {
205
+ result.push({
206
+ type: tag,
207
+ data: { skipTypography: true },
208
+ ...tagSettings.className && { className: tagSettings.className },
209
+ ...tagSettings.attrs && { attrs: tagSettings.attrs },
210
+ children: [{ type: "text", value: match[0] }]
211
+ });
212
+ }
213
+ lastIndex = match.index + match[0].length;
214
+ }
215
+ if (lastIndex < text.length) {
216
+ result.push({ type: "text", value: text.slice(lastIndex) });
217
+ }
218
+ return result;
219
+ }
220
+ function resolvePlacement(match, placement, tag, tagSettings) {
221
+ const resolved = placement.replace(/\$(\d+)/g, (_, n) => match[Number(n)] ?? "");
222
+ const tagOpenIdx = resolved.indexOf(TAG_OPEN);
223
+ const tagCloseIdx = resolved.indexOf(TAG_CLOSE);
224
+ if (tagOpenIdx === -1 || tagCloseIdx === -1) {
225
+ return [{ type: "text", value: resolved }];
226
+ }
227
+ const nodes = [];
228
+ if (tagOpenIdx > 0) {
229
+ nodes.push({ type: "text", value: resolved.slice(0, tagOpenIdx) });
230
+ }
231
+ nodes.push({
232
+ type: tag,
233
+ data: { skipTypography: true },
234
+ ...tagSettings.className && { className: tagSettings.className },
235
+ ...tagSettings.attrs && { attrs: tagSettings.attrs },
236
+ children: [{ type: "text", value: resolved.slice(tagOpenIdx + TAG_OPEN.length, tagCloseIdx) }]
237
+ });
238
+ const after = resolved.slice(tagCloseIdx + TAG_CLOSE.length);
239
+ if (after) {
240
+ nodes.push({ type: "text", value: after });
241
+ }
242
+ return nodes;
243
+ }
244
+
245
+ // src/functions/runt.ts
246
+ var NOWRAP_MARKER = "~";
247
+ var NOWRAP_WRAPPER = ["[", "]"];
248
+ function runt(text, { threshold = 10, space = import_glyphs3.SPACES.noBreak, minLineLength = 75 * 2 } = {}) {
249
+ if (text.length < minLineLength) return [{ type: "text", value: text }];
250
+ const segmenter = new Intl.Segmenter(void 0, {
251
+ granularity: "word"
252
+ });
253
+ const words = [...segmenter.segment(text)].filter((s) => s.isWordLike).map((s) => ({
254
+ index: s.index,
255
+ word: s.segment,
256
+ length: s.segment.length
257
+ }));
258
+ if (words.length < 2) return [{ type: "text", value: text }];
259
+ const noBreakPositions = /* @__PURE__ */ new Set();
260
+ let nowrapRange = null;
261
+ const markSpaceBefore = (pos) => {
262
+ for (let i = pos - 1; i >= 0; i--) {
263
+ const char = text[i];
264
+ if (char && /\s/u.test(char)) {
265
+ noBreakPositions.add(i);
266
+ break;
267
+ }
268
+ }
269
+ };
270
+ const last = words.at(-1);
271
+ if ([...last.word].length >= threshold) {
272
+ markSpaceBefore(last.index);
273
+ return [{ type: "text", value: applyNoBreaks(text, noBreakPositions, space) }];
274
+ }
275
+ const limit = threshold / 1.25;
276
+ for (let i = words.length - 1; i > 0; i--) {
277
+ const word = words[i];
278
+ const prev = words[i - 1];
279
+ markSpaceBefore(word.index);
280
+ if ([...prev.word].length >= limit) {
281
+ markSpaceBefore(prev.index);
282
+ nowrapRange = {
283
+ start: prev.index,
284
+ end: word.index + word.word.length
285
+ };
286
+ break;
287
+ }
288
+ }
289
+ const processed = applyNoBreaks(text, noBreakPositions, space);
290
+ if (!nowrapRange) return [{ type: "text", value: processed }];
291
+ const marked = processed.slice(0, nowrapRange.start) + NOWRAP_WRAPPER[0] + NOWRAP_MARKER + processed.slice(nowrapRange.start, nowrapRange.end) + NOWRAP_WRAPPER[1] + processed.slice(nowrapRange.end);
292
+ return wrapWithTag(
293
+ marked,
294
+ {
295
+ marker: NOWRAP_MARKER,
296
+ tag: "span",
297
+ wrapper: NOWRAP_WRAPPER
298
+ },
299
+ {
300
+ attrs: { style: "white-space: nowrap;" }
301
+ }
302
+ );
303
+ }
304
+ function applyNoBreaks(text, positions, space) {
305
+ if (positions.size === 0) return text;
306
+ let out = "";
307
+ for (let i = 0; i < text.length; i++) {
308
+ out += positions.has(i) ? space : text[i];
309
+ }
310
+ return out;
311
+ }
312
+
313
+ // src/functions/rubyText.ts
314
+ function rubyText(text, { marker = ":", wrapper = ["[", "]"] } = {}, { className, attrs } = {}) {
315
+ const result = [];
316
+ let i = 0;
317
+ const open = wrapper[0] + marker;
318
+ while (i < text.length) {
319
+ const baseStart = text.indexOf(open, i);
320
+ if (baseStart === -1) {
321
+ result.push({ type: "text", value: text.slice(i) });
322
+ break;
323
+ }
324
+ if (baseStart > i) {
325
+ result.push({ type: "text", value: text.slice(i, baseStart) });
326
+ }
327
+ let depth = 0;
328
+ let j = baseStart;
329
+ let baseEnd = -1;
330
+ while (j < text.length) {
331
+ if (text[j] === wrapper[0]) depth++;
332
+ else if (text[j] === wrapper[1]) {
333
+ depth--;
334
+ if (depth === 0) {
335
+ baseEnd = j;
336
+ break;
337
+ }
338
+ }
339
+ j++;
340
+ }
341
+ if (baseEnd === -1) {
342
+ result.push({ type: "text", value: text.slice(baseStart) });
343
+ break;
344
+ }
345
+ const furiganaStart = text.indexOf(open, baseEnd + 1);
346
+ if (furiganaStart !== baseEnd + 1) {
347
+ result.push({ type: "text", value: text.slice(baseStart, baseEnd + 1) });
348
+ i = baseEnd + 1;
349
+ continue;
350
+ }
351
+ depth = 0;
352
+ j = furiganaStart;
353
+ let furiganaEnd = -1;
354
+ while (j < text.length) {
355
+ if (text[j] === wrapper[0]) depth++;
356
+ else if (text[j] === wrapper[1]) {
357
+ depth--;
358
+ if (depth === 0) {
359
+ furiganaEnd = j;
360
+ break;
361
+ }
362
+ }
363
+ j++;
364
+ }
365
+ if (furiganaEnd === -1) {
366
+ result.push({ type: "text", value: text.slice(baseStart) });
367
+ break;
368
+ }
369
+ const baseInner = text.slice(baseStart + open.length, baseEnd);
370
+ const furiganaInner = text.slice(furiganaStart + open.length, furiganaEnd);
371
+ const baseParts = baseInner.split("|");
372
+ const furiganaParts = furiganaInner.split("|");
373
+ const children = [];
374
+ for (let k = 0; k < baseParts.length; k++) {
375
+ children.push({
376
+ type: "rb",
377
+ data: { skipTypography: true },
378
+ children: [{ type: "text", value: baseParts[k] ?? "" }]
379
+ });
380
+ children.push({
381
+ type: "rt",
382
+ data: { skipTypography: true },
383
+ children: [{ type: "text", value: furiganaParts[k] ?? "" }]
384
+ });
385
+ }
386
+ result.push({
387
+ type: "ruby",
388
+ data: { skipTypography: true },
389
+ ...className && { className },
390
+ ...attrs && { attrs },
391
+ children
392
+ });
393
+ i = furiganaEnd + 1;
394
+ }
395
+ return result;
396
+ }
397
+
398
+ // src/functions/chemNotation.ts
399
+ function parseScripts(content) {
400
+ const tokens = [];
401
+ let j = 0;
402
+ while (j < content.length) {
403
+ if (content[j] === "(") {
404
+ const close = content.indexOf(")", j);
405
+ if (close === -1) break;
406
+ const inner = content.slice(j + 1, close);
407
+ if (inner.startsWith("^")) {
408
+ tokens.push({ kind: "sup", value: inner.slice(1) });
409
+ } else if (inner.startsWith("_")) {
410
+ tokens.push({ kind: "sub", value: inner.slice(1) });
411
+ }
412
+ j = close + 1;
413
+ } else {
414
+ let k = j;
415
+ while (k < content.length && content[k] !== "(") k++;
416
+ const chunk = content.slice(j, k).trim();
417
+ if (chunk) tokens.push({ kind: "base", value: chunk });
418
+ j = k;
419
+ }
420
+ }
421
+ const baseIdx = tokens.findIndex((t) => t.kind === "base" && t.value);
422
+ if (baseIdx === -1) return null;
423
+ const base = tokens[baseIdx].value;
424
+ const left = tokens.slice(0, baseIdx);
425
+ const right = tokens.slice(baseIdx + 1);
426
+ return {
427
+ base,
428
+ supL: left.find((t) => t.kind === "sup")?.value ?? "",
429
+ subL: left.find((t) => t.kind === "sub")?.value ?? "",
430
+ supR: right.find((t) => t.kind === "sup")?.value ?? "",
431
+ subR: right.find((t) => t.kind === "sub")?.value ?? ""
432
+ };
433
+ }
434
+ function splitParts(content) {
435
+ const parts = [];
436
+ let depth = 0;
437
+ let start = 0;
438
+ for (let i = 0; i < content.length; i++) {
439
+ if (content[i] === "(") depth++;
440
+ else if (content[i] === ")") depth--;
441
+ else if (content[i] === "-" && depth === 0) {
442
+ parts.push(content.slice(start, i));
443
+ start = i + 1;
444
+ }
445
+ }
446
+ parts.push(content.slice(start));
447
+ return parts.map((p) => p.trim()).filter(Boolean);
448
+ }
449
+ function textNode(value) {
450
+ return { type: "text", value };
451
+ }
452
+ function mnNode(value) {
453
+ return { type: "mn", data: { skipTypography: true }, children: [textNode(value)] };
454
+ }
455
+ function buildMmultiscripts({ base, supL, subL, supR, subR }) {
456
+ const baseNode = { type: "mi", data: { skipTypography: true }, children: [textNode(base)] };
457
+ const children = [baseNode, mnNode(subR), mnNode(supR)];
458
+ if (subL || supL) {
459
+ children.push({ type: "mprescripts", data: { skipTypography: true }, children: [] });
460
+ children.push(mnNode(subL), mnNode(supL));
461
+ }
462
+ return { type: "mmultiscripts", data: { skipTypography: true }, children };
463
+ }
464
+ function chemNotation(text, { marker = "%", wrapper = ["[", "]"] } = {}, { className, attrs } = {}) {
465
+ const result = [];
466
+ const open = wrapper[0] + marker;
467
+ const openChar = wrapper[0];
468
+ const closeChar = wrapper[1];
469
+ let i = 0;
470
+ while (i < text.length) {
471
+ const start = text.indexOf(open, i);
472
+ if (start === -1) {
473
+ result.push(textNode(text.slice(i)));
474
+ break;
475
+ }
476
+ if (start > i) result.push(textNode(text.slice(i, start)));
477
+ let depth = 0;
478
+ let j = start;
479
+ let end = -1;
480
+ while (j < text.length) {
481
+ if (text[j] === openChar) depth++;
482
+ else if (text[j] === closeChar) {
483
+ depth--;
484
+ if (depth === 0) {
485
+ end = j;
486
+ break;
487
+ }
488
+ }
489
+ j++;
490
+ }
491
+ if (end === -1) {
492
+ result.push(textNode(text.slice(start)));
493
+ break;
494
+ }
495
+ const content = text.slice(start + open.length, end);
496
+ const parts = splitParts(content);
497
+ const parsed = parts.map(parseScripts).filter((p) => p !== null);
498
+ if (!parsed.length) {
499
+ result.push(textNode(text.slice(start, end + 1)));
500
+ i = end + 1;
501
+ continue;
502
+ }
503
+ result.push({
504
+ type: "math",
505
+ data: { skipTypography: true },
506
+ ...className && { className },
507
+ ...attrs && { attrs },
508
+ children: parsed.map(buildMmultiscripts)
509
+ });
510
+ i = end + 1;
511
+ }
512
+ return result;
513
+ }
514
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1,8 @@
1
+ export * from './smartNumberGrouping';
2
+ export * from './smartQuotes';
3
+ export * from './clearSpaces';
4
+ export * from './runt';
5
+ export * from './wrapWithTag';
6
+ export * from './rubyText';
7
+ export * from './chemNotation';
8
+ //# sourceMappingURL=index.d.ts.map