Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit76c78ac

Browse files
committed
feat: 🎸 add replace() function
1 parenta791b0d commit76c78ac

File tree

6 files changed

+188
-6
lines changed

6 files changed

+188
-6
lines changed

‎src/__tests__/flatToMdast.spec.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ describe('structure', () => {
1010
nodes:[
1111
{
1212
type:'root',
13-
}
14-
]
13+
},
14+
],
1515
};
1616
constmdast=flatToMdast(flatasany);
1717

@@ -249,7 +249,7 @@ describe('structure', () => {
249249
children:[
250250
{
251251
type:'text',
252-
value:'world!'
252+
value:'world!',
253253
},
254254
],
255255
},

‎src/__tests__/replace.spec.ts‎

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import{create}from'md-mdast';
2+
import{mdastToFlat}from'../mdastToFlat';
3+
import{replace}from'../replace';
4+
5+
describe('structure',()=>{
6+
it('exists',()=>{
7+
expect(typeofreplace).toBe('function');
8+
});
9+
10+
it('merges nodes',()=>{
11+
constparser=create();
12+
constmdast1=parser.tokenizeBlock('1\n'+'\n'+'here\n'+'\n'+'4\n');
13+
constmdast2=parser.tokenizeBlock('3\n'+'\n'+'4\n');
14+
constflat1=mdastToFlat(mdast1!);
15+
constflat2=mdastToFlat(mdast2!);
16+
constmerged=replace(flat1,3,flat2);
17+
18+
expect(merged).toMatchObject({
19+
nodes:[
20+
{type:'root',children:[1,3,5],idx:0},
21+
{type:'paragraph',children:[2],idx:1},
22+
{type:'text',value:'1',idx:2},
23+
{type:'portal',original:{type:'paragraph',children:[4],idx:3},children:[7]},
24+
{type:'text',value:'here',idx:4},
25+
{type:'paragraph',children:[6],idx:5},
26+
{type:'text',value:'4',idx:6},
27+
{type:'root',children:[8,10],idx:7},
28+
{type:'paragraph',children:[9],idx:8},
29+
{type:'text',value:'3',idx:9},
30+
{type:'paragraph',children:[11],idx:10},
31+
{type:'text',value:'4',idx:11},
32+
],
33+
contents:[],
34+
definitions:{},
35+
footnotes:{},
36+
});
37+
});
38+
39+
it('merges metadata',()=>{
40+
constparser=create();
41+
constmdast1=parser.tokenizeBlock(`
42+
# Click [here][link1] world![^foot]
43+
44+
merge here
45+
46+
[^foot]: This is footnote 1
47+
[link1]: http://google.com
48+
`);
49+
constmdast2=parser.tokenizeBlock(`
50+
## [what][gg]?[^note]
51+
52+
[gg]: mailto:gg@bets.com
53+
[^note]: is dis...
54+
`);
55+
constflat1=mdastToFlat(mdast1!);
56+
constflat2=mdastToFlat(mdast2!);
57+
constmerged=replace(flat1,7,flat2);
58+
59+
expect(merged).toMatchObject({
60+
nodes:[
61+
{type:'root',children:[1,7],idx:0},
62+
{
63+
type:'heading',
64+
children:[2,3,5,6],
65+
depth:1,
66+
idx:1,
67+
},
68+
{type:'text',value:'Click ',idx:2},
69+
{
70+
type:'linkReference',
71+
children:[4],
72+
identifier:'link1',
73+
referenceType:'full',
74+
idx:3,
75+
},
76+
{type:'text',value:'here',idx:4},
77+
{type:'text',value:' world',idx:5},
78+
{
79+
type:'imageReference',
80+
identifier:'^foot',
81+
referenceType:'shortcut',
82+
alt:'^foot',
83+
idx:6,
84+
},
85+
{
86+
type:'portal',
87+
idx:7,
88+
original:{type:'paragraph',children:[8],idx:7},
89+
children:[13],
90+
},
91+
{type:'text',value:'merge here',idx:8},
92+
{
93+
type:'footnoteDefinition',
94+
children:[10],
95+
identifier:'foot',
96+
idx:9,
97+
},
98+
{type:'paragraph',children:[11],idx:10},
99+
{type:'text',value:'This is footnote 1',idx:11},
100+
{
101+
type:'definition',
102+
identifier:'link1',
103+
title:null,
104+
url:'http://google.com',
105+
idx:12,
106+
},
107+
{type:'root',children:[14],idx:13},
108+
{type:'heading',children:[15,17,18],depth:2,idx:14},
109+
{
110+
type:'linkReference',
111+
children:[16],
112+
identifier:'gg',
113+
referenceType:'full',
114+
idx:15,
115+
},
116+
{type:'text',value:'what',idx:16},
117+
{type:'text',value:'?',idx:17},
118+
{type:'footnoteReference',value:'note',idx:18},
119+
{
120+
type:'definition',
121+
identifier:'gg',
122+
title:null,
123+
url:'mailto:gg@bets.com',
124+
idx:19,
125+
},
126+
{type:'footnoteDefinition',children:[21],identifier:'note',idx:20},
127+
{type:'paragraph',children:[22],idx:21},
128+
{type:'text',value:'is dis…',idx:22},
129+
],
130+
contents:[1,14],
131+
definitions:{link1:12,gg:19},
132+
footnotes:{foot:9,note:20},
133+
});
134+
});
135+
});

‎src/flatToMdast.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ export const flatToMdast: FlatToMdast = (flat: Flat) => {
1212
if(!mdast.children)mdast.children=[];
1313

1414
if(flat.definitionsinstanceofObject){
15-
Object.values(flat.definitions).forEach(index=>{
15+
Object.values(flat.definitions).forEach((index)=>{
1616
mdast.children.push(traverse(index)asTBlockToken);
1717
});
1818
}
1919
if(flat.footnotesinstanceofObject){
20-
Object.values(flat.footnotes).forEach(index=>{
20+
Object.values(flat.footnotes).forEach((index)=>{
2121
mdast.children.push(traverse(index)asTBlockToken);
2222
});
2323
}

‎src/index.tsx‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
export*from'./mdastToFlat';
2+
export*from'./flatToMdast';
3+
export*from'./replace';

‎src/replace.ts‎

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import{Flat}from'./types';
2+
3+
exportconstreplace=(into:Flat,at:number,what:Flat):Flat=>{
4+
constmergeIdx=into.nodes.length;
5+
constmerged:Flat={
6+
nodes:[...into.nodes],
7+
contents:[...into.contents],
8+
definitions:{...into.definitions},
9+
footnotes:{...into.footnotes},
10+
};
11+
12+
constreplacedNode=merged.nodes[at];
13+
merged.nodes[at]={
14+
type:'portal',
15+
idx:at,
16+
original:replacedNode,
17+
children:[mergeIdx],
18+
}asany;
19+
20+
// APPEND NODES.
21+
for(constnodeofwhat.nodes){
22+
constnewNode:any={
23+
...node,
24+
idx:node.idx+mergeIdx,
25+
};
26+
27+
if(newNode.children){
28+
newNode.children=newNode.children.map((idx)=>idx+mergeIdx);
29+
}
30+
merged.nodes.push(newNode);
31+
}
32+
33+
// MERGE METADATA.
34+
for(constidxofwhat.contents){
35+
merged.contents.push(idx+mergeIdx);
36+
}
37+
Object.keys(what.definitions).forEach(
38+
(identifier)=>(merged.definitions[identifier]=what.definitions[identifier]+mergeIdx),
39+
);
40+
Object.keys(what.footnotes).forEach(
41+
(identifier)=>(merged.footnotes[identifier]=what.footnotes[identifier]+mergeIdx),
42+
);
43+
44+
returnmerged;
45+
};

‎src/types.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export interface FlatFootnotes {
88
[id:string]:number;
99
}
1010

11-
exporttypeTNode=(IRoot|TAnyToken)&{idx:number,children?:number[]};
11+
exporttypeTNode=(IRoot|TAnyToken)&{idx:number;children?:number[]};
1212

1313
exportinterfaceFlat{
1414
nodes:TNode[];

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp