This commit is contained in:
Andrew Pimenov 2026-10-07 07:02:35 +03:00 • committed by GitHub
commit 41db58c4b9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -44,6 +44,10 @@ export function parseResultQuery(
return { op: m[1], threshold: v }; return { op: m[1], threshold: v };
} }
function escapeRegExp(string: string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
export function searchAllSheets(deps: SearchDeps, query: string): SearchHit[] { export function searchAllSheets(deps: SearchDeps, query: string): SearchHit[] {
const q = query.trim(); const q = query.trim();
if (!q) return []; if (!q) return [];
@ -95,20 +99,42 @@ export function searchAllSheets(deps: SearchDeps, query: string): SearchHit[] {
} }
return hits; return hits;
} }
const ql = q.toLowerCase();
const hits: SearchHit[] = []; const hits: SearchHit[] = [];
const regex = new RegExp(escapeRegExp(q), "gi");
for (const doc of docs) { for (const doc of docs) {
const lines = doc.text.split("\n"); const text = doc.text;
for (let i = 0; i < lines.length; i++) { regex.lastIndex = 0;
if (lines[i].toLowerCase().includes(ql)) {
hits.push({ let match;
docId: doc.id, let lastNewlineIdx = -1;
docTitle: doc.title, let lineIdx = 0;
line: i + 1,
text: lines[i], while ((match = regex.exec(text)) !== null) {
}); let nextNewline = text.indexOf("\n", lastNewlineIdx + 1);
if (hits.length >= 200) return hits; while (nextNewline !== -1 && nextNewline < match.index) {
lineIdx++;
lastNewlineIdx = nextNewline;
nextNewline = text.indexOf("\n", lastNewlineIdx + 1);
} }
let lineEnd = text.indexOf("\n", match.index);
if (lineEnd === -1) lineEnd = text.length;
const lineStart = lastNewlineIdx + 1;
const matchedLine = text.slice(lineStart, lineEnd);
hits.push({
docId: doc.id,
docTitle: doc.title,
line: lineIdx + 1,
text: matchedLine,
});
if (hits.length >= 200) return hits;
regex.lastIndex = lineEnd;
lastNewlineIdx = lineEnd;
lineIdx++;
} }
} }
return hits; return hits;