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
 | 
					  const elements = post
 | 
				
			||||||
    .contents()
 | 
					    .contents()
 | 
				
			||||||
    .toArray()
 | 
					    .toArray()
 | 
				
			||||||
    .map((el) => parseCheerioNode($, el)) // Parse the nodes
 | 
					    .map((e) => parseCheerioNode($, e)) // Parse the nodes
 | 
				
			||||||
    .filter((el) => !isPostElementEmpty(el)) // Ignore the empty nodes
 | 
					    .filter((e) => !isPostElementEmpty(e)) // Ignore the empty nodes
 | 
				
			||||||
    .map((el) => reducePostElement(el)); // Compress the nodes
 | 
					    .map((e) => reducePostElement(e)); // Compress the nodes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // ... then parse the elements to create the pairs of title/data
 | 
					  // ... then parse the elements to create the pairs of title/data
 | 
				
			||||||
  return associateElementsWithName(elements);
 | 
					  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)
 | 
					  // 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
 | 
					  // Parse the content of the spoiler
 | 
				
			||||||
  spoiler.content = node
 | 
					  spoiler.content = node
 | 
				
			||||||
| 
						 | 
					@ -278,8 +279,17 @@ function reducePostElement(element: IPostElement, recursive = true): IPostElemen
 | 
				
			||||||
  // Find the posts without name and text
 | 
					  // Find the posts without name and text
 | 
				
			||||||
  const unknownChildrens = shallowCopy.content.filter((e) => isPostElementUnknown(e));
 | 
					  const unknownChildrens = shallowCopy.content.filter((e) => isPostElementUnknown(e));
 | 
				
			||||||
  if (recursive) {
 | 
					  if (recursive) {
 | 
				
			||||||
    const recursiveUnknownChildrens = unknownChildrens.map((e) => reducePostElement(e));
 | 
					    // Copy the array of children
 | 
				
			||||||
    unknownChildrens.push(...recursiveUnknownChildrens);
 | 
					    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
 | 
					  // Eliminate non-useful child nodes
 | 
				
			||||||
| 
						 | 
					@ -289,7 +299,7 @@ function reducePostElement(element: IPostElement, recursive = true): IPostElemen
 | 
				
			||||||
      .filter((e) => !shallowCopy.content.includes(e))
 | 
					      .filter((e) => !shallowCopy.content.includes(e))
 | 
				
			||||||
      .map((e) => (e.content.length > 0 ? e.content : 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));
 | 
					    shallowCopy.content = shallowCopy.content.filter((e) => !unknownChildrens.includes(e));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Merge the non-empty children of this node with
 | 
					    // Merge the non-empty children of this node with
 | 
				
			||||||
| 
						 | 
					@ -304,6 +314,27 @@ function reducePostElement(element: IPostElement, recursive = true): IPostElemen
 | 
				
			||||||
  return shallowCopy;
 | 
					  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.
 | 
					 * Transform a `cheerio.Cheerio` node into an `IPostElement` element with its subnodes.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue