Biçimlendirici
Phasis, kendi ayrıştırıcısı üzerine kurulu yerel bir JavaScript biçimlendiricisi sunar. Kaynağı prettier ile uyumlu düzen kurallarıyla yeniden yazdırır; tümüyle PHP içinde çalışır: Node.js gerekmez, yorumlanan biçimlendirici paketleri gerekmez, harici süreç gerekmez.
formatSource
public static function formatSource(
string $source,
string $sourceType = 'script',
?FormatOptions $options = null,
): string
Phasis\Formatter\Formatter üzerindeki tek çağrılık giriş noktasıdır. Dili $sourceType seçer: JavaScript için script veya module, ya da json ve css. JavaScript, belirtilen amaçla ayrıştırır, yorumları yeniden iliştirir ve yapılandırılmış yazdırma genişliğine göre yazdırır.
use Phasis\Formatter\Formatter;
use Phasis\Formatter\FormatOptions;
$formatted = Formatter::formatSource(
"const a={x:1,y:2};",
'script',
new FormatOptions(useTabs: true, singleQuote: true),
);
// "const a = { x: 1, y: 2 };\n"
Geçersiz kaynak, ayrıştırıcıyla aynı Phasis\Exceptions\SyntaxError hatasını satır, sütun ve ofset bilgileriyle fırlatır.
FormatOptions
Düzen seçenekleri prettier 3.x ayarlarını yansıtır ve varsayılan olarak prettier varsayılanlarını kullanır:
| Seçenek | Varsayılan | Anlam |
|---|---|---|
printWidth |
80 |
Düzenin sığdırıldığı hedef satır genişliği. |
tabWidth |
2 |
Girinti düzeyi başına boşluk sayısı (ve sekmenin ölçülen genişliği). |
useTabs |
false |
Boşluk yerine sekmelerle girinti yap. |
semi |
true |
İfade noktalı virgülleri. |
singleQuote |
false |
Daha az kaçış gerektiren yerlerde " yerine ' kullan. |
trailingComma |
'all' |
'all', 'es5' veya 'none'. |
bracketSpacing |
true |
Nesne küme parantezlerinin içindeki boşluklar: { a } veya {a}. |
arrowParens |
'always' |
Tek parametreli ok işlevleri için 'always' ya da 'avoid'. |
CSS
formatSource($css, 'css'), stil sayfalarını prettier'ın stil sayfası düzeniyle biçimlendirir: seçici listelerinde her satıra bir seçici, her satıra bir bildirim, normalleştirilmiş birleştirici ve değer boşlukları, basit değer listelerini doldurarak paketleme, gölgeler ve degradeler için her satıra bir virgüllü liste, işlev bağımsız değişkenlerinin ya hep ya hiç biçimlendirilmesi, boş satırların ve yorumların korunması, Tailwind gibi bilinmeyen at kuralları için @apply ön bölümlerine dokunulmaması. Uzun bileşik seçiciler, alt öğe birleştiricilerinde satır kırar; aşırı uzun sözde sınıf bağımsız değişkenleri parantezlerinin içinde kaydırılır.
JSON
formatSource($json, 'json'), JavaScript ayrıştırıcısını ve yazıcılarını prettier'ın JSON kurallarıyla yeniden kullanır: anahtarlar tırnaklı kalır, singleQuote ne olursa olsun dizeler çift tırnaklı kalır, sondaki virgüller hiç görünmez ve belge içindeki // yorumları korunur.
Düzen kuralları
Yazıcı, prettier belge modelini uygular: gruplar yazdırma genişliğine sığdığında tek satıra açılır, sığmadığında satır kırar; çağrı bağımsız değişkenleri, sondaki işlev veya nesne bağımsız değişkenine bitişik durur; üye zincirleri satırı aştığında her noktadan önce satır kırar; birden çok satıra yazılmış nesneler çok satırlı kalır ve ifadeler arasında en fazla bir boş satır korunur. Eşleşen seçeneklerle prettier biçiminde düzenlenmiş girdi gerçek dünya kodlarında bayt düzeyinde aynıdır; uyumluluk paketi bunu prettier'ın kendisinin ürettiği örnek dosyalara karşı doğrular.
Yorumlar
Yorumlar belirteçleştirme sırasında toplanır (Parser::setCollectComments(true), araçlar için ayrıştırıcıda sunulur) ve ağaca başta, sonda veya bağımsız olarak iliştirilir. Satır yorumları kendi satırlarında kalır, aynı satırdaki sondaki yorumlar ifadelerine bağlı kalır, yorumların etrafındaki boş satırlar korunur ve /** ... */ blokları yeniden girintilenirken * kenar boşlukları hizalanır.
Garantiler
Test paketi tarafından uygulanan üç değişmez, biçimlendirilmiş her çıktı için geçerlidir:
- Çıktı, eşdeğer bir programa yeniden ayrıştırılır (konumlar hariç).
- Girdideki her yorum çıktıda korunur.
- Biçimlendirme idempotenttir: biçimlendirilmiş çıktıyı yeniden biçimlendirmek hiçbir şeyi değiştirmez.
Performans
Biçimlendirme, ayrıştırıcı hızında çalışır: gerçek dünya dosyaları onlarca milisaniyede biçimlendirilir ve tipik bir projenin elle yazılmış JavaScript dosyası tek bir süreçte uçtan uca bir saniyenin çok altında biçimlendirilir.