Modul:Mooc
Die Dokumentation für dieses Modul kann unter Modul:Mooc/Doku erstellt werden
require("Module:Exception");
local inheritance = require("Module:Inheritance");
local Item = require("Module:Mooc/Data/Item");
local TypeHandler = require("Module:Mooc/TypeHandler");
local IndexParser = require("Module:Mooc/IndexParser");
local Unit = require("Module:Mooc/Data/Unit");
local Lesson = require("Module:Mooc/Data/Lesson");
local Mooc = inheritance.extend(inheritance.Class);
local handlers = {}
local function getHandler(typeIdentifier)
for k,v in pairs(handlers) do
if v:handlesType(typeIdentifier) then
return v;
end
end
local registered = {}
for k,v in pairs(handlers) do
table.insert(registered, k);
end
throw('there is no type handler for item type "' .. typeIdentifier .. '" registered. Registered: ' .. table.concat(registered, ",") .. ".\n");
end
function Mooc:init(baseUrl)
if baseUrl then
self.baseUrl = baseUrl;
end
self.typeHandlers = {}
-- register basic item types
self:addTypeHandler(TypeHandler(Unit.TYPE, "Module:Mooc/Data/Unit", "Module:Mooc/Template/Unit"));
self:addTypeHandler(TypeHandler(Lesson.TYPE, "Module:Mooc/Data/Lesson", "Module:Mooc/Template/Lesson"));
self.typeHandlers.getHandler = function(typeIdentifier)
return getHandler(typeIdentifier);
end
end
function Mooc:addTypeHandler(typeHandler)
handlers[typeHandler:getType():getIdentifier()] = typeHandler;
end
function Mooc:getBaseUrl()
if not self.baseUrl then
local crrTitle = mw.title.getCurrentTitle();
--TODO substitute with interwiki, nsText and rootText for non-expensive solution
--expensive
local rootTitle = crrTitle.rootPageTitle;
self.baseUrl = rootTitle.fullText;
end
return self.baseUrl;
end
function Mooc:getIndexUrl()
return self:getBaseUrl() .. "/MoocIndex";
end
function Mooc:getCurrentPath()
local crrUrl = mw.title.getCurrentTitle().fullText;
local baseUrl = self:getBaseUrl();
if string.sub(crrUrl:lower(), 1, string.len(baseUrl)) == baseUrl:lower() then
--TODO this disables to use "_" in item path
local crrPath = string.gsub(string.sub(crrUrl, string.len(baseUrl) + 2), "_", " ");
return crrPath;
end
return nil;
end
function Mooc:getIndex()
local indexUrl = self:getIndexUrl();
--expensive
local indexPage = mw.title.new(indexUrl);
local indexPlain = indexPage:getContent();
if indexPlain then
return indexPlain;
end
throw('failed to read index from URL "' .. indexUrl .. '"');
end
function Mooc:renderOverview(frame)
local overviewTemplate = require("Module:Mooc/Template/Overview");
local index = IndexParser.parseIndexOverview(self:getIndex(), self:getBaseUrl());
return overviewTemplate:render(frame, index, self);
end
function Mooc:renderItem(frame, itemPath)
local itemPath = itemPath;
if itemPath == nil then
itemPath = self:getCurrentPath();
if itemPath == nil then
throw("failed to render item: the page is not a child of the base page");
end
end
local index = IndexParser.parseIndex(self:getIndex(), itemPath, self:getBaseUrl());
if not index then
throw('failed to render item @ "' .. itemPath .. '": item not found');
end
local typeHandler = self.typeHandlers.getHandler(index["item"]:getTypeIdentifier());
return typeHandler:getTemplate():render(frame, index, self);
end
function Mooc.overview(frame)
local baseUrl = frame.args['base'];
local mooc = Mooc(baseUrl);
return mooc:renderOverview(frame);
end
function Mooc.render(frame)
local baseUrl = frame.args['base'];
local itemPath = frame.args['path'];
local mooc = Mooc(baseUrl);
return mooc:renderItem(frame, itemPath);
end
return Mooc;