diff --git a/src/main/java/ui/PreviewPanel.java b/src/main/java/ui/PreviewPanel.java index c7321f8..54b0349 100644 --- a/src/main/java/ui/PreviewPanel.java +++ b/src/main/java/ui/PreviewPanel.java @@ -184,6 +184,18 @@ public PreviewPanel() { if (newState == Worker.State.SCHEDULED) { String location = webView.getEngine().getLocation(); if (location != null && !location.isEmpty() && !location.equals("about:blank")) { + // Ancre interne (#fragment) : défiler vers l'élément sans recharger la page + if (location.contains("#")) { + String fragment = location.substring(location.indexOf('#') + 1); + if (!fragment.isEmpty()) { + webView.getEngine().getLoadWorker().cancel(); + webView.getEngine().executeScript( + "var el = document.getElementById('" + fragment.replace("'", "\\'") + "');" + + "if (el) el.scrollIntoView({behavior: 'smooth', block: 'start'});" + ); + } + return; + } // Vérifier si c'est un lien vers un fichier .md if (location.toLowerCase().endsWith(".md") || location.toLowerCase().endsWith(".markdown")) { // Annuler la navigation @@ -267,6 +279,9 @@ private void updatePreview(String markdown, boolean addToHistory) { String html = htmlRenderer.render(markdownParser.parse(body)); + // ── IDs sur les titres : nécessaires pour la navigation par ancres (#fragment) + html = processHeadingIds(html); + // ── Checkboxes : convertir [ ] et [x] en éléments checkbox HTML html = processCheckboxes(html); @@ -527,6 +542,40 @@ private String loadResourceAsString(String resourcePath) { }); } + /** + * Injecte un attribut {@code id} GitHub-compatible sur chaque titre HTML ({@code