← وبلاگ

فونت‌های FIGlet در Text.js

⁦@textjs/font⁩ فونت‌های .flf از نوع FIGlet را تجزیه می‌کند و مانند برنامهٔ figlet می‌چیند. آزمون‌های آن 273 خروجی ثبت‌شده از ⁦figlet 2.2.5⁩ را بازپخش می‌کنند و همه مطابقت دارند.

Adam

⁦Text.js 0.3⁩ بستهٔ @textjs/font را اضافه کرد که تجزیه‌گر و رندرکننده‌ای برای فونت‌های FIGlet است. این بسته 17 فونت توزیع ⁦FIGlet 2.2.5⁩ را، هرکدام در یک ماژول ES، ارائه می‌کند و خروجی آن دقیقاً با فایل باینری figlet 2.2.5 مطابقت دارد.

import { FigletText } from "@textjs/font/react";import { slant } from "@textjs/font/slant";export default function Page() {  return <FigletText font={slant} color="accent">Text.js</FigletText>;}
  ______          __      _ /_  __/__  _  __/ /_    (_)____  / / / _ \| |/_/ __/   / / ___/ / / /  __/>  </ /__   / (__  )/_/  \___/_/|_|\__(_)_/ /____/                   /___/

دلیل انتخاب FIGlet

کامپوننت <AsciiFont> از نسخهٔ 0.1 دو سبک حروف داخلی به نام‌های block و compact داشته است. FIGlet از سال 1991 استاندارد این نوع حروف‌نگاری بوده است و صدها فونت .flf وجود دارد. پشتیبانی از این قالب یعنی می‌توان هرکدام از آن‌ها را به یک برنامهٔ کنسول اضافه کرد.

فونت FIGlet یک فایل متن ساده است. یک خط سرآیند ارتفاع، نویسهٔ hardblank و قواعد چیدمان را تعیین می‌کند، سپس هر نویسه به‌شکل بلوکی از ردیف‌ها رسم می‌شود که در انتهای هر ردیف نشانهٔ پایان دارد. FIGlet در چیدمان‌های پیش‌فرض خود هر نویسه را به چپ حرکت می‌دهد تا به نویسهٔ قبلی برسد، سپس با قواعد ادغام فونت تعیین می‌کند که آیا دو زیرنویسهٔ در تماس با هم یکی شوند یا نه.

حالت‌های چیدمان

برنامهٔ figlet پنج چیدمان افقی دارد و تابع renderFiglet همان پنج حالت را از طریق layout می‌پذیرد:

layoutfigletاثر
"default"-sچیدمان خود فونت، معمولاً ادغام‌شده
"full"-Wعرض کامل؛ بدون تماس نویسه‌ها
"fitted"-kنزدیک شدن نویسه‌ها تا رسیدن به یکدیگر
"smushed"-Sادغام با قواعد فونت
"universal"-oهم‌پوشانی نویسه‌های بعدی با نویسه‌های قبلی

عددی از -1 تا 63 یک حالت خام چیدمان -m است: مقدار -1 عرض کامل است، مقدار 0 حالت فشرده تا تماس است و مقادیر 1 تا 63 قواعد ادغام را انتخاب می‌کنند. هر شش قاعدهٔ ادغام افقی پیاده‌سازی شده‌اند: نویسهٔ یکسان، زیرخط، سلسله‌مراتب، جفت متقابل، X بزرگ و hardblank. تجزیه‌گر بخش‌های دیگر قالب را هم پردازش می‌کند: خطوط توضیح، نویسه‌های دارای برچسب کد در مبناهای ده‌دهی، هشت‌هشتی و شانزده‌شانزدهی، شکل جایگزین نویسهٔ ناموجود و فونت‌های راست‌به‌چپ مانند ivrit.

شکستن خطوط نیز از FIGlet پیروی می‌کند. ویژگی width خط را در مرز واژه‌ها و، وقتی واژه از خط عریض‌تر باشد، درون واژه می‌شکند؛ درست در همان جایی که figlet -w می‌شکند. دستور figlet -w 80 حداکثر 79 ستون چاپ می‌کند، بنابراین -w N معادل width: N - 1 است.

مطابقت با فایل باینری

فایل packages/font/test/fixtures/references.json شامل 273 خروجی است که با اجرای برنامهٔ واقعی figlet 2.2.5 روی همهٔ فونت‌های همراه بسته در تمام حالت‌های چیدمان تولید شده‌اند، با شکستن خطوط، تراز متن، متن راست‌به‌چپ، حالت پاراگراف و ورودی آزمون رگرسیون خود FIGlet با پرچم‌های فایل run-tests.sh آن. هر مورد آرگومان‌ها، ورودی و خروجی دقیق را ذخیره می‌کند و آزمون، خط فرمان را دوباره به گزینه‌ها تبدیل می‌کند:

for (const f of flags) {  if (f === "W") opts.layout = "full";  else if (f === "k") opts.layout = "fitted";  else if (f === "S") opts.layout = "smushed";  else if (f === "o") opts.layout = "universal";  else if (f === "s") opts.layout = "default";  else if (f === "c") opts.align = "center";  else if (f === "r") opts.align = "right";  else if (f === "l") opts.align = "left";  else if (f === "R") opts.direction = "rtl";  else if (f === "L") opts.direction = "ltr";  else if (f === "p") opts.paragraph = true;  else throw new Error(`unsupported flag -${f}`);}

هر 273 مورد مطابقت دارند. برای تولید دوبارهٔ داده‌های آزمون، نسخهٔ 2.2.5 برنامهٔ figlet را در PATH خود قرار دهید و دستور bun run --cwd packages/font references را اجرا کنید.

فونت‌ها روی شبکهٔ سلولی

هر فونت همراه بسته با نویسه‌های قابل چاپ ASCII یا ⁦Latin-1⁩ رسم می‌شود، بنابراین هر زیرنویسه در Menlo دقیقاً یک سلول است و با شبکه هم‌تراز می‌شود. کامپوننت <FigletText> ردیف‌هایش را برحسب سلول اندازه می‌گیرد، بنابراین حروف مانند هر <Text> دیگری در چیدمان flexbox قرار می‌گیرند و ویژگی‌های columns و align خطوط آن را درون کادرش می‌شکنند و تراز می‌کنند.

هر فونت ماژول جداگانه‌ای دارد، بنابراین برنامه فقط فونت‌هایی را همراه خود دارد که وارد می‌کند و هر فونت در اولین رندر تجزیه می‌شود، نه هنگام وارد کردن. ماژول @textjs/font/all همهٔ فونت‌ها را برای گالری‌ها صادر می‌کند.

هر FIGfont دیگری را می‌توان هنگام اجرا دریافت و تجزیه کرد:

import { parseFont } from "@textjs/font";const doom = parseFont(await (await fetch("/fonts/doom.flf")).text(), "Doom");

مجوزها

فونت‌های همراه بسته بایت‌به‌بایت با فونت‌های موجود در figlet-2.2.5.tar.gz یکسان‌اند و تحت مجوز ⁦BSD 3-Clause⁩ متعلق به FIGlet توزیع می‌شوند. هر فونت اطلاعات پدیدآورندگان خود را در خطوط توضیح نگه می‌دارد که از طریق font.comment در دسترس است. فونت‌های محبوبی که مجوز بازتوزیع ندارند، مانند Doom، ⁦Larry 3D⁩، ⁦ANSI Shadow⁩ و ⁦Calvin S⁩، همراه بسته ارائه نمی‌شوند.

مرجع کامل در بخش فونت‌ها است.