מדיה ויקי:Common.js: הבדלים בין גרסאות בדף
קפיצה לניווט
קפיצה לחיפוש
הוספת רשימת קטגוריות לדף החיפוש |
בחירת כמה קטגוריות יחד בדף החיפוש |
||
| (גרסת ביניים אחת של אותו משתמש אינה מוצגת) | |||
| שורה 181: | שורה 181: | ||
})(); | })(); | ||
// ========== רשימת קטגוריות בדף החיפוש ========== | // ========== רשימת קטגוריות בדף החיפוש ========== | ||
// מציג בדף מיוחד:חיפוש | // מציג בדף מיוחד:חיפוש לוח סימון של הקטגוריות הקיימות – ניתן לבחור כמה קטגוריות יחד. | ||
// | // הבחירה מוסיפה/מחליפה 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 | // אילו קטגוריות כבר נבחרו בשאילתה הנוכחית | ||
var preSelected = {}; | |||
. | var m = ($input.val() || '').match(/incategory:"((?:\\.|[^"\\])*)"/); | ||
if (m) { | |||
m[1].split('|').forEach(function (c) { | |||
preSelected[unescapeCat(c)] = true; | |||
}); | |||
} | |||
var $ | var $count = $('<span>').css({ 'font-weight': 'normal', color: '#54595d' }); | ||
var $summary = $('<summary>') | |||
.css({ ' | .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 | var sel = selectedCats(); | ||
var q = ($input.val() || '') | var q = ($input.val() || '').replace(TOKEN_RE, '').replace(/\s+$/, ''); | ||
if (sel.length) { | |||
q = (q ? q + ' ' : '') + 'incategory:"' + sel.map(escapeCat).join('|') + '"'; | |||
if ( | |||
q = (q ? q + ' ' : '') + 'incategory:"' + | |||
} | } | ||
$input.val(q). | $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' }) | .css({ margin: '8px 0' }) | ||
.append($ | .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();
});
})();