מדיה ויקי:Common.js: הבדלים בין גרסאות בדף

מתוך אוצר מהרי''ט
קפיצה לניווט קפיצה לחיפוש
הוספת רשימת קטגוריות לדף החיפוש
בחירת כמה קטגוריות יחד בדף החיפוש
 
(גרסת ביניים אחת של אותו משתמש אינה מוצגת)
שורה 181: שורה 181:


})();
})();
// ========== רשימת קטגוריות בדף החיפוש ==========
// ========== רשימת קטגוריות בדף החיפוש ==========
// מציג בדף מיוחד:חיפוש רשימה נפתחת של כל הקטגוריות הקיימות.
// מציג בדף מיוחד:חיפוש לוח סימון של הקטגוריות הקיימות – ניתן לבחור כמה קטגוריות יחד.
// בחירת קטגוריה מוסיפה/מחליפה incategory:"..." בתיבת החיפוש.
// הבחירה מוסיפה/מחליפה incategory:"א|ב|ג" בתיבת החיפוש (חיפוש בכל הקטגוריות שנבחרו).
// קטגוריות המסומנות ב[[קטגוריה:קטגוריות בהכנה]] אינן מוצגות ברשימה.
(function () {
(function () {
     if (mw.config.get('wgCanonicalSpecialPageName') !== 'Search') {
     if (mw.config.get('wgCanonicalSpecialPageName') !== 'Search') {
         return;
         return;
     }
     }
    var MARKER = 'קטגוריה:קטגוריות בהכנה';
    function escapeCat(c) {
        return c.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
    }
    function unescapeCat(c) {
        return c.replace(/\\(.)/g, '$1');
    }
    // מזהה את ביטוי ה-incategory שהלוח מייצר (כולל גרשיים מוברחים)
    var TOKEN_RE = /\s*incategory:"((?:\\.|[^"\\])*)"|\s*incategory:\S+/g;


     mw.loader.using('mediawiki.api').then(function () {
     mw.loader.using('mediawiki.api').then(function () {
         return new mw.Api().get({
         return new mw.Api().get({
             action: 'query',
             action: 'query',
             list: 'allpages',
             list: 'allpages|categorymembers',
             apnamespace: 14,
             apnamespace: 14,
             aplimit: 'max',
             aplimit: 'max',
            cmtitle: MARKER,
            cmnamespace: 14,
            cmlimit: 'max',
             formatversion: 2
             formatversion: 2
         });
         });
     }).then(function (res) {
     }).then(function (res) {
         var cats = (res.query.allpages || []).map(function (p) {
        var hidden = {};
        (res.query.categorymembers || []).forEach(function (p) {
            hidden[p.title] = true;
        });
        hidden[MARKER] = true;
 
         var cats = (res.query.allpages || []).filter(function (p) {
            return !hidden[p.title];
        }).map(function (p) {
             return p.title.replace(/^[^:]+:/, '');
             return p.title.replace(/^[^:]+:/, '');
         }).sort(function (a, b) { return a.localeCompare(b, 'he'); });
         }).sort(function (a, b) { return a.localeCompare(b, 'he'); });
שורה 210: שורה 234:
         }
         }


         var $label = $('<label>')
        // אילו קטגוריות כבר נבחרו בשאילתה הנוכחית
            .attr('for', 'mw-category-quick-select')
        var preSelected = {};
             .text('חיפוש בקטגוריה: ')
         var m = ($input.val() || '').match(/incategory:"((?:\\.|[^"\\])*)"/);
            .css({ 'font-weight': 'bold', 'margin-left': '0.5em' });
        if (m) {
             m[1].split('|').forEach(function (c) {
                preSelected[unescapeCat(c)] = true;
            });
        }


         var $select = $('<select>')
         var $count = $('<span>').css({ 'font-weight': 'normal', color: '#54595d' });
            .attr({ id: 'mw-category-quick-select', dir: 'rtl' })
        var $summary = $('<summary>')
             .css({ 'max-width': '100%', padding: '5px', 'font-size': '0.95em' });
             .css({ cursor: 'pointer', 'font-weight': 'bold', padding: '4px 0' })
            .text('חיפוש בקטגוריות מסוימות ')
            .append($count);


         $select.append($('<option>').val('').text('— כל הקטגוריות (ללא סינון) —'));
         var $list = $('<div>').css({
        cats.forEach(function (c) {
            'column-width': '260px',
             $select.append($('<option>').val(c).text(c));
            'column-gap': '1.5em',
            'max-height': '260px',
            'overflow-y': 'auto',
            padding: '6px 8px',
            border: '1px solid #c8ccd1',
            'border-radius': '3px',
             background: '#f8f9fa'
         });
         });


         // אם החיפוש הנוכחי כבר מסונן לקטגוריה – לסמן אותה ברשימה
         function selectedCats() {
        var current = ($input.val() || '').match(/incategory:"([^"]*)"/);
            return $list.find('input:checked').map(function () {
        if (current) {
                return this.value;
             $select.val(current[1]);
             }).get();
         }
         }


         $select.on('change', function () {
         function updateQuery() {
             var cat = this.value;
             var sel = selectedCats();
             var q = ($input.val() || '')
             var q = ($input.val() || '').replace(TOKEN_RE, '').replace(/\s+$/, '');
                .replace(/\s*incategory:"[^"]*"/g, '')
             if (sel.length) {
                .replace(/\s+$/, '');
                 q = (q ? q + ' ' : '') + 'incategory:"' + sel.map(escapeCat).join('|') + '"';
             if (cat) {
                 q = (q ? q + ' ' : '') + 'incategory:"' + cat + '"';
             }
             }
             $input.val(q).trigger('focus');
             $input.val(q);
            updateCount();
        }
 
        function updateCount() {
            var n = selectedCats().length;
            $count.text(n ? '(נבחרו: ' + n + ')' : '(אפשר לבחור כמה יחד)');
        }
 
        cats.forEach(function (c) {
            var $cb = $('<input>')
                .attr({ type: 'checkbox', value: c })
                .prop('checked', !!preSelected[c])
                .css({ 'margin-left': '0.4em' })
                .on('change', updateQuery);
            $('<label>')
                .css({ display: 'block', 'break-inside': 'avoid', padding: '2px 0', cursor: 'pointer' })
                .append($cb, document.createTextNode(c))
                .appendTo($list);
         });
         });


         $('<div>')
         var $clear = $('<button>')
            .attr('type', 'button')
            .text('ניקוי הבחירה')
            .css({ margin: '6px 0', padding: '3px 10px', cursor: 'pointer' })
            .on('click', function () {
                $list.find('input:checked').prop('checked', false);
                updateQuery();
            });
 
        var $details = $('<details>')
            .attr({ id: 'mw-category-multi', dir: 'rtl' })
             .css({ margin: '8px 0' })
             .css({ margin: '8px 0' })
             .append($label, $select)
             .append($summary, $list, $clear)
             .appendTo('#mw-search-top-table');
             .appendTo('#mw-search-top-table');
        if (Object.keys(preSelected).length) {
            $details.attr('open', '');
        }
        updateCount();
     });
     });
})();
})();

