Rework final pair up of elements
parent
5f9ad0056a
commit
701678b577
|
@ -376,6 +376,7 @@ function associateNameToElements(elements: IPostElement[]): IPostElement[] {
|
||||||
const pairs: IPostElement[] = [];
|
const pairs: IPostElement[] = [];
|
||||||
const specialCharsRegex = /^[-!$%^&*()_+|~=`{}[\]:";'<>?,./]/;
|
const specialCharsRegex = /^[-!$%^&*()_+|~=`{}[\]:";'<>?,./]/;
|
||||||
const specialRegex = new RegExp(specialCharsRegex);
|
const specialRegex = new RegExp(specialCharsRegex);
|
||||||
|
const x = pairUp(elements);
|
||||||
|
|
||||||
for (let i = 0; i < elements.length; i++) {
|
for (let i = 0; i < elements.length; i++) {
|
||||||
// If the text starts with a special char, clean it
|
// If the text starts with a special char, clean it
|
||||||
|
@ -417,4 +418,80 @@ function associateNameToElements(elements: IPostElement[]): IPostElement[] {
|
||||||
return pairs;
|
return pairs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function pairUp(elements: IPostElement[]): IPostElement[] {
|
||||||
|
// First ignore the "Generic" type elements, because
|
||||||
|
// they usually are containers for other data, like
|
||||||
|
// overview or download links.
|
||||||
|
const validElements = elements.filter((e) => e.type !== "Generic");
|
||||||
|
|
||||||
|
// Than we find all the IDs of "Text" elements where the
|
||||||
|
// text doesn't starts with double points. This means
|
||||||
|
// that we find all the IDs of "title" elements.
|
||||||
|
const indexes = validElements
|
||||||
|
.filter(
|
||||||
|
(e, i) =>
|
||||||
|
e.type === "Text" && // This element must be a text
|
||||||
|
((e.text.endsWith(":") && e.text !== ":") || // This element's text must ends with ":"
|
||||||
|
validElements[i + 1]?.text.startsWith(":")) // The next element's text must start with ":"
|
||||||
|
)
|
||||||
|
.map((e) => validElements.indexOf(e));
|
||||||
|
|
||||||
|
// Now we find all the elements between indexes and
|
||||||
|
// associate them with the previous "title" element
|
||||||
|
const data = indexes.map((i, j) => parseGroupData(i, j, indexes, validElements));
|
||||||
|
|
||||||
|
// Now parse all the "invalid" elements,
|
||||||
|
// so all the elements with "Generic" type
|
||||||
|
const genericElementsPairs = elements
|
||||||
|
.filter((e) => e.type === "Generic")
|
||||||
|
.map((e) => pairUp(e.content));
|
||||||
|
|
||||||
|
const flatten: IPostElement[] = [].concat(...genericElementsPairs);
|
||||||
|
data.push(...flatten);
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseGroupData(
|
||||||
|
start: number,
|
||||||
|
index: number,
|
||||||
|
indexes: number[],
|
||||||
|
elements: IPostElement[]
|
||||||
|
): IPostElement {
|
||||||
|
// Local variables
|
||||||
|
const endsWithSpecialCharsRegex = /[-!$%^&*()_+|~=`{}[\]:";'<>?,./]$/;
|
||||||
|
const startsWithDoublePointsRegex = /^[:]/;
|
||||||
|
|
||||||
|
// Find all the elements (title + data) of the same data group
|
||||||
|
const nextIndex = indexes[index + 1] ?? elements.length;
|
||||||
|
const group = elements.slice(start, nextIndex);
|
||||||
|
|
||||||
|
// Extract the title
|
||||||
|
const title = group.shift();
|
||||||
|
|
||||||
|
// Assign name and text of the title
|
||||||
|
title.name = title.text.replace(endsWithSpecialCharsRegex, "").trim();
|
||||||
|
title.text = group
|
||||||
|
.filter((e) => e.type === "Text")
|
||||||
|
.map((e) =>
|
||||||
|
e.text
|
||||||
|
.replace(startsWithDoublePointsRegex, "") // Remove the starting ":" from the element's text
|
||||||
|
.replace(endsWithSpecialCharsRegex, "") // Remove any special chars at the end
|
||||||
|
.trim()
|
||||||
|
)
|
||||||
|
.join(" "); // Join with space
|
||||||
|
|
||||||
|
// Append all the content of non-text elements.
|
||||||
|
group
|
||||||
|
.filter((e) => e.type !== "Text")
|
||||||
|
.forEach(
|
||||||
|
(e) =>
|
||||||
|
e.type === "Spoiler"
|
||||||
|
? title.content.push(...e.content) // Add all the content fo the spoiler
|
||||||
|
: title.content.push(e) // Add the element itself
|
||||||
|
);
|
||||||
|
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
//#endregion Private methods
|
//#endregion Private methods
|
||||||
|
|
Loading…
Reference in New Issue