Μετάβαση στο περιεχόμενο

Μορφοποιητής

Το Phasis διαθέτει εγγενή μορφοποιητή JavaScript, βασισμένο στον δικό του αναλυτή. Ανατυπώνει τον πηγαίο κώδικα με σημασιολογία διάταξης συμβατή με το prettier, εξ ολοκλήρου σε PHP: χωρίς Node.js, χωρίς διερμηνευόμενα πακέτα μορφοποίησης και χωρίς εξωτερικές διεργασίες.

formatSource

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

Το σημείο εισόδου μίας κλήσης στο Phasis\Formatter\Formatter. Το $sourceType επιλέγει τη γλώσσα: script ή module για JavaScript, json ή css. Το JavaScript αναλύει με βάση τον καθορισμένο στόχο, επανασυνδέει τα σχόλια και εκτυπώνει με το διαμορφωμένο πλάτος εκτύπωσης.

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"

Ο μη έγκυρος πηγαίος κώδικας προκαλεί το ίδιο Phasis\Exceptions\SyntaxError με τον αναλυτή, μαζί με γραμμή, στήλη και μετατόπιση.

FormatOptions

Οι επιλογές διάταξης αντικατοπτρίζουν το 3.x του prettier και από προεπιλογή χρησιμοποιούν τις προεπιλεγμένες τιμές του prettier:

Επιλογή Προεπιλογή Σημασία
printWidth 80 Πλάτος γραμμής-στόχος στο οποίο προσαρμόζεται η διάταξη.
tabWidth 2 Διαστήματα ανά επίπεδο εσοχής (και μετρούμενο πλάτος ενός tab).
useTabs false Χρήση tab αντί για διαστήματα στις εσοχές.
semi true Ερωτηματικά στο τέλος των εντολών.
singleQuote false Προτίμηση του ' αντί του " όπου απαιτούνται λιγότερες διαφυγές.
trailingComma 'all' 'all', 'es5' ή 'none'.
bracketSpacing true Διαστήματα μέσα στις αγκύλες αντικειμένων: { a } έναντι {a}.
arrowParens 'always' 'always' ή 'avoid' για συναρτήσεις βέλους με μία παράμετρο.

CSS

Το formatSource($css, 'css') μορφοποιεί τα φύλλα στυλ με τη διάταξη φύλλων στυλ του prettier: έναν επιλογέα ανά γραμμή στις λίστες επιλογέων, μία δήλωση ανά γραμμή, κανονικοποιημένα κενά σε συνδυαστές και τιμές, απλές λίστες τιμών με πλήρωση γραμμών, λίστες με κόμματα για σκιές και διαβαθμίσεις με ένα στοιχείο ανά γραμμή, ορίσματα συναρτήσεων είτε όλα σε μία γραμμή είτε όλα σε πολλές, διατήρηση κενών γραμμών και σχολίων, και αμετάβλητα προοίμια για άγνωστους κανόνες at όπως το Tailwind του @apply. Οι μακροί σύνθετοι επιλογείς διασπώνται στους συνδυαστές απογόνων, ενώ τα υπερβολικά μακριά ορίσματα ψευδοκλάσεων αναδιπλώνονται μέσα στις παρενθέσεις τους.

JSON

Το formatSource($json, 'json') επαναχρησιμοποιεί τον αναλυτή και τους εκτυπωτές του JavaScript με τους κανόνες JSON του prettier: τα κλειδιά παραμένουν σε εισαγωγικά, οι συμβολοσειρές σε διπλά εισαγωγικά ανεξάρτητα από το singleQuote, δεν εμφανίζονται ποτέ κόμματα στο τέλος και διατηρούνται τα σχόλια // μέσα στο έγγραφο.

Σημασιολογία διάταξης

Ο εκτυπωτής υλοποιεί το μοντέλο εγγράφων του prettier: οι ομάδες συμπτύσσονται όταν χωρούν στο πλάτος εκτύπωσης και διαφορετικά διασπώνται, τα ορίσματα κλήσης παραμένουν κοντά σε τελικό όρισμα συνάρτησης ή αντικειμένου, οι αλυσίδες μελών διασπώνται πριν από κάθε τελεία όταν ξεπερνούν το πλάτος γραμμής, τα αντικείμενα που γράφονται σε πολλές γραμμές παραμένουν σε πολλές γραμμές και διατηρείται το πολύ μία κενή γραμμή μεταξύ εντολών. Σε είσοδο μορφοποιημένη από το prettier με αντίστοιχες επιλογές, ο μορφοποιητής παράγει πανομοιότυπο αποτέλεσμα σε επίπεδο byte σε πραγματικό κώδικα· η σουίτα συμμόρφωσης το επιβεβαιώνει ακριβώς αυτό με δείγματα που δημιουργήθηκαν από το ίδιο το prettier.

Σχόλια

Τα σχόλια συλλέγονται κατά την ανάλυση των token (Parser::setCollectComments(true), διαθέσιμα στον αναλυτή για εργαλεία) και επανασυνδέονται στο δέντρο ως αρχικές, τελικές ή μετέωρες επισυνάψεις. Τα σχόλια γραμμής διατηρούν τις δικές τους γραμμές, τα τελικά σχόλια στην ίδια γραμμή παραμένουν στην εντολή τους, οι κενές γραμμές γύρω από τα σχόλια διατηρούνται και τα μπλοκ /** ... */ αποκτούν εκ νέου εσοχή με το περιθώριο * στοιχισμένο.

Εγγυήσεις

Ισχύουν τρεις αναλλοίωτες συνθήκες για κάθε μορφοποιημένο αποτέλεσμα, οι οποίες επιβάλλονται από τη σουίτα δοκιμών:

  • Το αποτέλεσμα αναλύεται ξανά σε ισοδύναμο πρόγραμμα (χωρίς να λαμβάνονται υπόψη οι θέσεις).
  • Κάθε σχόλιο της εισόδου διατηρείται στο αποτέλεσμα.
  • Η μορφοποίηση είναι αδρανής ως προς την επανάληψη: η μορφοποίηση ήδη μορφοποιημένου αποτελέσματος δεν αλλάζει τίποτα.

Απόδοση

Η μορφοποίηση εκτελείται με ταχύτητα αναλυτή: πραγματικά αρχεία μορφοποιούνται σε δεκάδες χιλιοστά του δευτερολέπτου, ενώ ένα τυπικό χειρόγραφο JavaScript έργου μορφοποιείται από άκρη σε άκρη σε πολύ λιγότερο από ένα δευτερόλεπτο, σε μία διεργασία.