גרסה אחרונה מ־20:16, 19 ביולי 2026

// קוד קיים - משאירים אותו
(function () {
    var userLang = mw.config.get('wgUserLanguage');
    var pageName = mw.config.get('wgPageName');

    if (pageName === 'רבי_יואל_טייטלבוים' && userLang === 'yi') {
        window.location.href = mw.util.getUrl('רבי_יואל_טייטלבוים/yi');
    }

    if (pageName === 'רבי_יואל_טייטלבוים/yi' && userLang === 'he') {
        window.location.href = mw.util.getUrl('רבי_יואל_טייטלבוים');
    }
})();

// תוכן עניינים - גרסה משופרת
mw.hook('wikipage.content').add(function ($content) {
    var $toc = $('#toc');
    if ($toc.length) {
        var $window = $(window);
        var $header = $('#firstHeading');

        function updateTocPosition() {
            var scrollTop = $window.scrollTop();
            var headerHeight = $header.offset().top + $header.outerHeight();

            $toc.css('top', scrollTop > headerHeight ? '0' : '220px');
        }

        $window.on('scroll resize', updateTocPosition);
        updateTocPosition(); // קריאה ראשונית
    }
});

// ========== בקרי מראה (Appearance Controls) ==========
(function() {
    'use strict';

    // פונקציות עזר לניהול העדפות
    var AppearancePrefs = {
        get: function(key, defaultVal) {
            try {
                var val = localStorage.getItem('otzar-' + key);
                return val !== null ? val : defaultVal;
            } catch(e) {
                return defaultVal;
            }
        },
        set: function(key, val) {
            try {
                localStorage.setItem('otzar-' + key, val);
            } catch(e) {}
        }
    };

    // טעינת העדפות שמורות
    function loadPreferences() {
        var fontSize = AppearancePrefs.get('fontSize', 'medium');
        var contentWidth = AppearancePrefs.get('contentWidth', 'normal');
        var fontFamily = AppearancePrefs.get('fontFamily', 'david');
        var panelVisible = AppearancePrefs.get('panelVisible', 'true');

        applyFontSize(fontSize);
        applyContentWidth(contentWidth);
        applyFontFamily(fontFamily);

        // החלת מצב התפריט
        if (panelVisible === 'false') {
            $('#appearance-panel').addClass('hidden');
            $('#appearance-toggle').addClass('panel-hidden');
        }
    }

    // החלת גודל טקסט
    function applyFontSize(size) {
        var $content = $('#content, .mw-parser-output');
        $content.removeClass('text-small text-medium text-large text-xlarge');
        $content.addClass('text-' + size);
        AppearancePrefs.set('fontSize', size);

        $('.appearance-option[data-type="fontSize"]').removeClass('active');
        $('.appearance-option[data-type="fontSize"][data-value="' + size + '"]').addClass('active');
    }

    // החלת רוחב תוכן
    function applyContentWidth(width) {
        var $content = $('#content');
        var $body = $('.mw-body');

        $content.removeClass('width-normal width-wide');
        $body.removeClass('width-normal width-wide');

        $content.addClass('width-' + width);
        $body.addClass('width-' + width);

        AppearancePrefs.set('contentWidth', width);

        $('.appearance-option[data-type="contentWidth"]').removeClass('active');
        $('.appearance-option[data-type="contentWidth"][data-value="' + width + '"]').addClass('active');
    }

    // החלת גופן
    function applyFontFamily(font) {
        var $content = $('#content, .mw-parser-output');
        $content.removeClass('font-david font-frank font-arial');
        $content.addClass('font-' + font);
        AppearancePrefs.set('fontFamily', font);

        $('.appearance-option[data-type="fontFamily"]').removeClass('active');
        $('.appearance-option[data-type="fontFamily"][data-value="' + font + '"]').addClass('active');
    }

    // הצגה/הסתרת תפריט
    function togglePanel() {
        var $panel = $('#appearance-panel');
        var $toggle = $('#appearance-toggle');

        $panel.toggleClass('hidden');
        $toggle.toggleClass('panel-hidden');

        var isVisible = !$panel.hasClass('hidden');
        AppearancePrefs.set('panelVisible', isVisible ? 'true' : 'false');
    }

    // יצירת כפתור הצגה/הסתרה
    function createToggleButton() {
        var html = '<div id="appearance-toggle" title="הצג/הסתר תפריט מראה">⚙</div>';
        $('body').append(html);

        $('#appearance-toggle').on('click', function() {
            togglePanel();
        });
    }

    // יצירת תפריט מראה
    function createAppearanceMenu() {
        var html =
            '<div id="appearance-panel">' +
            '  <h3 class="appearance-heading">מראה</h3>' +
            '  <div class="appearance-content">' +
            '    <div class="appearance-section">גודל טקסט:</div>' +
            '    <div class="appearance-option" data-type="fontSize" data-value="small">קטן</div>' +
            '    <div class="appearance-option" data-type="fontSize" data-value="medium">בינוני</div>' +
            '    <div class="appearance-option" data-type="fontSize" data-value="large">גדול</div>' +
            '    <div class="appearance-option" data-type="fontSize" data-value="xlarge">גדול מאוד</div>' +
            '    <div class="appearance-divider"></div>' +
            '    <div class="appearance-section">רוחב תוכן:</div>' +
            '    <div class="appearance-option" data-type="contentWidth" data-value="normal">רגיל</div>' +
            '    <div class="appearance-option" data-type="contentWidth" data-value="wide">רחב</div>' +
            '    <div class="appearance-divider"></div>' +
            '    <div class="appearance-section">גופן:</div>' +
            '    <div class="appearance-option" data-type="fontFamily" data-value="david">דוד</div>' +
            '    <div class="appearance-option" data-type="fontFamily" data-value="frank">פרנק</div>' +
            '    <div class="appearance-option" data-type="fontFamily" data-value="arial">אריאל</div>' +
            '  </div>' +
            '</div>';

        $('body').append(html);

        // מאזינים לאירועים
        $('.appearance-option').on('click', function() {
            var $this = $(this);
            var type = $this.data('type');
            var value = $this.data('value');

            if (type === 'fontSize') {
                applyFontSize(value);
            } else if (type === 'contentWidth') {
                applyContentWidth(value);
            } else if (type === 'fontFamily') {
                applyFontFamily(value);
            }
        });
    }

    // אתחול
    $(function() {
        createAppearanceMenu();
        createToggleButton();
        loadPreferences();
    });

})();

