Pour autant que je sache, la gestion de la création et de la mise à jour des liens est un peu répartie dans les sources de Quill. Le thème Snow par défaut gère l'édition des liens dans une certaine mesure : il suit la sélection de l'utilisateur et le dernier lien sélectionné en interne. Pour cette raison, je ne pense pas qu'il soit possible de réaliser ce que vous voulez actuellement dans Quill en utilisant uniquement un gestionnaire personnalisé.
Vous pouvez ouvrir un dossier pour signaler ce problème, les auteurs pourraient être disposés à ajouter un tel gestionnaire.
En attendant, j'ai trouvé un moyen de mettre à jour le lien en écoutant simplement les événements qui provoquent la fermeture de l'infobulle d'édition. Il y a quelques complications, parce qu'un lien peut être édité et le thème se fie alors à son suivi interne pour le mettre à jour. Cependant, dans l'ensemble, je pense que cette solution n'est pas trop mauvaise. Vous voudrez peut-être ajouter un contrôle d'erreur ici et là, mais dans l'ensemble elle semble fonctionner correctement et faire ce que vous voulez qu'elle fasse. J'ai créé un fichier Violon démontrant ceci. Par souci d'exhaustivité, je l'ai également inclus ici sous la forme d'un extrait de code.
var quill = new Quill('#editor', {
modules: {
toolbar: true
},
theme: 'snow'
}),
editor = document.getElementById('editor'),
lastLinkRange = null;
/**
* Add protocol to link if it is missing. Considers the current selection in Quill.
*/
function updateLink() {
var selection = quill.getSelection(),
selectionChanged = false;
if (selection === null) {
var tooltip = quill.theme.tooltip;
if (tooltip.hasOwnProperty('linkRange')) {
// user started to edit a link
lastLinkRange = tooltip.linkRange;
return;
} else {
// user finished editing a link
var format = quill.getFormat(lastLinkRange),
link = format.link;
quill.setSelection(lastLinkRange.index, lastLinkRange.length, 'silent');
selectionChanged = true;
}
} else {
var format = quill.getFormat();
if (!format.hasOwnProperty('link')) {
return; // not a link after all
}
var link = format.link;
}
// add protocol if not there yet
if (!/^https?:/.test(link)) {
link = 'http:' + link;
quill.format('link', link);
// reset selection if we changed it
if (selectionChanged) {
if (selection === null) {
quill.setSelection(selection, 0, 'silent');
} else {
quill.setSelection(selection.index, selection.length, 'silent');
}
}
}
}
// listen for clicking 'save' button
editor.addEventListener('click', function(event) {
// only respond to clicks on link save action
if (event.target === editor.querySelector('.ql-tooltip[data-mode="link"] .ql-action')) {
updateLink();
}
});
// listen for 'enter' button to save URL
editor.addEventListener('keydown', function(event) {
// only respond to clicks on link save action
var key = (event.which || event.keyCode);
if (key === 13 && event.target === editor.querySelector('.ql-tooltip[data-mode="link"] input')) {
updateLink();
}
});
<link href="https://cdn.quilljs.com/1.1.10/quill.snow.css" rel="stylesheet" />
<script src="https://cdn.quilljs.com/1.1.10/quill.min.js"></script>
<div id="editor"></div>
N'hésitez pas à me contacter si vous avez des questions.