Jump to content

Module:Mscorewithpipes

From Wikisource
-- This is intended to be a clone of User:Ankry's Mscore module without the restrictions on page formatting imposed by that module.
--
-- The first example of its use is at [[Asleep in the Deep (1898)]].

local p = {}

function p.renderpagelist ( frame )
    local pagelist = frame.args
    local score_text = ''
    local structure_text = {}
    local layout_text = {}
    local lyric_text = {}
    local other_context_text = {}
    local context_types = {}
    for index, page in pairs( frame.args ) do
        local page_title = mw.title.makeTitle( 'Page', page )
        local page_text = page_title:getContent()
        local current_score = mw.ustring.match( page_text, "<score" .. ".*" .. "</score>" ) or ""
        local flags = {}
        for line in mw.ustring.gmatch(current_score, "(.-)\n") do
            if index == 1 and mw.ustring.match(line, "begin structure") then
                flags["structure"] = 1
            elseif index == 1 and mw.ustring.match(line, "end structure") then
                flags["structure"] = nil
            elseif index == 1 and mw.ustring.match(line, "begin layout") then
                flags["layout"] = 1
            elseif index == 1 and mw.ustring.match(line, "end layout") then
                flags["layout"] = nil
            elseif mw.ustring.match(line, "Lyrics.*begin context") then
                    for context_name, corresponding_part in mw.ustring.gmatch(line, '\context Lyrics = "([%u%l]+)" { \\lyricsto "([%u%l]+)"') do
                       flags["context"] = context_name
                       context_types[context_name] = { "Lyrics", corresponding_part }
                       if lyric_text[context_name] == nil then
                            lyric_text[context_name] = {}
                       end
                    end
            elseif mw.ustring.match(line, "begin context") then
                    for context_type, context_name in mw.ustring.gmatch(line, '\context ([%u%l]+) = "([%u%l]+)"') do
                        flags["context"] = context_name
                        context_types[context_name] = { context_type, "n/a" }
                        if other_context_text[context_name] == nil then
                            other_context_text[context_name] = {}
                        end
                    end
            elseif mw.ustring.match(line, "end context") then
                flags["context"] = nil
            else
                if index == 1 and flags["layout"] ~= nil then
                    table.insert(layout_text, line)
                elseif index == 1 and flags["structure"] ~= nil then
                    table.insert(structure_text, line)
                elseif flags["context"] ~= nil then
                    current_context_type = context_types[flags["context"]][1]
                    if current_context_type == 'Lyrics' then
                        table.insert(lyric_text[flags["context"]], line)
                    else
                        table.insert(other_context_text[flags["context"]], line)
                    end
                end
            end
        end
    end
    score_text = score_text .. "<<\n"
    score_text = score_text .. table.concat(structure_text, "\n") .. "\n"
    for name, text_table in pairs(other_context_text) do
        score_text = score_text .. "\\context " .. context_types[name][1] .. " = \"" .. name .. "\" {\n" .. table.concat(text_table, "\n") .. "\n}\n"
    end
    for name, text_table in pairs(lyric_text) do
        local corresponding_part = context_types[name][2]
        score_text = score_text .. "\\context Lyrics = \"" .. name .. "\" { \\lyricsto \"" .. corresponding_part .. "\" { \n" .. table.concat(text_table, "\n") .. "\n} }\n"
    end
    score_text = score_text .. ">>\n"
    score_text = score_text .. table.concat(layout_text, "\n")
    score_text = frame:extensionTag( 'score', score_text, { midi = "1", vorbis = "1" } )
    return score_text
end

return p