Recursive call to reducePostElement return children in order
parent
4b3ce390fd
commit
8e118de909
|
@ -41,9 +41,9 @@ export function parseF95ThreadPost($: cheerio.Root, post: cheerio.Cheerio): IPos
|
|||
const elements = post
|
||||
.contents()
|
||||
.toArray()
|
||||
.map((el) => parseCheerioNode($, el)) // Parse the nodes
|
||||
.filter((el) => !isPostElementEmpty(el)) // Ignore the empty nodes
|
||||
.map((el) => reducePostElement(el)); // Compress the nodes
|
||||
.map((e) => parseCheerioNode($, e)) // Parse the nodes
|
||||
.filter((e) => !isPostElementEmpty(e)) // Ignore the empty nodes
|
||||
.map((e) => reducePostElement(e)); // Compress the nodes
|
||||
|
||||
// ... then parse the elements to create the pairs of title/data
|
||||
return associateElementsWithName(elements);
|
||||
|
@ -123,7 +123,8 @@ function parseCheerioSpoilerNode($: cheerio.Root, node: cheerio.Cheerio): IPostE
|
|||
};
|
||||
|
||||
// Find the title of the spoiler (contained in the button)
|
||||
spoiler.name = node.find(POST.SPOILER_BUTTON).first().text().trim();
|
||||
const name = node.find(POST.SPOILER_NAME)?.first();
|
||||
spoiler.name = name ? name.text().trim() : "";
|
||||
|
||||
// Parse the content of the spoiler
|
||||
spoiler.content = node
|
||||
|
@ -278,8 +279,17 @@ function reducePostElement(element: IPostElement, recursive = true): IPostElemen
|
|||
// Find the posts without name and text
|
||||
const unknownChildrens = shallowCopy.content.filter((e) => isPostElementUnknown(e));
|
||||
if (recursive) {
|
||||
const recursiveUnknownChildrens = unknownChildrens.map((e) => reducePostElement(e));
|
||||
unknownChildrens.push(...recursiveUnknownChildrens);
|
||||
// Copy the array of children
|
||||
const copy = [...unknownChildrens];
|
||||
|
||||
copy.map((e) => {
|
||||
// Reduce the element
|
||||
const reduced = reducePostElement(e);
|
||||
|
||||
// Replace the element
|
||||
const index = unknownChildrens.indexOf(e);
|
||||
unknownChildrens[index] = reduced;
|
||||
});
|
||||
}
|
||||
|
||||
// Eliminate non-useful child nodes
|
||||
|
@ -289,7 +299,7 @@ function reducePostElement(element: IPostElement, recursive = true): IPostElemen
|
|||
.filter((e) => !shallowCopy.content.includes(e))
|
||||
.map((e) => (e.content.length > 0 ? e.content : e));
|
||||
|
||||
// Remove the empty elements
|
||||
// Save the elements NOT IN unknownChildren
|
||||
shallowCopy.content = shallowCopy.content.filter((e) => !unknownChildrens.includes(e));
|
||||
|
||||
// Merge the non-empty children of this node with
|
||||
|
@ -304,6 +314,27 @@ function reducePostElement(element: IPostElement, recursive = true): IPostElemen
|
|||
return shallowCopy;
|
||||
}
|
||||
|
||||
function removeEmptyElement(element: IPostElement): IPostElement {
|
||||
// Create a copy of the content
|
||||
const contentCopy = [...element.content];
|
||||
|
||||
contentCopy.map((e) => {
|
||||
// Find the non-empty nodes
|
||||
const validNodes = e.content.filter((e) => !isPostElementEmpty(e));
|
||||
|
||||
// Clean this element children
|
||||
const cleanNodes = validNodes.map((e) => removeEmptyElement(e));
|
||||
|
||||
// Assign the nodes
|
||||
e.content = cleanNodes;
|
||||
});
|
||||
|
||||
const copy: IPostElement = Object.assign({}, element);
|
||||
copy.content = contentCopy;
|
||||
|
||||
return copy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Transform a `cheerio.Cheerio` node into an `IPostElement` element with its subnodes.
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue