Files
Document/search.js
T
2026-11-10 09:41:36 +00:00

209 خطوط
5.0 KiB
JavaScript
خام سرزنش تاریخچه

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
let documents = [];
const searchInput = document.getElementById("searchInput");
const results = document.getElementById("results");
const status = document.getElementById("status");
// لینک مستقیم فایل CSV در مخزن Git
const CSV_URL = "https://git.sadentel.net/f.taghipour/Document/raw/branch/main/SadenTel_Documents.csv";
// یکسان‌سازی حروف و اعداد
function normalize(value) {
return String(value ?? "")
.trim()
.toLowerCase()
.replace(/[۰-۹]/g, digit =>
"۰۱۲۳۴۵۶۷۸۹".indexOf(digit)
)
.replace(/[٠-٩]/g, digit =>
"٠١٢٣٤٥٦٧٨٩".indexOf(digit)
)
.replace(/ي/g, "ی")
.replace(/ك/g, "ک");
}
// پردازش فایل CSV
function parseCSV(text) {
const rows = [];
let row = [];
let field = "";
let insideQuotes = false;
for (let i = 0; i < text.length; i++) {
const char = text[i];
if (char === '"') {
if (insideQuotes && text[i + 1] === '"') {
field += '"';
i++;
} else {
insideQuotes = !insideQuotes;
}
}
else if (char === "," && !insideQuotes) {
row.push(field);
field = "";
}
else if (
(char === "\n" || char === "\r") &&
!insideQuotes
) {
if (char === "\r" && text[i + 1] === "\n") {
i++;
}
row.push(field);
if (row.some(value => value.trim() !== "")) {
rows.push(row);
}
row = [];
field = "";
}
else {
field += char;
}
}
row.push(field);
if (row.some(value => value.trim() !== "")) {
rows.push(row);
}
return rows;
}
// دریافت اطلاعات از لینک آنلاین CSV
async function loadDocuments() {
try {
searchInput.disabled = true;
status.textContent = "در حال دریافت اسناد...";
const response = await fetch(CSV_URL, {
cache: "no-store"
});
if (!response.ok) {
throw new Error("CSV file could not be loaded");
}
const text = await response.text();
const rows = parseCSV(text);
documents = rows.slice(1).map(columns => ({
row: columns[0]?.trim(),
title: columns[1]?.trim(),
id: columns[2]?.trim()
})).filter(doc => doc.title && doc.id);
status.textContent =
`${documents.length} سند با موفقیت بارگذاری شد.`;
searchInput.disabled = false;
} catch (error) {
status.textContent =
"خطا در دریافت اطلاعات. دسترسی به فایل CSV را بررسی کنید.";
console.error("Loading error:", error);
}
}
// جست‌وجوی اسناد
function searchDocuments() {
const query = normalize(searchInput.value);
results.innerHTML = "";
if (!query) {
status.textContent =
`${documents.length} سند ثبت شده است.`;
return;
}
const matches = documents.filter(doc => {
const title = normalize(doc.title);
const id = normalize(doc.id);
// استخراج کلمات کامل عنوان
const titleWords =
title.match(/[\p{L}\p{N}]+/gu) || [];
// تطابق کامل کلمه یا شناسه
return titleWords.includes(query) || id === query;
});
console.log("Search query:", query);
console.table(matches);
status.textContent =
`${matches.length} نتیجه پیدا شد.`;
if (matches.length === 0) {
results.innerHTML =
'<div class="empty">سندی با این مشخصات پیدا نشد.</div>';
return;
}
// نمایش نتایج
matches.forEach(doc => {
const item = document.createElement("div");
item.className = "result";
const title = document.createElement("h3");
title.textContent = doc.title;
const rowInfo = document.createElement("div");
rowInfo.className = "info";
const rowLabel = document.createElement("span");
rowLabel.textContent = "ردیف";
const rowValue = document.createElement("span");
rowValue.textContent = doc.row;
rowInfo.append(rowLabel, rowValue);
const idInfo = document.createElement("div");
idInfo.className = "info";
const idLabel = document.createElement("span");
idLabel.textContent = "شناسه داخلی سند";
const idValue = document.createElement("span");
idValue.textContent = doc.id;
idInfo.append(idLabel, idValue);
item.append(title, rowInfo, idInfo);
results.appendChild(item);
});
}
// جست‌وجوی لحظه‌ای
searchInput.addEventListener("input", searchDocuments);
// بارگذاری اولیه اطلاعات
loadDocuments();