undent؛ خداحافظی با فاصلههای اضافه تو تمپلیتها
خلاصهٔ کاملتر
تو جاوااسکریپت وقتی یه متن چندخطی رو با تمپلیت لیترال مینویسی، تورفتگی کدت مستقیم میره تو خروجی. یعنی یا باید متن رو بچسبونی به ستون صفر و خوانایی کد رو از دست بدی، یا با فاصلههای اضافه کنار بیای. undent یه کتابخونهٔ کوچیکه که همین رو حل میکنه و هر جا جاوااسکریپت اجرا میشه — Deno، نود، Bun — کار میکنه.
طرز کارش اینه که بهعنوان tagged template استفاده میشه: کمترین تورفتگی مشترک بین خطها رو پیدا میکنه، از همه کم میکنه و خطهای خالی اول و آخر رو هم که از جای بکتیک میان حذف میکنه. تورفتگی نسبی داخل خود متن دستنخورده میمونه.
const sql = undent`
SELECT id, name
FROM users
WHERE active = true
`;تو مستندات پروژه اومده که چند تا چیز رو هم که به گفتهٔ نویسنده بیشتر کتابخونههای dedent اشتباه انجام میدن درست کرده: سبک خط جدید (\n، \r\n و \r) رو بایتبهبایت نگه میداره و سرخود یکسانسازی نمیکنه، و مقدارهای چندخطیای که وسط متن درج میشن با align() سر ستون درج باقی میمونن؛ بدون اون، خط دوم به بعد میپره سر ستون صفر.
برای رشتههایی که اصلاً تمپلیت لیترال نیستن — مثلاً فایل SQL که از دیسک خوندی — متد .string() یا تابع مستقل dedentString رو داری. با embed() هم میتونی قطعهای که خودش تورفتگی داره رو اول تمیز کنی و بعد سر جاش بچسبونی، و با .with() نسخهٔ سفارشی خودت رو بسازی بدون اینکه نسخهٔ اصلی تغییر کنه.
دو تا استراتژی تشخیص تورفتگی داره: حالت پیشفرض «مشترک»، و حالت «خط اول» که همون رفتار پکیج outdent ـه و با همین اسم هم export شده. یه نکتهٔ ظریف هم هست: ستون درج بهطور پیشفرض با طول رشته حساب میشه، نه عرض واقعی روی صفحه؛ برای تب و ایموجی و کاراکترهای عریض باید سراغ createUnicodeColumnOffset() از زیرمسیر یونیکد بری، که خود مستندات هم میگه best-effort ـه.
نکات کلیدی:
- تورفتگی مشترک خطها حذف میشه، تورفتگی نسبی داخل متن میمونه
- سبک خط جدید بایتبهبایت حفظ میشه و یکسانسازی نمیشه
- align() و embed() برای مقدارهای چندخطی و قطعههای تودرتو
- .string() و dedentString برای رشتههای معمولی مثل فایل SQL
- خروجی outdent رفتار پکیج همنام npm رو میده و dedent نام مستعار خود undent ـه