// ========== רשימת קטגוריות בדף החיפוש ==========
// מציג בדף מיוחד:חיפוש לוח סימון של הקטגוריות הקיימות – ניתן לבחור כמה קטגוריות יחד.
// הבחירה מוסיפה/מחליפה incategory:"א|ב|ג" בתיבת החיפוש (חיפוש בכל הקטגוריות שנבחרו).
// קטגוריות המסומנות ב[[קטגוריה:קטגוריות בהכנה]] אינן מוצגות ברשימה.
(function () {
    if (mw.config.get('wgCanonicalSpecialPageName') !== 'Search') {
        return;
    }

    var MARKER = 'קטגוריה:קטגוריות בהכנה';

    function escapeCat(c) {
        return c.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
    }
    function unescapeCat(c) {
        return c.replace(/\\(.)/g, '$1');
    }
    // מזהה את ביטוי ה-incategory שהלוח מייצר (כולל גרשיים מוברחים)
    var TOKEN_RE = /\s*incategory:"((?:\\.|[^"\\])*)"|\s*incategory:\S+/g;

    mw.loader.using('mediawiki.api').then(function () {
        return new mw.Api().get({
            action: 'query',
            list: 'allpages|categorymembers',
            apnamespace: 14,
            aplimit: 'max',
            cmtitle: MARKER,
            cmnamespace: 14,
            cmlimit: 'max',
            formatversion: 2
        });
    }).then(function (res) {
        var hidden = {};
        (res.query.categorymembers || []).forEach(function (p) {
            hidden[p.title] = true;
        });
        hidden[MARKER] = true;

        var cats = (res.query.allpages || []).filter(function (p) {
            return !hidden[p.title];
        }).map(function (p) {
            return p.title.replace(/^[^:]+:/, '');
        }).sort(function (a, b) { return a.localeCompare(b, 'he'); });
        if (!cats.length) {
            return;
        }

        var $input = $('#searchText input[name="search"]');
        if (!$input.length) {
            return;
        }

        // אילו קטגוריות כבר נבחרו בשאילתה הנוכחית
        var preSelected = {};
        var m = ($input.val() || '').match(/incategory:"((?:\\.|[^"\\])*)"/);
        if (m) {
            m[1].split('|').forEach(function (c) {
                preSelected[unescapeCat(c)] = true;
            });
        }

        var $count = $('<span>').css({ 'font-weight': 'normal', color: '#54595d' });
        var $summary = $('<summary>')
            .css({ cursor: 'pointer', 'font-weight': 'bold', padding: '4px 0' })
            .text('חיפוש בקטגוריות מסוימות ')
            .append($count);

        var $list = $('<div>').css({
            'column-width': '260px',
            'column-gap': '1.5em',
            'max-height': '260px',
            'overflow-y': 'auto',
            padding: '6px 8px',
            border: '1px solid #c8ccd1',
            'border-radius': '3px',
            background: '#f8f9fa'
        });

        function selectedCats() {
            return $list.find('input:checked').map(function () {
                return this.value;
            }).get();
        }

        function updateQuery() {
            var sel = selectedCats();
            var q = ($input.val() || '').replace(TOKEN_RE, '').replace(/\s+$/, '');
            if (sel.length) {
                q = (q ? q + ' ' : '') + 'incategory:"' + sel.map(escapeCat).join('|') + '"';
            }
            $input.val(q);
            updateCount();
        }

        function updateCount() {
            var n = selectedCats().length;
            $count.text(n ? '(נבחרו: ' + n + ')' : '(אפשר לבחור כמה יחד)');
        }

        cats.forEach(function (c) {
            var $cb = $('<input>')
                .attr({ type: 'checkbox', value: c })
                .prop('checked', !!preSelected[c])
                .css({ 'margin-left': '0.4em' })
                .on('change', updateQuery);
            $('<label>')
                .css({ display: 'block', 'break-inside': 'avoid', padding: '2px 0', cursor: 'pointer' })
                .append($cb, document.createTextNode(c))
                .appendTo($list);
        });

        var $clear = $('<button>')
            .attr('type', 'button')
            .text('ניקוי הבחירה')
            .css({ margin: '6px 0', padding: '3px 10px', cursor: 'pointer' })
            .on('click', function () {
                $list.find('input:checked').prop('checked', false);
                updateQuery();
            });

        var $details = $('<details>')
            .attr({ id: 'mw-category-multi', dir: 'rtl' })
            .css({ margin: '8px 0' })
            .append($summary, $list, $clear)
            .appendTo('#mw-search-top-table');

        if (Object.keys(preSelected).length) {
            $details.attr('open', '');
        }
        updateCount();
    });
})();