mirror of
https://activitypub.software/TransFem-org/sfm-js
synced 2024-11-25 15:35:13 +00:00
This commit is contained in:
parent
4fe75b1341
commit
d95206fece
1 changed files with 20 additions and 42 deletions
66
src/util.ts
66
src/util.ts
|
@ -1,4 +1,4 @@
|
||||||
import { MfmNode, MfmText } from './node';
|
import { MfmNode } from './node';
|
||||||
|
|
||||||
export function createNode(type: string, props?: Record<string, any>, children?: MfmNode[]): MfmNode {
|
export function createNode(type: string, props?: Record<string, any>, children?: MfmNode[]): MfmNode {
|
||||||
const node: any = { type };
|
const node: any = { type };
|
||||||
|
@ -11,54 +11,32 @@ export function createNode(type: string, props?: Record<string, any>, children?:
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
export function mergeText(nodes: (MfmNode | string)[]): MfmNode[] {
|
||||||
* @param predicate specifies whether to group the previous item and the current item
|
const dest: MfmNode[] = [];
|
||||||
* @returns grouped items
|
const storedChars: string[] = [];
|
||||||
*/
|
|
||||||
export function groupContinuous<T>(arr: T[], predicate: (prev: T, current: T) => boolean): T[][] {
|
|
||||||
const dest: any[][] = [];
|
|
||||||
|
|
||||||
for (let i = 0; i < arr.length; i++) {
|
/**
|
||||||
if (i != 0 && predicate(arr[i - 1], arr[i])) {
|
* Generate a text node from the stored chars, And push it.
|
||||||
dest[dest.length - 1].push(arr[i]);
|
*/
|
||||||
|
function generateText() {
|
||||||
|
if (storedChars.length > 0) {
|
||||||
|
const textNode = createNode('text', { text: storedChars.join('') });
|
||||||
|
dest.push(textNode);
|
||||||
|
storedChars.length = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const node of nodes) {
|
||||||
|
if (typeof node == 'string') {
|
||||||
|
// Store the char.
|
||||||
|
storedChars.push(node);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
dest.push([arr[i]]);
|
generateText();
|
||||||
|
dest.push(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
generateText();
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function mergeGroupedTrees<T>(groupedTrees: T[][]): T[] {
|
|
||||||
return groupedTrees.reduce((acc, val) => acc.concat(val), ([] as T[]));
|
|
||||||
}
|
|
||||||
|
|
||||||
export function mergeText(trees: (MfmNode | string)[]): MfmNode[] {
|
|
||||||
// group trees
|
|
||||||
const groupes = groupContinuous(trees, (prev, current) => {
|
|
||||||
if (typeof prev == 'string' || typeof current == 'string') {
|
|
||||||
return (typeof prev == 'string' && typeof current == 'string');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return (prev.type == current.type);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// concatinate text
|
|
||||||
const concatGroupes = groupes.map((group) => {
|
|
||||||
if (typeof group[0] == 'string') {
|
|
||||||
return [
|
|
||||||
createNode('text', {
|
|
||||||
text: (group as string[]).join('')
|
|
||||||
})
|
|
||||||
];
|
|
||||||
}
|
|
||||||
return (group as MfmNode[]);
|
|
||||||
});
|
|
||||||
|
|
||||||
// merge groups
|
|
||||||
const dest = mergeGroupedTrees(concatGroupes);
|
|
||||||
|
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue