Common.js | فراغیب

از فراغیب
پرش به ناوبری پرش به جستجو
بدون خلاصۀ ویرایش
بدون خلاصۀ ویرایش
 
(۲ نسخهٔ میانیِ ایجادشده توسط همین کاربر نشان داده نشد)
خط ۱: خط ۱:
/* global mw, $ */


/**********************************************************************
*  Load edit.js for edit-related pages
**********************************************************************/
if (
    mw.config.get("wgAction") === "edit" ||
    mw.config.get("wgAction") === "submit" ||
    mw.config.get("wgCanonicalSpecialPageName") === "Upload"
) {
    importScript("مدیاویکی:Common.js/edit.js");
}
/**********************************************************************
*  Magic editintros
**********************************************************************/
function addEditIntro(name) {
    $(".mw-editsection, #ca-edit")
        .find("a")
        .each(function () {
            this.href = $(this).attr("href") + "&editintro=" + name;
        });
}
if (mw.config.get("wgNamespaceNumber") === 0) {
    $(function () {
        if (document.getElementById("disambigbox")) {
            addEditIntro("Template:Disambig_editintro");
        }
    });
    $(function () {
        var cats = mw.config.get("wgCategories") || [];
        if (cats.includes("افراد زنده")) {
            addEditIntro("Template:BLP_editintro");
        }
    });
}


// این باعث می‌شود تصاویر فقط وقتی کاربر اسکرول می‌کند لود شوند
/**********************************************************************
   
  *  Load additional JS/CSS via URL (Secure)
   
  **********************************************************************/
