Jump to content

Module:CodeToText: Difference between revisions

Created page with "local p = {} function p.test(frame) local pageName = frame.args.page or 'Module:Sandbox' local titleObj = mw.title.new(pageName) if not titleObj then return "Failed to create mw.title object for '" .. pageName .. "'" end local content = titleObj:getContent() if not content then return "No content for '" .. pageName .. "'" end return content end return p"
 
// via Wikitext Extension for VSCode
 
(20 intermediate revisions by the same user not shown)
Line 1: Line 1:
--[[
* Name: CodeToText
* Author: Mark W. Datysgeld
* Description: Utility for extracting content snippets from wiki pages using emoji hook markers placed at the beginning and end of desired content sections
* Notes: Example usage: {{#invoke:CodeToText|showSnippet|page=Module:Example|hook=⭐}}; Supports emoji hooks like 🪝, 📌, 🔖, ⭐ for both inline and block content extraction
]]
local p = {}
local p = {}


function p.test(frame)
function p.showSnippet(frame)
     local pageName = frame.args.page or 'Module:Sandbox'
     local pageName = frame.args.page
    if not pageName then
        return "Error: 'page' parameter is required"
    end
 
    local hook = frame.args.hook
    if not hook then
        return "Error: 'hook' parameter is required"
    end
 
     local titleObj = mw.title.new(pageName)
     local titleObj = mw.title.new(pageName)
     if not titleObj then
     if not titleObj then
Line 13: Line 29:
     end
     end


     return content
     -- Try inline hooks first
    local inlineSnippet = content:match(hook .. "(.-)" .. hook)
    if inlineSnippet then
        return inlineSnippet
    end
 
    -- Find block hooks
    local s, e = content:find(hook, 1, true)
    if not s then
        return "Error: Need at least 2 instances of hook '" .. hook .. "' in '" .. pageName .. "'"
    end
 
    local s2, e2 = content:find(hook, e + 1, true)
    if not s2 then
        return "Error: Need at least 2 instances of hook '" .. hook .. "' in '" .. pageName .. "'"
    end
 
    -- Extract text between the two hooks, excluding the hook lines
    local snippet = content:sub(e + 1, s2 - 1)
 
    -- Trim leading and trailing newlines
    if snippet:sub(1,1) == "\n" then
        snippet = snippet:sub(2)
    end
    if snippet:sub(-1) == "\n" then
        snippet = snippet:sub(1, -2)
    end
 
    return snippet
end
end


return p
return p

Latest revision as of 02:56, 25 August 2025

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

--[[
* Name: CodeToText
* Author: Mark W. Datysgeld
* Description: Utility for extracting content snippets from wiki pages using emoji hook markers placed at the beginning and end of desired content sections
* Notes: Example usage: {{#invoke:CodeToText|showSnippet|page=Module:Example|hook=⭐}}; Supports emoji hooks like 🪝, 📌, 🔖, ⭐ for both inline and block content extraction
]]

local p = {}

function p.showSnippet(frame)
    local pageName = frame.args.page
    if not pageName then
        return "Error: 'page' parameter is required"
    end

    local hook = frame.args.hook
    if not hook then
        return "Error: 'hook' parameter is required"
    end

    local titleObj = mw.title.new(pageName)
    if not titleObj then
        return "Failed to create mw.title object for '" .. pageName .. "'"
    end

    local content = titleObj:getContent()
    if not content then
        return "No content for '" .. pageName .. "'"
    end

    -- Try inline hooks first
    local inlineSnippet = content:match(hook .. "(.-)" .. hook)
    if inlineSnippet then
        return inlineSnippet
    end

    -- Find block hooks
    local s, e = content:find(hook, 1, true)
    if not s then
        return "Error: Need at least 2 instances of hook '" .. hook .. "' in '" .. pageName .. "'"
    end

    local s2, e2 = content:find(hook, e + 1, true)
    if not s2 then
        return "Error: Need at least 2 instances of hook '" .. hook .. "' in '" .. pageName .. "'"
    end

    -- Extract text between the two hooks, excluding the hook lines
    local snippet = content:sub(e + 1, s2 - 1)

    -- Trim leading and trailing newlines
    if snippet:sub(1,1) == "\n" then
        snippet = snippet:sub(2)
    end
    if snippet:sub(-1) == "\n" then
        snippet = snippet:sub(1, -2)
    end

    return snippet
end

return p