Files
2026-11-10 10:33:04 +00:00

182 خطوط
4.7 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
const CSV_URL = "https://git.sadentel.net/f.taghipour/Document/raw/branch/main/SadenTel_Documents.csv";
// یکسان‌سازی متن و اعداد
function normalize(value) {
return String(value ?? "")
.toLowerCase()
.trim()
.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(`HTTP Error: ${response.status}`);
}
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 titleWords =
normalize(doc.title).match(/[\p{L}\p{N}]+/gu) || [];
const id = normalize(doc.id);
// فقط تطابق کامل کلمه یا شناسه
return titleWords.includes(query) || id === query;
});
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();