Generate Launchpad Bug Links from tags

Parse tags, create buttons for originate-from bug links and JIRA links

// ==UserScript==
// @name         Generate Launchpad Bug Links from tags
// @namespace    http://anthonywong.net/
// @version      1.4
// @description  Parse tags, create buttons for originate-from bug links and JIRA links
// @match        https://bugs.launchpad.net/*/+bug/*
// @grant        none
// @license      GPLv2
// ==/UserScript==

(function () {
    'use strict';

    // Locate the <span id="tag-list"> element
    const tagsElement = document.querySelector('#tag-list');

    if (tagsElement) {
        // Extract the tags as text
        const tagsText = tagsElement.textContent;

        // Find all "originate-from-XXXX" patterns
        const originateMatches = tagsText.match(/originate-from-(\d+)/g);

        // Find all "jira-$JIRA_TICKET" patterns
        const jiraMatches = tagsText.match(/jira-([a-zA-Z0-9\-]+)/g);

        // Create a container for the buttons
        const buttonContainer = document.createElement("div");
        buttonContainer.style.marginTop = "10px";

        // Process originate-from tags
        if (originateMatches) {
            originateMatches.forEach((tag) => {
                const bugNumber = tag.replace("originate-from-", "");

                // Create a button
                const button = document.createElement("button");
                button.textContent = `Go to Bug ${bugNumber}`;
                button.style.marginRight = "5px";
                button.style.padding = "5px 10px";

                // Set up the button click event
                button.addEventListener("click", () => {
                    const bugUrl = `https://bugs.launchpad.net/ubuntu/+bug/${bugNumber}`;
                    window.open(bugUrl, "_blank");
                });

                // Add the button to the container
                buttonContainer.appendChild(button);
            });
        }

        // Process JIRA tags
        if (jiraMatches) {
            jiraMatches.forEach((tag) => {
                const jiraTicket = tag.replace("jira-", "").toUpperCase();

                // Create a button
                const button = document.createElement("button");
                button.textContent = `Go to JIRA ${jiraTicket}`;
                button.style.marginRight = "5px";
                button.style.padding = "5px 10px";

                // Set up the button click event
                button.addEventListener("click", () => {
                    const jiraUrl = `https://warthogs.atlassian.net/browse/${jiraTicket}`;
                    window.open(jiraUrl, "_blank");
                });

                // Add the button to the container
                buttonContainer.appendChild(button);
            });
        }

        // Append the container below the tags element
        if (buttonContainer.childNodes.length > 0) {
            tagsElement.parentNode.appendChild(buttonContainer);
        }
    }
})();