export default function textSearch(content, query) {
if (query.length === 0 || content.length === 0 || query.length > content.length) {
return content;
}
const contentLower = content.toLowerCase();
const queryLower = query.toLowerCase();
const qLen = query.length;
const rawRanges = [];
let i = 0;
while (i <= content.length - qLen) {
if (contentLower.slice(i, i + qLen) === queryLower) {
rawRanges.push([i, i + qLen]);
i += qLen;
} else {
i++;
}
}
if (rawRanges.length === 0) {
return content;
}
const mergedRanges = [rawRanges[0]];
for (let j = 1; j < rawRanges.length; j++) {
const [start, end] = rawRanges[j];
const last = mergedRanges[mergedRanges.length - 1];
if (start <= last[1]) {
last[1] = Math.max(last[1], end);
} else {
mergedRanges.push([start, end]);
}
}
let result = '';
let cursor = 0;
for (const [start, end] of mergedRanges) {
result += content.slice(cursor, start);
result += `<b>${content.slice(start, end)}</b>`;
cursor = end;
}
result += content.slice(cursor);
return result;
}