<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://chabadpedia.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bot+doubleredirects</id>
	<title>Chabadpedia - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://chabadpedia.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bot+doubleredirects"/>
	<link rel="alternate" type="text/html" href="https://chabadpedia.com/index.php/Special:Contributions/Bot_doubleredirects"/>
	<updated>2026-05-08T07:41:17Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/common.js&amp;diff=15464</id>
		<title>User:Bot doubleredirects/common.js</title>
		<link rel="alternate" type="text/html" href="https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/common.js&amp;diff=15464"/>
		<updated>2026-03-20T15:36:36Z</updated>

		<summary type="html">&lt;p&gt;Bot doubleredirects: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;importScript(&#039;User:Bot_doubleredirects/Gadget-DoubleRedirectFixer.js&#039;);&lt;/div&gt;</summary>
		<author><name>Bot doubleredirects</name></author>
	</entry>
	<entry>
		<id>https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/Gadget-DoubleRedirectFixer.js&amp;diff=15463</id>
		<title>User:Bot doubleredirects/Gadget-DoubleRedirectFixer.js</title>
		<link rel="alternate" type="text/html" href="https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/Gadget-DoubleRedirectFixer.js&amp;diff=15463"/>
		<updated>2026-03-20T15:34:13Z</updated>

		<summary type="html">&lt;p&gt;Bot doubleredirects: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(() =&amp;gt; {&lt;br /&gt;
  const BOT_USERS = [508];&lt;br /&gt;
  const api = new mw.Api();&lt;br /&gt;
&lt;br /&gt;
  const getRedirectContent = async (title) =&amp;gt; {&lt;br /&gt;
    return api.get({&lt;br /&gt;
      prop: &amp;quot;revisions&amp;quot;,&lt;br /&gt;
      titles: title,&lt;br /&gt;
      rvprop: &amp;quot;content&amp;quot;,&lt;br /&gt;
      rvslots: &amp;quot;*&amp;quot;,&lt;br /&gt;
      formatversion: &amp;quot;2&amp;quot;,&lt;br /&gt;
    });&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const getRedirectTarget = async (title) =&amp;gt; {&lt;br /&gt;
    const { query } = await api.get({&lt;br /&gt;
      titles: title,&lt;br /&gt;
      redirects: true,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    if (query?.pages) {&lt;br /&gt;
      const page = Object.values(query.pages).find((page) =&amp;gt; !page.missing);&lt;br /&gt;
      return page?.title ?? null;&lt;br /&gt;
    }&lt;br /&gt;
    return null;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const extractAnchorFromContent = (content) =&amp;gt; {&lt;br /&gt;
    const match = content.match(/\[\[.*?(?:#(.+?))?\]\]/);&lt;br /&gt;
    return match?.[1] ? `#${match[1]}` : &amp;quot;&amp;quot;;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const getNamespacePrefix = async (title) =&amp;gt; {&lt;br /&gt;
    const { query } = await api.get({&lt;br /&gt;
      titles: title,&lt;br /&gt;
      prop: &amp;quot;info&amp;quot;,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    if (query?.pages) {&lt;br /&gt;
      const page = Object.values(query.pages)[0];&lt;br /&gt;
      if (page.ns !== undefined) {&lt;br /&gt;
        const namespacePrefixes = {&lt;br /&gt;
          4: &#039;חב&amp;quot;דפדיה:&#039;,&lt;br /&gt;
          6: &amp;quot;קובץ:&amp;quot;,&lt;br /&gt;
          10: &amp;quot;תבנית:&amp;quot;,&lt;br /&gt;
          12: &amp;quot;עזרה:&amp;quot;,&lt;br /&gt;
          14: &amp;quot;קטגוריה:&amp;quot;,&lt;br /&gt;
        };&lt;br /&gt;
        return namespacePrefixes[page.ns] ?? &amp;quot;&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return &amp;quot;&amp;quot;;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const createRedirect = async (title, target) =&amp;gt; {&lt;br /&gt;
    try {&lt;br /&gt;
      await api.postWithEditToken({&lt;br /&gt;
        action: &amp;quot;edit&amp;quot;,&lt;br /&gt;
        format: &amp;quot;json&amp;quot;,&lt;br /&gt;
        bot: true,&lt;br /&gt;
        title: title,&lt;br /&gt;
        text: `#הפניה [[${target}]]`,&lt;br /&gt;
        summary: &amp;quot;תיקון הפניה כפולה&amp;quot;,&lt;br /&gt;
      });&lt;br /&gt;
      mw.notify(`\nstatus:${title} success`);&lt;br /&gt;
    } catch (error) {&lt;br /&gt;
      console.error(error);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const processRedirect = async (title) =&amp;gt; {&lt;br /&gt;
    try {&lt;br /&gt;
      const contentData = await getRedirectContent(title);&lt;br /&gt;
      const content =&lt;br /&gt;
        contentData.query.pages[0].revisions[0].slots.main.content;&lt;br /&gt;
      const anchor = extractAnchorFromContent(content);&lt;br /&gt;
&lt;br /&gt;
      const finalTarget = await getRedirectTarget(title);&lt;br /&gt;
      if (!finalTarget) return;&lt;br /&gt;
&lt;br /&gt;
      const namespace = await getNamespacePrefix(finalTarget);&lt;br /&gt;
      const fullTarget = namespace + finalTarget + anchor;&lt;br /&gt;
&lt;br /&gt;
      if (title === finalTarget) {&lt;br /&gt;
        alert(&amp;quot;הפניה מעגלית&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      console.log(&amp;quot;Creating redirect to:&amp;quot;, fullTarget);&lt;br /&gt;
      await createRedirect(title, fullTarget);&lt;br /&gt;
    } catch (error) {&lt;br /&gt;
      console.error(&amp;quot;Error processing redirect:&amp;quot;, error);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const init = async () =&amp;gt; {&lt;br /&gt;
    const userGroups = mw.config.get(&amp;quot;wgUserGroups&amp;quot;);&lt;br /&gt;
    const userId = mw.config.get(&amp;quot;wgUserId&amp;quot;);&lt;br /&gt;
    const pageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if (!userGroups.includes(&amp;quot;bot&amp;quot;) &amp;amp;&amp;amp; !BOT_USERS.includes(userId)) return;&lt;br /&gt;
    if (pageName !== &amp;quot;מיוחד:הפניות_כפולות&amp;quot;) return;&lt;br /&gt;
&lt;br /&gt;
    const num = prompt(&amp;quot;? כמה הפניות כפולות להציג&amp;quot;, 0);&lt;br /&gt;
    if (!num) return;&lt;br /&gt;
&lt;br /&gt;
    try {&lt;br /&gt;
      const { query } = await api.get({&lt;br /&gt;
        list: &amp;quot;querypage&amp;quot;,&lt;br /&gt;
        qppage: &amp;quot;DoubleRedirects&amp;quot;,&lt;br /&gt;
        qplimit: num,&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      const redirects = query.querypage.results;&lt;br /&gt;
      for (const redirect of redirects) {&lt;br /&gt;
        const title = redirect.title.replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
        await processRedirect(title);&lt;br /&gt;
      }&lt;br /&gt;
    } catch (error) {&lt;br /&gt;
      console.error(&amp;quot;Error fetching redirects:&amp;quot;, error);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  $(init);&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Bot doubleredirects</name></author>
	</entry>
	<entry>
		<id>https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/Gadget-DoubleRedirectFixer.js&amp;diff=11707</id>
		<title>User:Bot doubleredirects/Gadget-DoubleRedirectFixer.js</title>
		<link rel="alternate" type="text/html" href="https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/Gadget-DoubleRedirectFixer.js&amp;diff=11707"/>
		<updated>2025-07-10T14:49:20Z</updated>

		<summary type="html">&lt;p&gt;Bot doubleredirects: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// Credit: HaMiklolah (Improved version - allows execution for any logged-in user)&lt;br /&gt;
(() =&amp;gt; {&lt;br /&gt;
    const api = new mw.Api();&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Gets the content of the redirect page.&lt;br /&gt;
     * @param {string} title - The page title.&lt;br /&gt;
     * @returns {Promise&amp;lt;string|null&amp;gt;} The page content or null if an error occurred.&lt;br /&gt;
     */&lt;br /&gt;
    const getRedirectContent = async (title) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            const response = await api.get({&lt;br /&gt;
                prop: &amp;quot;revisions&amp;quot;,&lt;br /&gt;
                titles: title,&lt;br /&gt;
                rvprop: &amp;quot;content&amp;quot;,&lt;br /&gt;
                rvslots: &amp;quot;*&amp;quot;,&lt;br /&gt;
                formatversion: &amp;quot;2&amp;quot;,&lt;br /&gt;
            });&lt;br /&gt;
            const page = response.query?.pages?.[0];&lt;br /&gt;
            return page?.revisions?.[0]?.slots?.main?.content ?? null;&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;Error getting redirect content for &amp;quot; + title + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Gets the final redirect target.&lt;br /&gt;
     * @param {string} title - The title of the redirect page.&lt;br /&gt;
     * @returns {Promise&amp;lt;string|null&amp;gt;} The redirect target or null if not found.&lt;br /&gt;
     */&lt;br /&gt;
    const getRedirectTarget = async (title) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            const { query } = await api.get({&lt;br /&gt;
                titles: title,&lt;br /&gt;
                redirects: true, // Allows MediaWiki to follow redirects&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            if (query?.pages) {&lt;br /&gt;
                // Find the page that is not missing (the final target)&lt;br /&gt;
                const page = Object.values(query.pages).find((p) =&amp;gt; !p.missing);&lt;br /&gt;
                return page?.title ?? null;&lt;br /&gt;
            }&lt;br /&gt;
            return null;&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;Error getting redirect target for &amp;quot; + title + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Extracts the anchor from redirect content (e.g., [[Target_Page#anchor]]).&lt;br /&gt;
     * @param {string} content - The content of the redirect page.&lt;br /&gt;
     * @returns {string} The anchor with &#039;#&#039; if it exists, otherwise an empty string.&lt;br /&gt;
     */&lt;br /&gt;
    const extractAnchorFromContent = (content) =&amp;gt; {&lt;br /&gt;
        // Regex adjusted to look for &#039;#REDIRECT&#039;&lt;br /&gt;
        const match = content.match(/#REDIRECT\s*\[\[[^\]]+?(?:#(.+?))?\]\]/i); // &#039;i&#039; for case-insensitive&lt;br /&gt;
        return match?.[1] ? &amp;quot;#&amp;quot; + match[1] : &amp;quot;&amp;quot;;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Gets the namespace prefix of a page (e.g., &amp;quot;MediaWiki:&amp;quot;, &amp;quot;File:&amp;quot;).&lt;br /&gt;
     * @param {string} title - The page title.&lt;br /&gt;
     * @returns {Promise&amp;lt;string&amp;gt;} The namespace prefix or an empty string.&lt;br /&gt;
     */&lt;br /&gt;
    const getNamespacePrefix = async (title) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            const { query } = await api.get({&lt;br /&gt;
                titles: title,&lt;br /&gt;
                prop: &amp;quot;info&amp;quot;,&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            if (query?.pages) {&lt;br /&gt;
                const page = Object.values(query.pages)[0];&lt;br /&gt;
                if (page.ns !== undefined) {&lt;br /&gt;
                    // Standard MediaWiki namespaces. Adjust &#039;4&#039; if Chabadpedia uses a different name for NS 4.&lt;br /&gt;
                    const namespacePrefixes = {&lt;br /&gt;
                        0: &amp;quot;&amp;quot;, // Main/Article namespace&lt;br /&gt;
                        1: &amp;quot;Talk:&amp;quot;,&lt;br /&gt;
                        2: &amp;quot;User:&amp;quot;,&lt;br /&gt;
                        3: &amp;quot;User talk:&amp;quot;,&lt;br /&gt;
                        4: &amp;quot;Chabadpedia:&amp;quot;, // Common for English wikis, could also be &amp;quot;Project:&amp;quot; or &amp;quot;Wikipedia:&amp;quot;&lt;br /&gt;
                        5: &amp;quot;Chabadpedia talk:&amp;quot;,&lt;br /&gt;
                        6: &amp;quot;File:&amp;quot;,&lt;br /&gt;
                        7: &amp;quot;File talk:&amp;quot;,&lt;br /&gt;
                        8: &amp;quot;MediaWiki:&amp;quot;,&lt;br /&gt;
                        9: &amp;quot;MediaWiki talk:&amp;quot;,&lt;br /&gt;
                        10: &amp;quot;Template:&amp;quot;,&lt;br /&gt;
                        11: &amp;quot;Template talk:&amp;quot;,&lt;br /&gt;
                        12: &amp;quot;Help:&amp;quot;,&lt;br /&gt;
                        13: &amp;quot;Help talk:&amp;quot;,&lt;br /&gt;
                        14: &amp;quot;Category:&amp;quot;,&lt;br /&gt;
                        15: &amp;quot;Category talk:&amp;quot;,&lt;br /&gt;
                        // Add more custom namespaces here if applicable, using their numerical IDs.&lt;br /&gt;
                    };&lt;br /&gt;
                    return namespacePrefixes[page.ns] ?? &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            return &amp;quot;&amp;quot;;&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;Error getting namespace prefix for &amp;quot; + title + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            return &amp;quot;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Creates/fixes a redirect.&lt;br /&gt;
     * @param {string} title - The title of the page to become a redirect.&lt;br /&gt;
     * @param {string} target - The redirect target.&lt;br /&gt;
     */&lt;br /&gt;
    const createRedirect = async (title, target) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            await api.postWithEditToken({&lt;br /&gt;
                action: &amp;quot;edit&amp;quot;,&lt;br /&gt;
                format: &amp;quot;json&amp;quot;,&lt;br /&gt;
                title: title,&lt;br /&gt;
                // Changed from #הפניה to #REDIRECT&lt;br /&gt;
                text: &amp;quot;#REDIRECT [[&amp;quot; + target + &amp;quot;]]&amp;quot;,&lt;br /&gt;
                // Localized summary&lt;br /&gt;
                summary: &amp;quot;Bot: Fixing double redirect to [[&amp;quot; + target + &amp;quot;]]&amp;quot;,&lt;br /&gt;
            });&lt;br /&gt;
            // Localized success notification&lt;br /&gt;
            mw.notify(title + &amp;quot;: Redirect successfully fixed to &amp;quot; + target, { type: &#039;success&#039;, title: &#039;Success&#039; });&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;Error creating redirect for &amp;quot; + title + &amp;quot; to &amp;quot; + target + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            // Localized error notifications&lt;br /&gt;
            if (error.code === &#039;badtags&#039;) {&lt;br /&gt;
                mw.notify(title + &amp;quot;: Error: Permission denied to use edit tags. Please contact a system administrator.&amp;quot;, { type: &#039;error&#039;, title: &#039;Permission Error&#039; });&lt;br /&gt;
            } else {&lt;br /&gt;
                mw.notify(title + &amp;quot;: Failed to fix redirect. See console for details.&amp;quot;, { type: &#039;error&#039;, title: &#039;Error&#039; });&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Processes a single double redirect: finds the final target and fixes it.&lt;br /&gt;
     * @param {string} title - The page title of the double redirect.&lt;br /&gt;
     */&lt;br /&gt;
    const processRedirect = async (title) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            const content = await getRedirectContent(title);&lt;br /&gt;
            if (content === null) {&lt;br /&gt;
                mw.notify(title + &amp;quot;: Could not retrieve redirect page content.&amp;quot;, { type: &#039;warn&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            const anchor = extractAnchorFromContent(content);&lt;br /&gt;
            const finalTarget = await getRedirectTarget(title);&lt;br /&gt;
&lt;br /&gt;
            if (!finalTarget) {&lt;br /&gt;
                mw.notify(title + &amp;quot;: No final redirect target found.&amp;quot;, { type: &#039;warn&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            const namespace = await getNamespacePrefix(finalTarget);&lt;br /&gt;
            const fullTarget = namespace + finalTarget + anchor;&lt;br /&gt;
&lt;br /&gt;
            // Check to prevent circular redirects or unnecessary fixes&lt;br /&gt;
            if (title.replace(/_/g, &amp;quot; &amp;quot;) === finalTarget.replace(/_/g, &amp;quot; &amp;quot;) &amp;amp;&amp;amp; !anchor) {&lt;br /&gt;
                mw.notify(title + &amp;quot;: Redirect is already valid. No fix needed.&amp;quot;, { type: &#039;info&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (title.replace(/_/g, &amp;quot; &amp;quot;) === fullTarget.replace(/_/g, &amp;quot; &amp;quot;)) {&lt;br /&gt;
                mw.notify(title + &amp;quot;: Circular or valid redirect. No fix needed.&amp;quot;, { type: &#039;info&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            console.log(&amp;quot;Creating new redirect: &amp;quot; + title + &amp;quot; --&amp;gt; &amp;quot; + fullTarget);&lt;br /&gt;
            await createRedirect(title, fullTarget);&lt;br /&gt;
&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;Error processing double redirect for &amp;quot; + title + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            mw.notify(title + &amp;quot;: An error occurred while processing the redirect. See console for details.&amp;quot;, { type: &#039;error&#039;, title: &#039;Error&#039; });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * The main function that runs the script.&lt;br /&gt;
     */&lt;br /&gt;
    const init = async () =&amp;gt; {&lt;br /&gt;
        const pageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Ensure the script runs only on the Special:DoubleRedirects page&lt;br /&gt;
        if (pageName !== &amp;quot;Special:DoubleRedirects&amp;quot;) {&lt;br /&gt;
            console.log(&amp;quot;This script only runs on Special:DoubleRedirects.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        const numInput = prompt(&amp;quot;How many double redirects to display and fix? (Recommended to start with a small number, e.g., 10)&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
        const num = parseInt(numInput, 10);&lt;br /&gt;
&lt;br /&gt;
        if (isNaN(num) || num &amp;lt;= 0) {&lt;br /&gt;
            mw.notify(&amp;quot;Invalid input. Please enter a positive integer.&amp;quot;, { type: &#039;error&#039; });&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            mw.notify(&amp;quot;Starting check for &amp;quot; + num + &amp;quot; double redirects...&amp;quot;, { type: &#039;info&#039; });&lt;br /&gt;
&lt;br /&gt;
            // Get the list of double redirects via API&lt;br /&gt;
            const { query } = await api.get({&lt;br /&gt;
                list: &amp;quot;querypage&amp;quot;,&lt;br /&gt;
                qppage: &amp;quot;DoubleRedirects&amp;quot;,&lt;br /&gt;
                qplimit: num,&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            const redirects = query.querypage.results;&lt;br /&gt;
            if (redirects.length === 0) {&lt;br /&gt;
                mw.notify(&amp;quot;No double redirects found to fix.&amp;quot;, { type: &#039;info&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // Loop through each redirect and fix it&lt;br /&gt;
            for (const redirect of redirects) {&lt;br /&gt;
                const title = redirect.title.replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
                await processRedirect(title);&lt;br /&gt;
            }&lt;br /&gt;
            mw.notify(&amp;quot;Finished processing double redirects.&amp;quot;, { type: &#039;success&#039;, title: &#039;Finished&#039; });&lt;br /&gt;
&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;Error fetching double redirects:&amp;quot;, error);&lt;br /&gt;
            mw.notify(&amp;quot;An error occurred while fetching the list of double redirects.&amp;quot;, { type: &#039;error&#039;, title: &#039;General Error&#039; });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Run the script when the page is loaded&lt;br /&gt;
    $(init);&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Bot doubleredirects</name></author>
	</entry>
	<entry>
		<id>https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/Gadget-DoubleRedirectFixer.js&amp;diff=11706</id>
		<title>User:Bot doubleredirects/Gadget-DoubleRedirectFixer.js</title>
		<link rel="alternate" type="text/html" href="https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/Gadget-DoubleRedirectFixer.js&amp;diff=11706"/>
		<updated>2025-07-10T14:47:35Z</updated>

		<summary type="html">&lt;p&gt;Bot doubleredirects: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// קרדיט: המכלול (גרסה משופרת - מאפשרת הרצה לכל משתמש מחובר)&lt;br /&gt;
(() =&amp;gt; {&lt;br /&gt;
    const api = new mw.Api();&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * מקבל את תוכן דף ההפניה.&lt;br /&gt;
     * @param {string} title - שם הדף.&lt;br /&gt;
     * @returns {Promise&amp;lt;string|null&amp;gt;} תוכן הדף או null אם הייתה שגיאה.&lt;br /&gt;
     */&lt;br /&gt;
    const getRedirectContent = async (title) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            const response = await api.get({&lt;br /&gt;
                prop: &amp;quot;revisions&amp;quot;,&lt;br /&gt;
                titles: title,&lt;br /&gt;
                rvprop: &amp;quot;content&amp;quot;,&lt;br /&gt;
                rvslots: &amp;quot;*&amp;quot;,&lt;br /&gt;
                formatversion: &amp;quot;2&amp;quot;,&lt;br /&gt;
            });&lt;br /&gt;
            const page = response.query?.pages?.[0];&lt;br /&gt;
            return page?.revisions?.[0]?.slots?.main?.content ?? null;&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה בקבלת תוכן הפניה עבור &amp;quot; + title + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * מקבל את יעד ההפניה הסופי.&lt;br /&gt;
     * @param {string} title - שם דף ההפניה.&lt;br /&gt;
     * @returns {Promise&amp;lt;string|null&amp;gt;} יעד ההפניה או null אם לא נמצא.&lt;br /&gt;
     */&lt;br /&gt;
    const getRedirectTarget = async (title) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            const { query } = await api.get({&lt;br /&gt;
                titles: title,&lt;br /&gt;
                redirects: true, // מאפשר למדיה-וויקי לעקוב אחר הפניות&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            if (query?.pages) {&lt;br /&gt;
                // מצא את הדף שאינו חסר (היעד הסופי)&lt;br /&gt;
                const page = Object.values(query.pages).find((p) =&amp;gt; !p.missing);&lt;br /&gt;
                return page?.title ?? null;&lt;br /&gt;
            }&lt;br /&gt;
            return null;&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה בקבלת יעד ההפניה עבור &amp;quot; + title + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * מחלץ את העוגן (anchor) מתוך תוכן הפניה (לדוגמה: [[דף_יעד#עוגן]]).&lt;br /&gt;
     * @param {string} content - תוכן דף ההפניה.&lt;br /&gt;
     * @returns {string} העוגן עם &#039;#&#039; אם קיים, אחרת מחרוזת ריקה.&lt;br /&gt;
     */&lt;br /&gt;
    const extractAnchorFromContent = (content) =&amp;gt; {&lt;br /&gt;
        const match = content.match(/#REDIRECT\s*\[\[[^\]]+?(?:#(.+?))?\]\]/);&lt;br /&gt;
        return match?.[1] ? &amp;quot;#&amp;quot; + match[1] : &amp;quot;&amp;quot;;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * מקבל את קידומת מרחב השם של דף (לדוגמה: &amp;quot;מדיה ויקי:&amp;quot;, &amp;quot;קובץ:&amp;quot;).&lt;br /&gt;
     * @param {string} title - שם הדף.&lt;br /&gt;
     * @returns {Promise&amp;lt;string&amp;gt;} קידומת מרחב השם או מחרוזת ריקה.&lt;br /&gt;
     */&lt;br /&gt;
    const getNamespacePrefix = async (title) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            const { query } = await api.get({&lt;br /&gt;
                titles: title,&lt;br /&gt;
                prop: &amp;quot;info&amp;quot;,&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            if (query?.pages) {&lt;br /&gt;
                const page = Object.values(query.pages)[0];&lt;br /&gt;
                if (page.ns !== undefined) {&lt;br /&gt;
                    // יש להוסיף כאן מרחבי שמות נוספים במידת הצורך&lt;br /&gt;
                    const namespacePrefixes = {&lt;br /&gt;
                        4: &amp;quot;chabadpedia:&amp;quot;,    // Namespace 4&lt;br /&gt;
                        6: &amp;quot;File:&amp;quot;,       // Namespace 6&lt;br /&gt;
                        10: &amp;quot;Template:&amp;quot;,     // Namespace 10&lt;br /&gt;
                        12: &amp;quot;Help:&amp;quot;,      // Namespace 12&lt;br /&gt;
                        // ... ניתן להוסיף עוד מרחבי שמות לפי המספרים שלהם בוויקי&lt;br /&gt;
                    };&lt;br /&gt;
                    return namespacePrefixes[page.ns] ?? &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            return &amp;quot;&amp;quot;;&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה בקבלת קידומת מרחב שם עבור &amp;quot; + title + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            return &amp;quot;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * יוצר/מתקן הפניה.&lt;br /&gt;
     * @param {string} title - שם הדף שיהפוך להפניה.&lt;br /&gt;
     * @param {string} target - יעד ההפניה.&lt;br /&gt;
     */&lt;br /&gt;
    const createRedirect = async (title, target) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            await api.postWithEditToken({&lt;br /&gt;
                action: &amp;quot;edit&amp;quot;,&lt;br /&gt;
                format: &amp;quot;json&amp;quot;,&lt;br /&gt;
                // **השורות עם &amp;quot;tags&amp;quot; הוסרו לחלוטין כאן.**&lt;br /&gt;
                title: title,&lt;br /&gt;
                text: &amp;quot;#REDIRECT [[&amp;quot; + target + &amp;quot;]]&amp;quot;,&lt;br /&gt;
                summary: &amp;quot;בוט: מתקן הפניה כפולה ל- [[&amp;quot; + target + &amp;quot;]]&amp;quot;,&lt;br /&gt;
            });&lt;br /&gt;
            mw.notify(title + &amp;quot;: ההפניה תוקנה בהצלחה ל- &amp;quot; + target, { type: &#039;success&#039;, title: &#039;הצלחה&#039; });&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה ביצירת הפניה עבור &amp;quot; + title + &amp;quot; ל- &amp;quot; + target + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            // בדיקה ספציפית לשגיאת badtags&lt;br /&gt;
            if (error.code === &#039;badtags&#039;) {&lt;br /&gt;
                 mw.notify(title + &amp;quot;: שגיאה: אין הרשאה להשתמש בתגיות עריכה. אנא פנה למנהל המערכת.&amp;quot;, { type: &#039;error&#039;, title: &#039;שגיאת הרשאה&#039; });&lt;br /&gt;
            } else {&lt;br /&gt;
                 mw.notify(title + &amp;quot;: נכשל תיקון ההפניה. פרטים בקונסול.&amp;quot;, { type: &#039;error&#039;, title: &#039;שגיאה&#039; });&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * מעבד הפניה כפולה יחידה: מוצא את היעד הסופי ומתקן אותה.&lt;br /&gt;
     * @param {string} title - שם הדף של ההפניה הכפולה.&lt;br /&gt;
     */&lt;br /&gt;
    const processRedirect = async (title) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            const content = await getRedirectContent(title);&lt;br /&gt;
            if (content === null) {&lt;br /&gt;
                mw.notify(title + &amp;quot;: לא ניתן לאחזר תוכן דף ההפניה.&amp;quot;, { type: &#039;warn&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            const anchor = extractAnchorFromContent(content);&lt;br /&gt;
            const finalTarget = await getRedirectTarget(title);&lt;br /&gt;
&lt;br /&gt;
            if (!finalTarget) {&lt;br /&gt;
                mw.notify(title + &amp;quot;: לא נמצא יעד הפניה סופי.&amp;quot;, { type: &#039;warn&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            const namespace = await getNamespacePrefix(finalTarget);&lt;br /&gt;
            const fullTarget = namespace + finalTarget + anchor;&lt;br /&gt;
&lt;br /&gt;
            // בדיקה למניעת הפניות מעגליות או תיקונים מיותרים&lt;br /&gt;
            if (title.replace(/_/g, &amp;quot; &amp;quot;) === finalTarget.replace(/_/g, &amp;quot; &amp;quot;) &amp;amp;&amp;amp; !anchor) {&lt;br /&gt;
                mw.notify(title + &amp;quot;: ההפניה כבר תקינה. אין צורך בתיקון.&amp;quot;, { type: &#039;info&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (title.replace(/_/g, &amp;quot; &amp;quot;) === fullTarget.replace(/_/g, &amp;quot; &amp;quot;)) {&lt;br /&gt;
                mw.notify(title + &amp;quot;: הפניה מעגלית או תקינה. אין צורך בתיקון.&amp;quot;, { type: &#039;info&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            console.log(&amp;quot;יוצר הפניה חדשה: &amp;quot; + title + &amp;quot; --&amp;gt; &amp;quot; + fullTarget);&lt;br /&gt;
            await createRedirect(title, fullTarget);&lt;br /&gt;
&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה בעיבוד הפניה כפולה עבור &amp;quot; + title + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            mw.notify(title + &amp;quot;: אירעה שגיאה בעת עיבוד ההפניה. פרטים בקונסול.&amp;quot;, { type: &#039;error&#039;, title: &#039;שגיאה&#039; });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * הפונקציה הראשית שמפעילה את הסקריפט.&lt;br /&gt;
     */&lt;br /&gt;
    const init = async () =&amp;gt; {&lt;br /&gt;
        const pageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // ודא שהסקריפט רץ רק בדף ההפניות הכפולות&lt;br /&gt;
        if (pageName !== &amp;quot;Special:DoubleRedirects&amp;quot;) {&lt;br /&gt;
            console.log(&amp;quot;הסקריפט פועל רק בדף מיוחד:הפניות_כפולות.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        const numInput = prompt(&amp;quot;כמה הפניות כפולות להציג ולתקן? (מומלץ להתחיל עם מספר קטן, לדוגמה: 10)&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
        const num = parseInt(numInput, 10);&lt;br /&gt;
&lt;br /&gt;
        if (isNaN(num) || num &amp;lt;= 0) {&lt;br /&gt;
            mw.notify(&amp;quot;קלט לא חוקי. אנא הזן מספר שלם חיובי.&amp;quot;, { type: &#039;error&#039; });&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            mw.notify(&amp;quot;מתחיל בדיקת &amp;quot; + num + &amp;quot; הפניות כפולות...&amp;quot;, { type: &#039;info&#039; });&lt;br /&gt;
&lt;br /&gt;
            // קבלת רשימת ההפניות הכפולות באמצעות API&lt;br /&gt;
            const { query } = await api.get({&lt;br /&gt;
                list: &amp;quot;querypage&amp;quot;,&lt;br /&gt;
                qppage: &amp;quot;DoubleRedirects&amp;quot;,&lt;br /&gt;
                qplimit: num,&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            const redirects = query.querypage.results;&lt;br /&gt;
            if (redirects.length === 0) {&lt;br /&gt;
                mw.notify(&amp;quot;לא נמצאו הפניות כפולות לתיקון.&amp;quot;, { type: &#039;info&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // לולאה על כל הפניה ותיקונה&lt;br /&gt;
            for (const redirect of redirects) {&lt;br /&gt;
                const title = redirect.title.replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
                await processRedirect(title);&lt;br /&gt;
            }&lt;br /&gt;
            mw.notify(&amp;quot;סיום עיבוד ההפניות הכפולות.&amp;quot;, { type: &#039;success&#039;, title: &#039;סיום&#039; });&lt;br /&gt;
&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה באחזור הפניות כפולות:&amp;quot;, error);&lt;br /&gt;
            mw.notify(&amp;quot;אירעה שגיאה באחזור רשימת ההפניות הכפולות.&amp;quot;, { type: &#039;error&#039;, title: &#039;שגיאה כללית&#039; });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // הפעל את הסקריפט כאשר הדף נטען&lt;br /&gt;
    $(init);&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Bot doubleredirects</name></author>
	</entry>
	<entry>
		<id>https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/Gadget-DoubleRedirectFixer.js&amp;diff=11705</id>
		<title>User:Bot doubleredirects/Gadget-DoubleRedirectFixer.js</title>
		<link rel="alternate" type="text/html" href="https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/Gadget-DoubleRedirectFixer.js&amp;diff=11705"/>
		<updated>2025-07-10T14:42:40Z</updated>

		<summary type="html">&lt;p&gt;Bot doubleredirects: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// קרדיט: המכלול (גרסה משופרת - מאפשרת הרצה לכל משתמש מחובר)&lt;br /&gt;
(() =&amp;gt; {&lt;br /&gt;
    const api = new mw.Api();&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * מקבל את תוכן דף ההפניה.&lt;br /&gt;
     * @param {string} title - שם הדף.&lt;br /&gt;
     * @returns {Promise&amp;lt;string|null&amp;gt;} תוכן הדף או null אם הייתה שגיאה.&lt;br /&gt;
     */&lt;br /&gt;
    const getRedirectContent = async (title) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            const response = await api.get({&lt;br /&gt;
                prop: &amp;quot;revisions&amp;quot;,&lt;br /&gt;
                titles: title,&lt;br /&gt;
                rvprop: &amp;quot;content&amp;quot;,&lt;br /&gt;
                rvslots: &amp;quot;*&amp;quot;,&lt;br /&gt;
                formatversion: &amp;quot;2&amp;quot;,&lt;br /&gt;
            });&lt;br /&gt;
            const page = response.query?.pages?.[0];&lt;br /&gt;
            return page?.revisions?.[0]?.slots?.main?.content ?? null;&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה בקבלת תוכן הפניה עבור &amp;quot; + title + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * מקבל את יעד ההפניה הסופי.&lt;br /&gt;
     * @param {string} title - שם דף ההפניה.&lt;br /&gt;
     * @returns {Promise&amp;lt;string|null&amp;gt;} יעד ההפניה או null אם לא נמצא.&lt;br /&gt;
     */&lt;br /&gt;
    const getRedirectTarget = async (title) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            const { query } = await api.get({&lt;br /&gt;
                titles: title,&lt;br /&gt;
                redirects: true, // מאפשר למדיה-וויקי לעקוב אחר הפניות&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            if (query?.pages) {&lt;br /&gt;
                // מצא את הדף שאינו חסר (היעד הסופי)&lt;br /&gt;
                const page = Object.values(query.pages).find((p) =&amp;gt; !p.missing);&lt;br /&gt;
                return page?.title ?? null;&lt;br /&gt;
            }&lt;br /&gt;
            return null;&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה בקבלת יעד ההפניה עבור &amp;quot; + title + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * מחלץ את העוגן (anchor) מתוך תוכן הפניה (לדוגמה: [[דף_יעד#עוגן]]).&lt;br /&gt;
     * @param {string} content - תוכן דף ההפניה.&lt;br /&gt;
     * @returns {string} העוגן עם &#039;#&#039; אם קיים, אחרת מחרוזת ריקה.&lt;br /&gt;
     */&lt;br /&gt;
    const extractAnchorFromContent = (content) =&amp;gt; {&lt;br /&gt;
        const match = content.match(/#הפניה\s*\[\[[^\]]+?(?:#(.+?))?\]\]/);&lt;br /&gt;
        return match?.[1] ? &amp;quot;#&amp;quot; + match[1] : &amp;quot;&amp;quot;;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * מקבל את קידומת מרחב השם של דף (לדוגמה: &amp;quot;מדיה ויקי:&amp;quot;, &amp;quot;קובץ:&amp;quot;).&lt;br /&gt;
     * @param {string} title - שם הדף.&lt;br /&gt;
     * @returns {Promise&amp;lt;string&amp;gt;} קידומת מרחב השם או מחרוזת ריקה.&lt;br /&gt;
     */&lt;br /&gt;
    const getNamespacePrefix = async (title) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            const { query } = await api.get({&lt;br /&gt;
                titles: title,&lt;br /&gt;
                prop: &amp;quot;info&amp;quot;,&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            if (query?.pages) {&lt;br /&gt;
                const page = Object.values(query.pages)[0];&lt;br /&gt;
                if (page.ns !== undefined) {&lt;br /&gt;
                    // יש להוסיף כאן מרחבי שמות נוספים במידת הצורך&lt;br /&gt;
                    const namespacePrefixes = {&lt;br /&gt;
                        4: &amp;quot;chabadpedia:&amp;quot;,    // Namespace 4&lt;br /&gt;
                        6: &amp;quot;File:&amp;quot;,       // Namespace 6&lt;br /&gt;
                        10: &amp;quot;Template:&amp;quot;,     // Namespace 10&lt;br /&gt;
                        12: &amp;quot;Help:&amp;quot;,      // Namespace 12&lt;br /&gt;
                        // ... ניתן להוסיף עוד מרחבי שמות לפי המספרים שלהם בוויקי&lt;br /&gt;
                    };&lt;br /&gt;
                    return namespacePrefixes[page.ns] ?? &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            return &amp;quot;&amp;quot;;&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה בקבלת קידומת מרחב שם עבור &amp;quot; + title + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            return &amp;quot;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * יוצר/מתקן הפניה.&lt;br /&gt;
     * @param {string} title - שם הדף שיהפוך להפניה.&lt;br /&gt;
     * @param {string} target - יעד ההפניה.&lt;br /&gt;
     */&lt;br /&gt;
    const createRedirect = async (title, target) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            await api.postWithEditToken({&lt;br /&gt;
                action: &amp;quot;edit&amp;quot;,&lt;br /&gt;
                format: &amp;quot;json&amp;quot;,&lt;br /&gt;
                // **השורות עם &amp;quot;tags&amp;quot; הוסרו לחלוטין כאן.**&lt;br /&gt;
                title: title,&lt;br /&gt;
                text: &amp;quot;#הפניה [[&amp;quot; + target + &amp;quot;]]&amp;quot;,&lt;br /&gt;
                summary: &amp;quot;בוט: מתקן הפניה כפולה ל- [[&amp;quot; + target + &amp;quot;]]&amp;quot;,&lt;br /&gt;
            });&lt;br /&gt;
            mw.notify(title + &amp;quot;: ההפניה תוקנה בהצלחה ל- &amp;quot; + target, { type: &#039;success&#039;, title: &#039;הצלחה&#039; });&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה ביצירת הפניה עבור &amp;quot; + title + &amp;quot; ל- &amp;quot; + target + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            // בדיקה ספציפית לשגיאת badtags&lt;br /&gt;
            if (error.code === &#039;badtags&#039;) {&lt;br /&gt;
                 mw.notify(title + &amp;quot;: שגיאה: אין הרשאה להשתמש בתגיות עריכה. אנא פנה למנהל המערכת.&amp;quot;, { type: &#039;error&#039;, title: &#039;שגיאת הרשאה&#039; });&lt;br /&gt;
            } else {&lt;br /&gt;
                 mw.notify(title + &amp;quot;: נכשל תיקון ההפניה. פרטים בקונסול.&amp;quot;, { type: &#039;error&#039;, title: &#039;שגיאה&#039; });&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * מעבד הפניה כפולה יחידה: מוצא את היעד הסופי ומתקן אותה.&lt;br /&gt;
     * @param {string} title - שם הדף של ההפניה הכפולה.&lt;br /&gt;
     */&lt;br /&gt;
    const processRedirect = async (title) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            const content = await getRedirectContent(title);&lt;br /&gt;
            if (content === null) {&lt;br /&gt;
                mw.notify(title + &amp;quot;: לא ניתן לאחזר תוכן דף ההפניה.&amp;quot;, { type: &#039;warn&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            const anchor = extractAnchorFromContent(content);&lt;br /&gt;
            const finalTarget = await getRedirectTarget(title);&lt;br /&gt;
&lt;br /&gt;
            if (!finalTarget) {&lt;br /&gt;
                mw.notify(title + &amp;quot;: לא נמצא יעד הפניה סופי.&amp;quot;, { type: &#039;warn&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            const namespace = await getNamespacePrefix(finalTarget);&lt;br /&gt;
            const fullTarget = namespace + finalTarget + anchor;&lt;br /&gt;
&lt;br /&gt;
            // בדיקה למניעת הפניות מעגליות או תיקונים מיותרים&lt;br /&gt;
            if (title.replace(/_/g, &amp;quot; &amp;quot;) === finalTarget.replace(/_/g, &amp;quot; &amp;quot;) &amp;amp;&amp;amp; !anchor) {&lt;br /&gt;
                mw.notify(title + &amp;quot;: ההפניה כבר תקינה. אין צורך בתיקון.&amp;quot;, { type: &#039;info&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (title.replace(/_/g, &amp;quot; &amp;quot;) === fullTarget.replace(/_/g, &amp;quot; &amp;quot;)) {&lt;br /&gt;
                mw.notify(title + &amp;quot;: הפניה מעגלית או תקינה. אין צורך בתיקון.&amp;quot;, { type: &#039;info&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            console.log(&amp;quot;יוצר הפניה חדשה: &amp;quot; + title + &amp;quot; --&amp;gt; &amp;quot; + fullTarget);&lt;br /&gt;
            await createRedirect(title, fullTarget);&lt;br /&gt;
&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה בעיבוד הפניה כפולה עבור &amp;quot; + title + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            mw.notify(title + &amp;quot;: אירעה שגיאה בעת עיבוד ההפניה. פרטים בקונסול.&amp;quot;, { type: &#039;error&#039;, title: &#039;שגיאה&#039; });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * הפונקציה הראשית שמפעילה את הסקריפט.&lt;br /&gt;
     */&lt;br /&gt;
    const init = async () =&amp;gt; {&lt;br /&gt;
        const pageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // ודא שהסקריפט רץ רק בדף ההפניות הכפולות&lt;br /&gt;
        if (pageName !== &amp;quot;Special:DoubleRedirects&amp;quot;) {&lt;br /&gt;
            console.log(&amp;quot;הסקריפט פועל רק בדף מיוחד:הפניות_כפולות.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        const numInput = prompt(&amp;quot;כמה הפניות כפולות להציג ולתקן? (מומלץ להתחיל עם מספר קטן, לדוגמה: 10)&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
        const num = parseInt(numInput, 10);&lt;br /&gt;
&lt;br /&gt;
        if (isNaN(num) || num &amp;lt;= 0) {&lt;br /&gt;
            mw.notify(&amp;quot;קלט לא חוקי. אנא הזן מספר שלם חיובי.&amp;quot;, { type: &#039;error&#039; });&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            mw.notify(&amp;quot;מתחיל בדיקת &amp;quot; + num + &amp;quot; הפניות כפולות...&amp;quot;, { type: &#039;info&#039; });&lt;br /&gt;
&lt;br /&gt;
            // קבלת רשימת ההפניות הכפולות באמצעות API&lt;br /&gt;
            const { query } = await api.get({&lt;br /&gt;
                list: &amp;quot;querypage&amp;quot;,&lt;br /&gt;
                qppage: &amp;quot;DoubleRedirects&amp;quot;,&lt;br /&gt;
                qplimit: num,&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            const redirects = query.querypage.results;&lt;br /&gt;
            if (redirects.length === 0) {&lt;br /&gt;
                mw.notify(&amp;quot;לא נמצאו הפניות כפולות לתיקון.&amp;quot;, { type: &#039;info&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // לולאה על כל הפניה ותיקונה&lt;br /&gt;
            for (const redirect of redirects) {&lt;br /&gt;
                const title = redirect.title.replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
                await processRedirect(title);&lt;br /&gt;
            }&lt;br /&gt;
            mw.notify(&amp;quot;סיום עיבוד ההפניות הכפולות.&amp;quot;, { type: &#039;success&#039;, title: &#039;סיום&#039; });&lt;br /&gt;
&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה באחזור הפניות כפולות:&amp;quot;, error);&lt;br /&gt;
            mw.notify(&amp;quot;אירעה שגיאה באחזור רשימת ההפניות הכפולות.&amp;quot;, { type: &#039;error&#039;, title: &#039;שגיאה כללית&#039; });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // הפעל את הסקריפט כאשר הדף נטען&lt;br /&gt;
    $(init);&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Bot doubleredirects</name></author>
	</entry>
	<entry>
		<id>https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/Gadget-DoubleRedirectFixer.js&amp;diff=11622</id>
		<title>User:Bot doubleredirects/Gadget-DoubleRedirectFixer.js</title>
		<link rel="alternate" type="text/html" href="https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/Gadget-DoubleRedirectFixer.js&amp;diff=11622"/>
		<updated>2025-06-30T16:28:50Z</updated>

		<summary type="html">&lt;p&gt;Bot doubleredirects: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  (() =&amp;gt; {&lt;br /&gt;
  const api = new mw.Api();&lt;br /&gt;
&lt;br /&gt;
  const getRedirectContent = async (title) =&amp;gt; {&lt;br /&gt;
    return api.get({&lt;br /&gt;
      prop: &amp;quot;revisions&amp;quot;,&lt;br /&gt;
      titles: title,&lt;br /&gt;
      rvprop: &amp;quot;content&amp;quot;,&lt;br /&gt;
      rvslots: &amp;quot;*&amp;quot;,&lt;br /&gt;
      formatversion: &amp;quot;2&amp;quot;,&lt;br /&gt;
    });&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const getRedirectTarget = async (title) =&amp;gt; {&lt;br /&gt;
    const { query } = await api.get({&lt;br /&gt;
      titles: title,&lt;br /&gt;
      redirects: true,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    if (query?.pages) {&lt;br /&gt;
      const page = Object.values(query.pages).find((page) =&amp;gt; !page.missing);&lt;br /&gt;
      return page?.title ?? null;&lt;br /&gt;
    }&lt;br /&gt;
    return null;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const extractAnchorFromContent = (content) =&amp;gt; {&lt;br /&gt;
    const match = content.match(/\[\[.*?(?:#(.+?))?\]\]/);&lt;br /&gt;
    return match?.[1] ? `#${match[1]}` : &amp;quot;&amp;quot;;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const getNamespacePrefix = async (title) =&amp;gt; {&lt;br /&gt;
    const { query } = await api.get({&lt;br /&gt;
      titles: title,&lt;br /&gt;
      prop: &amp;quot;info&amp;quot;,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    if (query?.pages) {&lt;br /&gt;
      const page = Object.values(query.pages)[0];&lt;br /&gt;
      if (page.ns) {&lt;br /&gt;
        const namespacePrefixes = {&lt;br /&gt;
          4: &amp;quot;chabadpedia:&amp;quot;,&lt;br /&gt;
          6: &amp;quot;File:&amp;quot;,&lt;br /&gt;
          10: &amp;quot;Template:&amp;quot;,&lt;br /&gt;
          12: &amp;quot;Help:&amp;quot;,&lt;br /&gt;
        };&lt;br /&gt;
        return namespacePrefixes[page.ns] ?? &amp;quot;&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return &amp;quot;&amp;quot;;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const createRedirect = async (title, target) =&amp;gt; {&lt;br /&gt;
    try {&lt;br /&gt;
      await api.postWithEditToken({&lt;br /&gt;
        action: &amp;quot;edit&amp;quot;,&lt;br /&gt;
        format: &amp;quot;json&amp;quot;,&lt;br /&gt;
        tags: &amp;quot;doubleredirect-bot&amp;quot;,&lt;br /&gt;
        bot: true,&lt;br /&gt;
        title: title,&lt;br /&gt;
        text: `#REDIRECT [[${target}]]`,&lt;br /&gt;
      });&lt;br /&gt;
      mw.notify(`\nstatus:${title} succes`);&lt;br /&gt;
    } catch (error) {&lt;br /&gt;
      console.error(error);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const processRedirect = async (title) =&amp;gt; {&lt;br /&gt;
    try {&lt;br /&gt;
      const contentData = await getRedirectContent(title);&lt;br /&gt;
      const content =&lt;br /&gt;
        contentData.query.pages[0].revisions[0].slots.main.content;&lt;br /&gt;
      const anchor = extractAnchorFromContent(content);&lt;br /&gt;
&lt;br /&gt;
      const finalTarget = await getRedirectTarget(title);&lt;br /&gt;
      if (!finalTarget) return;&lt;br /&gt;
&lt;br /&gt;
      const namespace = await getNamespacePrefix(finalTarget);&lt;br /&gt;
      const fullTarget = namespace + finalTarget + anchor;&lt;br /&gt;
&lt;br /&gt;
      if (title === finalTarget) {&lt;br /&gt;
        alert(&amp;quot;הפניה מעגלית&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      console.log(&amp;quot;Creating redirect to:&amp;quot;, fullTarget);&lt;br /&gt;
      await createRedirect(title, fullTarget);&lt;br /&gt;
    } catch (error) {&lt;br /&gt;
      console.error(&amp;quot;Error processing redirect:&amp;quot;, error);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const init = async () =&amp;gt; {&lt;br /&gt;
    const userGroups = mw.config.get(&amp;quot;wgUserGroups&amp;quot;);&lt;br /&gt;
    const userId = mw.config.get(&amp;quot;wgUserId&amp;quot;);&lt;br /&gt;
    const pageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if (!userGroups.includes(&amp;quot;bot&amp;quot;) &amp;amp;&amp;amp; !BOT_USERS.includes(userId)) return;&lt;br /&gt;
    if (pageName !== &amp;quot;Special:DoubleRedirects&amp;quot;) return;&lt;br /&gt;
&lt;br /&gt;
    const num = prompt(&amp;quot;? כמה הפניות כפולות להציג&amp;quot;, 0);&lt;br /&gt;
    if (!num) return;&lt;br /&gt;
&lt;br /&gt;
    try {&lt;br /&gt;
      const { query } = await api.get({&lt;br /&gt;
        list: &amp;quot;querypage&amp;quot;,&lt;br /&gt;
        qppage: &amp;quot;DoubleRedirects&amp;quot;,&lt;br /&gt;
        qplimit: num,&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      const redirects = query.querypage.results;&lt;br /&gt;
      for (const redirect of redirects) {&lt;br /&gt;
        const title = redirect.title.replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
        await processRedirect(title);&lt;br /&gt;
      }&lt;br /&gt;
    } catch (error) {&lt;br /&gt;
      console.error(&amp;quot;Error fetching redirects:&amp;quot;, error);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  $(init);&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Bot doubleredirects</name></author>
	</entry>
	<entry>
		<id>https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/Gadget-DoubleRedirectFixer.js&amp;diff=11621</id>
		<title>User:Bot doubleredirects/Gadget-DoubleRedirectFixer.js</title>
		<link rel="alternate" type="text/html" href="https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/Gadget-DoubleRedirectFixer.js&amp;diff=11621"/>
		<updated>2025-06-30T16:26:40Z</updated>

		<summary type="html">&lt;p&gt;Bot doubleredirects: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  const BOT_USERS = [6163];&lt;br /&gt;
  const api = new mw.Api();&lt;br /&gt;
&lt;br /&gt;
  const getRedirectContent = async (title) =&amp;gt; {&lt;br /&gt;
    return api.get({&lt;br /&gt;
      prop: &amp;quot;revisions&amp;quot;,&lt;br /&gt;
      titles: title,&lt;br /&gt;
      rvprop: &amp;quot;content&amp;quot;,&lt;br /&gt;
      rvslots: &amp;quot;*&amp;quot;,&lt;br /&gt;
      formatversion: &amp;quot;2&amp;quot;,&lt;br /&gt;
    });&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const getRedirectTarget = async (title) =&amp;gt; {&lt;br /&gt;
    const { query } = await api.get({&lt;br /&gt;
      titles: title,&lt;br /&gt;
      redirects: true,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    if (query?.pages) {&lt;br /&gt;
      const page = Object.values(query.pages).find((page) =&amp;gt; !page.missing);&lt;br /&gt;
      return page?.title ?? null;&lt;br /&gt;
    }&lt;br /&gt;
    return null;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const extractAnchorFromContent = (content) =&amp;gt; {&lt;br /&gt;
    const match = content.match(/\[\[.*?(?:#(.+?))?\]\]/);&lt;br /&gt;
    return match?.[1] ? `#${match[1]}` : &amp;quot;&amp;quot;;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const getNamespacePrefix = async (title) =&amp;gt; {&lt;br /&gt;
    const { query } = await api.get({&lt;br /&gt;
      titles: title,&lt;br /&gt;
      prop: &amp;quot;info&amp;quot;,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    if (query?.pages) {&lt;br /&gt;
      const page = Object.values(query.pages)[0];&lt;br /&gt;
      if (page.ns) {&lt;br /&gt;
        const namespacePrefixes = {&lt;br /&gt;
          4: &amp;quot;chabadpedia:&amp;quot;,&lt;br /&gt;
          6: &amp;quot;File:&amp;quot;,&lt;br /&gt;
          10: &amp;quot;Template:&amp;quot;,&lt;br /&gt;
          12: &amp;quot;Help:&amp;quot;,&lt;br /&gt;
        };&lt;br /&gt;
        return namespacePrefixes[page.ns] ?? &amp;quot;&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return &amp;quot;&amp;quot;;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const createRedirect = async (title, target) =&amp;gt; {&lt;br /&gt;
    try {&lt;br /&gt;
      await api.postWithEditToken({&lt;br /&gt;
        action: &amp;quot;edit&amp;quot;,&lt;br /&gt;
        format: &amp;quot;json&amp;quot;,&lt;br /&gt;
        tags: &amp;quot;doubleredirect-bot&amp;quot;,&lt;br /&gt;
        bot: true,&lt;br /&gt;
        title: title,&lt;br /&gt;
        text: `#REDIRECT [[${target}]]`,&lt;br /&gt;
      });&lt;br /&gt;
      mw.notify(`\nstatus:${title} succes`);&lt;br /&gt;
    } catch (error) {&lt;br /&gt;
      console.error(error);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const processRedirect = async (title) =&amp;gt; {&lt;br /&gt;
    try {&lt;br /&gt;
      const contentData = await getRedirectContent(title);&lt;br /&gt;
      const content =&lt;br /&gt;
        contentData.query.pages[0].revisions[0].slots.main.content;&lt;br /&gt;
      const anchor = extractAnchorFromContent(content);&lt;br /&gt;
&lt;br /&gt;
      const finalTarget = await getRedirectTarget(title);&lt;br /&gt;
      if (!finalTarget) return;&lt;br /&gt;
&lt;br /&gt;
      const namespace = await getNamespacePrefix(finalTarget);&lt;br /&gt;
      const fullTarget = namespace + finalTarget + anchor;&lt;br /&gt;
&lt;br /&gt;
      if (title === finalTarget) {&lt;br /&gt;
        alert(&amp;quot;הפניה מעגלית&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      console.log(&amp;quot;Creating redirect to:&amp;quot;, fullTarget);&lt;br /&gt;
      await createRedirect(title, fullTarget);&lt;br /&gt;
    } catch (error) {&lt;br /&gt;
      console.error(&amp;quot;Error processing redirect:&amp;quot;, error);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const init = async () =&amp;gt; {&lt;br /&gt;
    const userGroups = mw.config.get(&amp;quot;wgUserGroups&amp;quot;);&lt;br /&gt;
    const userId = mw.config.get(&amp;quot;wgUserId&amp;quot;);&lt;br /&gt;
    const pageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if (!userGroups.includes(&amp;quot;bot&amp;quot;) &amp;amp;&amp;amp; !BOT_USERS.includes(userId)) return;&lt;br /&gt;
    if (pageName !== &amp;quot;Special:DoubleRedirects&amp;quot;) return;&lt;br /&gt;
&lt;br /&gt;
    const num = prompt(&amp;quot;? כמה הפניות כפולות להציג&amp;quot;, 0);&lt;br /&gt;
    if (!num) return;&lt;br /&gt;
&lt;br /&gt;
    try {&lt;br /&gt;
      const { query } = await api.get({&lt;br /&gt;
        list: &amp;quot;querypage&amp;quot;,&lt;br /&gt;
        qppage: &amp;quot;DoubleRedirects&amp;quot;,&lt;br /&gt;
        qplimit: num,&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      const redirects = query.querypage.results;&lt;br /&gt;
      for (const redirect of redirects) {&lt;br /&gt;
        const title = redirect.title.replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
        await processRedirect(title);&lt;br /&gt;
      }&lt;br /&gt;
    } catch (error) {&lt;br /&gt;
      console.error(&amp;quot;Error fetching redirects:&amp;quot;, error);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  $(init);&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Bot doubleredirects</name></author>
	</entry>
	<entry>
		<id>https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/Gadget-DoubleRedirectFixer.js&amp;diff=11620</id>
		<title>User:Bot doubleredirects/Gadget-DoubleRedirectFixer.js</title>
		<link rel="alternate" type="text/html" href="https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/Gadget-DoubleRedirectFixer.js&amp;diff=11620"/>
		<updated>2025-06-30T16:13:00Z</updated>

		<summary type="html">&lt;p&gt;Bot doubleredirects: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  const BOT_USERS = [6163];&lt;br /&gt;
  const api = new mw.Api();&lt;br /&gt;
&lt;br /&gt;
  const getRedirectContent = async (title) =&amp;gt; {&lt;br /&gt;
    return api.get({&lt;br /&gt;
      prop: &amp;quot;revisions&amp;quot;,&lt;br /&gt;
      titles: title,&lt;br /&gt;
      rvprop: &amp;quot;content&amp;quot;,&lt;br /&gt;
      rvslots: &amp;quot;*&amp;quot;,&lt;br /&gt;
      formatversion: &amp;quot;2&amp;quot;,&lt;br /&gt;
    });&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const getRedirectTarget = async (title) =&amp;gt; {&lt;br /&gt;
    const { query } = await api.get({&lt;br /&gt;
      titles: title,&lt;br /&gt;
      redirects: true,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    if (query?.pages) {&lt;br /&gt;
      const page = Object.values(query.pages).find((page) =&amp;gt; !page.missing);&lt;br /&gt;
      return page?.title ?? null;&lt;br /&gt;
    }&lt;br /&gt;
    return null;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const extractAnchorFromContent = (content) =&amp;gt; {&lt;br /&gt;
    const match = content.match(/\[\[.*?(?:#(.+?))?\]\]/);&lt;br /&gt;
    return match?.[1] ? `#${match[1]}` : &amp;quot;&amp;quot;;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const getNamespacePrefix = async (title) =&amp;gt; {&lt;br /&gt;
    const { query } = await api.get({&lt;br /&gt;
      titles: title,&lt;br /&gt;
      prop: &amp;quot;info&amp;quot;,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    if (query?.pages) {&lt;br /&gt;
      const page = Object.values(query.pages)[0];&lt;br /&gt;
      if (page.ns) {&lt;br /&gt;
        const namespacePrefixes = {&lt;br /&gt;
          4: &amp;quot;המכלול:&amp;quot;,&lt;br /&gt;
          6: &amp;quot;קובץ:&amp;quot;,&lt;br /&gt;
          10: &amp;quot;תבנית:&amp;quot;,&lt;br /&gt;
          12: &amp;quot;עזרה:&amp;quot;,&lt;br /&gt;
        };&lt;br /&gt;
        return namespacePrefixes[page.ns] ?? &amp;quot;&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return &amp;quot;&amp;quot;;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const createRedirect = async (title, target) =&amp;gt; {&lt;br /&gt;
    try {&lt;br /&gt;
      await api.postWithEditToken({&lt;br /&gt;
        action: &amp;quot;edit&amp;quot;,&lt;br /&gt;
        format: &amp;quot;json&amp;quot;,&lt;br /&gt;
        tags: &amp;quot;doubleredirect-bot&amp;quot;,&lt;br /&gt;
        bot: true,&lt;br /&gt;
        title: title,&lt;br /&gt;
        text: `#הפניה [[${target}]]`,&lt;br /&gt;
      });&lt;br /&gt;
      mw.notify(`\nstatus:${title} succes`);&lt;br /&gt;
    } catch (error) {&lt;br /&gt;
      console.error(error);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const processRedirect = async (title) =&amp;gt; {&lt;br /&gt;
    try {&lt;br /&gt;
      const contentData = await getRedirectContent(title);&lt;br /&gt;
      const content =&lt;br /&gt;
        contentData.query.pages[0].revisions[0].slots.main.content;&lt;br /&gt;
      const anchor = extractAnchorFromContent(content);&lt;br /&gt;
&lt;br /&gt;
      const finalTarget = await getRedirectTarget(title);&lt;br /&gt;
      if (!finalTarget) return;&lt;br /&gt;
&lt;br /&gt;
      const namespace = await getNamespacePrefix(finalTarget);&lt;br /&gt;
      const fullTarget = namespace + finalTarget + anchor;&lt;br /&gt;
&lt;br /&gt;
      if (title === finalTarget) {&lt;br /&gt;
        alert(&amp;quot;הפניה מעגלית&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      console.log(&amp;quot;Creating redirect to:&amp;quot;, fullTarget);&lt;br /&gt;
      await createRedirect(title, fullTarget);&lt;br /&gt;
    } catch (error) {&lt;br /&gt;
      console.error(&amp;quot;Error processing redirect:&amp;quot;, error);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const init = async () =&amp;gt; {&lt;br /&gt;
    const userGroups = mw.config.get(&amp;quot;wgUserGroups&amp;quot;);&lt;br /&gt;
    const userId = mw.config.get(&amp;quot;wgUserId&amp;quot;);&lt;br /&gt;
    const pageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if (!userGroups.includes(&amp;quot;bot&amp;quot;) &amp;amp;&amp;amp; !BOT_USERS.includes(userId)) return;&lt;br /&gt;
    if (pageName !== &amp;quot;מיוחד:הפניות_כפולות&amp;quot;) return;&lt;br /&gt;
&lt;br /&gt;
    const num = prompt(&amp;quot;? כמה הפניות כפולות להציג&amp;quot;, 0);&lt;br /&gt;
    if (!num) return;&lt;br /&gt;
&lt;br /&gt;
    try {&lt;br /&gt;
      const { query } = await api.get({&lt;br /&gt;
        list: &amp;quot;querypage&amp;quot;,&lt;br /&gt;
        qppage: &amp;quot;DoubleRedirects&amp;quot;,&lt;br /&gt;
        qplimit: num,&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      const redirects = query.querypage.results;&lt;br /&gt;
      for (const redirect of redirects) {&lt;br /&gt;
        const title = redirect.title.replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
        await processRedirect(title);&lt;br /&gt;
      }&lt;br /&gt;
    } catch (error) {&lt;br /&gt;
      console.error(&amp;quot;Error fetching redirects:&amp;quot;, error);&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  $(init);&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Bot doubleredirects</name></author>
	</entry>
	<entry>
		<id>https://chabadpedia.com/index.php?title=User:Bot_doubleredirects&amp;diff=11601</id>
		<title>User:Bot doubleredirects</title>
		<link rel="alternate" type="text/html" href="https://chabadpedia.com/index.php?title=User:Bot_doubleredirects&amp;diff=11601"/>
		<updated>2025-06-29T17:22:38Z</updated>

		<summary type="html">&lt;p&gt;Bot doubleredirects: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User bot owner}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;inputbox&amp;gt;&lt;br /&gt;
type=commenttitle&lt;br /&gt;
page=User talk:M.robin&lt;br /&gt;
default=בקשת הפעלת בוט הפניות&lt;br /&gt;
break=no&lt;br /&gt;
width=28&lt;br /&gt;
preload=תבנית:חתימה אוטומטית&lt;br /&gt;
buttonlabel=שלח&lt;br /&gt;
&amp;lt;/inputbox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Special:DoubleRedirects]]&lt;/div&gt;</summary>
		<author><name>Bot doubleredirects</name></author>
	</entry>
	<entry>
		<id>https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/Gadget-DoubleRedirectFixer.js&amp;diff=11600</id>
		<title>User:Bot doubleredirects/Gadget-DoubleRedirectFixer.js</title>
		<link rel="alternate" type="text/html" href="https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/Gadget-DoubleRedirectFixer.js&amp;diff=11600"/>
		<updated>2025-06-29T17:21:55Z</updated>

		<summary type="html">&lt;p&gt;Bot doubleredirects: Created page with &amp;quot;// קרדיט: המכלול (גרסה משופרת - מאפשרת הרצה לכל משתמש מחובר) (() =&amp;gt; {     const api = new mw.Api();      /**      * מקבל את תוכן דף ההפניה.      * @param {string} title - שם הדף.      * @returns {Promise&amp;lt;string|null&amp;gt;} תוכן הדף או null אם הייתה שגיאה.      */     const getRedirectContent = async (title) =&amp;gt; {         try {             const response = await api.get({                 pro...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;// קרדיט: המכלול (גרסה משופרת - מאפשרת הרצה לכל משתמש מחובר)&lt;br /&gt;
(() =&amp;gt; {&lt;br /&gt;
    const api = new mw.Api();&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * מקבל את תוכן דף ההפניה.&lt;br /&gt;
     * @param {string} title - שם הדף.&lt;br /&gt;
     * @returns {Promise&amp;lt;string|null&amp;gt;} תוכן הדף או null אם הייתה שגיאה.&lt;br /&gt;
     */&lt;br /&gt;
    const getRedirectContent = async (title) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            const response = await api.get({&lt;br /&gt;
                prop: &amp;quot;revisions&amp;quot;,&lt;br /&gt;
                titles: title,&lt;br /&gt;
                rvprop: &amp;quot;content&amp;quot;,&lt;br /&gt;
                rvslots: &amp;quot;*&amp;quot;,&lt;br /&gt;
                formatversion: &amp;quot;2&amp;quot;,&lt;br /&gt;
            });&lt;br /&gt;
            const page = response.query?.pages?.[0];&lt;br /&gt;
            return page?.revisions?.[0]?.slots?.main?.content ?? null;&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה בקבלת תוכן הפניה עבור &amp;quot; + title + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * מקבל את יעד ההפניה הסופי.&lt;br /&gt;
     * @param {string} title - שם דף ההפניה.&lt;br /&gt;
     * @returns {Promise&amp;lt;string|null&amp;gt;} יעד ההפניה או null אם לא נמצא.&lt;br /&gt;
     */&lt;br /&gt;
    const getRedirectTarget = async (title) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            const { query } = await api.get({&lt;br /&gt;
                titles: title,&lt;br /&gt;
                redirects: true, // מאפשר למדיה-וויקי לעקוב אחר הפניות&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            if (query?.pages) {&lt;br /&gt;
                // מצא את הדף שאינו חסר (היעד הסופי)&lt;br /&gt;
                const page = Object.values(query.pages).find((p) =&amp;gt; !p.missing);&lt;br /&gt;
                return page?.title ?? null;&lt;br /&gt;
            }&lt;br /&gt;
            return null;&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה בקבלת יעד ההפניה עבור &amp;quot; + title + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * מחלץ את העוגן (anchor) מתוך תוכן הפניה (לדוגמה: [[דף_יעד#עוגן]]).&lt;br /&gt;
     * @param {string} content - תוכן דף ההפניה.&lt;br /&gt;
     * @returns {string} העוגן עם &#039;#&#039; אם קיים, אחרת מחרוזת ריקה.&lt;br /&gt;
     */&lt;br /&gt;
    const extractAnchorFromContent = (content) =&amp;gt; {&lt;br /&gt;
        const match = content.match(/#הפניה\s*\[\[[^\]]+?(?:#(.+?))?\]\]/);&lt;br /&gt;
        return match?.[1] ? &amp;quot;#&amp;quot; + match[1] : &amp;quot;&amp;quot;;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * מקבל את קידומת מרחב השם של דף (לדוגמה: &amp;quot;מדיה ויקי:&amp;quot;, &amp;quot;קובץ:&amp;quot;).&lt;br /&gt;
     * @param {string} title - שם הדף.&lt;br /&gt;
     * @returns {Promise&amp;lt;string&amp;gt;} קידומת מרחב השם או מחרוזת ריקה.&lt;br /&gt;
     */&lt;br /&gt;
    const getNamespacePrefix = async (title) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            const { query } = await api.get({&lt;br /&gt;
                titles: title,&lt;br /&gt;
                prop: &amp;quot;info&amp;quot;,&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            if (query?.pages) {&lt;br /&gt;
                const page = Object.values(query.pages)[0];&lt;br /&gt;
                if (page.ns !== undefined) {&lt;br /&gt;
                    // יש להוסיף כאן מרחבי שמות נוספים במידת הצורך&lt;br /&gt;
                    const namespacePrefixes = {&lt;br /&gt;
                        4: &amp;quot;חבדפדיה:&amp;quot;,    // Namespace 4&lt;br /&gt;
                        6: &amp;quot;קובץ:&amp;quot;,       // Namespace 6&lt;br /&gt;
                        10: &amp;quot;תבנית:&amp;quot;,     // Namespace 10&lt;br /&gt;
                        12: &amp;quot;עזרה:&amp;quot;,      // Namespace 12&lt;br /&gt;
                        // ... ניתן להוסיף עוד מרחבי שמות לפי המספרים שלהם בוויקי&lt;br /&gt;
                    };&lt;br /&gt;
                    return namespacePrefixes[page.ns] ?? &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            return &amp;quot;&amp;quot;;&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה בקבלת קידומת מרחב שם עבור &amp;quot; + title + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            return &amp;quot;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * יוצר/מתקן הפניה.&lt;br /&gt;
     * @param {string} title - שם הדף שיהפוך להפניה.&lt;br /&gt;
     * @param {string} target - יעד ההפניה.&lt;br /&gt;
     */&lt;br /&gt;
    const createRedirect = async (title, target) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            await api.postWithEditToken({&lt;br /&gt;
                action: &amp;quot;edit&amp;quot;,&lt;br /&gt;
                format: &amp;quot;json&amp;quot;,&lt;br /&gt;
                // **השורות עם &amp;quot;tags&amp;quot; הוסרו לחלוטין כאן.**&lt;br /&gt;
                title: title,&lt;br /&gt;
                text: &amp;quot;#הפניה [[&amp;quot; + target + &amp;quot;]]&amp;quot;,&lt;br /&gt;
                summary: &amp;quot;בוט: מתקן הפניה כפולה ל- [[&amp;quot; + target + &amp;quot;]]&amp;quot;,&lt;br /&gt;
            });&lt;br /&gt;
            mw.notify(title + &amp;quot;: ההפניה תוקנה בהצלחה ל- &amp;quot; + target, { type: &#039;success&#039;, title: &#039;הצלחה&#039; });&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה ביצירת הפניה עבור &amp;quot; + title + &amp;quot; ל- &amp;quot; + target + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            // בדיקה ספציפית לשגיאת badtags&lt;br /&gt;
            if (error.code === &#039;badtags&#039;) {&lt;br /&gt;
                 mw.notify(title + &amp;quot;: שגיאה: אין הרשאה להשתמש בתגיות עריכה. אנא פנה למנהל המערכת.&amp;quot;, { type: &#039;error&#039;, title: &#039;שגיאת הרשאה&#039; });&lt;br /&gt;
            } else {&lt;br /&gt;
                 mw.notify(title + &amp;quot;: נכשל תיקון ההפניה. פרטים בקונסול.&amp;quot;, { type: &#039;error&#039;, title: &#039;שגיאה&#039; });&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * מעבד הפניה כפולה יחידה: מוצא את היעד הסופי ומתקן אותה.&lt;br /&gt;
     * @param {string} title - שם הדף של ההפניה הכפולה.&lt;br /&gt;
     */&lt;br /&gt;
    const processRedirect = async (title) =&amp;gt; {&lt;br /&gt;
        try {&lt;br /&gt;
            const content = await getRedirectContent(title);&lt;br /&gt;
            if (content === null) {&lt;br /&gt;
                mw.notify(title + &amp;quot;: לא ניתן לאחזר תוכן דף ההפניה.&amp;quot;, { type: &#039;warn&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            const anchor = extractAnchorFromContent(content);&lt;br /&gt;
            const finalTarget = await getRedirectTarget(title);&lt;br /&gt;
&lt;br /&gt;
            if (!finalTarget) {&lt;br /&gt;
                mw.notify(title + &amp;quot;: לא נמצא יעד הפניה סופי.&amp;quot;, { type: &#039;warn&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            const namespace = await getNamespacePrefix(finalTarget);&lt;br /&gt;
            const fullTarget = namespace + finalTarget + anchor;&lt;br /&gt;
&lt;br /&gt;
            // בדיקה למניעת הפניות מעגליות או תיקונים מיותרים&lt;br /&gt;
            if (title.replace(/_/g, &amp;quot; &amp;quot;) === finalTarget.replace(/_/g, &amp;quot; &amp;quot;) &amp;amp;&amp;amp; !anchor) {&lt;br /&gt;
                mw.notify(title + &amp;quot;: ההפניה כבר תקינה. אין צורך בתיקון.&amp;quot;, { type: &#039;info&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (title.replace(/_/g, &amp;quot; &amp;quot;) === fullTarget.replace(/_/g, &amp;quot; &amp;quot;)) {&lt;br /&gt;
                mw.notify(title + &amp;quot;: הפניה מעגלית או תקינה. אין צורך בתיקון.&amp;quot;, { type: &#039;info&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            console.log(&amp;quot;יוצר הפניה חדשה: &amp;quot; + title + &amp;quot; --&amp;gt; &amp;quot; + fullTarget);&lt;br /&gt;
            await createRedirect(title, fullTarget);&lt;br /&gt;
&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה בעיבוד הפניה כפולה עבור &amp;quot; + title + &amp;quot;:&amp;quot;, error);&lt;br /&gt;
            mw.notify(title + &amp;quot;: אירעה שגיאה בעת עיבוד ההפניה. פרטים בקונסול.&amp;quot;, { type: &#039;error&#039;, title: &#039;שגיאה&#039; });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * הפונקציה הראשית שמפעילה את הסקריפט.&lt;br /&gt;
     */&lt;br /&gt;
    const init = async () =&amp;gt; {&lt;br /&gt;
        const pageName = mw.config.get(&amp;quot;wgPageName&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // ודא שהסקריפט רץ רק בדף ההפניות הכפולות&lt;br /&gt;
        if (pageName !== &amp;quot;מיוחד:הפניות_כפולות&amp;quot;) {&lt;br /&gt;
            console.log(&amp;quot;הסקריפט פועל רק בדף מיוחד:הפניות_כפולות.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        const numInput = prompt(&amp;quot;כמה הפניות כפולות להציג ולתקן? (מומלץ להתחיל עם מספר קטן, לדוגמה: 10)&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
        const num = parseInt(numInput, 10);&lt;br /&gt;
&lt;br /&gt;
        if (isNaN(num) || num &amp;lt;= 0) {&lt;br /&gt;
            mw.notify(&amp;quot;קלט לא חוקי. אנא הזן מספר שלם חיובי.&amp;quot;, { type: &#039;error&#039; });&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            mw.notify(&amp;quot;מתחיל בדיקת &amp;quot; + num + &amp;quot; הפניות כפולות...&amp;quot;, { type: &#039;info&#039; });&lt;br /&gt;
&lt;br /&gt;
            // קבלת רשימת ההפניות הכפולות באמצעות API&lt;br /&gt;
            const { query } = await api.get({&lt;br /&gt;
                list: &amp;quot;querypage&amp;quot;,&lt;br /&gt;
                qppage: &amp;quot;DoubleRedirects&amp;quot;,&lt;br /&gt;
                qplimit: num,&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            const redirects = query.querypage.results;&lt;br /&gt;
            if (redirects.length === 0) {&lt;br /&gt;
                mw.notify(&amp;quot;לא נמצאו הפניות כפולות לתיקון.&amp;quot;, { type: &#039;info&#039; });&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // לולאה על כל הפניה ותיקונה&lt;br /&gt;
            for (const redirect of redirects) {&lt;br /&gt;
                const title = redirect.title.replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
                await processRedirect(title);&lt;br /&gt;
            }&lt;br /&gt;
            mw.notify(&amp;quot;סיום עיבוד ההפניות הכפולות.&amp;quot;, { type: &#039;success&#039;, title: &#039;סיום&#039; });&lt;br /&gt;
&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
            console.error(&amp;quot;שגיאה באחזור הפניות כפולות:&amp;quot;, error);&lt;br /&gt;
            mw.notify(&amp;quot;אירעה שגיאה באחזור רשימת ההפניות הכפולות.&amp;quot;, { type: &#039;error&#039;, title: &#039;שגיאה כללית&#039; });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // הפעל את הסקריפט כאשר הדף נטען&lt;br /&gt;
    $(init);&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Bot doubleredirects</name></author>
	</entry>
	<entry>
		<id>https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/common.js&amp;diff=11599</id>
		<title>User:Bot doubleredirects/common.js</title>
		<link rel="alternate" type="text/html" href="https://chabadpedia.com/index.php?title=User:Bot_doubleredirects/common.js&amp;diff=11599"/>
		<updated>2025-06-29T17:21:17Z</updated>

		<summary type="html">&lt;p&gt;Bot doubleredirects: Created page with &amp;quot;importScript(&amp;#039;User:Bot doubleredirects/Gadget-DoubleRedirectFixer.js&amp;#039;);&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;importScript(&#039;User:Bot doubleredirects/Gadget-DoubleRedirectFixer.js&#039;);&lt;/div&gt;</summary>
		<author><name>Bot doubleredirects</name></author>
	</entry>
	<entry>
		<id>https://chabadpedia.com/index.php?title=User:Bot_doubleredirects&amp;diff=11598</id>
		<title>User:Bot doubleredirects</title>
		<link rel="alternate" type="text/html" href="https://chabadpedia.com/index.php?title=User:Bot_doubleredirects&amp;diff=11598"/>
		<updated>2025-06-29T17:13:38Z</updated>

		<summary type="html">&lt;p&gt;Bot doubleredirects: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User bot owner}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;inputbox&amp;gt;&lt;br /&gt;
type=commenttitle&lt;br /&gt;
page=User talk:M.robin&lt;br /&gt;
default=בקשת הפעלת בוט הפניות&lt;br /&gt;
break=no&lt;br /&gt;
width=28&lt;br /&gt;
preload=תבנית:חתימה אוטומטית&lt;br /&gt;
buttonlabel=שלח&lt;br /&gt;
&amp;lt;/inputbox&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bot doubleredirects</name></author>
	</entry>
	<entry>
		<id>https://chabadpedia.com/index.php?title=User:Bot_doubleredirects&amp;diff=11597</id>
		<title>User:Bot doubleredirects</title>
		<link rel="alternate" type="text/html" href="https://chabadpedia.com/index.php?title=User:Bot_doubleredirects&amp;diff=11597"/>
		<updated>2025-06-29T17:09:43Z</updated>

		<summary type="html">&lt;p&gt;Bot doubleredirects: Created page with &amp;quot;{{User bot owner}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User bot owner}}&lt;/div&gt;</summary>
		<author><name>Bot doubleredirects</name></author>
	</entry>
</feed>