NOTE: Apart from
(and even then it's questionable, I'm Scottish). These are machine translated in languages I don't read. If they're terrible please contact me.
You can see how this translation was done in this article.
Saturday, 28 September 2024
//Less than a minute
Σε αυτό το site χρησιμοποιώ το Hightlight.js για να μετατρέψω την πλευρά του πελάτη με κώδικα snippets. Μου αρέσει αυτό καθώς κρατάει τον κωδικό μου καθαρό και απλό. Ωστόσο, ήθελα να προσθέσω ένα κουμπί αντιγραφής σε κάθε κώδικα ώστε οι χρήστες να μπορούν εύκολα να αντιγράψουν τον κώδικα στο πρόχειρό τους. Αυτό είναι ένα απλό έργο, αλλά σκέφτηκα να το καταγράψω εδώ για οποιονδήποτε άλλο που θα ήθελε να κάνει το ίδιο.
Το τελικό σημείο είναι ότι έχουμε ένα κουμπί αντιγραφής όπως αυτό στο site:
ΣΗΜΕΙΩΣΗ: Όλες οι πιστώσεις για αυτό το άρθρο πηγαίνει σε Faraz Patankar Ποιος είναι το άρθρο που συνήθιζα να το φτιάχνω αυτό; Απλά ήθελα να καταγράψω τις αλλαγές που έκανα εδώ για τη δική μου αναφορά και να μοιραστώ με άλλους.
Υπάρχουν κάποιοι τρόποι για να το κάνουμε αυτό. πρόσθετο κουμπί αντιγραφήςName για Higlight.js αλλά αποφάσισα ότι ήθελα περισσότερο έλεγχο πάνω στο κουμπί και το styling. Οπότε συνάντησα τον εαυτό μου. το παρόν άρθρο για την προσθήκη ενός αντιτύπου.
Ενώ αυτό το άρθρο είναι μια μεγάλη προσέγγιση είχε ένα ζευγάρι των ζητημάτων που σταμάτησε να είναι τέλειο για μένα:
// Lucide copy icon
copyButton.innerHTML = `<svg class="h-4 w-4" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-copy"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg>`;
Ενώ αυτό λειτουργεί, χρησιμοποιώ ήδη BoxIcons σε αυτό το site που έχει Αντιγραφή εικονιδίου ήδη εκεί μέσα.
// Notify user that the content has been copied
toast.success("Copied to clipboard", {
description: "The code block content has been copied to the clipboard.",
});
Αυτό το plugin αγκυροβολεί στο after:highlightElement
event και προσθέτει ένα κουμπί στο μπλοκ κώδικα.
Έτσι, πρώτα αντέγραψα τον κώδικα του Faraz και στη συνέχεια έκανα τις ακόλουθες αλλαγές:
text-xl
.showToast
λειτουργία που έχω στο site μου (δείτε αργότερα)aria-label
και title
στο κουμπί για την προσβασιμότητα (και να δώσει ένα ωραίο hover εφέ).hljs.addPlugin({
"after:highlightElement": ({ el, text }) => {
const wrapper = el.parentElement;
if (wrapper == null) {
return;
}
/**
* Make the parent relative so we can absolutely
* position the copy button
*/
wrapper.classList.add("relative");
const copyButton = document.createElement("button");
copyButton.classList.add(
"absolute",
"top-2",
"right-1",
"p-2",
"text-gray-500",
"hover:text-gray-700",
"bx",
"bx-copy",
"text-xl",
"cursor-pointer"
);
copyButton.setAttribute("aria-label", "Copy code to clipboard");
copyButton.setAttribute("title", "Copy code to clipboard");
copyButton.onclick = () => {
navigator.clipboard.writeText(text);
// Notify user that the content has been copied
showToast("The code block content has been copied to the clipboard.", 3000, "success");
};
// Append the copy button to the wrapper
wrapper.prepend(copyButton);
},
});
showToast
ΛειτουργίαΑυτό βασίζεται σε ένα μερικό ξυράφι που πρόσθεσα στο έργο μου. Αυτή η μερική χρήση του Συστατικό τοστ DaisyUI για να δείξετε ένα μήνυμα στον χρήστη. Μου αρέσει αυτή η προσέγγιση καθώς διατηρεί το Javascript καθαρό και απλό και μου επιτρέπει να στυλ το μήνυμα πρόποση με τον ίδιο τρόπο με το υπόλοιπο site.
<div id="toast" class="toast toast-bottom fixed z-50 hidden overflow-y-hidden">
<div id="toast-message" class="alert">
<div>
<span id="toast-text">Notification message</span>
</div>
</div>
<p class="hidden right-1 bx-copy cursor-pointer alert-success alert-warning alert-error alert-info"></p>
</div>
Θα παρατηρήσετε ότι αυτό έχει επίσης ένα περίεργο κρυμμένο p
ετικέτα στο κάτω μέρος, αυτό είναι μόνο για Tailwind να αναλύσετε αυτές τις τάξεις όταν χτίζει το CSS της ιστοσελίδας.
Η λειτουργία Javascript είναι απλή, απλά δείχνει το τοστ μήνυμα για ένα καθορισμένο χρόνο και στη συνέχεια το κρύβει και πάλι.
window.showToast = function(message, duration = 3000, type = 'success') {
const toast = document.getElementById('toast');
const toastText = document.getElementById('toast-text');
const toastMessage = document.getElementById('toast-message');
// Set message and type
toastText.innerText = message;
toastMessage.className = `alert alert-${type}`; // Change alert type (success, warning, error)
// Show the toast
toast.classList.remove('hidden');
// Hide the toast after specified duration
setTimeout(() => {
toast.classList.add('hidden');
}, duration);
}
Στη συνέχεια, μπορούμε να το ονομάσουμε με τη χρήση του showToast
λειτουργία στην copyButton.onclick
Γεγονός.
showToast("The code block content has been copied to the clipboard.", 3000, "success");
Πρόσθεσα αυτό το μερικό δεξιά στην κορυφή του μου _Layout.cshtml
αρχείο ώστε να είναι διαθέσιμο σε κάθε σελίδα.
<partial name="_Toast" />``
Τώρα όταν δείχνουμε αναρτήσεις στο blog οι μπλοκ κωδικών έχουν:
Αυτό ήταν, μια απλή αλλαγή στον κώδικα του Φαράζ για να δουλέψει για μένα. Ελπίζω αυτό να βοηθάει κάποιον άλλο εκεί έξω.