Update results.html
Browse files- results.html +41 -36
results.html
CHANGED
|
@@ -10,23 +10,21 @@
|
|
| 10 |
@media (prefers-color-scheme: dark) { :root { --bg: #202124; --card: #202124; --text: #bdc1c6; --muted: #9aa0a6; --link: #8ab4f8; --border: #3c4043; } }
|
| 11 |
|
| 12 |
body { font-family: 'Tajawal', sans-serif; background: var(--bg); color: var(--text); margin: 0; }
|
| 13 |
-
header { background: var(--card); padding:
|
| 14 |
-
.logo-s { font-size:
|
| 15 |
.search-bar { flex-grow: 1; max-width: 600px; }
|
| 16 |
-
.search-bar input { width: 100%; padding:
|
| 17 |
|
| 18 |
-
.container { max-width: 700px; margin: 20px
|
| 19 |
-
|
| 20 |
-
.result-item { margin-bottom:
|
| 21 |
-
.result-item
|
| 22 |
-
.result-item
|
| 23 |
-
.result-item h3 {
|
| 24 |
-
.result-item
|
| 25 |
-
.result-item p { margin: 5px 0 0; line-height: 1.58; font-size: 14px; }
|
| 26 |
|
| 27 |
#loader { text-align: center; margin-top: 50px; color: var(--muted); }
|
| 28 |
-
.error { display: none; background: #
|
| 29 |
-
@keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
|
| 30 |
</style>
|
| 31 |
</head>
|
| 32 |
<body>
|
|
@@ -41,63 +39,70 @@
|
|
| 41 |
</header>
|
| 42 |
|
| 43 |
<div class="container">
|
| 44 |
-
<div id="stats"
|
| 45 |
-
<div id="loader">
|
| 46 |
-
<div id="results"></div>
|
| 47 |
-
<div id="error" class="error">
|
| 48 |
-
<b>عذراً! حدث خطأ في جلب البيانات.</b><br>
|
| 49 |
-
تأكد أن سيرفر OpenShift قيد التشغيل وأن بروكسي جوجل يعمل.
|
| 50 |
-
</div>
|
| 51 |
</div>
|
| 52 |
|
| 53 |
<script>
|
| 54 |
const params = new URLSearchParams(window.location.search);
|
| 55 |
const query = params.get('q');
|
| 56 |
|
| 57 |
-
// --- إعدادات
|
| 58 |
-
const
|
| 59 |
const SEARXNG_API = "https://searxng-anesnt-dev.apps.rm1.0a51.p1.openshiftapps.com/search";
|
| 60 |
|
| 61 |
if (query) {
|
| 62 |
document.getElementById('q-input').value = query;
|
| 63 |
-
|
| 64 |
}
|
| 65 |
|
| 66 |
-
async function
|
| 67 |
-
const
|
| 68 |
const loader = document.getElementById('loader');
|
| 69 |
-
const
|
| 70 |
|
| 71 |
-
|
| 72 |
-
const
|
|
|
|
|
|
|
| 73 |
|
| 74 |
try {
|
| 75 |
const response = await fetch(finalUrl);
|
| 76 |
-
const
|
| 77 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 78 |
|
|
|
|
| 79 |
loader.style.display = 'none';
|
| 80 |
|
| 81 |
if (!data.results || data.results.length === 0) {
|
| 82 |
-
stats.innerText = "لم يتم العثور على نتائج.";
|
| 83 |
return;
|
| 84 |
}
|
| 85 |
|
| 86 |
-
stats.innerText = `
|
| 87 |
|
| 88 |
data.results.forEach(item => {
|
| 89 |
-
|
| 90 |
<div class="result-item">
|
| 91 |
<cite>${item.url}</cite>
|
| 92 |
<a href="${item.url}" target="_blank"><h3>${item.title}</h3></a>
|
| 93 |
-
<p>${item.content || 'لا يوجد وصف
|
| 94 |
</div>
|
| 95 |
`;
|
|
|
|
| 96 |
});
|
|
|
|
| 97 |
} catch (e) {
|
| 98 |
-
console.error(e);
|
| 99 |
loader.style.display = 'none';
|
| 100 |
-
|
|
|
|
|
|
|
| 101 |
}
|
| 102 |
}
|
| 103 |
</script>
|
|
|
|
| 10 |
@media (prefers-color-scheme: dark) { :root { --bg: #202124; --card: #202124; --text: #bdc1c6; --muted: #9aa0a6; --link: #8ab4f8; --border: #3c4043; } }
|
| 11 |
|
| 12 |
body { font-family: 'Tajawal', sans-serif; background: var(--bg); color: var(--text); margin: 0; }
|
| 13 |
+
header { background: var(--card); padding: 12px 5%; border-bottom: 1px solid var(--border); display: flex; align-items: center; gap: 20px; position: sticky; top: 0; z-index: 10; }
|
| 14 |
+
.logo-s { font-size: 22px; font-weight: 800; color: var(--primary); text-decoration: none; }
|
| 15 |
.search-bar { flex-grow: 1; max-width: 600px; }
|
| 16 |
+
.search-bar input { width: 100%; padding: 8px 20px; border-radius: 24px; border: 1px solid var(--border); background: var(--bg); color: var(--text); outline: none; font-family: 'Tajawal'; }
|
| 17 |
|
| 18 |
+
.container { max-width: 700px; margin: 20px auto; padding: 0 20px; }
|
| 19 |
+
#stats { font-size: 13px; color: var(--muted); margin-bottom: 20px; }
|
| 20 |
+
.result-item { margin-bottom: 25px; }
|
| 21 |
+
.result-item cite { font-style: normal; font-size: 13px; color: var(--muted); display: block; margin-bottom: 2px; overflow: hidden; text-overflow: ellipsis; }
|
| 22 |
+
.result-item h3 { margin: 0; color: var(--link); font-weight: 500; font-size: 19px; }
|
| 23 |
+
.result-item h3:hover { text-decoration: underline; cursor: pointer; }
|
| 24 |
+
.result-item p { margin: 4px 0 0; line-height: 1.5; font-size: 14px; color: var(--text); opacity: 0.9; }
|
|
|
|
| 25 |
|
| 26 |
#loader { text-align: center; margin-top: 50px; color: var(--muted); }
|
| 27 |
+
.error-box { display: none; background: #fff5f5; border: 1px solid #feb2b2; padding: 15px; border-radius: 8px; color: #c53030; font-size: 14px; }
|
|
|
|
| 28 |
</style>
|
| 29 |
</head>
|
| 30 |
<body>
|
|
|
|
| 39 |
</header>
|
| 40 |
|
| 41 |
<div class="container">
|
| 42 |
+
<div id="stats">جاري البحث...</div>
|
| 43 |
+
<div id="loader">جاري جلب النتائج من OpenShift...</div>
|
| 44 |
+
<div id="results-list"></div>
|
| 45 |
+
<div id="error" class="error-box"></div>
|
|
|
|
|
|
|
|
|
|
| 46 |
</div>
|
| 47 |
|
| 48 |
<script>
|
| 49 |
const params = new URLSearchParams(window.location.search);
|
| 50 |
const query = params.get('q');
|
| 51 |
|
| 52 |
+
// --- الإعدادات ---
|
| 53 |
+
const GOOGLE_PROXY = "https://script.google.com/macros/s/AKfycbxMgy-ecIdzeIWvbL_ASNzWBcQJODEGkJ5MZn3JCWR0IMTFC48JrAY6kxcyXT5KceFB/exec";
|
| 54 |
const SEARXNG_API = "https://searxng-anesnt-dev.apps.rm1.0a51.p1.openshiftapps.com/search";
|
| 55 |
|
| 56 |
if (query) {
|
| 57 |
document.getElementById('q-input').value = query;
|
| 58 |
+
search(query);
|
| 59 |
}
|
| 60 |
|
| 61 |
+
async function search(q) {
|
| 62 |
+
const list = document.getElementById('results-list');
|
| 63 |
const loader = document.getElementById('loader');
|
| 64 |
+
const errDiv = document.getElementById('error');
|
| 65 |
|
| 66 |
+
// بناء رابط البحث الأصلي
|
| 67 |
+
const apiCall = `${SEARXNG_API}?q=${encodeURIComponent(q)}&format=json&language=ar`;
|
| 68 |
+
// إرساله عبر بروكسي جوجل
|
| 69 |
+
const finalUrl = `${GOOGLE_PROXY}?url=${encodeURIComponent(apiCall)}`;
|
| 70 |
|
| 71 |
try {
|
| 72 |
const response = await fetch(finalUrl);
|
| 73 |
+
const rawText = await response.text();
|
| 74 |
+
|
| 75 |
+
// فحص إذا كان الرد HTML (يعني خطأ من جوجل)
|
| 76 |
+
if (rawText.includes("<!DOCTYPE") || rawText.includes("<html")) {
|
| 77 |
+
throw new Error("جوجل أرجع صفحة ويب بدلاً من بيانات. تأكد من إعداد 'Anyone' في الـ Script.");
|
| 78 |
+
}
|
| 79 |
|
| 80 |
+
const data = JSON.parse(rawText);
|
| 81 |
loader.style.display = 'none';
|
| 82 |
|
| 83 |
if (!data.results || data.results.length === 0) {
|
| 84 |
+
document.getElementById('stats').innerText = "لم يتم العثور على نتائج.";
|
| 85 |
return;
|
| 86 |
}
|
| 87 |
|
| 88 |
+
document.getElementById('stats').innerText = `تم العثور على ${data.results.length} نتيجة لـ "${q}"`;
|
| 89 |
|
| 90 |
data.results.forEach(item => {
|
| 91 |
+
const itemHtml = `
|
| 92 |
<div class="result-item">
|
| 93 |
<cite>${item.url}</cite>
|
| 94 |
<a href="${item.url}" target="_blank"><h3>${item.title}</h3></a>
|
| 95 |
+
<p>${item.content || 'لا يوجد وصف.'}</p>
|
| 96 |
</div>
|
| 97 |
`;
|
| 98 |
+
list.innerHTML += itemHtml;
|
| 99 |
});
|
| 100 |
+
|
| 101 |
} catch (e) {
|
|
|
|
| 102 |
loader.style.display = 'none';
|
| 103 |
+
errDiv.style.display = 'block';
|
| 104 |
+
errDiv.innerHTML = `<b>فشل في عرض النتائج:</b><br>${e.message}`;
|
| 105 |
+
console.error(e);
|
| 106 |
}
|
| 107 |
}
|
| 108 |
</script>
|