Modul:Parallel
Tampilan
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