تخطَّ إلى المحتوى

طبقة التنسيق format.ts

تحليل القيم المحايدة والتنسيق لكل طرف.

جميع قيم الرموز هي تعبيرات محايدة تجاه المنصات (سداسي عشري / rgba / سلاسل مع وحدة / أرقام / مصفوفات بيزيه). يحلِّلها format.ts إلى بيانات مهيكلة، ثم يقوم كل هدف بتنسيقها إلى قيم حرفية في اللغة المحلية.

أنواع البنى بعد التحليل

Section titled “أنواع البنى بعد التحليل”
interface ParsedColor { r: number; g: number; b: number; a: number } // r/g/b: 0..255، a: 0..1
interface ParsedDimension { value: number; unit: 'px' | '%' }
interface ParsedDuration { ms: number } // موحَّدة إلى ملي ثانية
interface ParsedShadow { x: number; y: number; blur: number; spread?: number; color: ParsedColor }

يدعم ثلاثة أشكال سداسية عشرية:

الإدخال المعالجة
#RGB تكرار كل خانة لتوسيعها
#RRGGBB أخذ القنوات مباشرة
#AARRGGBB الخانتان الأولى هما alpha، وتُقسمان على 255 للتطبيع إلى 0..1
أطوال أخرى يُطلق قيمة لون سداسية عشرية غير قابلة للتحليل

تحليل rgba() / rgb()، والقيمة الافتراضية لـ alpha هي 1. تخضع القنوات للتحقق عبر clamp255 (يُطلق قناة اللون خارج النطاق عند تجاوز 0..255).

الدخول الموحَّد للألوان: ما يبدأ بـ # يمر عبر parseHex، وما يبدأ بـ rgb يمر عبر parseRgba، وإلا يُطلق تنسيق لون غير مدعوم (يُقبل السداسي العشري وrgba فقط).

parseDimension(value: string): ParsedDimension

Section titled “parseDimension(value: string): ParsedDimension”

يطابق /^(\d+(?:\.\d+)?)(px|%)$/، وإلا يُطلق قيمة حجم غير قابلة للتحليل. لا يقبل سوى px و% — أما الوحدات الأخرى فيمنعها الخط الأحمر 5 على مستوى JSON.

parseDuration(value: string): ParsedDuration

Section titled “parseDuration(value: string): ParsedDuration”

يطابق /^(\d+(?:\.\d+)?)(s|ms)$/، ويضرب s في 1000، موحِّدًا كل المدد إلى ملي ثانية.

التقسيم بمسافة (4 أجزاء على الأقل):

x y blur [spread] color

إذا طابق الجزء الرابع -?\d+(\.\d+)?px فهو مقدار الانتشار (spread)، وإلا فهو اللون:

if (rest.length > 1 && /^-?\d+(\.\d+)?px$/.test(rest[0])) {
spread = Number(rest[0].replace('px', ''))
rest.shift()
}

يُمرَّر جزء اللون إلى parseColor.

assertTypedValue(type: TokenType, value: TokenValue): void

Section titled “assertTypedValue(type: TokenType, value: TokenValue): void”

تحقق دلالي خارج schema: تأكيد القيم نوعًا نوعًا مع تحليلها فعليًا. وهذا هو الحاجز الأخير في أولويات الأنواع ذات الطبقات الثلاث (راجع نظام الأنواع).

النوع التأكيد
color يجب أن يكون سلسلة نصية ويقبل التحليل عبر parseColor
dimension يجب أن يكون سلسلة نصية ويقبل التحليل عبر parseDimension
duration يجب أن يكون سلسلة نصية ويقبل التحليل عبر parseDuration
shadow يجب أن يكون سلسلة نصية ويقبل التحليل عبر parseShadow
cubicBezier يجب أن يكون مصفوفة طولها 4 من الأرقام
number / string بلا تحقق

قيمة 0xAARRGGBB الحرفية، للاستخدام في Kotlin / C. قناة alpha هي Math.round(a * 255)، وكل قناة بخانتين سداسيتين عشريتين كبيرتين.

سلسلة #AARRGGBB، للاستخدام في ArkTS. مبنية على toArgbHex مع استبدال 0x بـ #.

حكم خاص بـ Android: إذا طابق المسار /fontsize/i يُستخدم sp، وإلا dp.

الدخول الموحَّد للأهداف. يحوّل القيمة المحايدة وفق token.type إلى كائن اتحاد مميَّز بـ kind:

{ kind: 'color'; color: ParsedColor }
| { kind: 'dimension'; dimension: ParsedDimension }
| { kind: 'duration'; duration: ParsedDuration }
| { kind: 'shadow'; shadow: ParsedShadow }
| { kind: 'cubicBezier'; bezier: number[] }
| { kind: 'number'; number: number }
| { kind: 'string'; string: string }

ثم يجري كل هدف switch على هذا الاتحاد لتنسيقه إلى قيمة محلية. وهكذا تُكتب تحليل القيم المحايدة مرة واحدة، وما على كل طرف سوى «كيفية الكتابة».

Copyright © 2024-2026 FengMo WenXue