1. Nachrichten
  2. Forum
    1. Unerledigte Themen
    2. Forenregeln
  3. Spenden
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. camp-firefox.de
  2. Speravir

Beiträge von Speravir

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 20. Januar 2025 um 01:12

    Endor:

    Ein weiteres Skript, von dem ich bei dir nur die uralte XUL-Version finde, bei Mithrandir/Ardiman aber die erste JS-Version, die inzwischen mehrfach angepasst werden musste. Damit kann man Javascript schnell de-/aktivieren:

    JavaScript
    // JsOff.uc.js
    (function() {
    if (!window.gBrowser) return;
    const
        buttonID = 'toolbar-button-js',
        configPref = 'javascript.enabled',
        labelText = 'Javascript ein-/ausschalten',
        tooltipOn = 'Javascript ist eingeschaltet',
        tooltipOff = 'Javascript ist ausgeschaltet',
        css =
    `#${buttonID}[tooltiptext="${tooltipOn}"] {list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAARVBMVEUAAAAKmAAJiAALqAAIeACG/zd6/zMAVAEMugAARgEHZgATQAADJgBS/gARvgA+zgABEAAofAAXxgA1sAAANgFb/xUMrACNps2gAAAAfUlEQVR4XmXOVwrEMAxF0afmmjZ1/0sdSYQhkAsG+0gfxj1mJhKPhJgdtNbLNE4V2BnIgRyAaTaBBCaR9kWMRQKIpG3PgK3JfyOhnRuLt12AsX7QAvydEHeFlYD8GFabeNh+ENWEA3ux8kIn7hrwXuAdnXtPGENVOVMduPUDmGIDcIkU2P8AAAAASUVORK5CYII=");}
    #${buttonID}[tooltiptext="${tooltipOff}"] {list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAY1BMVEUAAAD/RDf/HxX/U0f/0dH/LyX8CwD/Rz/MBADsCgD/y8v/vb0gAgD/aWn/MTH/Jx2kAACYAwD/FgtYBABdExP/nZ3/W0+KBgB6AgD/iYlpFRW0JCReBAA8AQDABADwEAAwAQBzWTWpAAAAiElEQVR4XmXMR5bDUAhE0Sr4QTk7h+79r9Ig2ZroDe8pwLEkkb+iGMhQYK93KIjwDZ1BNACWEBYAdGBW9RGYuQGpZwfVvC90BdKhf77meQUq/angdEJ2yNtiQhWQEGo/iQYJt3DHI7QNu7c4/KOtq7rHhXFMBuX1BasZZRhXKP6SJSJTSmWJQx/pFASUD6QxIwAAAABJRU5ErkJggg==");}`;
    try {
            CustomizableUI.createWidget({
                id: buttonID,
                type: 'custom',
                defaultArea: CustomizableUI.AREA_NAVBAR,
                onBuild: function(aDocument) {
                        let button = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
                        let attributes = {
                            id: buttonID,
                            class: 'toolbarbutton-1 chromeclass-toolbar-additional',
                            removable: 'true',
                            label: labelText,
                            tooltiptext: Services.prefs.getBoolPref(configPref) ? tooltipOn : tooltipOff,
                        };
                        for (let a in attributes) button.setAttribute(a, attributes[a]);
                        button.addEventListener('click', () => { if(event.button === 0) {
                            let isEnabled = !Services.prefs.getBoolPref(configPref);
                            Services.prefs.setBoolPref(configPref, isEnabled);
                            let windows = Services.wm.getEnumerator('navigator:browser');
                            while (windows.hasMoreElements()) {
                                    let button = windows.getNext().document.getElementById(buttonID);
                                    if (isEnabled) { button.setAttribute('tooltiptext', tooltipOn) }
                                    else { button.setAttribute('tooltiptext', tooltipOff) };
                            };
                        }});
                        return button;
                }
            });
    } catch(e) { };
    let stylesheet = document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"');
    document.insertBefore(stylesheet, document.documentElement);
    })();
    Alles anzeigen

    Beachte, dass ich alles, was man konfigurieren könnte, nach vorn gesetzt und Variablen zugewiesen habe. Nach demselben Muster habe ich auch andere Skripte geändert und würde dafür plädieren, das möglichst oft zu tun.

  • UserCSSLoader (Anfang 2025)

    • Speravir
    • 19. Januar 2025 um 01:08
    Zitat von Sören Hentzschel

    Also eigentlich sollte es dadurch leichter lesbar werden

    Wie gesagt, für mich nicht. Aber wir müssen das nicht weiter ausführen.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 19. Januar 2025 um 01:05
    Zitat von lenny2

    Die optimale Variante von UndoListInTabmenuToo.uc.js sieht für mich so aus.

    (etc.) Kannst Du das bitte selbst bei GitHub eintragen oder hier auf Englisch noch einmal aufschreiben? Ich würde im letzteren Fall dann darauf verweisen.

    Zitat von lenny2

    - Die Breite der Dropdown-Liste der geschlossenen Tabs muss vergrößert werden, sie ist 3-4cm kleiner als bei der „Undo Cloae Tab 8.0.0“-Erweiterung und das ist unbequem.

    Ich halte es nicht für zu schmal, bei mir werden etwa 60 Zeichen angezeigt (schwankt, weil keine Festbreitenschrift).

    Zitat von Mira_Belle

    Wer sich das Skript anschauen möchte:

    Such darin nach \u00FC und ersetze es durch ü sowie nach \u00F6 und ersetze dies durch ö (gibts jeweils 2x) – im Skript sind jetzt schon Umlaute enthalten., so dass die Kodierung keinen Vorteil bringt.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 18. Januar 2025 um 01:46
    Zitat von Mira_Belle

    Damit ich besser vergleichen kann, wärst Du so nett und verlinkst die Beiträge?
    Jene ohne Übersetzungsschwächen (bzw. ohne Fehler). Bitte, Danke.

    Upps. OK, bei der Menge der Antworten kann man den Überblick verlieren. Und ich glaube, mir geht das selbst so:

    • Version 1 : 15. Januar 2025 um 23:04
    • Version 2: 16. Januar 2025 um 10:29

    V. 1 scheint mir die bessere zu sein, obwohl Du sie anscheinend zuerst gepostet hast. ( Endor bitte mal abgleichen.)

    Ich hatte weiter oben geschrieben, dass jemand Alice informieren sollte. Der jemand war jetzt ich:

    Error with UndoListInTabmenuToo.uc.js · Issue #91 · alice0775/userChrome.js

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 17. Januar 2025 um 01:31

    Endor & Horstmann:

    In meiner vorigen Antwort war mir nicht genau bewusst, womit ihr Probleme habt. Das ist mir erst später klar geworden. Nehmen wir das Beispiel Browsertools-Button, ich beziehe mich auf die am 7. Juni 2023 gepostete Version (als browsertoolbox.uc.js):

    Wir finden dort ab Zeile 22 ein einer Variable zugeordnetes Objekt (gekürzt um die hier nicht relevanten Teile):

    JavaScript
                    var props = {
                        // Kürzung
                        style: 'list-style-image: url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '");',
    
                        oncommand: '(' + onCommand.toString() + ')()'
                    };
                    for (var p in props)
                        toolbaritem.setAttribute(p, props[p]);
                    return toolbaritem;

    sowie ab Z. 39 die eigentliche Funktion:

    JavaScript
        function onCommand() {
            var document = event.target.ownerDocument;
            if (!document.getElementById('menu_browserToolbox')) {
                let { require } = ChromeUtils.importESModule("resource://devtools/shared/loader/Loader.sys.mjs", {});
                require("devtools/client/framework/devtools-browser");
            };
            document.getElementById('menu_browserToolbox').click();
        };

    Das kann man nun unter Entfernung oder auch unter Erhalt der eigenen Funktion zu einem addEventListener umbauen:

    a) Entfernung, im Prinzip wie in meiner vorherigen Antwort (die Einrückung stimmt jetzt nicht mehr, weil ich alles nur kopiert habe)

    JavaScript
                    let props = {
                        // Kürzung
                        style: 'list-style-image: url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '");'
                    };
                    for (let p in props)
                        toolbaritem.setAttribute(p, props[p]);
    
                        toolbaritem.addEventListener('click',() => {
            let document = event.target.ownerDocument;
            if (!document.getElementById('menu_browserToolbox')) {
                let { require } = ChromeUtils.importESModule("resource://devtools/shared/loader/Loader.sys.mjs", {});
                require("devtools/client/framework/devtools-browser");
            };
            document.getElementById('menu_browserToolbox').click();
        });
    
                    return toolbaritem;
    Alles anzeigen

    b) die Funktion wird gar nicht angerührt (wobei, wie Horstmann selber schreibt, ein anderer Funktionsname deutlich besser wäre, openBox oder so):

    JavaScript
                    let props = {
                        // Kürzung
                        style: 'list-style-image: url("' + ("file:" + currentProfileDirectory + "/chrome/icons/" + buttonicon) + '");'
                    };
                    for (let p in props)
                        toolbaritem.setAttribute(p, props[p]);
    
                        toolbaritem.addEventListener('click', () => { onCommand() });
    
                    return toolbaritem;
    
    // weiterer Code
    
        function onCommand() {
        // Funktionscode
        };
    Alles anzeigen

    Ich bin selbst nicht darauf gekommen, aber Mitleser hat das so in seinem DeepL-Skript benutzt, vergleiche Posting vom 12. Januar 2025, dort mit der zusätzlichen Verbesserung, dass der Code nur bei Klick mit der linken Maustaste ausgeführt werden soll (zusätzliches if (event.button == 0) {…} um den Funktionsaufruf, beachtet dazu Sörens Hinweis: drei Gleichheitszeichen wären besser).

    Beachtet auch, dass in beiden Variationen am Ende von Zeile 24 (style: …) ein Komma entfernt werden musste. Und ich habe var in let geändert.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 17. Januar 2025 um 00:43
    Zitat von Sören Hentzschel

    Dann ist das ja logisch.

    Schon in Ordnung.

    Zitat von Mira_Belle

    da beziehst Du Dich aber auf eine Version, die längst überholt ist.

    Wie Sören dir bereits geantwortet hat: Nöö. Ich hatte durchaus bemerkt, dass Du ein geändertes Skript gepostet hast, es aber nicht heruntergeladen. Edit: Jetzt aber doch. Welche der zwei Versionen ist die neuere? Die zuletzt gepostete enthält jedenfalls viele Rechtschreibfehler und Übersetzungsschwächen (wenn man nicht sogar Fehler), die in der zuerst geposteten ausgemerzt wurden.

  • UserCSSLoader (Anfang 2025)

    • Speravir
    • 17. Januar 2025 um 00:10
    Zitat von Sören Hentzschel

    Das & kann in den Zeilen 7, 8 und 19 entfernt werden.

    Ja, danke. Ich weiß das (dank dir, Du hattest schon einmal darauf hingewiesen). Ich finde es aber ohne das & viel schwerer lesbar, vor allem, wenn die Regeln umfangreicher werden, und werde es für mich deshalb beibehalten.

  • UserCSSLoader (Anfang 2025)

    • Speravir
    • 16. Januar 2025 um 01:15

    Vorab: Ich beziehe mich auf diese Version von 2023 bei Endor (genauer: Revision 7947b7d), deshalb Ping Endor.

    Zunächst das Einfache: Wenn man sich wie ich den Loader als frei verschiebbare Schaltfläche anzeigen lässt (Einstellung let position = 0;, dann kann man sich per CSS ein Symbol einrichten (ob das auch als festes Menü möglich ist, habe ich nicht ausprobiert):

    CSS
    /* Symbol für den UserCSSLoader, eigentlich ein Menü */
    #usercssloader-menu {
        background-image: url("./images/CSS.png") !important;
        background-position: center !important;
        background-repeat: no-repeat !important;
        background-size: 16px !important;
        & > :is(.menu-accel-container,.menu-right) { display: none !important }
        & > .menu-text[value="CSS"] { opacity: 0 !important }
    }

    Das bedeutet, dass die Symboldatei CSS.png (siehe in CSS.zip) in einem Unterordner images des Ordners liegt, in dem sich die Stildatei befindet. Das Symbol habe ich von dieser Datei abgeleitet: File:CSS text representation (short).png (Wikimedia Commons). Beachte, dass der ursprüngliche Autor (das bin nicht ich) die Datei unter eine CC-Lizenz gesetzt hat. Ich bin aber der Überzeugung, dass für diese Datei die Schöpfungshöhe viel zu gering ist, was gewöhnlich in Wikimedia Commons mit der Vorlage Template:PD-textlogo markiert wird.

    Ich habe mir zusätzlich die folgende Stilregel in gleich zwei Stildateien geschrieben, die hier im UserCSSLoader eher nicht zeitgleich deaktiviert werden:

    CSS
    /* Check mark (x) für den UserCSSLoader */
    #usercssloader-menu menuitem[checked="false"] {
        &::before {
            content: "\274C";
            display: block;
            width: 16px;
            height: 16px;
        }
        & .menu-iconic-text { padding-inline-start: 8px !important }
    }

    \274C steht für das Zeichen ❌ (in Unicode als CROSS MARK bezeichnet).


    Nun zum eigentlichen Skriptinhalt:

    Zuerst eine Frage:
    Funktioniert bei Euch der Konfigparameter filemanagerParam? Bei mir nämlich nicht. Ich lasse stattdessen als filemanager eine Verknüpfung aufrufen, in der die Parameter enthalten sind. (In Linux und MacOS würde man wohl ein Shellscript nehmen).

    Zweitens:
    Die Tastenkombinationen sollten überarbeitet werden: Manche sind eher ungewöhnlich, manche sind doppelt (ich selbst habe sie auskommentiert). Ein paar Vorschläge wären gut. Und wieso gibt es nur für einen der Menüeinträge den entsprechenden Hinweistext (acceltext im Skript)?

    Von mir:
    * Alt+C zum Öffnen des Menüs funktioniert nicht, weil damit das Standardmenü für die Historie (Chronik) geöffnet wird.
    * Styles importieren: I statt R.
    * CSS-Datei erstellen: E statt D. Alt+D öffnet das Standard-Dateimenü.
    * Chrome-Ordner öffnen, vielleicht K statt O?

    Drittens:
    Die Skriptsammlung userstyles.org ist schon länger nicht mehr erreichbar, so dass der entsprechende Menüeintrag und die Funktion, die von diesem aufgerufen wird, entfernt werden können. Dasselbe trifft bei mir auf die Testfunktion sowie die beiden Menüeinträge zu, die diese aufrufen. Zusätzlich ist dann der vorherige Menüseparator nicht mehr nötig.

    Viertens:
    Hier nicht behandelt, aber das Skript muss wie viele andere auf Eventhandler umgestellt werden. Ich hab sie noch nicht getestet, aber BrokenHeart hat anscheinend eine dahingehend veränderte, funktionierende Version vorgestellt. (Edit: Upps, stimmt nicht.) In diese sollten die notwendigen Änderungen dann eingearbeitet werden. (Aha, Mira_Belle oder Endor – 15. Januar 2025, 15:29, oder das direkt folgende Posting um 15:58 Uhr).

    Nachtrag:
    Barbaras folgender Beitrag hat mich erinnert, dass ich vergessen habe, das um die entfernten Teile (Punkt 3) gekürzte Skript zu posten. Nicht geändert sind aber die Tastenkombinationen.

    JavaScript
    // ==UserScript==
    // @name           UserCSSLoader
    // @description    CSS-Codes - Styles laden und verwalten
    // @namespace      http://d.hatena.ne.jp/Griever/
    // @author         Griever
    // @include        main
    // @license        MIT License
    // @compatibility  Firefox 116*
    // @charset        UTF-8
    // @version        0.0.4K+
    // @note           Aktualisierung von Speravir - www.camp-firefox.de
    // @note           Fx92: getURLSpecFromFile() -> getURLSpecFromActualFile()
    // @note           AUTHOR_SHEET Verwendung hinzugefügt, wichtig: am Ende des Dateinamens .author.css
    // @note           Version 0.0.4.g ermoeglicht "Styles importieren" per Mittelklick und Verwendung
    // @note           eines anderen Dateimanager (siehe in Konfiguration)
    // @note           + ergänzt um einen Parameter für den Dateimanager (vFMParameter in der Konfiguration) von aborix
    // @note           Frei verschiebbare Schaltfläche eingebaut von aborix
    // @note           0.0.4 Remove E4X
    // @note           CSSEntry-Klasse erstellt
    // @note           Style-Test-Funktion überarbeitet
    // @note           Wenn die Datei gelöscht wurde, CSS beim Neu-Erstellen und Löschen des Menüs abbrechen
    // @note           uc einlesen .uc.css temporäre Korrespondenz zum erneuten Lesen
    // ==/UserScript==
    /****** Bedienungsanleitung ******
    CSS-Ordner im Chrome-Ordner erstellen, CSS-Dateien dort ablegen - speichern.
    Diejenigen, deren Dateiname mit "xul-" beginnen, diejenigen, die mit ".as.css" enden, sind AGENT_SHEET, 
    alle anderen außer USER_SHEET werden gelesen. Da der Inhalt der Datei nicht überprüft wird,
    darauf achten, @ Namespace Angabe nicht zu vergessen!
    CSS-Menü wird zur Menüleiste hinzugefügt
    Linksklick auf Stil, zum aktivieren/deaktivieren
    Mittelklick auf Stil zum aktivieren/deaktivieren, ohne Menü zu schließen
    Rechtsklick auf Stil zum Öffnen im Editor
    Strg+Linksklick zum Anzegen im Dateimanager
    Verwenden des in "view_source.editor.path" angegebenen Editors
    Dateiordner kann in Konfiguration geändert werden
    **** Anleitung Ende ****/
    (function(){
    /* Konfiguration */
    // Position: als Menü anzeigen = 1, als frei verschiebbare-Schaltfläche = 0
    let position = 1;
    // alternativer Dateimanager, Bsp.:
    // let filemanager = "C:\\Programme\\totalcmd\\TOTALCMD.EXE";
    let filemanager = PathUtils.join(PathUtils.profileDir, "chrome", "Totalcommander.lnk");
    // eventuelle Parameter für den alternativen Dateimanager, sonst filemanagerParam = "";
    //let filemanagerParam = "/O /A /T";
    let filemanagerParam = "";
    // Unterordner für die CSS-Dateien:
    let cssFolder = "CSS";
    // zusätzlich Chrome-Ordner im Untermenü anzeigen: 1 = ja, 0 = nein
    let showChrome = 1;
    /* Ende Konfiguration */
    
    let { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
    // Wenn beim Start ein anderes Fenster angezeigt wird (das zweite Fenster), wird es beendet
    let list = Services.wm.getEnumerator("navigator:browser");
    while(list.hasMoreElements()){ if(list.getNext() != window) return; }
    const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
    if (window.UCL) {
        window.UCL.destroy();
        delete window.UCL;
    }
    window.UCL = {
        vFileManager: filemanager,
        vFMParameter: filemanagerParam,
        USE_UC: "UC" in window,
        AGENT_SHEET: Ci.nsIStyleSheetService.AGENT_SHEET,
        USER_SHEET : Ci.nsIStyleSheetService.USER_SHEET,
        AUTHOR_SHEET: Ci.nsIStyleSheetService.AUTHOR_SHEET,
        readCSS : {},
        get disabled_list() {
            let obj = [];
            try {
                    obj = this.prefs.getCharPref("disabled_list").split("|");
            } catch(e) {}
            delete this.disabled_list;
            return this.disabled_list = obj;
        },
        get prefs() {
                delete this.prefs;
                return this.prefs = Services.prefs.getBranch("UserCSSLoader.")
        },
        get styleSheetServices(){
                delete this.styleSheetServices;
                return this.styleSheetServices = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
        },
        get FOLDER() {
            let aFolder;
            try {
                // UserCSSLoader.FOLDER verwenden
                let folderPath = this.prefs.getCharPref("FOLDER");
                aFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile)
                aFolder.initWithPath(folderPath);
            } catch (e) {
                aFolder = Services.dirsvc.get("UChrm", Ci.nsIFile);
                aFolder.appendRelativePath(cssFolder);
            }
            if (!aFolder.exists() || !aFolder.isDirectory()) {
                aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664);
            }
            delete this.FOLDER;
            return this.FOLDER = aFolder;
        },
        get CHRMFOLDER() {
            let bFolder;
            try {
                // UserCSSLoader.CHRMFOLDER verwenden
                let CHRMfolderPath = this.prefs.getCharPref("CHRMFOLDER");
                bFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile)
                bFolder.initWithPath(CHRMfolderPath);
            } catch (e) {
                bFolder = Services.dirsvc.get("UChrm", Ci.nsIFile);
            }
            if (!bFolder.exists() || !bFolder.isDirectory()) {
                bFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664);
            }
            delete this.CHRMFOLDER;
            return this.CHRMFOLDER = bFolder;
        },
        getFocusedWindow: function() {
            let win = document.commandDispatcher.focusedWindow;
            if (!win || win == window) win = content;
            return win;
        },
        init: function() {
            let cssmenu = $C("menu", {
                id: "usercssloader-menu",
                label: "CSS",
                tooltiptext: "UserCSSLoader\n\nLinksklick: Stylesheets anzeigen\nMittelklick: Styles importieren",
                accesskey: "C",
                onclick: "if (event.button == 1) UCL.rebuild()"
            });
            let menupopup = $C("menupopup", {
                id: "usercssloader-menupopup"
            });
            cssmenu.appendChild(menupopup);
            let menu = $C("menu", {
                label: "Style-Loader-Menü",
                id: "style-loader-menu",
                accesskey: "M"
            });
            menupopup.appendChild(menu);
            menupopup.appendChild($C("menuseparator"));
            
            let mp = $C("menupopup", { id: "usercssloader-submenupopup" });
            menu.appendChild(mp);
            mp.appendChild($C("menuitem", {
                label: "Styles importieren",
                accesskey: "R",
                acceltext: "Alt + R",
                oncommand: "UCL.rebuild();"
            }));
            mp.appendChild($C("menuseparator"));
            mp.appendChild($C("menuitem", {
                label: "CSS-Datei erstellen",
                accesskey: "D",
                oncommand: "UCL.create();"
            }));
            mp.appendChild($C("menuitem", {
                label: "CSS-Ordner öffnen",
                accesskey: "O",
                oncommand: "UCL.openFolder();"
            }));
            if (showChrome == 1) {
                mp.appendChild($C("menuitem", {
                label: "Chrome-Ordner öffnen",
                accesskey: "O",
                oncommand: "UCL.openCHRMFolder();"
                }));
            }
            mp.appendChild($C("menuitem", {
                label: "userChrome.css bearbeiten",
                hidden: false,
                oncommand: "UCL.editUserCSS('userChrome.css');"
            }));
            mp.appendChild($C("menuitem", {
                label: "userContent.css bearbeiten",
                hidden: false,
                oncommand: "UCL.editUserCSS('userContent.css');"
            }));
            menu = $C("menu", {
                label: ".uc.css",
                accesskey: "U",
                hidden: !UCL.USE_UC
            });
            menupopup.appendChild(menu);
            mp = $C("menupopup", { id: "usercssloader-ucmenupopup" });
            menu.appendChild(mp);
            mp.appendChild($C("menuitem", {
                label: "Importieren(.uc.js)",
                oncommand: "UCL.UCrebuild();"
            }));
            mp.appendChild($C("menuseparator", { id: "usercssloader-ucseparator" }));
            CustomizableUI.createWidget({
                id: 'usercssloader-menu-item',
                type: 'custom',
                defaultArea: CustomizableUI.AREA_NAVBAR,
                onBuild: function(aDocument) {
                    let toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbaritem');
                    toolbaritem.id = 'usercssloader-menu-item';
                    toolbaritem.className = 'chromeclass-toolbar-additional';
                    return toolbaritem;
                }
            });
            $('usercssloader-menu-item').appendChild(cssmenu);
            if (position == 1) {
            let refNode = $('helpMenu');
            refNode.parentNode.insertBefore(cssmenu, refNode.nextSibling);
            }
            
            $("mainKeyset").appendChild($C("key", {
                id: "usercssloader-rebuild-key",
                oncommand: "UCL.rebuild();",
                key: "R",
                modifiers: "alt",
            }));        
            this.rebuild();
            this.initialized = true;
            if (UCL.USE_UC) {
                setTimeout(function() {
                    UCL.UCcreateMenuitem();
                }, 1000);
            }
            window.addEventListener("unload", this, false);
        },
        uninit: function() {
            const dis = [];
            for (let x of Object.keys(this.readCSS)) {
                if (!this.readCSS[x].enabled)
                    dis.push(x);
            }
            this.prefs.setCharPref("disabled_list", dis.join("|"));
            window.removeEventListener("unload", this, false);
        },
        destroy: function() {
            var i = document.getElementById("usercssloader-menu");
            if (i) i.parentNode.removeChild(i);
            var i = document.getElementById("usercssloader-rebuild-key");
            if (i) i.parentNode.removeChild(i);
            this.uninit();
        },
        handleEvent: function(event) {
            switch(event.type){
                case "unload": this.uninit(); break;
            }
        },
        rebuild: function() {
            let ext = /\.css$/i;
            let not = /\.uc\.css/i;
            let files = this.FOLDER.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
            while (files.hasMoreElements()) {
                let file = files.getNext().QueryInterface(Ci.nsIFile);
                if (!ext.test(file.leafName) || not.test(file.leafName)) continue;
                let CSS = this.loadCSS(file);
                CSS.flag = true;
            }
            for (let leafName of Object.keys(this.readCSS)) {
                const CSS = this.readCSS[leafName];
                if (!CSS.flag) {
                    CSS.enabled = false;
                    delete this.readCSS[leafName];
                }
                delete CSS.flag;
                this.rebuildMenu(leafName);
            }
            if (this.initialized) {
                if (typeof(StatusPanel) !== "undefined")
                    StatusPanel._label = "Style importiert";
                else
                    XULBrowserWindow.statusTextField.label = "Styles importieren";
            }
        },
        loadCSS: function(aFile) {
            var CSS = this.readCSS[aFile.leafName];
            if (!CSS) {
                CSS = this.readCSS[aFile.leafName] = new CSSEntry(aFile);
                if (this.disabled_list.indexOf(CSS.leafName) === -1) {
                    CSS.enabled = true;
                }
            } else if (CSS.enabled) {
                CSS.enabled = true;
            }
            return CSS;
        },
        rebuildMenu: function(aLeafName) {
            var CSS = this.readCSS[aLeafName];
            var menuitem = document.getElementById("usercssloader-" + aLeafName);
            if (!CSS) {
                if (menuitem)
                    menuitem.parentNode.removeChild(menuitem);
                return;
            }
            if (!menuitem) {
                menuitem = $C("menuitem", {
                    label : aLeafName,
                    id : "usercssloader-" + aLeafName,
                    class : "usercssloader-item " + (CSS.SHEET == this.AGENT_SHEET? "AGENT_SHEET" : CSS.SHEET == this.AUTHOR_SHEET? "AUTHOR_SHEET": "USER_SHEET"),
                    type : "checkbox",
                    autocheck : "false",
                    oncommand : "UCL.toggle('"+ aLeafName +"');",
                    onclick : "UCL.itemClick(event);",
                    onmouseup : "if (event.button == 1) event.preventDefault();",
                    tooltiptext : "Linksklick: an/aus, Menü schließt\nMittelklick: an/aus, Menü bleibt offen\nRechtsklick: bearbeiten\nStrg+Linksklick: im Dateimanager anzeigen"
                    });
                document.getElementById("usercssloader-menupopup").appendChild(menuitem);
            }
            menuitem.setAttribute("checked", CSS.enabled);
        },
        toggle: function(aLeafName) {
            var CSS = this.readCSS[aLeafName];
            if (!CSS || event.ctrlKey) return;
            CSS.enabled = !CSS.enabled;
            this.rebuildMenu(aLeafName);
        },
        itemClick: function(event) {
            let label = event.currentTarget.getAttribute("label");
            
            if (event.button == 0) {
                 if (event.ctrlKey) {
                    event.preventDefault();
                    event.stopPropagation();
                    UCL.openFolder (label);
                 } else {return;
                 }
            }
                    event.preventDefault();
                    event.stopPropagation();
            if (event.button == 1) {
                this.toggle(label);
            }
            else if (event.button == 2) {
                // closeMenus(event.target);
                this.edit(this.getFileFromLeafName(label));
            }
        },
        getFileFromLeafName: function(aLeafName) {
            let f = this.FOLDER.clone();
            f.QueryInterface(Ci.nsIFile); // use appendRelativePath
            f.appendRelativePath(aLeafName);
            return f;
        },
        openFolder:function(label){
            if (label) {
            var target= this.FOLDER.path +  "\\" + label
            } else {
                 var target= this.FOLDER.path
            }
            if (this.vFileManager.length != 0) {
                var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
                var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
                var args=[this.vFMParameter,target];
                file.initWithPath(this.vFileManager);
                process.init(file);
                // Verzeichnis mit anderem Dateimanager öffnen
                process.run(false, args, args.length);
            } else {
                // Verzeichnis mit Dateimanager des Systems öffnen
                this.FOLDER.launch();
            }
        },
        openCHRMFolder:function(){
            if (this.vFileManager.length != 0) {
                var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
                var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess);
                var args=[this.vFMParameter,this.CHRMFOLDER.path];
                file.initWithPath(this.vFileManager);
                process.init(file);
                // Verzeichnis mit anderem Dateimanager öffnen
                process.run(false, args, args.length);
            } else {
                // Verzeichnis mit Dateimanager des Systems öffnen
                this.CHRMFOLDER.launch();
            }
         },
        editUserCSS: function(aLeafName) {
            let file = Services.dirsvc.get("UChrm", Ci.nsIFile);
            file.appendRelativePath(aLeafName);
            this.edit(file);
        },
        edit: function(aFile) {
            var editor = Services.prefs.getCharPref("view_source.editor.path");
            if (!editor) return alert("Unter about:config den vorhandenen Schalter:\n view_source.editor.path mit dem Editorpfad ergänzen");
            try {
                var UI = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
                UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0? "Shift_JIS": "UTF-8";
                var path = UI.ConvertFromUnicode(aFile.path);
                var app = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile);
                app.initWithPath(editor);
                var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
                process.init(app);
                process.run(false, [path], 1);
            } catch (e) {}
        },
        create: function(aLeafName) {
            if (!aLeafName) aLeafName = prompt("Name des Styles", dateFormat(new Date(), "%Y_%m%d_%H%M%S"));
            if (aLeafName) aLeafName = aLeafName.replace(/\s+/g, " ").replace(/[\\/:*?\"<>|]/g, "");
            if (!aLeafName || !/\S/.test(aLeafName)) return;
            if (!/\.css$/.test(aLeafName)) aLeafName += ".css";
            let file = this.getFileFromLeafName(aLeafName);
            this.edit(file);
        },
        UCrebuild: function() {
            let re = /^file:.*\.uc\.css(?:\?\d+)?$/i;
            let query = "?" + new Date().getTime();
            Array.slice(document.styleSheets).forEach(function(css){
                if (!re.test(css.href)) return;
                if (css.ownerNode) {
                    css.ownerNode.parentNode.removeChild(css.ownerNode);
                }
                let pi = document.createProcessingInstruction('xml-stylesheet','type="text/css" href="'+ css.href.replace(/\?.*/, '') + query +'"');
                document.insertBefore(pi, document.documentElement);
            });
            UCL.UCcreateMenuitem();
        },
        UCcreateMenuitem: function() {
            let sep = $("usercssloader-ucseparator");
            let popup = sep.parentNode;
            if (sep.nextSibling) {
                let range = document.createRange();
                range.setStartAfter(sep);
                range.setEndAfter(popup.lastChild);
                range.deleteContents();
                range.detach();
            }
            let re = /^file:.*\.uc\.css(?:\?\d+)?$/i;
            Array.slice(document.styleSheets).forEach(function(css) {
                if (!re.test(css.href)) return;
                let fileURL = decodeURIComponent(css.href).split("?")[0];
                let aLeafName = fileURL.split("/").pop();
                let m = $C("menuitem", {
                    label : aLeafName,
                    tooltiptext : fileURL,
                    id : "usercssloader-" + aLeafName,
                    type : "checkbox",
                    autocheck : "false",
                    checked : "true",
                    oncommand : "if (!event.ctrlKey) {this.setAttribute('checked', !(this.css.disabled = !this.css.disabled));}",
                    onclick : "UCL.UCItemClick(event);"
                });
                m.css = css;
                popup.appendChild(m);
            });
        },
        UCItemClick: function(event) {
            if (event.button == 0) return;
            event.preventDefault();
            event.stopPropagation();
            if (event.button == 1) {
                event.target.doCommand();
            }
            else if (event.button == 2) {
                // closeMenus(event.target);
                let fileURL = event.currentTarget.getAttribute("tooltiptext");
                let file = Services.io.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler).getURLSpecFromActualFile(fileURL);
                this.edit(file);
            }
        },
    };
    function CSSEntry(aFile) {
        this.path = aFile.path;
        this.leafName = aFile.leafName;
        this.lastModifiedTime = 1;
        this.SHEET = /^xul-|\.as\.css$/i.test(this.leafName) ? 
            Ci.nsIStyleSheetService.AGENT_SHEET:
            /\.author\.css$/i.test(this.leafName)?
            Ci.nsIStyleSheetService.AUTHOR_SHEET:
            Ci.nsIStyleSheetService.USER_SHEET;
    }
    CSSEntry.prototype = {
        sss: Components.classes["@mozilla.org/content/style-sheet-service;1"]
                .getService(Components.interfaces.nsIStyleSheetService),
        _enabled: false,
        get enabled() {
            return this._enabled;
        },
        set enabled(isEnable) {
            var aFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsIFile)
            aFile.initWithPath(this.path);
            var isExists = aFile.exists(); // true, wenn die Datei existiert
            var lastModifiedTime = isExists ? aFile.lastModifiedTime : 0;
            var isForced = this.lastModifiedTime != lastModifiedTime; // true, wenn es eine Änderung in der Datei gibt
            var fileURL = Services.io.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler).getURLSpecFromActualFile(aFile);
            var uri = Services.io.newURI(fileURL, null, null);
            if (this.sss.sheetRegistered(uri, this.SHEET)) {
                // Wenn diese Datei bereits gelesen wurde
                if (!isEnable || !isExists) {
                    this.sss.unregisterSheet(uri, this.SHEET);
                }
                else if (isForced) {
                    // Nach Stornierung erneut einlesen
                    this.sss.unregisterSheet(uri, this.SHEET);
                    this.sss.loadAndRegisterSheet(uri, this.SHEET);
                }
            } else {
                // Datei wurde nicht gelesen
                if (isEnable && isExists) {
                    this.sss.loadAndRegisterSheet(uri, this.SHEET);
                }
            }
            if (this.lastModifiedTime !== 1 && isEnable && isForced) {
                log(this.leafName + " wurde aktualisiert");
            }
            this.lastModifiedTime = lastModifiedTime;
            return this._enabled = isEnable;
        },
    };
    UCL.init();
    function $(id) { return document.getElementById(id); }
    function $A(arr) { return Array.slice(arr); }
    function $C(name, attr) {
        var el = document.createXULElement(name);
        if (attr) Object.keys(attr).forEach(function(n) { el.setAttribute(n, attr[n]) });
        return el;
    }
    function dateFormat(date, format) {
        format = format.replace("%Y", ("000" + date.getFullYear()).substr(-4));
        format = format.replace("%m", ("0" + (date.getMonth()+1)).substr(-2));
        format = format.replace("%d", ("0" + date.getDay()).substr(-2));
        format = format.replace("%H", ("0" + date.getHours()).substr(-2));
        format = format.replace("%M", ("0" + date.getMinutes()).substr(-2));
        format = format.replace("%S", ("0" + date.getSeconds()).substr(-2));
        return format;
    }
    function log() { Application.console.log(Array.slice(arguments)); }
    })();
    Alles anzeigen

    Für die Verknüpfung hab ich mal eine Totalcommander.lnk als Beispiel genommen, die Paramater seht ihr im auskommentierten Teil.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 16. Januar 2025 um 00:29
    Zitat von lenny2

    es gibt noch ein weiteres Problem (es ist in allen Versionen des Skripts vorhanden), wenn die Tabs-List leer ist, bleibt der Tabs-Menüpunkt im Hauptkontextmenü aktiv.

    Das hab ich mir vor gefühlten Ewigkeiten in die userChrome.css eingetragen:

    CSS
    /* Skript "UndoListInTabmenuToo", Tab- und Hauptkontextmenü */
    #historyUndoWindowMenu3[disabled="true"],
    #historyUndoWindowMenuPopup3[disabled="true"],
    #tabContextUndoList[disabled="true"],
    #ContextUndoList[disabled="true"]
    { display: none }

    Statt die Einträge auszublenden, könnten sie natürlich auch mit color:grey oder einem ähnlichen Farbton versehen werden. (Was immer der Standard für das Ausgrauen ist.)

    Ansonsten sollte Alice auf die Probleme im Skript hingewiesen werden.


    Zitat von Mira_Belle

    lenny2 sorry, da weiß ich gerade auch nicht weiter!
    Wenn es Dich stört, "klammere" die Funktion einfach aus.

    JavaScript
       /*     if (undoPopup.childNodes[i + 2]) {
              undoPopup.childNodes[i + 2].setAttribute("tooltiptext", tooltiptext);
          }		*/

    Wenn ich es berichtigt bekomme, poste ich hier.

    Übrigens erzeugt genau dieser Teil bei mir in der Konsole einen Fehler. Die Fehler, die Sören sah, erhalte ich nicht (ich hab das Skript direkt von Alice bezogen und die Texte übersetzt bzw. aus der Vorgängerversion übernommen).

  • Script für animierte Grafiken funktioniert ab FF 94 nicht mehr vollständig

    • Speravir
    • 16. Januar 2025 um 00:06
    Zitat von Mitleser

    aber auch wieder etwas schlechter lesbar.

    Seh ich nicht so, es ist ja auch außerhalb der Konfiguration, aber belassen wir es dabei.

    Zitat von Mitleser

    Kann man machen aber 'copy and paste' aus einem Dateimanager sollte man dann schon voraussetzen können.

    War nur ein Vorschlag. Auch hier: Belassen wir es dabei.

    Zitat von Mira_Belle

    Wenn ich auch noch meinen Senf dazu geben dürfte.

    Klar, ist ja keine Konversation hinter den Kulissen. :)

    Zitat von Mira_Belle

    Vier Möglichkeiten

    Viele Wege führen nach Rom oder so ähnlich.

  • Script für animierte Grafiken funktioniert ab FF 94 nicht mehr vollständig

    • Speravir
    • 15. Januar 2025 um 02:39
    Zitat von Mitleser

    Wie Du vielleicht bemerkt hast, ist mir die 'ConfigArea' in meinen Scripten sehr wichtig.

    Das hatte ich nicht bedacht. Aber Du hast damit Recht.

    Es geht jedoch so etwas:

    JavaScript
    const iconPath = '/chrome/icons/'; // Pfad zum Ordner der das Icon beinhaltet
    // …
    const icoDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir)) + iconPath;

    Und dann überall curProfDir + iconPath durch icoDir ersetzen (der Name ist natürlich nur ein Beispiel, er muss sich ja von iconPath unterscheiden).

    Zum Thema Leute haben keine Ahnung: Der beginnende und der abschließende Schrägstrich im Pfad sind wichtig für die Funktionalität, so dass man darauf hinweisen könnte, sie nicht zu entfernen.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 15. Januar 2025 um 02:24
    Zitat von Endor

    Andere Frage:
    In einem Script habe ich dies:

    Code
    oncommand: '(' + onCommand.toString() + ')()'

    Habe es nach so geändert:

    Code
    toolbaritem.addEventListener('click', event => {
    					if (event.button == 0) { 
                                (' + onCommand.toString() + ')();
                                     }

    Funktioniert aber nicht.

    Das kommt so ähnlich zum Beispiel im von mir ganz zu Anfang erwähnten AnimationToggleButton-Skript vor, von dir zuletzt hier aktualisiert (soweit mir bekannt).

    Ich hab da bis eben länger dran gesessen. Die Lösung besteht darin, die Funktion onCommand aufzulösen und deren Code in die vom Eventhandler aufgerufene anonyme Funktion einzufügen. In AnimationToggleButton heißt die Funktion onClick, aber das spielt hier keine Rolle.

    alt:

    JavaScript
    function onClick() {
    // Funktionscode, aktuelle Version Zeilen 36-82
    };
    
    tb_button.setAttribute('onclick', '(' + onClick.toString() + ')();');

    neu:

    JavaScript
    tb_button.addEventListener('click', () => {
    // Funktionscode
    });
  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 12. Januar 2025 um 01:52
    Zitat von Mira_Belle

    Kann man für einzelne Skripts nicht ein Unterforum aufmachen

    Oder eine Liste, in denen die Skripte verlinkt werden. Das kann aber immer nur einer bearbeiten (plus Admin und Moderator).

    Das stört mich quasi schon von Anfang an. Ich hatte mal ein ergänzendes Wiki vorgeschlagen. Der Vorteil wäre, dass dort mehr als eine Person editieren könnten.

  • Script für animierte Grafiken funktioniert ab FF 94 nicht mehr vollständig

    • Speravir
    • 12. Januar 2025 um 01:36

    Danke, Mitleser. Meine angekündigten Anmerkungen zu Deinem Skript:

    In Bezug auf die Konstante curProfDir in Zeile 30: Wenn Du diese wie hier ausschließlich zusammen mit dem Pfad für das Symbol nutzt, dann kannst Du alles auch zusammenfassen. Also statt

    JavaScript
    const iconPath = '/chrome/icons/';

    sowie

    JavaScript
    const curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir));

    und später im Skript (mehrfach) curProfDir + iconPath könntest Du etwa das nutzen:

    JavaScript
    const iconPath = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir, 'chrome', 'icons'));

    und dann im Skript nur iconPath verwenden. Wenn sich der Dateiname nicht ändern würde, könnte man sogar diesen in die Konstante übernehmen.

    Außerdem: Statt if…else…if…else…if…else (ab Zeile 49) könntest du switch nehmen, Das müsste dann, denke ich, etwa so aussehen (mit iconPath inklusive Profilpfad):

    JavaScript
    switch( Services.prefs.getCharPref(charPref) ) {
      case 'normal':
    		el.querySelector(cl).style.fill = iconColNorm;
    		el.style.listStyleImage = 'url("' + iconPath + iconNorm + '")';
        	el.setAttribute('label', labelNorm);
        	el.setAttribute('tooltiptext', ttTextNorm);
        	break;
      case 'once':
    		el.querySelector(cl).style.fill = iconColOnce;
    		el.style.listStyleImage = 'url("' + iconPath + iconOnce + '")';
        	el.setAttribute('label', labelOnce);
        	el.setAttribute('tooltiptext', ttTextOnce);
        	break;
      case 'none':
    		el.querySelector(cl).style.fill = iconColNone;
    		el.style.listStyleImage = 'url("' + iconPath + iconNone + '")';
        	el.setAttribute('label', labelNone);
        	el.setAttribute('tooltiptext', ttTextNone);
        	break;
    }
    Alles anzeigen
  • 2024-Update: Aktualisierung auf WoltLab Suite 6.1

    • Speravir
    • 11. Januar 2025 um 00:27

    Sören, ich halte das, was ursprünglich in diesem Posting von mir zu beobachten war, für einen Fehler der Software:

    Ich schrieb ein Javascript-Schnipsel, das mit einem Semikolon endete, markiert als Code in Klammern. Die Software machte daraus den Zwinkersmilie, hätte das aber meiner Ansicht nach nicht tun dürfen, weil das Code-Ende-Markup eigentlich zwischen Semikolon und schlie'ender Klammer liegen sollte.

    Hier noch einmal: (var urlbar;)

    Edit: Aber wieso geschieht es jetzt, wo ich es hier demonstrieren wollte, gerade nicht?

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 11. Januar 2025 um 00:13
    Zitat von Mitleser

    habe ich angefangen einige Button-Scripte umzuschreiben, darunter auch einige Scripte die Userprefs betreffen
    (setIntPref/setBoolPref oder setCharPref). Bei mir befinden sich diese Buttons in einer zusätzlichen Seitenleiste am rechten Rand. Hier mein Script um den 'image.animation_mode' zu schalten.

    Danke, sehr interessant. Kannst du das bitte im oben verlinkten Thread nochmal posten? Ich hätte einige kleinere Anmerkungen dazu, die thematisch nicht hierher gehören.

    Zitat von Sören Hentzschel

    Das heißt es grundsätzlich.

    (etc.) Danke. Und weil Eventlistener schon lange funktionieren, könnte man also alles auch jetzt schon umbauen, oder?

    Zitat von Endor

    Unser japanischer Hauptlieferant für Scripte, schon zu loshombre Zeiten,
    Alice, hat einen ganzen Haufen Scripte für Firefox 135 aktualisiert.

    Ich weiß. :)

    BTW, ich hatte noch Ping Zitronella vergessen, denn das Beispiel AnimationToggleButton ist ja von ihr (bzw. sie hat den Thread gestartet und ich es so bemerkt), ebenso das Skript für die Media-Codec-Umstellung.

  • Div. Skripte funktionieren im aktuellem Nightly nicht mehr

    • Speravir
    • 10. Januar 2025 um 01:45

    Endor: Das betrifft viele Skripte, die bei dir gehostet werden.


    Sören Hentzschel: Aus (stark verkürzt) onCommand wird addEventListener('command', … ). Heißt das, wenn onClick genutzt wird, dass der Eventlistener click lauten muss? Oder ist das egal? Beispiel: AnimationToggleButton: Script für animierte Grafiken funktioniert ab FF 94 nicht mehr vollständig (letzte Änderung von Endor in einem anderen Thread dort von mir im derzeit jüngsten Beitrag verlinkt).

  • Farbiger Ladebalken

    • Speravir
    • 7. Januar 2025 um 01:19
    Zitat von BarbaraZ-

    Der Ladebalken macht nicht mehr dass, was er soll, er macht einfch: NICHTS.
    Leider fehlt mir das Wissen, wo ich ansetzen muss.

    Teste bitte diese Version, sie unterscheidet sich mindestens in Zeile 37 (var urlbar; )

    userChrome.js/loadingbar/loading-bar.uc.js (GitHub, Endor8/userChrome.js). Diese funktioniert bei mir mehr oder weniger. (Ich hatte keine Erinnerung mehr, dass die letzte Änderung von mir ist, muss sich hier in den Tiefen des Forums finden.)

    Zitat von BrokenHeart

    Ich finde die Animation nur etwas "überstylt".

    Du könntest den roten Farbwert unauffälliger gestalten, bei Barbara in Zeile 9. Meine Änderung ist rgba(170,170,255,0.7). Ich mag übrigens die explizite Angabe der Null bzw. kann das erlaubte Weglassen nicht ausstehen (schlechter zu erkennen, daher fehleranfällig). Siehe auch Zusatzinfos zu loadingbar bei Endor.

  • Adresszeile soll eine andere Hintergrundfarbe haben

    • Speravir
    • 2. Dezember 2024 um 00:24

    Dharkness, ergänzend: Brauner (Pferd) (Wikipedia). Ansonsten, ohne neue Erkenntnis Liste geflügelter Worte/R – Ruhig Brauner! (gleichfalls Wikipedia). Allgemeiner: Nicht alles, was als Brauner bezeichnet wird, ist ein Nazi; in der Liste sind im Gegenteil sogar einige Opfer der Faschisten.

  • Unterschiedliche Schriftart

    • Speravir
    • 25. November 2024 um 23:31
    Zitat von 2002Andreas
    Zitat von .DeJaVu

    Welche Version von LO eigentlich?

    Ach so, Version 24.2.x. Ich bezog mich oben auf 24.8.x. Ich kann also nicht ausschließen, dass bei dir doch ein Teil der Schriften fehlt.

    Nachtrag: Nein, auch dort sind alle vier Schriftschnitte der Noto Sans enthalten.

    Zitat von sam2008

    hier ist PowerShell Skript:

    Krümelk*ckend: In Zeile 8 wird nach "*DejaVu*" gesucht. Wie man auch in der Registrierungsdatei von mir sehen kann, sind das aber mehr als die Sans-Serif-Schriften. Deshalb sollte in Zeile 11 das Sans entfernt werden.

Unterstütze uns!

Jährlich (2025)

82,4 %

82,4% (535,86 von 650 EUR)

Jetzt spenden
  1. Kontakt
  2. Datenschutz
  3. Impressum
Community-Software: WoltLab Suite™
Mastodon