İçeriğe geç

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

PHP
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.

PHP
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.