document.addEventListener("DOMContentLoaded", function() {
mw.loader.using(["mediawiki.util"], function () {
  const imgs = document.querySelectorAll("img");
    var extraCSS = mw.util.getParamValue("withCSS"),
  imgs.forEach(img => {
        extraJS = mw.util.getParamValue("withJS");
    img.setAttribute("loading","lazy");
  });
});


    if (extraCSS) {
        if (/^MediaWiki:[^&<>=%#]*\.css$/.test(extraCSS)) {
            mw.loader.load(
                "/w/index.php?title=" +
                    encodeURIComponent(extraCSS) +
                    "&action=raw&ctype=text/css",
                "text/css"
            );
        } else {
            mw.notify("Only pages from the MediaWiki namespace are allowed.", {
                title: "Invalid withCSS value",
            });
        }
    }


    if (extraJS) {
        if (/^MediaWiki:[^&<>=%#]*\.js$/.test(extraJS)) {
            mw.loader.load(
                "/w/index.php?title=" +
                    encodeURIComponent(extraJS) +
                    "&action=raw&ctype=text/javascript"
            );
        } else {
            mw.notify("Only pages from the MediaWiki namespace are allowed.", {
                title: "Invalid withJS value",
            });
        }
    }
});


// می‌توانی جستجوی سریع‌تر فعال کنی:
/**********************************************************************
*  Auto-load Preloaded.js when needed
**********************************************************************/
mw.loader.using(["mediawiki.util"], function () {
    if (mw.util.getParamValue("preload")) {
        mw.loader.load("MediaWiki:Preloaded.js");
    }
});


/**********************************************************************
*  Collapsible tables (modern, safe)
**********************************************************************/
function makeCollapsibleMwCollapsible($content) {
    var $tables = $content
        .find("table.collapsible:not(.mw-collapsible)")
        .addClass("mw-collapsible");


    $.each($tables, function (index, table) {
        if ($(table).hasClass("collapsed")) {
            $(table).addClass("mw-collapsed");
        }
    });


if (window.innerWidth < 720) {
    if ($tables.length > 0) {
  document.body.classList.add("mobile-search-enhanced");
        mw.loader.using("jquery.makeCollapsible").then(function () {
            $tables.makeCollapsible();
        });
    }
}
}
mw.hook("wikipage.content").add(makeCollapsibleMwCollapsible);
/**********************************************************************
*  AutoCollapse, InnerCollapse, OuterCollapse
**********************************************************************/
function mwCollapsibleSetup($collapsibleContent) {
    var autoCollapseThreshold = 2;


    $.each($collapsibleContent, function (index, element) {
        var $element = $(element);


//
        if ($element.hasClass("collapsible")) {
            $element
                .find("tr:first-child > th:first-child")
                .prepend(
                    $element.find("tr:first-child > * > .mw-collapsible-toggle")
                );
        }


mw.loader.using('ext.wikiEditor').then(function () {
        // Auto collapse
        if (
            $collapsibleContent.length >= autoCollapseThreshold &&
            $element.hasClass("autocollapse")
        ) {
            $element.data("mw-collapsible").collapse();
        }


$('#wpTextbox1').wikiEditor('addToToolbar', {
        // Inner collapse (requires outercollapse ancestor)
        if ($element.hasClass("innercollapse")) {
            if ($element.parents(".outercollapse").length > 0) {
                $element.data("mw-collapsible").collapse();
            }
        }


sections: {
        // Ensure toggle inherits proper text color
advanced: {
        var $toggle = $element.find(".mw-collapsible-toggle");
type: 'toolbar',
        if ($toggle.length && $toggle.parent()[0].style.color) {
label: 'ابزارهای پیشرفته'
            $toggle.find("a").css("color", "inherit");
        }
    });
}
}
},
mw.hook("wikipage.collapsibleContent").add(mwCollapsibleSetup);
 
/**********************************************************************
*  Dynamic Navigation Bars (single clean version)
**********************************************************************/
var collapseCaption = "نهفتن";
var expandCaption = "نمایش";
var navigationBarHide = "[" + collapseCaption + "]";
var navigationBarShow = "[" + expandCaption + "]";
 
function toggleNavigationBar(indexNavigationBar, event) {
    var navToggle = document.getElementById("NavToggle" + indexNavigationBar);
    var navFrame = document.getElementById("NavFrame" + indexNavigationBar);
    var navChild;
 
    if (!navFrame || !navToggle) return false;


groups: {
    var isShown = navToggle.firstChild.data === navigationBarHide;
templates: {
 
label: 'الگوها'
    for (
}
        navChild = navFrame.firstChild;
},
        navChild !== null;
        navChild = navChild.nextSibling
    ) {
        if (navChild.nodeType === 1) {
            if (
                $(navChild).hasClass("NavContent") ||
                $(navChild).hasClass("NavPic")
            ) {
                navChild.style.display = isShown ? "none" : "block";
            }
        }
    }


tools: {
    navToggle.firstChild.data = isShown
        ? navigationBarShow
        : navigationBarHide;


infobox: {
    event.preventDefault();
label: 'اینفوباکس',
type: 'button',
icon: 'https://upload.wikimedia.org/wikipedia/commons/5/5a/VisualEditor_-_Template.svg',
action: {
type: 'encapsulate',
options: {
pre: '{{Infobox\n| نام = \n| تصویر = \n}}\n',
post: ''
}
}
}
},


ref: {
function createNavigationBarToggleButton($content) {
label: 'منبع',
    var indexNavigationBar = 0;
type: 'button',
icon: 'https://upload.wikimedia.org/wikipedia/commons/9/9c/OOjs_UI_icon_reference.svg',
action: {
type: 'encapsulate',
options: {
pre: '<ref>',
post: '</ref>'
}
}
},


gallery: {
    $content.find("div.NavFrame:not(.mw-collapsible)").each(function (_, navFrame) {
label: 'گالری تصاویر',
        indexNavigationBar++;
type: 'button',
action: {
type: 'encapsulate',
options: {
pre: '<gallery>\nFile:Example.jpg|توضیح\n</gallery>',
post: ''
}
}
},


category: {
        var $navFrame = $(navFrame);
label: 'دسته‌بندی',
        var navToggle = document.createElement("a");
type: 'button',
        navToggle.className = "NavToggle";
action: {
        navToggle.id = "NavToggle" + indexNavigationBar;
type: 'encapsulate',
        navToggle.href = "#";
options: {
pre: '[[رده:',
post: ']]'
}
}
}


}
        $(navToggle).on(
            "click",
            $.proxy(toggleNavigationBar, null, indexNavigationBar)
        );


});
        var isCollapsed = $navFrame.hasClass("collapsed");


});
        // Determine if any child is hidden (compatibility)
        $(navFrame)
            .children()
            .each(function () {
                if (
                    this.nodeType === 1 &&
                    (this.style.display === "none") &&
                    ($(this).hasClass("NavContent") || $(this).hasClass("NavPic"))
                ) {
                    isCollapsed = true;
                }
            });


        // Apply initial collapsed state
        if (isCollapsed) {
            $(navFrame)
                .children()
                .each(function () {
                    if (
                        $(this).hasClass("NavContent") ||
                        $(this).hasClass("NavPic")
                    ) {
                        this.style.display = "none";
                    }
                });
        }


        navToggle.appendChild(
            document.createTextNode(
                isCollapsed ? navigationBarShow : navigationBarHide
            )
        );


mw.loader.using('ext.wikiEditor').then(function () {
        // Attach toggle to NavHead
        $(navFrame)
            .children()
            .each(function () {
                if ($(this).hasClass("NavHead")) {
                    navToggle.style.color = this.style.color;
                    this.appendChild(navToggle);
                }
            });


function enToFaDigits(str) {
        navFrame.id = "NavFrame" + indexNavigationBar;
var id = ['0','1','2','3','4','5','6','7','8','9'];
    });
var pd = ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹'];
for(var i=0;i<10;i++){
str = str.replace(new RegExp(id[i],'g'),pd[i]);
}
return str;
}
}


function faToEnDigits(str) {
mw.hook("wikipage.content").add(createNavigationBarToggleButton);
var id = ['0','1','2','3','4','5','6','7','8','9'];
var pd = ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹'];
for(var i=0;i<10;i++){
str = str.replace(new RegExp(pd[i],'g'),id[i]);
}
return str;
}


$('#wpTextbox1').wikiEditor('addToToolbar', {
/**********************************************************************
*  Add “Complete list of languages” link on Main Page
**********************************************************************/
mw.loader.using(["mediawiki.util"], function () {
    mw.log.deprecate(
        window,
        "addPortletLink",
        mw.util.addPortletLink,
        "Use mw.util.addPortletLink instead"
    );


sections: {
    if (["صفحهٔ_اصلی", "بحث:صفحه_اصلی"].includes(mw.config.get("wgPageName"))) {
digits: {
        $(function () {
type: 'toolbar',
            mw.util.addPortletLink(
label: 'تبدیل اعداد'
                "p-lang",
}
                "//meta.wikimedia.org/wiki/List_of_Wikipedias/fa",
},
                "فهرست کامل",
                "interwiki-completelist",
                "فهرست کامل"
            );
        });
    }
});


groups: {
/**********************************************************************
convert: {
*  WikiMiniAtlas loader
label: 'ابزار'
**********************************************************************/
}
(function () {
},
    var require_wikiminiatlas = false;
    var coord_filter = /geohack/;


tools: {
    $(function () {
        $("a.external.text").each(function (_, link) {
            if (link.href && coord_filter.test(link.href)) {
                require_wikiminiatlas = true;
                return false;
            }
        });


faDigits: {
        if ($("div.kmldata").length) {
label: 'اعداد فارسی',
            require_wikiminiatlas = true;
type: 'button',
        }
action: {
type: 'callback',
execute: function () {


var textarea = document.getElementById('wpTextbox1');
        if (require_wikiminiatlas) {
var start = textarea.selectionStart;
            mw.loader.load(
var end = textarea.selectionEnd;
                "//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript"
var text = textarea.value.substring(start,end);
            );
        }
    });
})();


textarea.value =
/**********************************************************************
textarea.value.substring(0,start) +
*  Source code pages should be LTR
enToFaDigits(text) +
**********************************************************************/
textarea.value.substring(end);
mw.loader.using(["mediawiki.util"], function () {
    if ([2, 4, 8].includes(mw.config.get("wgNamespaceNumber"))) {
        if (/\.(js|css|py)$/.test(mw.config.get("wgPageName"))) {
            mw.util.addCSS(
                ".diff-addedline, .diff-deletedline, .diff-context { direction: ltr; } " +
                    "#wpTextbox1 { direction: ltr; }"
            );
        }
    }


}
    // Hide WikiLove for newbies
}
    if (
},
        !mw.config.get("wgUserGroups").includes("autoconfirmed") ||
        mw.config.get("wgUserEditCount") < 100
    ) {
        mw.util.addCSS("#ca-wikilove { display: none; }");
    }
});


enDigits: {
/**********************************************************************
label: 'اعداد انگلیسی',
*  بهتر کردن نمایش فرمول‌ها در RTL
type: 'button',
**********************************************************************/
action: {
$(function () {
type: 'callback',
    $("span.mwe-math-mathml-inline").each(function () {
execute: function () {
        var $parent = $(this).parent();
        var $grand = $parent.parent();


var textarea = document.getElementById('wpTextbox1');
        if (
var start = textarea.selectionStart;
            $grand.is("p, dd") &&
var end = textarea.selectionEnd;
            $grand.text().trim() === $parent.text().trim()
var text = textarea.value.substring(start,end);
        ) {
            $grand.css({
                direction: "ltr",
                padding: "1em 0",
            });
        }
    });
});


textarea.value =
/**********************************************************************
textarea.value.substring(0,start) +
*  هشدار برای عنوان نادرست ایمیل
faToEnDigits(text) +
**********************************************************************/
textarea.value.substring(end);
$(function () {
    var row = $("#mw-input-wpSubject").parents("tr");
    if (row.length) {
        row.before(
            '<tr><td></td><td style="color:red;font-weight:bold">لطفاً عبارت Wikipedia e-mail ‌را با یک عنوان مناسب جایگزین کنید!</td></tr>'
        );
    }
});


}
/**********************************************************************
}
*  Bold reference numbers on click
}
**********************************************************************/
$("sup.reference").click(function () {
    var citeId = $(this).attr("id");
    var selector = 'sup > a[href="#' + citeId + '"]';
 
    $(selector).css({ color: "#2a4b8d", "font-weight": "bold" });
    $(selector).one("click", function () {
        $(this).css({ color: "", "font-weight": "" });
    });
});


}
/**********************************************************************
*  Hide FileExporter for non-free files  (fixed)
**********************************************************************/
$(function () {
    var nonFreeCats = [
        "محتویات غیر آزاد",
        "تصویرهای با منبع نامعلوم",
        "تصویرهای با پدیدآور نامشخص",
    ];


    if (
        $("#ca-fileExporter").length === 1 &&
        (mw.config.get("wgCategories") || []).some(function (cat) {
            return nonFreeCats.includes(cat);
        })
    ) {
        $("#ca-fileExporter").hide();
    }
});
});


/**********************************************************************
*  Advertisement banner (only for logged-out users)
**********************************************************************/
mw.loader.using("jquery", function () {
    $(function () {
        var disableAd = false;
        if (mw.config.get("wgUserName") !== null || disableAd) return;
        var adBanner = $(
            '<div id="site-ad-banner">' +
                '<a href="https://ble.ir/iranian_law" target="_blank">' +
                '<img src="https://www.illrc.ac.ir/wp-content/uploads/2026/03/1.jpg" alt="Advertisement" class="ad-img">' +
                "</a>" +
                '<button id="close-ad" title="بستن">✖</button>' +
                "</div>"
        );
        $("body").append(adBanner);
        $("#close-ad").on("click", function () {
            $("#site-ad-banner").fadeOut();
        });
    });
});
});
`

نسخهٔ کنونی تا ۲۲ مهٔ ۲۰۲۶، ساعت ۰۴:۲۸

/* global mw, $ */

/**********************************************************************
 *  Load edit.js for edit-related pages
 **********************************************************************/
if (
    mw.config.get("wgAction") === "edit" ||
    mw.config.get("wgAction") === "submit" ||
    mw.config.get("wgCanonicalSpecialPageName") === "Upload"
) {
    importScript("مدیاویکی:Common.js/edit.js");
}

/**********************************************************************
 *  Magic editintros
 **********************************************************************/
function addEditIntro(name) {
    $(".mw-editsection, #ca-edit")
        .find("a")
        .each(function () {
            this.href = $(this).attr("href") + "&editintro=" + name;
        });
}

if (mw.config.get("wgNamespaceNumber") === 0) {
    $(function () {
        if (document.getElementById("disambigbox")) {
            addEditIntro("Template:Disambig_editintro");
        }
    });

    $(function () {
        var cats = mw.config.get("wgCategories") || [];
        if (cats.includes("افراد زنده")) {
            addEditIntro("Template:BLP_editintro");
        }
    });
}

/**********************************************************************
 *  Load additional JS/CSS via URL (Secure)
 **********************************************************************/
mw.loader.using(["mediawiki.util"], function () {
    var extraCSS = mw.util.getParamValue("withCSS"),
        extraJS = mw.util.getParamValue("withJS");

    if (extraCSS) {
        if (/^MediaWiki:[^&<>=%#]*\.css$/.test(extraCSS)) {
            mw.loader.load(
                "/w/index.php?title=" +
                    encodeURIComponent(extraCSS) +
                    "&action=raw&ctype=text/css",
                "text/css"
            );
        } else {
            mw.notify("Only pages from the MediaWiki namespace are allowed.", {
                title: "Invalid withCSS value",
            });
        }
    }

    if (extraJS) {
        if (/^MediaWiki:[^&<>=%#]*\.js$/.test(extraJS)) {
            mw.loader.load(
                "/w/index.php?title=" +
                    encodeURIComponent(extraJS) +
                    "&action=raw&ctype=text/javascript"
            );
        } else {
            mw.notify("Only pages from the MediaWiki namespace are allowed.", {
                title: "Invalid withJS value",
            });
        }
    }
});

/**********************************************************************
 *  Auto-load Preloaded.js when needed
 **********************************************************************/
mw.loader.using(["mediawiki.util"], function () {
    if (mw.util.getParamValue("preload")) {
        mw.loader.load("MediaWiki:Preloaded.js");
    }
});

/**********************************************************************
 *  Collapsible tables (modern, safe)
 **********************************************************************/
function makeCollapsibleMwCollapsible($content) {
    var $tables = $content
        .find("table.collapsible:not(.mw-collapsible)")
        .addClass("mw-collapsible");

    $.each($tables, function (index, table) {
        if ($(table).hasClass("collapsed")) {
            $(table).addClass("mw-collapsed");
        }
    });

    if ($tables.length > 0) {
        mw.loader.using("jquery.makeCollapsible").then(function () {
            $tables.makeCollapsible();
        });
    }
}
mw.hook("wikipage.content").add(makeCollapsibleMwCollapsible);

/**********************************************************************
 *  AutoCollapse, InnerCollapse, OuterCollapse
 **********************************************************************/
function mwCollapsibleSetup($collapsibleContent) {
    var autoCollapseThreshold = 2;

    $.each($collapsibleContent, function (index, element) {
        var $element = $(element);

        if ($element.hasClass("collapsible")) {
            $element
                .find("tr:first-child > th:first-child")
                .prepend(
                    $element.find("tr:first-child > * > .mw-collapsible-toggle")
                );
        }

        // Auto collapse
        if (
            $collapsibleContent.length >= autoCollapseThreshold &&
            $element.hasClass("autocollapse")
        ) {
            $element.data("mw-collapsible").collapse();
        }

        // Inner collapse (requires outercollapse ancestor)
        if ($element.hasClass("innercollapse")) {
            if ($element.parents(".outercollapse").length > 0) {
                $element.data("mw-collapsible").collapse();
            }
        }

        // Ensure toggle inherits proper text color
        var $toggle = $element.find(".mw-collapsible-toggle");
        if ($toggle.length && $toggle.parent()[0].style.color) {
            $toggle.find("a").css("color", "inherit");
        }
    });
}
mw.hook("wikipage.collapsibleContent").add(mwCollapsibleSetup);

/**********************************************************************
 *  Dynamic Navigation Bars (single clean version)
 **********************************************************************/
var collapseCaption = "نهفتن";
var expandCaption = "نمایش";
var navigationBarHide = "[" + collapseCaption + "]";
var navigationBarShow = "[" + expandCaption + "]";

function toggleNavigationBar(indexNavigationBar, event) {
    var navToggle = document.getElementById("NavToggle" + indexNavigationBar);
    var navFrame = document.getElementById("NavFrame" + indexNavigationBar);
    var navChild;

    if (!navFrame || !navToggle) return false;

    var isShown = navToggle.firstChild.data === navigationBarHide;

    for (
        navChild = navFrame.firstChild;
        navChild !== null;
        navChild = navChild.nextSibling
    ) {
        if (navChild.nodeType === 1) {
            if (
                $(navChild).hasClass("NavContent") ||
                $(navChild).hasClass("NavPic")
            ) {
                navChild.style.display = isShown ? "none" : "block";
            }
        }
    }

    navToggle.firstChild.data = isShown
        ? navigationBarShow
        : navigationBarHide;

    event.preventDefault();
}

function createNavigationBarToggleButton($content) {
    var indexNavigationBar = 0;

    $content.find("div.NavFrame:not(.mw-collapsible)").each(function (_, navFrame) {
        indexNavigationBar++;

        var $navFrame = $(navFrame);
        var navToggle = document.createElement("a");
        navToggle.className = "NavToggle";
        navToggle.id = "NavToggle" + indexNavigationBar;
        navToggle.href = "#";

        $(navToggle).on(
            "click",
            $.proxy(toggleNavigationBar, null, indexNavigationBar)
        );

        var isCollapsed = $navFrame.hasClass("collapsed");

        // Determine if any child is hidden (compatibility)
        $(navFrame)
            .children()
            .each(function () {
                if (
                    this.nodeType === 1 &&
                    (this.style.display === "none") &&
                    ($(this).hasClass("NavContent") || $(this).hasClass("NavPic"))
                ) {
                    isCollapsed = true;
                }
            });

        // Apply initial collapsed state
        if (isCollapsed) {
            $(navFrame)
                .children()
                .each(function () {
                    if (
                        $(this).hasClass("NavContent") ||
                        $(this).hasClass("NavPic")
                    ) {
                        this.style.display = "none";
                    }
                });
        }

        navToggle.appendChild(
            document.createTextNode(
                isCollapsed ? navigationBarShow : navigationBarHide
            )
        );

        // Attach toggle to NavHead
        $(navFrame)
            .children()
            .each(function () {
                if ($(this).hasClass("NavHead")) {
                    navToggle.style.color = this.style.color;
                    this.appendChild(navToggle);
                }
            });

        navFrame.id = "NavFrame" + indexNavigationBar;
    });
}

mw.hook("wikipage.content").add(createNavigationBarToggleButton);

/**********************************************************************
 *  Add “Complete list of languages” link on Main Page
 **********************************************************************/
mw.loader.using(["mediawiki.util"], function () {
    mw.log.deprecate(
        window,
        "addPortletLink",
        mw.util.addPortletLink,
        "Use mw.util.addPortletLink instead"
    );

    if (["صفحهٔ_اصلی", "بحث:صفحه_اصلی"].includes(mw.config.get("wgPageName"))) {
        $(function () {
            mw.util.addPortletLink(
                "p-lang",
                "//meta.wikimedia.org/wiki/List_of_Wikipedias/fa",
                "فهرست کامل",
                "interwiki-completelist",
                "فهرست کامل"
            );
        });
    }
});

/**********************************************************************
 *  WikiMiniAtlas loader
 **********************************************************************/
(function () {
    var require_wikiminiatlas = false;
    var coord_filter = /geohack/;

    $(function () {
        $("a.external.text").each(function (_, link) {
            if (link.href && coord_filter.test(link.href)) {
                require_wikiminiatlas = true;
                return false;
            }
        });

        if ($("div.kmldata").length) {
            require_wikiminiatlas = true;
        }

        if (require_wikiminiatlas) {
            mw.loader.load(
                "//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript"
            );
        }
    });
})();

/**********************************************************************
 *  Source code pages should be LTR
 **********************************************************************/
mw.loader.using(["mediawiki.util"], function () {
    if ([2, 4, 8].includes(mw.config.get("wgNamespaceNumber"))) {
        if (/\.(js|css|py)$/.test(mw.config.get("wgPageName"))) {
            mw.util.addCSS(
                ".diff-addedline, .diff-deletedline, .diff-context { direction: ltr; } " +
                    "#wpTextbox1 { direction: ltr; }"
            );
        }
    }

    // Hide WikiLove for newbies
    if (
        !mw.config.get("wgUserGroups").includes("autoconfirmed") ||
        mw.config.get("wgUserEditCount") < 100
    ) {
        mw.util.addCSS("#ca-wikilove { display: none; }");
    }
});

/**********************************************************************
 *  بهتر کردن نمایش فرمول‌ها در RTL
 **********************************************************************/
$(function () {
    $("span.mwe-math-mathml-inline").each(function () {
        var $parent = $(this).parent();
        var $grand = $parent.parent();

        if (
            $grand.is("p, dd") &&
            $grand.text().trim() === $parent.text().trim()
        ) {
            $grand.css({
                direction: "ltr",
                padding: "1em 0",
            });
        }
    });
});

/**********************************************************************
 *  هشدار برای عنوان نادرست ایمیل
 **********************************************************************/
$(function () {
    var row = $("#mw-input-wpSubject").parents("tr");
    if (row.length) {
        row.before(
            '<tr><td></td><td style="color:red;font-weight:bold">لطفاً عبارت Wikipedia e-mail ‌را با یک عنوان مناسب جایگزین کنید!</td></tr>'
        );
    }
});

/**********************************************************************
 *  Bold reference numbers on click
 **********************************************************************/
$("sup.reference").click(function () {
    var citeId = $(this).attr("id");
    var selector = 'sup > a[href="#' + citeId + '"]';

    $(selector).css({ color: "#2a4b8d", "font-weight": "bold" });
    $(selector).one("click", function () {
        $(this).css({ color: "", "font-weight": "" });
    });
});

/**********************************************************************
 *  Hide FileExporter for non-free files  (fixed)
 **********************************************************************/
$(function () {
    var nonFreeCats = [
        "محتویات غیر آزاد",
        "تصویرهای با منبع نامعلوم",
        "تصویرهای با پدیدآور نامشخص",
    ];

    if (
        $("#ca-fileExporter").length === 1 &&
        (mw.config.get("wgCategories") || []).some(function (cat) {
            return nonFreeCats.includes(cat);
        })
    ) {
        $("#ca-fileExporter").hide();
    }
});

/**********************************************************************
 *  Advertisement banner (only for logged-out users)
 **********************************************************************/
mw.loader.using("jquery", function () {
    $(function () {
        var disableAd = false;

        if (mw.config.get("wgUserName") !== null || disableAd) return;

        var adBanner = $(
            '<div id="site-ad-banner">' +
                '<a href="https://ble.ir/iranian_law" target="_blank">' +
                '<img src="https://www.illrc.ac.ir/wp-content/uploads/2026/03/1.jpg" alt="Advertisement" class="ad-img">' +
                "</a>" +
                '<button id="close-ad" title="بستن">✖</button>' +
                "</div>"
        );

        $("body").append(adBanner);

        $("#close-ad").on("click", function () {
            $("#site-ad-banner").fadeOut();
        });
    });
});
`