Skip to content

Repository files navigation

نشان تاکسلی

تاکسلی · tuxly

دنیای نرم‌افزار آزاد، به فارسی

اخبار · معرفی · آموزش · رویدادها

tuxly.ir · خوراک RSS · هویت بصری

فارسی · English


این چیه

تاکسلی خانهٔ فارسی نرم‌افزار آزاد و متن‌باز است: خبرهای گنو/لینوکس و پروژه‌های آزاد، معرفی توزیع‌ها و میزکارها، آموزش، و تقویم رویدادهای اجتماع.

کد و محتوا هر دو در همین مخزن‌اند و هر دو آزادند.

شروع

git clone https://github.com/goudarz/tuxly.git
cd tuxly
npm install          # نصب وابستگی و موارد مورد نیاز
npm run dev          # http://localhost:4321

نیازمندی: Node 24 یا بالاتر. اگر nvm دارید، nvm use نسخهٔ درست را از .nvmrc برمی‌دارد.

بعد از اولین نصب، یک بار این را اجرا کنید تا شمارهٔ نسخهٔ توزیع‌ها پر شود:

npm run update:versions

دستورها

دستور کار
npm run dev سرور توسعه
npm run build تصویر OG + بیلد ایستا + ایندکس جست‌وجو + کپی آن به public/
npm run preview پیش‌نمایش خروجی بیلد
npm run check اعتبارسنجی اسکیمای محتوا و تایپ‌ها
npm run info نمایش وضعیت پروژه و همهٔ دستورها
npm run update:versions به‌روزرسانی نسخه‌ها از ویکی‌داده و endoflife.date
npm run update:versions -- --verbose همان، با جزئیات کامل خطا
npm run brand:anniversary پوستر سالگرد
npm run brand:mascots بازتولید ماسکات‌ها
npm run brand:banner بنر ریدمی
npm run brand:social تصویر پیش‌نمایش گیت‌هاب
npm run brand:social-kit آواتار و بنر شبکه‌های اجتماعی
npm run fonts:subset کوچک کردن قلم‌ها به نویسه‌های مورد استفاده

ساختار

content/                محتوا — مارک‌داون، جدا از کد
  posts/                مطالب
  entities/             توزیع‌ها، میزکارها، پنجره‌گردان‌ها، پروژه‌ها، اجتماع‌ها
  events/               رویدادها
  authors/              نویسندگان
  glossary/terms.json   واژه‌نامهٔ فنی
src/
  assets/               تصویرها — در بیلد بهینه می‌شوند
  components/           کامپوننت‌ها
  layouts/              چیدمان صفحه‌ها
  lib/                  کمکی‌ها — فارسی، schema، خوراک، ارائه‌دهندگان
  integrations/         افزونه‌های بیلد — پیوند بیرونی، Pagefind در dev
  pages/                مسیرها
public/brand/           لوگو، ماسکات، تصویرهای شبکه‌های اجتماعی
scripts/                بنر، به‌روزرسانی نسخه، تولید تصویر و قلم

پوشهٔ pipeline/ — جمع‌آوری و بازبینی اخبار — فعلاً منتشر نشده در حال توسعه می‌باشد و محلی نگه داشته می‌شود.

نوشتن مطلب

فایل تازه در content/posts/ بسازید. از _template.md کپی بگیرید — همهٔ فیلدها با توضیح آنجاست.

اسکیما در src/content.config.ts سخت‌گیر است و بیلد را می‌شکند اگر:

  • مطلبی source دارد ولی sourceUrl یا context ندارد
  • originStatus روی draft-review باشد ولی draft: false
  • originStatus روی reviewed باشد ولی reviewedBy خالی
  • تصویر شاخص بدون coverAlt باشد

این عمدی است. خطای بیلد بهتر از صفحهٔ منتشرشدهٔ ناقص است.

چند تصمیم و دلیلشان

صفحهٔ ارائه‌دهندگان خودکار ساخته می‌شود. نامی که در performers یک رویداد بنویسید کافی است؛ /speakers/<نام> خودش می‌آید. فایل جدا برای هر نفر یعنی هر رویداد با نام تازه اول باید فایل بسازد وگرنه بیلد می‌شکند — و همین اصطکاک باعث می‌شود در عمل کسی ارائه‌دهنده‌ها را ثبت نکند. هویت از slugify می‌آید که فارسی را اول نرمال می‌کند، پس «سینا بی‌مثل» و «سینا بی مثل» یک نفرند.

