- // ==UserScript==
- // @name Mydealz Enhanced Comment Editor
- // @namespace mydealz-enhanced-editor
- // @version 1.3
- // @description Erweitert den Kommentar-Editor um zusätzliche Formatierungsoptionen
- // @match https://www.mydealz.de/*
- // @exclude https://www.mydealz.de/*/edit*
- // @exclude https://www.mydealz.de/*/add*
- // @grant none
- // @license MIT
- // ==/UserScript==
-
- (function() {
- 'use strict';
-
- function waitForEditor() {
- const observer = new MutationObserver((mutations) => {
- mutations.forEach((mutation) => {
- const editors = document.querySelectorAll('.tools-wrapper .toolbar');
- editors.forEach(editor => {
- if (!editor.dataset.enhanced) {
- enhanceEditor(editor);
- editor.dataset.enhanced = 'true';
- }
- });
- });
- });
-
- observer.observe(document, {
- childList: true,
- subtree: true
- });
- }
-
- function zitieren() {
- const p = document.querySelector('[parentcommentid]');
- if (!p) {
- alert('Erst auf "Antworten" klicken\ndann den Zitieren-Button nutzen');
- return;
- }
-
- const i = p.getAttribute('parentcommentid');
- if (!i) {
- alert('Keine gültige Kommentar ID');
- return;
- }
-
- fetch("https://www.mydealz.de/graphql", {
- method: 'POST',
- headers: {'Content-Type': 'application/json'},
- body: JSON.stringify({
- query: 'query comment($id:ID!){comment(id:$id){preparedHtmlContent createdAt createdAtTs}}',
- variables: {id: i}
- })
- })
- .then(r => r.json())
- .then(d => {
- let html = d.data.comment.preparedHtmlContent;
- let imgCount = 1;
- html = html.replace(/<img[^>]+src="([^"]+)"[^>]*>/g, (match,src) => {
- if (!src.includes('.jpg') || !src.split('/').pop().includes('_')) {
- const newName = `${i}_${imgCount}`;
- const newSrc = src.replace(/\/([^\/]+)\.jpg/, `/${newName}.jpg`)
- .replace(/\/([^\/]+)\/fs\//, `/${newName}/fs/`);
- imgCount++;
- return match.replace(src, newSrc);
- }
- return match;
- });
-
- const t = document.querySelector('textarea[parentcommentid]');
- const e = document.querySelector('.redactor-editor[placeholder^="Antworten"]');
- if (t && e) {
- t.value = html;
- e.innerHTML = html;
- console.log('Inhalt eingefügt');
- } else {
- alert('Editor nicht gefunden');
- }
- })
- .catch(e => alert("Fehler: " + e.message));
- }
-
- function enhanceEditor(toolbar) {
- const buttonContainer = document.createElement('div');
- buttonContainer.className = 'gap--all-1';
- buttonContainer.style.display = 'flex';
- buttonContainer.style.alignItems = 'center';
-
- // Zitieren-Button zuerst hinzufügen
- const zitierButton = document.createElement('button');
- zitierButton.type = 'button';
- zitierButton.className = 'button button--type-tag button--mode-light button--square';
- zitierButton.title = 'Originaltext zitieren';
- zitierButton.style.minWidth = '36px';
- zitierButton.style.height = '36px';
- zitierButton.style.padding = '0 4px';
- zitierButton.style.marginRight = '0px';
-
- const labelSpan = document.createElement('span');
- labelSpan.innerHTML = 'Z';
- labelSpan.style.fontSize = '18px';
- labelSpan.style.lineHeight = '1';
-
- zitierButton.appendChild(labelSpan);
- zitierButton.addEventListener('click', zitieren);
- buttonContainer.appendChild(zitierButton);
-
- // Restliche Buttons danach hinzufügen
- addButton(buttonContainer, "bold", "Fett Ctrl+B", "B",
- {module: "inline", fn: "format", args: ["strong"]});
- addButton(buttonContainer, "strike", "Durchgestrichen", "S",
- {module: "inline", fn: "format", args: ["del"]});
- addButton(buttonContainer, "italic", "Kursiv Ctrl+I", "I",
- {module: "inline", fn: "format", args: ["em"]});
- addButton(buttonContainer, "bullet-list", "Liste Ctrl+Shift+8", "•",
- {module: "list", fn: "toggle", args: ["unorderedlist"]});
- addButton(buttonContainer, "line", "Trennlinie", "-",
- {module: "line", fn: "insert", args: null});
-
- const sendButton = toolbar.querySelector('button[disabled]');
- toolbar.insertBefore(buttonContainer, sendButton);
- }
-
-
- function addButton(container, icon, title, label, handler) {
- const button = document.createElement('button');
- button.type = 'button';
- button.className = 'button button--type-tag button--mode-light button--square';
- button.title = title;
- button.style.minWidth = '36px';
- button.style.height = '36px';
- button.style.padding = '0 4px';
- button.style.marginRight = '0px';
-
- const labelSpan = document.createElement('span');
- labelSpan.innerHTML = label;
- labelSpan.style.fontSize = '18px';
- labelSpan.style.lineHeight = '1';
-
- if (handler) {
- button.setAttribute('data-handler', 'wysiwyg-button popover-close');
- button.setAttribute('data-wysiwyg-button', JSON.stringify(handler));
- }
-
- button.appendChild(labelSpan);
- container.appendChild(button);
- }
-
- if (document.readyState === 'loading') {
- document.addEventListener('DOMContentLoaded', waitForEditor);
- } else {
- waitForEditor();
- }
- })();