diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cbfd695..8272408 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,4 +31,4 @@ jobs: gh release create "$tag" \ --title="$tag" \ --draft \ - main.js manifest.json + main.js manifest.json styles.css diff --git a/main.js b/main.js index 97f47bc..40e0287 100644 --- a/main.js +++ b/main.js @@ -6,11 +6,14 @@ module.exports = class MyPlugin extends Plugin { this.registerMarkdownPostProcessor((element, context) => { this.processNotes(element); }); + + // Charger les styles CSS depuis styles.css + this.addStylesheet("styles.css"); } // Fonction pour détecter et transformer les blocs de type ":::type[Titre]" dans le markdown processNotes(element) { - if (!element || !element.innerHTML) return; + if (!element) return; const types = [ "note", @@ -30,161 +33,56 @@ module.exports = class MyPlugin extends Plugin { ]; types.forEach((type) => { - // Recherche des blocs personnalisés :::type[Titre] + // Parcourir les enfants de l'élément pour trouver les blocs correspondants const regex = new RegExp(`:::${type}\\[([^\\]]+)\\]([\\s\\S]*?):::`, "g"); - element.innerHTML = element.innerHTML.replace( - regex, - (match, title, content) => { - return this.createBox(type, title, content); + + Array.from(element.childNodes).forEach((child) => { + if (child.nodeType === Node.TEXT_NODE) { + const matches = [...child.textContent.matchAll(regex)]; + if (matches.length > 0) { + const fragment = document.createDocumentFragment(); + + matches.forEach((match) => { + const [fullMatch, title, content] = match; + + // Créer un élément DOM pour la boîte + const boxElement = this.createBoxElement(type, title, content); + + // Ajouter la boîte au fragment + fragment.appendChild(boxElement); + + // Supprimer le texte correspondant au match + child.textContent = child.textContent.replace(fullMatch, ""); + }); + + // Insérer les nouvelles boîtes avant le nœud textuel actuel + element.insertBefore(fragment, child); + } } - ); + }); }); } - // Fonction pour générer le HTML des boîtes stylisées - createBox(type, title, content) { - // Remplacer les sauts de ligne par des balises
pour préserver le formatage - const formattedContent = content.trim().replace(/\n/g, "
"); - return ` -
-
${title}
-
${formattedContent}
-
- `; + // Fonction pour créer dynamiquement un élément DOM pour la boîte stylisée + createBoxElement(type, title, content) { + const section = document.createElement("section"); + section.classList.add("custom-box", type); + + const titleDiv = document.createElement("div"); + titleDiv.classList.add("box-title"); + titleDiv.textContent = title; + + const contentDiv = document.createElement("div"); + contentDiv.classList.add("box-content"); + content.split("\n").forEach((line) => { + const lineElement = document.createElement("p"); + lineElement.textContent = line; + contentDiv.appendChild(lineElement); + }); + + section.appendChild(titleDiv); + section.appendChild(contentDiv); + + return section; } }; - -// CSS à ajouter pour styliser les boîtes -const customBoxCSS = ` - .custom-box { - border-radius: 5px; - padding: 15px; - margin: 15px 0; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); - } - - .custom-box.note { - color: #000; - background-color: #fff; - border-left: 4px solid #d1d3c0; - border-top: 4px solid #d1d3c0; - } - - .custom-box.tip { - color: #000; - background-color: #e8f5e9; - border-left: 4px solid #66bb6a; - border-top: 4px solid #66bb6a; - } - - .custom-box.info { - color: #000; - background-color: #e3f2fd; - border-left: 4px solid #29b6f6; - border-top: 4px solid #29b6f6; - } - - .custom-box.warning { - color: #000; - background-color: #fff8e1; - border-left: 4px solid #ffa726; - border-top: 4px solid #ffa726; - } - - .custom-box.danger { - color: #000; - background-color: #ffebee; - border-left: 4px solid #ef5350; - border-top: 4px solid #ef5350; - } - - .custom-box.success { - color: #000; - background-color: #36ff00; - border-left: 4px solid #28a745; - border-top: 4px solid #28a745; - } - - .custom-box.error { - color: #fff; - background-color: #911a24; - border-left: 4px solid #e74c3c; - border-top: 4px solid #e74c3c; - } - - .custom-box.critical { - color: #fff; - background-color: #ff2300; - border-left: 4px solid #7b0f1c; - border-top: 4px solid #7b0f1c; - } - - .custom-box.debug { - color: #fff; - background-color: #486bbb; - border-left: 4px solid #b0bec5; - border-top: 4px solid #b0bec5; - } - - .custom-box.update { - color: #000; - background-color: #6eec66; - border-left: 4px solid #5ebf58; - border-top: 4px solid #5ebf58; - } - - .custom-box.question { - color: #000; - background-color: #f3ff00; - border-left: 4px solid #ffdc00; - border-top: 4px solid #ffdc00; - } - - .custom-box.announcement { - color: #000; - background-color: #ec00ff; - border-left: 4px solid #ec407a; - border-top: 4px solid #ec407a; - } - - .custom-box.progress { - color: #000; - background-color: #ede7f6; - border-left: 4px solid #7e57c2; - border-top: 4px solid #7e57c2; - } - - .custom-box.highlight { - color: #000; - background: linear-gradient(0deg, #f6ef5c 0%, #98ceff 100%); - border-left: 4px solid #ff9800; - border-top: 4px solid #ff9800; - } - - - - .box-title { - font-weight: bold; - margin-bottom: 10px; - position: relative; - padding-bottom: 5px; - } - - .box-title::after { - content: ''; - position: absolute; - left: 0; - bottom: 0; - width: 100%; - height: 2px; - background: linear-gradient(to right, #676860, transparent); - } - - .box-content { - margin-top: -30px; - line-height: 1.5; - } -`; - -// Insérer le style dans le document -document.head.insertAdjacentHTML("beforeend", ``); diff --git a/manifest.json b/manifest.json index dd360be..737ef33 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "wonderbox", "name": "WonderBox", - "version": "1.0.4", + "version": "1.0.5", "minAppVersion": "0.12.0", "description": "Create more relevant text sections your tips, top notes, warnings and more.", "author": "Christian Humbert", diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..b20c32f --- /dev/null +++ b/styles.css @@ -0,0 +1,126 @@ +.custom-box { + border-radius: 5px; + padding: 15px; + margin: 15px 0; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +.custom-box.note { + color: #000; + background-color: #fff; + border-left: 4px solid #d1d3c0; + border-top: 4px solid #d1d3c0; +} + +.custom-box.tip { + color: #000; + background-color: #e8f5e9; + border-left: 4px solid #66bb6a; + border-top: 4px solid #66bb6a; +} + +.custom-box.info { + color: #000; + background-color: #e3f2fd; + border-left: 4px solid #29b6f6; + border-top: 4px solid #29b6f6; +} + +.custom-box.warning { + color: #000; + background-color: #fff8e1; + border-left: 4px solid #ffa726; + border-top: 4px solid #ffa726; +} + +.custom-box.danger { + color: #000; + background-color: #ffebee; + border-left: 4px solid #ef5350; + border-top: 4px solid #ef5350; +} + +.custom-box.success { + color: #000; + background-color: #36ff00; + border-left: 4px solid #28a745; + border-top: 4px solid #28a745; +} + +.custom-box.error { + color: #fff; + background-color: #911a24; + border-left: 4px solid #e74c3c; + border-top: 4px solid #e74c3c; +} + +.custom-box.critical { + color: #fff; + background-color: #ff2300; + border-left: 4px solid #7b0f1c; + border-top: 4px solid #7b0f1c; +} + +.custom-box.debug { + color: #fff; + background-color: #486bbb; + border-left: 4px solid #b0bec5; + border-top: 4px solid #b0bec5; +} + +.custom-box.update { + color: #000; + background-color: #6eec66; + border-left: 4px solid #5ebf58; + border-top: 4px solid #5ebf58; +} + +.custom-box.question { + color: #000; + background-color: #f3ff00; + border-left: 4px solid #ffdc00; + border-top: 4px solid #ffdc00; +} + +.custom-box.announcement { + color: #000; + background-color: #ec00ff; + border-left: 4px solid #ec407a; + border-top: 4px solid #ec407a; +} + +.custom-box.progress { + color: #000; + background-color: #ede7f6; + border-left: 4px solid #7e57c2; + border-top: 4px solid #7e57c2; +} + +.custom-box.highlight { + color: #000; + background: linear-gradient(0deg, #f6ef5c 0%, #98ceff 100%); + border-left: 4px solid #ff9800; + border-top: 4px solid #ff9800; +} + +.box-title { + font-weight: bold; + margin-bottom: 10px; + position: relative; + padding-bottom: 5px; +} + +.box-title::after { + content: ""; + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 2px; + background: linear-gradient(to right, #676860, transparent); +} + +.box-content { + margin-top: -30px; + line-height: 1.5; +}