جست‌وجو در حالت dev هم کار می‌کند — ولی فقط بعد از یک بیلد. ایندکس را Pagefind در dist/ می‌سازد، پس npm run build در پایان آن را داخل public/pagefind/ کپی می‌کند (این پوشه در .gitignore است).

دو مانع سر راه بود و هر دو حل شده‌اند: astro dev فقط public/ را سرو می‌کند نه dist/ را، و Vite هم حاضر نیست فایل .js داخل public/ را به عنوان ماژول تحویل بدهد و خطای ۵۰۰ می‌داد. افزونهٔ src/integrations/pagefind-dev.mjs مسیر /pagefind/ را پیش از میان‌افزار transform ویت تحویل می‌دهد. فقط در حالت توسعه؛ در پروداکشن این فایل‌ها دارایی ایستای معمولی‌اند.

نقشهٔ سایت یک مسیر است، نه یک مرحلهٔ پس از بیلد. /sitemap.xml را src/pages/sitemap.xml.ts مستقیم از کالکشن‌های محتوا می‌سازد. مرحله‌ای که بعد از بیلد اجرا شود می‌تواند از قلم بیفتد؛ یک route نمی‌تواند. هر URL lastmod واقعی از خود محتوا می‌گیرد، نه زمان بیلد.

نسخه‌ها دستی وارد نمی‌شوند. شمارهٔ نسخهٔ سی توزیع اگر دستی نوشته شود، ظرف چند ماه بخش بزرگی‌اش غلط می‌شود — چون به‌روز نگه داشتنشان دستی، کاری است که در عمل انجام نمی‌شود. scripts/update-versions.mjs هفتگی از endoflife.date و ویکی‌داده می‌گیرد. اگر داده‌ای نبود، فیلد خالی می‌ماند و صفحه «در حال بررسی» نشان می‌دهد — بهتر از حدس زدن.

تک‌مخزن، بدون submodule. کد و محتوا یک‌جا. دو پروانه: کد AGPL-3.0-or-later، محتوا CC BY-SA 4.0 (در content/LICENSE). submodule یعنی هر کلون بدون --recursive می‌شکند و هر تغییر دو PR می‌خواهد(به خاطر شرایط پایدار نبودن اینترنت داخل کشور این تصمیم گرفته شد).

تصاویر داخل مخزن، در src/assets/. در بیلد خودکار به AVIF و WebP و چند اندازه تبدیل می‌شوند. نه سرویس خارجی، نه چالش‌های محدودیت‌های که ممکنه پیش بیاید.

اسکرول بی‌نهایت روی صفحه‌بندی واقعی سوار است. لینک‌های /news/2 در HTML هستند چون خزندهٔ موتورهای جست‌وجو اسکرول نمی‌کند. جاوااسکریپت دو صفحه را خودکار می‌آورد و بعد دکمه نشان می‌دهد، وگرنه کاربر هیچ‌وقت به فوتر نمی‌رسد.

مستندات بیشتر

فایل موضوع
docs/DEPLOY.md استقرار روی GitHub Pages و دامنهٔ اختصاصی
docs/VERSIONS.md اگر نسخه خودکار گرفته نشد چه کنیم
docs/COMMITS.md قرارداد پیام کامیت
NOTICE.md خلاصهٔ پروانه‌ها به زبان ساده
CODE_OF_CONDUCT.md منشور رفتاری اجتماع

پروانه

بخش پروانه
کد AGPL-3.0-or-later
محتوا CC BY-SA 4.0
نشان و لوگوتایپ علامت تجاری — قواعد
وزیرمتن و Space Grotesk SIL OFL 1.1

مطالبی که از منابع دیگر می‌آیند، پروانهٔ خودشان را نگه می‌دارند و پایین هر صفحه ذکر می‌شود.

AGPL یعنی: استفاده، تغییر و بازنشر آزاد است — به شرط اینکه سورس نسخهٔ خودتان را منتشر کنید (حتی اگر فقط روی سرور اجرایش می‌کنید) و به مخزن اصلی لینک بدهید. خلاصهٔ ساده در NOTICE.md.

About

Resources

Code of conduct

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages