77 lines
13 KiB
JavaScript
77 lines
13 KiB
JavaScript
// متن مقدمهٔ یکتای صفحات لیست (/doctors و /clinics).
|
|
// canonical درست، محتوای یکسان را غیرتکراری نمیکند — این متن همان نقش مکمل را دارد.
|
|
// مثل صفحات تخصص، ساختار جملهبندی هر شهر با هش نام شهر انتخاب میشود تا ۳۵ دامنه
|
|
// ۳۵ متن با ساختار متفاوت داشته باشند، نه یک قالب با نام جایگذاریشده.
|
|
|
|
function hash(value) {
|
|
let out = 0;
|
|
for (let i = 0; i < value.length; i++) out = (out * 31 + value.charCodeAt(i)) >>> 0;
|
|
return out;
|
|
}
|
|
|
|
// seed همیشه unsigned — با >> علامتدار، هشهای بزرگ ایندکس منفی میساختند.
|
|
const pick = (variants, seed) => variants[(seed >>> 0) % variants.length];
|
|
|
|
const CLINIC_INTROS = (city) => [
|
|
`مراکز درمانی ${city} اینجا فهرست شدهاند. هر کارت نام مرکز، شمارهٔ تماس و نشانی را نشان میدهد و با یک کلیک به صفحهٔ کامل همان مرکز میرسید. آنجا چیزهایی هست که در کارت جا نمیشود: تخصصهایی که ارائه میشود، پزشکانی که پذیرش دارند، بیمههای طرف قرارداد و موقعیت روی نقشه. اگر خدمت مشخصی مدنظرتان است، فیلتر تخصص بالای صفحه فهرست را کوتاه میکند. نوبت از صفحهٔ خودِ مرکز گرفته میشود؛ پزشک را انتخاب میکنید، بازهٔ خالی را میزنید و تأییدیه پیامک میشود. مرکزی که چند شعبه دارد، هر شعبه رکورد جدا با ساعت کاری خودش دارد. فهرست صفحهبندی دارد، پس اگر شهر مراکز زیادی داشته باشد همه در یک صفحه فشرده نمیشوند. سابقهٔ نوبتهایی که میگیرید در حساب کاربریتان میماند.`,
|
|
`اگر ترجیح میدهید اول مرکز درمانی را انتخاب کنید و بعد پزشک را، این صفحه نقطهٔ شروع است. کلینیکهای تخصصی، درمانگاههای چندتخصصی و مراکز تصویربرداری ${city} کنار هم آمدهاند. صفحهٔ هر مرکز پزشکان همکارش را با تخصص و اولین نوبت آزادشان نشان میدهد، پس لازم نیست جداگانه دنبال پزشک بگردید. نشانی و شمارهٔ تماس هر مرکز دورهای بازبینی میشود. مراکزی که شبانهروزی پذیرش دارند جدا مشخص شدهاند. رزرو همانجا انجام میشود و هزینهٔ خدمت پیش از تأیید نهایی نمایش داده میشود، پس قبل از قطعیشدن میدانید چقدر است. اگر مرکزی هنوز پزشکی ثبت نکرده باشد، صفحهاش اطلاعات تماس را نشان میدهد ولی تقویم نوبت خالی نخواهد داشت. لغو نوبت هم از بخش نوبتهای من انجام میشود.`,
|
|
`فهرست زیر مراکز درمانی فعال ${city} است. تفاوتش با یک جستوجوی ساده این است که هر رکورد به صفحهای کامل وصل است: موقعیت روی نقشه، ساعات کاری، فهرست تخصصها و پزشکانی که در همان مرکز پذیرش دارند. برای مراکزی که چند تخصص را زیر یک سقف جمع کردهاند، میشود در یک مراجعه چند کار را پیش برد. بیمههای طرف قرارداد هم روی همان صفحه آمده. نوبت با تأیید شما قطعی میشود و تأییدیه پیامک میگردد؛ اگر برنامهتان عوض شد، لغو از بخش نوبتهای من انجام میشود و آن بازه آزاد میشود. فیلتر تخصص بالای صفحه فهرست را کوتاه میکند و انتخاب شما در نشانی صفحه ثبت میشود، پس همان نما را میتوانید دوباره باز کنید یا برای کسی بفرستید.`,
|
|
`کلینیکهای ${city} با اطلاعات یکشکل کنار هم آمدهاند تا مقایسه سخت نباشد. روی کارت هر مرکز نام و شمارهٔ تماس پیداست؛ باقی چیزها در صفحهٔ خودش است — تخصصها، پزشکان، بیمهها و نقشه. اگر مرکزی چند شعبه دارد، هر شعبه رکورد مستقل خودش را با ساعت کاری جداگانه دارد، پس پیش از راهافتادن شعبهٔ درست را انتخاب کنید. رزرو از صفحهٔ مرکز و از طریق پزشکش انجام میشود. تأییدیه بلافاصله پیامک میشود و سابقهٔ نوبت در حساب کاربریتان میماند تا مراجعهٔ بعدی سریعتر باشد. هزینهٔ هر خدمت هم پیش از تأیید نهایی نمایش داده میشود. مراکزی که شبانهروزی پذیرش دارند با نشانهٔ جداگانه مشخص شدهاند تا در شرایط اضطراری زودتر پیدایشان کنید.`,
|
|
`این صفحه مراکز درمانی ${city} را نشان میدهد، از کلینیک تخصصی تا درمانگاه چندتخصصی. جستوجو را میتوانید با فیلتر تخصص محدود کنید تا فقط مراکزی بمانند که خدمت موردنظرتان را میدهند. صفحهٔ هر مرکز نشانی، شمارهٔ تماس، موقعیت روی نقشه و فهرست پزشکان همکار را دارد؛ کنار نام هر پزشک تخصص و وضعیت نوبتدهیاش هم آمده. رزرو از همانجا انجام میشود، شبانهروزی و بدون تماس تلفنی. اگر بهجای مرکز دنبال یک پزشک مشخص هستید، فهرست پزشکان ${city} مسیر مستقیمتری است. بیمههای طرف قرارداد هر مرکز روی صفحهٔ خودش آمده، پس پیش از مراجعه میدانید پوشش دارید یا نه. اگر مرکزی چند شعبه داشته باشد، هر شعبه رکورد مستقل با ساعت کاری خودش دارد.`,
|
|
`مرکز درمانی مناسب در ${city} را از این فهرست پیدا کنید. هر مرکز صفحهٔ اختصاصی دارد و آنچه آنجا میبینید از رکورد خودِ مرکز میآید: خدمات، تخصصها، بیمههای طرف قرارداد و پزشکانی که پذیرش دارند. موقعیت روی نقشه هم هست تا پیش از مراجعه مسیر و زمان رسیدن را بدانید. نوبتگیری از صفحهٔ مرکز و از طریق پزشک انجام میشود؛ هزینهٔ خدمت پیش از تأیید نمایش داده میشود. لغو نوبت از حساب کاربری ممکن است و بازهٔ لغوشده همان لحظه به فهرست نوبتهای آزاد برمیگردد. برای محدود کردن فهرست میتوانید از فیلتر تخصص استفاده کنید تا فقط مراکزی بمانند که خدمت موردنظرتان را ارائه میدهند. نشانی و شمارهٔ تماس هر مرکز دورهای بازبینی میشود.`,
|
|
];
|
|
|
|
|
|
// مقدمهٔ صفحهٔ اصلی هر دامنهٔ شهری.
|
|
//
|
|
// صفحهٔ اصلی تا پیش از این فقط `site_name` و `slogan` را از city.json شهری میکرد و
|
|
// بقیهٔ صفحه — بنر، کادر جستجو، جستجوهای پرتکرار، فوتر — روی همهٔ دامنهها یکسان بود.
|
|
// اندازهگیری: شباهت متن رندرشدهٔ بهبهان و یاسوج ۹۹٫۰٪. گوگل canonicalِ درستِ ما را رد
|
|
// میکرد و صفحهٔ اصلی شهر را با دامنهٔ دیگری تجمیع میکرد
|
|
// (Duplicate, Google chose different canonical than user).
|
|
//
|
|
// عدد پزشک و تخصص داخل متن میآید تا تمایز فقط لفظی نباشد؛ هر شهر آمار خودش را دارد.
|
|
const CITY_INTROS = (city, doctorCount, topSpecialty) => [
|
|
`${doctorCount} پزشک از ${city} روی این سامانه پروفایل دارند. بیشترینشان ${topSpecialty}اند. نام پزشک یا نام تخصص را در کادر بالا بزنید؛ هر دو جستوجو میشوند. اگر هنوز نمیدانید سراغ کدام تخصص بروید، فهرست تخصصهای همین شهر پایینتر آمده و از هر کدام مستقیم به پزشکانش میرسید.`,
|
|
`نوبت پزشکان ${city} را از همینجا میگیرید، در هر ساعت شبانهروز و بدون تماس با مطب. الان ${doctorCount} پزشک ثبت شدهاند و ${topSpecialty} پرمراجعهترین حوزه است. روی پروفایل هر پزشک، محل پذیرش و بازههای خالی همان هفته را میبینید. انتخاب کنید و تأیید بگیرید؛ پیامک تأییدیه همان لحظه میآید.`,
|
|
`اینجا نقطهٔ شروع برای پیدا کردن پزشک در ${city} است. ${doctorCount} پروفایل ثبت شده و ${topSpecialty} بیشترین سهم را دارد. هر پروفایل تخصص، نشانی محل پذیرش و امتیاز بیمارانی که قبلاً از همینجا نوبت گرفتهاند را نشان میدهد. رزرو، تغییر و لغو نوبت همه از حساب کاربری خودتان انجام میشود.`,
|
|
`${city} روی این سامانه ${doctorCount} پزشک دارد و ${topSpecialty} از بقیه پرمراجعهتر است. کادر جستوجو نام پزشک و نام تخصص را با هم میگیرد. اگر ترجیح میدهید اول مرکز درمانی را انتخاب کنید، فهرست کلینیکها جداست و پزشکان هر مرکز را کنار هم نشان میدهد.`,
|
|
`دنبال پزشک در ${city} میگردید؟ ${doctorCount} پزشک ثبت شدهاند، بیشترشان در حوزهٔ ${topSpecialty}. نتیجهٔ جستوجو نشانی مطب، ساعات کاری و اولین نوبت آزاد هر پزشک را نشان میدهد. پزشکی که فعلاً نوبتدهیاش خاموش است هم میماند، فقط با برچسب مشخص، تا بدانید گزینه هست.`,
|
|
`فهرست پزشکان ${city} الان ${doctorCount} پروفایل دارد و ${topSpecialty} صدرنشین مراجعههاست. اطلاعات هر پزشک — تخصص، محل پذیرش، ساعت کاری — دورهای بازبینی میشود تا با وضعیت واقعی مطب بخواند. نوبت با تأیید شما قطعی میشود و اگر برنامهتان عوض شد، لغوش از همان حساب ممکن است.`,
|
|
];
|
|
|
|
/**
|
|
* مقدمهٔ یکتای صفحهٔ اصلی یک شهر.
|
|
*
|
|
* seed از نام شهر میآید، نه تصادفی: متن باید بین شهرها واگرا شود ولی برای یک شهر
|
|
* در هر rebuild ثابت بماند، وگرنه محتوای صفحهٔ اصلی مدام عوض میشد.
|
|
*/
|
|
export function buildCityIntro(cityName, doctorCount = 0, topSpecialty = "") {
|
|
const count = Number(doctorCount) > 0 ? Number(doctorCount) : 0;
|
|
const specialty = topSpecialty || "پزشکی عمومی";
|
|
|
|
return pick(CITY_INTROS(cityName, count, specialty), hash(cityName) >>> 5);
|
|
}
|
|
|
|
/**
|
|
* جملهٔ آماری که به انتهای متن میچسبد.
|
|
*
|
|
* انتخاب variant با هش انجام میشود و با ۶ حالت و ۳۵ شهر، حدود ۱۵٪ جفتها همvariant
|
|
* میشوند. برای آن جفتها متن تقریباً یکسان میشد و دو صفحه دوباره شبیه هم — سنجیده
|
|
* شد: بهبهان و یاسوج روی /clinics از ۶۸٫۹٪ به ۸۴٫۷٪ شباهت رفتند.
|
|
*
|
|
* عدد واقعیِ هر شهر این را میشکند، چون هیچ دو شهری آمار یکسان ندارند. همان الگویی
|
|
* که در متن صفحهٔ اصلی جواب داد.
|
|
*/
|
|
const countSentence = (count, cityName, noun) =>
|
|
Number(count) > 0
|
|
? ` هماکنون ${Number(count)} ${noun} در ${cityName} روی این سامانه ثبت شدهاند.`
|
|
: "";
|
|
|
|
export function buildClinicsIntro(cityName, clinicCount = 0) {
|
|
return (
|
|
pick(CLINIC_INTROS(cityName), hash(cityName) >>> 2) +
|
|
countSentence(clinicCount, cityName, "مرکز درمانی")
|
|
);
|
|
}
|