Το slug είναι η αναγνώσιμη ουρά μιας διεύθυνσης ιστού — το my-first-post στο example.com/blog/my-first-post. Είναι το τμήμα που διαβάζει ένας άνθρωπος πριν αποφασίσει αν θα κάνει κλικ, και το τμήμα που μια μηχανή αναζήτησης διαβάζει ως σύντομη περιγραφή του περιεχομένου της σελίδας. Γι' αυτό αξίζει περισσότερη προσοχή από ένα αναγνωριστικό βάσης δεδομένων (ID) ή μια ημερομηνία. Αυτή η δωρεάν γεννήτρια μετατρέπει οποιοδήποτε κείμενο σε slug: επικολλήστε έναν τίτλο στο πεδίο "Κείμενο προς μετατροπή", πατήστε "Δημιουργία" και το αποτέλεσμα εμφανίζεται με ένα κουμπί αντιγραφής δίπλα του. Οι προεπιλογές είναι οι ρυθμίσεις που θέλουν οι περισσότεροι ιστότοποι — πεζά γράμματα, παύλες μεταξύ των λέξεων, αφαίρεση κοινών λέξεων συμπλήρωσης, μεταγραφή μη λατινικών χαρακτήρων — οπότε ένα λειτουργικό slug απέχει μόνο ένα κλικ. Και κάθε μία από αυτές τις αποφάσεις είναι ένας διακόπτης που μπορείτε να αλλάξετε.
Όλα συμβαίνουν στη δική σας συσκευή. Η σελίδα φορτώνει μια μικρή μηχανή JavaScript και την εκτελεί τοπικά: οι τίτλοι σας δεν μεταφορτώνονται ποτέ, δεν καταγράφονται, και το εργαλείο συνεχίζει να λειτουργεί ακόμα και χωρίς σύνδεση στο διαδίκτυο. Αυτός είναι και ο λόγος που το αποτέλεσμα ενημερώνεται τη στιγμή που αλλάζετε μια ρύθμιση. Αξίζει να αναφέρουμε τη σειρά των εργασιών, γιατί αυτή καθιστά το αποτέλεσμα προβλέψιμο: ένας επικολλημένος σύνδεσμος αρχικά ανάγεται στο τελευταίο τμήμα της διαδρομής του, μετά το κείμενο μετατρέπεται σε πεζά γράμματα, έπειτα αφαιρούνται οι λέξεις διακοπής, μεταγράφονται οι μη λατινικοί χαρακτήρες, έπειτα αφαιρούνται οι αριθμοί και οι ειδικοί χαρακτήρες (εάν το έχετε επιλέξει). Στη συνέχεια ό,τι απομένει ενώνεται με το διαχωριστικό σας, το αποτέλεσμα κόβεται στο μέγιστο μήκος, και τελικά τυχόν επαναλήψεις παίρνουν μια αριθμητική κατάληξη. Το "Κείμενο προς μετατροπή" δέχεται έως 500.000 χαρακτήρες μονομιάς, το οποίο αντιστοιχεί σε μερικές χιλιάδες τίτλους άρθρων.
Μία γραμμή μέσα, ένα slug έξω. Επικολλήστε μια ολόκληρη λίστα με τίτλους και κάθε γραμμή γίνεται το δικό της αριθμημένο slug, με τον αρχικό τίτλο να εμφανίζεται από πάνω με γκρι χρώμα. Έτσι σε μια ομάδα των πενήντα μπορείτε ακόμα να καταλάβετε σε ποια επικεφαλίδα ανήκει το κάθε slug. Μια λίστα που βρίσκεται ήδη σε ένα αρχείο δεν χρειάζεται να περάσει από το πρόχειρο: η "Φόρτωση από αρχείο", το κουμπί δίπλα στο πεδίο εισαγωγής, ανοίγει ένα αρχείο απλού κειμένου — .txt, .csv, .md, .json και τα παρόμοια — και ρίχνει το περιεχόμενό του στο πεδίο. Το πρόγραμμα περιήγησής σας διαβάζει αυτό το αρχείο ακριβώς με τον ίδιο τρόπο που διαβάζει αυτά που πληκτρολογείτε, και δεν μεταφορτώνεται πουθενά. Το "Διαχωρισμός με" καθορίζει πώς κόβεται η λίστα. Η επιλογή "Αυτόματα" είναι η προεπιλογή: μια νέα γραμμή διαχωρίζει πάντα τα στοιχεία, ενώ ένα κόμμα τα διαχωρίζει μόνο όταν η είσοδος είναι μια μονή γραμμή της οποίας τα μέρη μοιάζουν με ανεξάρτητες τιμές — έτσι το "τιμή 3,5 EUR" και το "Κεφάλαιο 5: αποτελέσματα, συμπεράσματα" παραμένουν ολόκληρα αντί να διασπώνται σε κομμάτια. Η "Νέα γραμμή", το "Κόμμα" και το "Κενό" επιβάλλουν την επιλογή όταν ήδη γνωρίζετε τη μορφή των δεδομένων σας. Η "Μορφή εξόδου" αποφασίζει πώς θα επιστρέψει μια ομάδα όταν τη λάβετε — ένα ανά γραμμή, "Διαχωρισμένα με κενό" ή "Διαχωρισμένα με κόμμα" — και τόσο η "Αντιγραφή όλων" όσο και η "Αποθήκευση σε αρχείο" ακολουθούν αυτήν τη ρύθμιση. Το "Ιστορικό" διατηρεί τις τελευταίες 10 εκτελέσεις σας στο δικό σας πρόγραμμα περιήγησης, οπότε μια λίστα που μετατρέψατε πριν από μία ώρα βρίσκεται ακόμα εκεί.
Το μη λατινικό κείμενο είναι το τμήμα που οι περισσότερες γεννήτριες slug πετυχαίνουν στο περίπου και ελάχιστες με απόλυτη ακρίβεια. Ένα URL είναι ασφαλέστερο σε απλό ASCII, οπότε τα κυριλλικά, τα ελληνικά, τα αραβικά, τα κινεζικά και τα ευρωπαϊκά γράμματα με τόνους πρέπει να μετατραπούν, και το μόνο πραγματικό ερώτημα είναι με ποιου τον κανόνα. Αυτή η σελίδα απαντά σε δύο επίπεδα. Το γενικό επίπεδο καλύπτει κάθε αλφάβητο: μια βιβλιοθήκη μεταγραφής με μια λογική απάντηση ASCII για σχεδόν κάθε χαρακτήρα που μπορείτε να πληκτρολογήσετε, και αναλαμβάνει ό,τι δεν καλύπτει κανένας πίνακας. Το ειδικό επίπεδο είναι ένα σύνολο από χειροκίνητα δημιουργημένους πίνακες για τις γλώσσες όπου η γενική απάντηση δεν είναι αυτή που πραγματικά χρησιμοποιεί η χώρα, και τα ελληνικά είναι μία από αυτές. Δεν έχετε κάτι να επιλέξετε: για τα ελληνικά υπάρχει ένα πρότυπο, το ΕΛΟΤ 743 (ISO 843) — αυτό που τυπώνεται στα διαβατήρια και στις πινακίδες των δρόμων — και ο πίνακάς του φορτώνεται αμέσως. Τα μεμονωμένα γράμματα το γενικό επίπεδο τα έδινε ήδη σωστά, όμως το ΕΛΟΤ κρίνεται στα δίψηφα, και εκεί έκανε λάθος: το ου έβγαινε oy αντί για ou, οπότε το Μουσείο γινόταν moyseio· το αυ και το ευ έβγαιναν ay και ey αντί για av και ev, οπότε η Ευρώπη γινόταν eyropi· και το γγ έβγαινε gg αντί για ng. Τώρα το ου δίνει ou, το γγ δίνει ng, ενώ το αυ και το ευ δίνουν av και ev πριν από φωνήεν ή ηχηρό σύμφωνο και af και ef πριν από άηχο — γι' αυτό το Ναύπλιο βγαίνει nafplio και η Λευκάδα lefkada. Ο φορτωμένος πίνακας στέκεται σε ένα επεξεργάσιμο πλέγμα κάτω από τους "Κανόνες μεταγραφής", όπου κάθε γράμμα είναι ένα πεδίο κειμένου που μπορείτε να αλλάξετε, και η "Επαναφορά προεπιλογών" τον επαναφέρει. Ο ουκρανικός πίνακας ακολουθεί το Ψήφισμα 55 του Υπουργικού Συμβουλίου του 2010, το πρότυπο που τυπώνεται στα ουκρανικά διαβατήρια, συμπεριλαμβανομένων των λεπτομερειών που είναι εύκολο να ξεφύγουν: το зг γίνεται zgh αντί για zh ώστε να παραμένει διακριτό από το ж. Τα є, ї, й, ю και я παίρνουν μια μορφή στην αρχή της λέξης και άλλη στο εσωτερικό της. Και η απόστροφος και το μαλακό σημείο αφαιρούνται χωρίς να ξεκινά νέα λέξη, οπότε το Знам'янка βγαίνει ως znamianka και όχι znamyanka. Τα γερμανικά χρησιμοποιούν από προεπιλογή το ανεπτυγμένο ä → ae, ö → oe, ü → ue που πραγματικά χρησιμοποιούν οι γερμανικές διευθύνσεις, με μια απλή παραλλαγή ä → a αν το προτιμάτε.
Η "Αφαίρεση λέξεων διακοπής" είναι ενεργοποιημένη από προεπιλογή. Αφαιρεί τις μικρές συνδετικές λέξεις — a, the, and (στα αγγλικά), o, η, το, και, σε, με (στα ελληνικά) — που μεγαλώνουν ένα slug χωρίς να του προσθέτουν νόημα. Η λίστα στην ενότητα "Λέξεις διακοπής" είναι πλήρως επεξεργάσιμη και έρχεται ήδη συμπληρωμένη: μια αγγλική λίστα συν μια λίστα για τη γλώσσα της σελίδας στην οποία βρίσκεστε. Έτσι η ουκρανική σελίδα γνωρίζει τα в, на, та και і, και η γερμανική γνωρίζει τα der, die και das. Προσθέστε δικές σας λέξεις, διαγράψτε αυτές που θέλετε να κρατήσετε ή απενεργοποιήστε εντελώς τη λειτουργία, οπότε το πεδίο γίνεται γκρι αντί να προσποιείται ότι έχει ακόμα σημασία. Δύο ειλικρινείς σημειώσεις για αυτό. Η αφαίρεση λέξεων διακοπής είναι ένα μικρό κέρδος στην καθαριότητα, όχι μοχλός κατάταξης — λαμβάνετε μια πιο σύντομη, πιο καθαρή διεύθυνση, όχι μια καλύτερη θέση. Και αν κάθε λέξη σε έναν τίτλο τυχαίνει να βρίσκεται στη λίστα, το ειλικρινές αποτέλεσμα είναι τίποτα απολύτως, οπότε το εργαλείο σας το λέει αυτό αντί να σας δώσει ένα άδειο κουτί.
Οι υπόλοιποι διακόπτες αποφασίζουν για τη μορφή. Το "Διαχωριστικό στο slug" επιλέγει τι θα υπάρχει ανάμεσα στις λέξεις, και η προεπιλογή της παύλας δεν είναι θέμα γούστου: η Google διαβάζει την παύλα ως διαχωριστικό λέξεων και την κάτω παύλα ως ενωτικό, έτσι το my_first_post φτάνει στον ανιχνευτή ως μια μεγάλη λέξη, ενώ το my-first-post φτάνει ως τρεις. Η "Κάτω παύλα (_)" υπάρχει για τα συστήματα που επιμένουν σε αυτήν. Τα "Πεζά γράμματα" είναι ενεργοποιημένα επειδή οι περισσότεροι διακομιστές αντιμετωπίζουν τις διευθύνσεις με διάκριση πεζών-κεφαλαίων (case-sensitive), και τα μικτά γράμματα είναι ένας εύκολος τρόπος να καταλήξετε με δύο URL για μια σελίδα. Η "Αφαίρεση ειδικών χαρακτήρων" καθαρίζει ό,τι δεν είναι γράμμα, ψηφίο, κενό, παύλα ή κάτω παύλα, το οποίο είναι αυτό που κρατά τα σημεία στίξης, τα εισαγωγικά και τα emoji έξω από μια διεύθυνση — τα emoji αφαιρούνται πριν τη μεταγραφή ειδικά ώστε ένας πύραυλος να μη γίνει η λέξη rocket. Η "Αφαίρεση αριθμών" είναι απενεργοποιημένη, επειδή ένας αριθμός σε έναν τίτλο είναι συνήθως μέρος του τίτλου. Το "Μέγιστο μήκος" κυμαίνεται από 10 έως 200 με προεπιλογή το 80. Όταν ένα slug είναι μεγαλύτερο από αυτό, η μηχανή κόβει στην τελευταία ολόκληρη λέξη που χωράει, αντί στη μέση κάποιας λέξης. Ο αριθμός δίπλα σε κάθε αποτέλεσμα είναι το μήκος του σε χαρακτήρες, και γίνεται κόκκινος μετά το 60 — όχι ένα απόλυτο όριο, αλλά το σημείο όπου ένα slug αρχίζει να περικόπτεται στα αποτελέσματα αναζήτησης και γίνεται δύσχρηστο στην επικόλληση σε ένα μήνυμα.
Δύο ακόμη διακόπτες υπάρχουν επειδή μετατρέπουν μια μαζική μετατροπή σε δουλειά ενός κλικ. Τα "Μοναδικά slugs" εντοπίζουν την περίπτωση όπου δύο διαφορετικοί τίτλοι ανάγονται στο ίδιο slug — "Top 10 συμβουλές" και "Top-10 συμβουλές" γίνονται και τα δύο top-10-symvoules — και δίνουν στο δεύτερο ένα -2, στο τρίτο ένα -3, μειώνοντας πρώτα τη βάση αν η κατάληξη θα το έσπρωχνε πάνω από το μέγιστο μήκος σας. Δύο σελίδες στην ίδια διεύθυνση είναι ένα πρόβλημα πολύ φθηνότερο να εντοπιστεί σε αυτήν τη λίστα παρά στο CMS σας. Η "Εξαγωγή slug από επικολλημένο URL" λειτουργεί προς την άλλη κατεύθυνση: επικολλήστε έναν πλήρη σύνδεσμο και το εργαλείο παίρνει το τελευταίο μέρος της διαδρομής, αφαιρεί το συμβολοσειρά ερωτήματος (query string) και οποιαδήποτε κατάληξη .html ή .php, και αποκωδικοποιεί την ποσοστιαία κωδικοποίηση. Έτσι ένας σύνδεσμος της Wikipedia που τελειώνει σε %D0%9B%D1%8C%D0%B2%D1%96%D0%B2 επιστρέφει ως lviv αντί για μια σειρά από δεκαεξαδικά ψηφία. Ενεργοποιείται μόνο όταν ολόκληρη η γραμμή είναι σύνδεσμος, άρα μια διεύθυνση που αναφέρεται μέσα σε μια πρόταση μένει ως έχει.
Γιατί να επιλέξετε αυτήν τη γεννήτρια slug;
- Μόνο στο πρόγραμμα περιήγησης: οι τίτλοι σας δεν μεταφορτώνονται ποτέ και η σελίδα συνεχίζει να λειτουργεί εκτός σύνδεσης
- Μαζική μετατροπή από επικόλληση ή αρχείο κειμένου, με τον αρχικό τίτλο πάνω από κάθε slug
- Πραγματικά πρότυπα μεταγραφής ανά γλώσσα, όχι ένας γενικός πίνακας για όλες
- Ουκρανικά σύμφωνα με το Ψήφισμα Νο 55 του 2010 — η ορθογραφία που χρησιμοποιείται στα διαβατήρια
- Κάθε κανόνας επεξεργάσιμος γράμμα-γράμμα, με επαναφορά με ένα κλικ
- Αυτόματες καταλήξεις -2 και -3 ώστε κανένα από τα δύο slug σε μια ομάδα να μην συγκρούεται
- Επικολλήστε έναν σύνδεσμο και πάρτε το slug από αυτόν, με αποκωδικοποιημένη την ποσοστιαία κωδικοποίηση
- Επεξεργάσιμη λίστα λέξεων διακοπής που έρχεται συμπληρωμένη για τη γλώσσα σας
- Ασφαλής περικοπή σε ολόκληρη λέξη, με μετρητή χαρακτήρων δίπλα σε κάθε αποτέλεσμα
- Δωρεάν και απεριόριστα: χωρίς εγγραφή, χωρίς όριο, τίποτα δεν διατηρείται στους διακομιστές μας
Τα slugs είναι απαραίτητα όπου μια σελίδα πρέπει να φέρει μια αναγνώσιμη διεύθυνση. Ένα ιστολόγιο (blog) ή ιστότοπος ειδήσεων μετατρέπει κάθε τίτλο σε ένα, που είναι η περίπτωση γύρω από την οποία διαμορφώθηκε αυτό το εργαλείο: επικολλήστε τους τίτλους της εβδομάδας, λάβετε τα URL της εβδομάδας. Ένα ηλεκτρονικό κατάστημα κάνει το ίδιο για ονόματα προϊόντων και κατηγοριών, συνήθως μαζικά μετά από μια εισαγωγή, και συνήθως σε μια γλώσσα της οποίας το αλφάβητο δεν μπορεί να συγκρατήσει η διεύθυνση. Τα έγγραφα τεκμηρίωσης και οι βάσεις γνώσεων κατασκευάζουν άγκυρες (anchors) και ονόματα αρχείων με τον ίδιο τρόπο. Πέρα από τις διευθύνσεις ιστού, η ίδια καθαρή συμβολοσειρά είναι αυτό που θέλετε για ένα όνομα αρχείου που δεν θα σπάσει σε ένα άλλο λειτουργικό σύστημα, ένα κλειδί βάσης δεδομένων που μπορεί να διαβάσει ένας άνθρωπος σε ένα αρχείο καταγραφής, ένα όνομα κλάδου (branch name), ένα όνομα εικόνας σε μια βιβλιοθήκη πολυμέσων, ή το αναγνωριστικό μιας ενότητας σε μια γεννήτρια στατικών ιστότοπων. Οποιοδήποτε μέρος όπου ένα αναγνώσιμο από άνθρωπο όνομα πρέπει να επιβιώσει περνώντας σε ένα αναγνώσιμο από μηχανή πεδίο, είναι ένα μέρος όπου ανήκει ένα slug.
Αξίζει να γνωρίζετε ορισμένους περιορισμούς πριν βασιστείτε σε αυτό. Πρόκειται για γεννήτρια, όχι για επικυρωτή (validator): δεν θα ελέγξει αν ένα slug είναι ήδη κατειλημμένο στον ιστότοπό σας, διότι δεν έχει ιδέα τι περιέχει ο ιστότοπός σας — η μοναδικότητα που εγγυάται βρίσκεται μέσα στην ομάδα που έχετε μπροστά σας. Οι ανακατευθύνσεις είναι επίσης δική σας δουλειά. Η αλλαγή του slug μιας δημοσιευμένης σελίδας σπάει την παλιά της διεύθυνση, και αυτή είναι μια απόφαση για το CMS σας παρά για αυτό το εργαλείο. Η "Αποθήκευση σε αρχείο" γράφει απλό κείμενο, όχι CSV ή JSON. Ο αυτόματος διαχωρισμός κάνει μια κρίση σχετικά με τα κόμματα που είναι σωστή σε σχεδόν κάθε περίπτωση, αλλά όχι σε όλες. Αυτός ακριβώς είναι ο λόγος για τον οποίο το "Διαχωρισμός με" σας επιτρέπει να το παρακάμψετε. Και η μεταγραφή είναι μια σύμβαση παρά μετάφραση — το München γίνεται muenchen, όχι Munich — οπότε όταν μια σελίδα έχει ένα καθιερωμένο όνομα στη γλώσσα προορισμού, αυτό το όνομα είναι καλύτερο slug από οποιαδήποτε αυτόματη μετατροπή του πρωτοτύπου.