Module:CopyEmbeddedStories: Difference between revisions

From Seven Sages of Rome
No edit summary
No edit summary
Line 1: Line 1:
-- Module:CopyEmbeddedStories
local p = {}
local p = {}


-- [Previous helper functions remain the same]
-- Function to fetch and format EmbeddedStory templates from a given page
-- Helper function to extract all EmbeddedStory templates from text
function p.fetchEmbeddedStories(frame)
local function extractEmbeddedStories(text)
     local pageTitle = frame.args["sourcePage"]
     local stories = {}
     if not pageTitle then
     -- Match all EmbeddedStory templates
        return "Error: No source page specified."
    for story in mw.ustring.gmatch(text, "{{EmbeddedStory.-}}") do
        table.insert(stories, story)
     end
     end
    return stories
end


-- Helper function to append templates to a page
    -- Get the wikitext content of the source page
local function appendToPage(title, templates)
     local content = mw.title.new(pageTitle):getContent()
    local page = mw.title.new(title)
    if not content then
    if not page then return false, "Invalid page title" end
         return "Error: Source page not found or empty."
   
     end
     local status, err = pcall(function()
        local pageText = mw.text.trim(mw.title.new(title):getContent() or "")
        -- Add a newline if the page isn't empty
        if pageText ~= "" then
            pageText = pageText .. "\n\n"
         end
        -- Append all templates
        for _, template in ipairs(templates) do
            pageText = pageText .. template .. "\n"
        end
       
        -- Save the page
        local success = page:update({
            text = pageText,
            summary = "Copied EmbeddedStory templates",
            minor = false
        })
        if not success then
            error("Failed to save page")
        end
    end)
   
     return status, err
end


-- Main function to copy templates
    -- Find all EmbeddedStory templates
function p.copyTemplates(frame)
     local templates = {}
     local sourcePage = frame.args[1]
     for embeddedStory in content:gmatch("{{EmbeddedStory.-}}") do
     local targetPage = frame.args[2]
         table.insert(templates, embeddedStory)
   
    if not sourcePage or not targetPage then
         return "Error: Source and target pages must be specified"
     end
     end
   
 
     -- Get source page content
     -- Return the extracted templates
     local sourceTitle = mw.title.new(sourcePage)
     if #templates == 0 then
    if not sourceTitle then
         return "No EmbeddedStory templates found on the source page."
        return "Error: Invalid source page title"
    end
   
    local sourceContent = sourceTitle:getContent()
    if not sourceContent then
         return "Error: Could not read source page"
     end
     end
   
    -- Extract templates
    local stories = extractEmbeddedStories(sourceContent)
    if #stories == 0 then
        return "No EmbeddedStory templates found on source page"
    end
   
    -- Copy templates to target page
    local success, err = appendToPage(targetPage, stories)
    if not success then
        return "Error copying templates: " .. (err or "unknown error")
    end
   
    return string.format("Successfully copied %d templates to %s", #stories, targetPage)
end
-- Function to generate form
function p.showForm(frame)
    local currentPage = mw.title.getCurrentTitle().text
   
    local html = string.format([[
<div class="template-copy-form">
<h3>Copy Embedded Stories</h3>
<div style="margin: 10px 0;">
<input type="text" id="targetPage" placeholder="Enter target page name" style="width: 300px; padding: 5px;"/>
<button onclick="copyTemplates()" style="margin-left: 10px; padding: 5px 10px;">Copy Stories</button>
</div>
<div id="copyResult" style="margin-top: 10px;"></div>
</div>
<script type="text/javascript">
function copyTemplates() {
    var targetPage = document.getElementById('targetPage').value;
    if (!targetPage) {
        mw.notify('Please enter a target page name');
        return;
    }
    var currentPage = %s;
   
    new mw.Api().post({
        action: 'parse',
        text: '{{#invoke:CopyEmbeddedStories|copyTemplates|' + currentPage + '|' + targetPage + '}}',
        contentmodel: 'wikitext'
    }).done(function(response) {
        mw.notify(response.parse.text['*']);
        document.getElementById('copyResult').innerHTML = response.parse.text['*'];
    }).fail(function(error) {
        mw.notify('Error copying templates');
        document.getElementById('copyResult').innerHTML = 'Error copying templates';
    });
}
</script>
]], mw.text.jsonEncode(currentPage))


     return frame:preprocess(html)
     return table.concat(templates, "\n")
end
end


return p
return p

Revision as of 20:12, 13 November 2024

Documentation for this module may be created at Module:CopyEmbeddedStories/doc

local p = {}

-- Function to fetch and format EmbeddedStory templates from a given page
function p.fetchEmbeddedStories(frame)
    local pageTitle = frame.args["sourcePage"]
    if not pageTitle then
        return "Error: No source page specified."
    end

    -- Get the wikitext content of the source page
    local content = mw.title.new(pageTitle):getContent()
    if not content then
        return "Error: Source page not found or empty."
    end

    -- Find all EmbeddedStory templates
    local templates = {}
    for embeddedStory in content:gmatch("{{EmbeddedStory.-}}") do
        table.insert(templates, embeddedStory)
    end

    -- Return the extracted templates
    if #templates == 0 then
        return "No EmbeddedStory templates found on the source page."
    end

    return table.concat(templates, "\n")
end

return p