رحلة 9 أيام في بوكيت – تايلاند (مزيج شبابي وعائلي)
Uncategorized
<!-- Tripmoo: تحويل كل كلمة إلى رابط (RTL + Mobile) -->
<section class="tm-autolink-wrap" dir="rtl" lang="ar">
<style>
.tm-autolink-wrap{font-family:system-ui,"Cairo","Tajawal",sans-serif;line-height:1.9}
.tm-autolink{background:#fff;border:1px solid rgba(0,0,0,.06);border-radius:14px;padding:14px}
.tm-autolink a.tm-word{color:#7300A8;text-decoration:underline;text-underline-offset:3px;transition:.2s}
.tm-autolink a.tm-word:hover{opacity:.85}
.tm-note{font-size:.9rem;color:#666;margin-top:8px}
</style>
<!-- ضع نصّك هنا (سطر أو فقرة أو عنوان) -->
<div id="tm-text" class="tm-autolink">
بوكيت تايلاند رحلة 9 أيام تشمل مدينة بوكيت القديمة وجزيرة جيمس بوند
وعشاء مميز في مطعم Three Monkeys، إضافة إلى شواطئ كاتا وكارون ونشاطات Zipline و ATV.
</div>
<div class="tm-note">💡 اضغط على أي كلمة لفتح مقال فرعي أو صفحة مرتبطة بها.</div>
<script>
(function(){
// 1) إعدادات عامة
const basePath = "/blog/"; // مسار افتراضي لو ما في مطابقة (عدّله لمسار مقالاتك)
const openInNewTab = true; // افتح الروابط في تبويب جديد؟
// 2) عبارات مكوّنة من أكثر من كلمة → عنوان/صفحة معيّنة
// تُستبدل أولاً قبل توزيع الروابط على الكلمات المفردة
const phraseMappings = [
{ phrase: "جيمس بوند", url: "/destinations/phang-nga/james-bond-island" },
{ phrase: "Three Monkeys", url: "/food/three-monkeys-phuket" },
{ phrase: "مدينة بوكيت القديمة", url: "/phuket/phuket-old-town" }
];
// 3) كلمات مفردة → عنوان/صفحة معيّنة
const wordMappings = {
"بوكيت": "/destinations/phuket",
"تايلاند": "/destinations/thailand",
"كاتا": "/phuket/kata-beach",
"كارون": "/phuket/karon-beach",
"Zipline": "/activities/zipline-phuket",
"ATV": "/activities/atv-phuket",
"رحلة": "/trips",
"شواطئ": "/beaches",
"مطعم": "/food"
};
// 4) اختياري: تجاهل كلمات قصيرة شائعة (فعِّل/عطّل)
const ignoreShortCommon = true;
const stopWords = new Set(["و","في","من","إلى","على","عن","مع","ثم","أو","أن","إن","هو","هي","كان","كانت","هذا","هذه","ذلك","تلك"]);
const el = document.getElementById("tm-text");
if(!el) return;
// خطوة A: استبدال العبارات المتعددة الكلمات بروابط مباشرة
let html = el.innerHTML;
phraseMappings.forEach(({ phrase, url })=>{
// استبدال غير حساس للشكل، مع الحفاظ على RTL
const esc = phrase.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
const re = new RegExp(`(\\b${esc}\\b)`, 'gu'); // \b قد لا تعمل جيداً مع العربي دائماً
html = html.replace(re, `<a class="tm-word" href="${url}" ${openInNewTab?'target="_blank" rel="noopener"':''}>$1</a>`);
});
// خطوة B: لفّ الكلمات المفردة المتبقية بروابط
// نفصل إلى "توكنز" مع الاحتفاظ بالمسافات وعلامات الترقيم
function tokenize(text){
// يقسم على أساس المسافات مع الاحتفاظ بها كتوكن
return text.split(/(\s+)/u);
}
function cleanToken(t){
// إزالة التشكيل وعلامات الترقيم من بداية/نهاية الكلمة فقط
return t.normalize("NFC").replace(/^[^\p{L}\p{N}]+|[^\p{L}\p{N}]+$/gu, "");
}
const tokens = tokenize(html).map(tok=>{
// إذا التوكن يحتوي بالفعل على <a>… لا نلمسه
if (tok.includes("<a ")) return tok;
// لو مسافة/سطر جديد
if (/^\s+$/u.test(tok)) return tok;
const raw = cleanToken(tok);
if (!raw) return tok;
// تجاهل كلمات قصيرة/شائعة (اختياري)
if (ignoreShortCommon && (raw.length <= 1 || stopWords.has(raw))) return tok;
// حدد الرابط
const direct = wordMappings[raw] || wordMappings[raw.toLowerCase()];
const href = direct ? direct : basePath + encodeURIComponent(raw);
// لفّ الكلمة الأصلية كلها (مع إبقاء علامات الترقيم حولها)
// نحدد موقع الكلمة داخل التوكن الأصلي للمحافظة على الترقيم
const start = tok.indexOf(raw);
if (start === -1) {
// لو ما لقيناها كما هي، خلّي التوكن بدون تغيير
return tok;
}
const before = tok.slice(0, start);
const after = tok.slice(start + raw.length);
return `${before}<a class="tm-word" href="${href}" ${openInNewTab?'target="_blank" rel="noopener"':''} title="افتح: ${raw}">${raw}</a>${after}`;
});
el.innerHTML = tokens.join("");
})();
</script>
</section>