Module:Mooc

From Wikiversity
Jump to navigation Jump to search
 This module is part of the MOOC interface.

This is the central MOOC script to render a MOOC item at a wiki page.

Invokable functions[edit source]

The following functions are static and therefore can be invoked by wiki pages.

overview[edit source]

Renders the overview at the invoking page. The overview page lists all lessons the MOOC consists of.

Parameters:

  1. Frame: frame - WikiMedia frame object holding information about the invoking page

Returns: string representation of the overview page rendered


render[edit source]

Renders a MOOC item at the invoking page. The title of the invoking page is used to identify the item that should be rendered. Thus you can not invoke the module on non-MOOC pages: The page title must be a sub page of the MOOC page.

Parameters:

  1. Frame: frame - WikiMedia frame object holding information about the invoking page

Returns:

  • string representation of the item rendered
  • throws an error if the invoking page is not a child of the MOOC base
  • throws an error if the invoking page does not represent any MOOC item (see explanation above)


Instance functions[edit source]

The following functions are accessible by other Lua modules if they have access to a MOOC instance. Therefore they can not be invoked by wiki pages directly.

init[edit source]

Initializes the MOOC module. This method can be overridden and is supposed to register type handlers for all item types known. If the method is overridden you should always call the super method.

Parameters:

  1. String: baseUrl - page title of the MOOC base (the page where the MOOC is located)


addTypeHandler[edit source]

Registers a type handler for a MOOC item type.

Parameters:

  1. Mooc/TypeHandler: typeHandler - instance of the type handler to be registered


getBaseUrl[edit source]

Determines the page title of the MOOC base. This default implementation considers the root page of the invoking wiki page as MOOC base.

Returns: page title of the MOOC base


getIndexUrl[edit source]

Determines the page title of the default MOOC index. The default MOOC index is located `/MoocIndex` relative to the MOOC base.

Returns: page title of the MOOC index


getCurrentPath[edit source]

Gets the MOOC item path of the invoking wiki page. The MOOC item path is always relative to the MOOC base.

Returns:

  • MOOC item path of the invoking wiki page
  • nil if the invoking page is not a child of the MOOC base


getIndex[edit source]

Retrieves the plain wiki text content of the MOOC index page.

Returns:

  • wiki text of the MOOC index page
  • throws an error if the content retrieval failed


renderOverview[edit source]

Renders the overview at the invoking page. The overview page lists all lessons the MOOC consists of.

Parameters:

  1. Frame: frame - WikiMedia frame object holding information about the invoking page

Returns: string representation of the overview page rendered


renderItem[edit source]

Renders a MOOC item at the invoking page. At the moment a page can only render the item it represents. (item with the path equal to the page title relative to the MOOC base)

Parameters:

  1. Frame: frame - WikiMedia frame object holding information about the invoking page

Returns:

  • string representation of the item rendered
  • throws an error if the invoking page is not a child of the MOOC base
  • throws an error if the invoking page does not represent any MOOC item (see explanation above)


Local functions[edit source]

The following functions are local and therefore can not be invoked by wiki pages or other Lua modules.

getHandler[edit source]

Gets the type handler for a certain MOOC item type. The handler must be registered before e.g. by using `addTypeHandler`.

Parameters:

  1. String: typeIdentifier - identifier of the MOOC item type the handler is needed for

Returns:

  • template handler for the MOOC item type specified
  • throws an error if no registered type handler handles the item type specified

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;