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

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


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


     var MARKER = 'קטגוריה:קטגוריות בהכנה';
     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 () {
שורה 224: שורה 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();
    });
})();