Lompat ke isi

Modul:Parallel

Dari Wikisumber bahasa Indonesia, perpustakaan bebas

Dokumentasi untuk modul ini dapat dibuat di Modul:Parallel/doc

-- A lua module for displaying parallel text (e.g., translations, comparisons)
-- Adapted from https://dev.miraheze.org/wiki/Module:Lyrics

local p = {};

local getArgs = require('Module:Arguments').getArgs;
local aCandy = require("Module:ACandy");
local a, raw = aCandy.a, aCandy.Raw;

-- RTL (Right-to-Left) language codes
local rtlLanguages = {
	ar = true,  -- Arabic
	he = true,  -- Hebrew
	fa = true,  -- Persian
	ur = true,  -- Urdu
	yi = true,  -- Yiddish
	arc = true, -- Aramaic
	ckb = true, -- Central Kurdish (Sorani)
}

function splitSeparator(text, separator)
	text = text or "";
	local result = {};
	local regex = string.format("[^%s]*%s", separator, separator);
	for line in string.gmatch(text .. separator, regex) do
		line = string.gsub(line, separator, "");
	    table.insert(result, line);
	end
	return result;
end

function parseColumns(args)
	local numColumns = tonumber(args['columns']) or -1;
	if numColumns == -1 then
		for i = 1, 10 do
			if not args[i] then
				numColumns = i - 1;
				break;
			end
		end
	end
	
	local columns = {};
	for i = 1, numColumns do
		table.insert(columns, splitSeparator(args[i], "\n"));
	end
	
	return numColumns, columns;
end

function isRTL(langCode)
	if not langCode then
		return false;
	end
	return rtlLanguages[langCode] == true;
end

function p.main(frame)
	local args = getArgs(frame, {parentFirst = true});
	
	local numColumns, columns = parseColumns(args);

	local langs = {};
	local styles = {};
	local numLines = 0;
	for i = 1, numColumns do
		langs[i] = args['lang' .. tostring(i)];
		styles[i] = args['style' .. tostring(i)];
		numLines = math.max(numLines, #columns[i]);
	end
	
	-- Check if first column is RTL
	local isFirstColumnRTL = isRTL(langs[1]);
	
	-- no-hover is true by default
	local noHover = (args['no-hover'] or "true") ~= "false";
	
	-- Create container with RTL class if needed
	local containerClasses = {"parallel-container"};
	if isFirstColumnRTL then
		table.insert(containerClasses, "parallel-rtl");
	end
	
	local result = a.div {
		class = table.concat(containerClasses, " "),
		style = args['container-style'],
		lang = isFirstColumnRTL and langs[1] or nil
	};
	
	for rowNumber = 1, numLines do
		local lineClasses = {"parallel-line"};
		local line = {};
		local lineHasContent = false;
		
		-- Jangan balik urutan kolom di Lua, biarkan CSS direction:rtl yang mengatur
		for col = 1, numColumns do
			local text = columns[col][rowNumber] or "";
			if text == "" then
				text = " ";
			else
				lineHasContent = true;
			end
			table.insert(line, a.div {
				class = "parallel-column",
				lang = langs[col],
				style = styles[col],
				raw(text)
			});
		end
		
		if not noHover and lineHasContent then
			table.insert(lineClasses, "parallel-hover");
		end
		
		result.children:insert(a.div {
			class = table.concat(lineClasses, " "),
			line
		});
	end
	
	local stylesheet = frame:extensionTag{ 
		name = 'templatestyles', 
		args = { src = 'Module:Parallel/styles.css' } 
	};
	
	return tostring(result) .. stylesheet;
end

return p