Skip to content

Commit 4888ee5

Browse files
committed
feat(json-crdt-extensions): 🎸 use registry in HTML import
1 parent acfe769 commit 4888ee5

File tree

4 files changed

+28
-21
lines changed

4 files changed

+28
-21
lines changed
Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,38 @@
11
import {html as _html} from 'very-small-parser/lib/html';
22
import {fromHast as _fromHast} from 'very-small-parser/lib/html/json-ml/fromHast';
33
import {SliceTypeName} from '../slice';
4+
import {registry as defaultRegistry} from '../registry/registry';
45
import type {JsonMlNode} from 'very-small-parser/lib/html/json-ml/types';
56
import type {THtmlToken} from 'very-small-parser/lib/html/types';
67
import type {PeritextMlNode} from '../block/types';
8+
import type {SliceRegistry} from '../registry/SliceRegistry';
79

8-
export const fromJsonMl = (jsonml: JsonMlNode): PeritextMlNode => {
10+
export const fromJsonMl = (jsonml: JsonMlNode, registry: SliceRegistry = defaultRegistry): PeritextMlNode => {
911
if (typeof jsonml === 'string') return jsonml;
10-
const [tag, attr = {}, ...children] = jsonml;
11-
const type = SliceTypeName[tag as any] ?? tag;
12-
const data = attr['data-attr'] !== void 0 ? JSON.parse(attr['data-attr']) : null;
13-
// console.log('tag', tag);
14-
// const namedTag = tag === '' ? tag : tag;
15-
// const peritextTag = namedTag ?? (attr?.inline ? 'span' : 'div');
16-
// const peritextAttr = attr && attr['data-attr'] !== void 0 ? {data: JSON.parse(attr['data-attr'])} : null;
17-
const peritextNode: PeritextMlNode = [type, {}];
18-
const length = children.length;
19-
for (let i = 0; i < length; i++) peritextNode.push(fromJsonMl(children[i]));
20-
return peritextNode;
12+
const tag = jsonml[0];
13+
const length = jsonml.length;
14+
const node: PeritextMlNode = [tag, null];
15+
for (let i = 2; i < length; i++) node.push(fromJsonMl(jsonml[i] as JsonMlNode, registry));
16+
const res = registry.fromHtml(jsonml);
17+
if (res) {
18+
node[0] = res[0];
19+
node[1] = res[1];
20+
} else {
21+
node[0] = SliceTypeName[tag as any] ?? tag;
22+
const attr = jsonml[1] || {};
23+
const data = attr['data-attr'] !== void 0 ? JSON.parse(attr['data-attr']) : null;
24+
const inline = attr['data-inline'] === 'true';
25+
if (data || inline) node[1] = {data, inline};
26+
}
27+
return node;
2128
};
2229

23-
export const fromHast = (hast: THtmlToken): PeritextMlNode => {
30+
export const fromHast = (hast: THtmlToken, registry?: SliceRegistry): PeritextMlNode => {
2431
const jsonml = _fromHast(hast);
25-
return fromJsonMl(jsonml);
32+
return fromJsonMl(jsonml, registry);
2633
};
2734

28-
export const fromHtml = (html: string): PeritextMlNode => {
35+
export const fromHtml = (html: string, registry?: SliceRegistry): PeritextMlNode => {
2936
const hast = _html.parsef(html);
30-
return fromHast(hast);
37+
return fromHast(hast, registry);
3138
};

src/json-crdt-extensions/peritext/registry/SliceRegistry.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export class SliceRegistry {
2626
return converter ? converter(el) : undefined;
2727
}
2828

29-
public fromHtml(el: JsonMlElement): ReturnType<FromHtmlConverter<any, any>> | undefined {
29+
public fromHtml(el: JsonMlElement): PeritextMlElement | undefined {
3030
const tag = el[0] + '';
3131
const converters = this.fromHtmlMap.get(tag);
3232
if (converters) {

src/json-crdt-extensions/peritext/registry/registry.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ registry.add({
2525
href: attr.href ?? '',
2626
title: attr.title ?? '',
2727
};
28-
return [CommonSliceType.a, data];
28+
return [CommonSliceType.a, {data, inline: true}];
2929
}
3030
},
3131
});

src/json-crdt-extensions/peritext/registry/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ export interface SliceTypeDefinition<Type extends number | string = number | str
99
schema: Schema;
1010
toHtml?: ToHtmlConverter<PeritextMlElement<Type, JsonNodeView<SchemaToJsonNode<Schema>>, Inline>>;
1111
fromHtml?: {
12-
[htmlTag: string]: FromHtmlConverter<Type, JsonNodeView<SchemaToJsonNode<Schema>>>;
12+
[htmlTag: string]: FromHtmlConverter<PeritextMlElement<Type, JsonNodeView<SchemaToJsonNode<Schema>>, Inline>>;
1313
};
1414
}
1515

1616
export type ToHtmlConverter<El extends PeritextMlElement<any, any, any> = PeritextMlElement<string | number, unknown, boolean>> =
1717
(element: El) => [tag: string, attr: Record<string, string> | null];
1818

19-
export type FromHtmlConverter<Type extends number | string = string | number, Data = unknown> =
20-
(jsonml: JsonMlElement) => [type: Type, data: Data];
19+
export type FromHtmlConverter<El extends PeritextMlElement<any, any, any> = PeritextMlElement<string | number, unknown, boolean>> =
20+
(jsonml: JsonMlElement) => El;

0 commit comments

Comments
 (0)