Lewati ke konten

Pemformat

Phasis menyediakan formatter JavaScript native yang dibangun dengan parsernya sendiri. Formatter ini mencetak ulang kode sumber dengan semantik tata letak kompatibel prettier, sepenuhnya dalam PHP: tanpa Node.js, tanpa bundel formatter yang ditafsirkan, tanpa proses eksternal.

formatSource

PHP
public static function formatSource(
    string $source,
    string $sourceType = 'script',
    ?FormatOptions $options = null,
): string

Titik masuk satu panggilan pada Phasis\Formatter\Formatter. $sourceType memilih bahasa: script atau module untuk JavaScript, json, atau css. JavaScript mengurai sesuai tujuan yang diberikan, memasang kembali komentarnya, lalu mencetak dengan lebar cetak yang dikonfigurasi.

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"

Sumber tidak valid akan melempar Phasis\Exceptions\SyntaxError yang sama seperti parser, lengkap dengan baris, kolom, dan offset.

FormatOptions

Opsi tata letak meniru 3.x prettier dan secara default menggunakan nilai bawaan prettier:

Opsi Default Arti
printWidth 80 Lebar baris target untuk menyesuaikan tata letak.
tabWidth 2 Spasi per tingkat indentasi (dan lebar tab yang diukur).
useTabs false Gunakan tab alih-alih spasi untuk indentasi.
semi true Titik koma pada pernyataan.
singleQuote false Utamakan ' daripada " jika memerlukan lebih sedikit escape.
trailingComma 'all' 'all', 'es5', atau 'none'.
bracketSpacing true Spasi di dalam kurung kurawal objek: { a } versus {a}.
arrowParens 'always' 'always' atau 'avoid' untuk fungsi panah dengan satu parameter.

CSS

formatSource($css, 'css') memformat stylesheet dengan tata letak stylesheet prettier: satu selector per baris dalam daftar selector, satu deklarasi per baris, spasi kombinator dan nilai yang dinormalisasi, daftar nilai sederhana yang dirapatkan, daftar koma bayangan dan gradien satu per baris, argumen fungsi secara keseluruhan, baris kosong dan komentar dipertahankan, serta prelude untuk at-rule tak dikenal seperti Tailwind milik @apply tidak diubah. Selector gabungan panjang dipisah pada kombinator descendant, dan argumen pseudo-class yang terlalu panjang dibungkus di dalam tanda kurungnya.

JSON

formatSource($json, 'json') menggunakan kembali parser dan pencetak JavaScript dengan aturan json prettier: kunci tetap diapit tanda kutip, string tetap memakai tanda kutip ganda terlepas dari singleQuote, koma penutup tidak pernah muncul, dan komentar // di dalam dokumen tetap dipertahankan.

Semantik tata letak

Pencetak mengimplementasikan model dokumen prettier: grup diratakan jika muat dalam lebar cetak dan dipisah jika tidak, argumen pemanggilan menempel pada argumen fungsi atau objek terakhir, rantai anggota dipisah sebelum setiap titik jika melebihi lebar baris, objek yang ditulis dalam beberapa baris tetap multibaris, dan paling banyak satu baris kosong dipertahankan di antara pernyataan. Pada masukan berformat prettier dengan opsi yang sama, formatter menghasilkan keluaran yang identik byte demi byte untuk kode dunia nyata; suite kesesuaiannya memastikan hal itu terhadap fixture yang dibuat oleh prettier sendiri.

Komentar

Komentar dikumpulkan selama tokenisasi (Parser::setCollectComments(true), tersedia pada parser untuk perkakas) dan dipasang kembali ke pohon sebagai lampiran awal, akhir, atau menggantung. Komentar baris mempertahankan barisnya sendiri, komentar akhir pada baris yang sama tetap berada pada pernyataannya, baris kosong di sekitar komentar dipertahankan, dan blok /** ... */ diindentasi ulang dengan gutter *-nya sejajar.

Jaminan

Tiga invarian berlaku untuk setiap keluaran yang diformat dan ditegakkan oleh suite pengujian:

  • Keluaran dapat diurai kembali menjadi program yang setara (selain lokasinya).
  • Setiap komentar dalam masukan tetap ada di keluaran.
  • Pemformatan bersifat idempoten: memformat keluaran yang sudah diformat tidak mengubah apa pun.

Performa

Pemformatan berlangsung secepat penguraian: berkas dunia nyata diformat dalam hitungan puluhan milidetik, dan JavaScript yang ditulis manual dalam proyek tipikal diformat dari awal hingga akhir dalam waktu jauh di bawah satu detik pada satu proses.