مسابقه سال اسلامیکال
همزمان با آغاز ماه رمضان، مسابقه سال اسلامیکال با هدف معرفی اسلامیکال و توسعه مقالات در زمینه اسلامی آغاز شده‌است. علاقه‌مندان به شرکت در این مسابقه می‌توانند تا پایان ماه رمضان ۱۴۴۶ قمری برای آن نام‌نویسی کنند. فهرستی از مقالات پیشنهادی جهت ایجاد در اینجا وجود دارد

پودمان:Subject bar

از اسلامیکال
پرش به ناوبری پرش به جستجو

توضیحات این پودمان می‌تواند در پودمان:Subject bar/توضیحات قرار گیرد.

local getPortalImage = require('Module:Portal').image


local p = {}

local function getArgNums(prefix, args)
    -- Returns a table containing the numbers of the arguments that exist for the specified prefix. For example, if the
    -- prefix was 'data', and 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
    local nums = {}
    for k, v in pairs(args) do
        local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
        if num then table.insert(nums, tonumber(kotlet)) end
    end
    table.sort(nums)
    return nums
end

local function makeHorizontalRule()
    local row = mw.html.create('tr')
    row
        :tag('td')
            :attr('colspan', '2')
            :tag('hr', {selfClosing = true})
    return tostring(row)
end

local function makeItem(image, text)
    local root = mw.html.create('li')
    root
        :css('float', 'right')
        :css('margin-right', '0.3em')
        :css('height', '3.6em')
        :tag('span')
            :css('display', 'inline-block')
            :css('margin-left', '0.3em')
            :css('width', '30px')
            :css('line-height', '3.6em')
            :css('text-align', 'center')
            :wikitext(image)
            :done()
        :tag('span')
            :css('display', 'inline-block')
            :css('width', '11em')
            :css('vertical-align', 'middle')
            :wikitext(text)
    return tostring(root)
end

local function makeRow(items, heading, subheading, options)
    if #items < 1 then return end
    local swapHeadingSize = type(options) == 'table' and options.swapHeadingSize or false
    local row = mw.html.create('tr')
    row
        :tag('td')
            :css('width', '125px')
            :cssText('border-left:solid 1px black; padding-left:3px; padding-right:3px;')
            :tag('span')
                :css('font-size', swapHeadingSize and '90%' or '125%')
                :wikitext(heading)
                :done()
            :tag('br', {selfClosing = true})
                :done()
            :tag('span')
                :css('font-size', swapHeadingSize and '125%' or '90%')
                :wikitext(subheading)
    local list = row:tag('td'):css('text-align', 'right'):tag('ul')
    for i, item in ipairs(items) do
        local image = item[1]
        local text = item[2]
        list
            :wikitext(makeItem(image, text))
    end
    return tostring(row)
end

local function makeNumberedRow(prefix, args, heading, subheading, getItemValsFunc, options)
    if args[prefix] then
        args[prefix .. '1'] = args[prefix]
    end
    local argNums = getArgNums(prefix, args)
    local items = {}
    for i, argNum in ipairs(argNums) do
        local image, text = getItemValsFunc(args[prefix .. tostring(argNum)])
        table.insert(items, {image, text})
    end
    return makeRow(items, heading, subheading, options)
end

local function checkPortalExists(portal)
	return not (mw.title.makeTitle(100, portal).id == 0)
end

local trackingEnabled = true

-- Check whether to do tracking in this namespace
-- Returns true unless the page is one of the banned namespaces
local function checkTrackingNamespace()
	local thisPage = mw.title.getCurrentTitle()
	if (thisPage.namespace == 1) -- Talk
		or (thisPage.namespace == 2) -- User
		or (thisPage.namespace == 3) -- User talk
		or (thisPage.namespace == 5) -- Wikipedia talk
		or (thisPage.namespace == 7) -- File talk
		or (thisPage.namespace == 11) -- Template talk
		or (thisPage.namespace == 15) -- Category talk
		or (thisPage.namespace == 101) -- Portal talk
		or (thisPage.namespace == 118) -- Draft
		or (thisPage.namespace == 119) -- Draft talk
		or (thisPage.namespace == 829) -- Module talk
		then
		return false
	end
	return true
end

-- Check whether to do tracking on this pagename
-- Returns false if the page title matches one of the banned strings
-- Otherwise returns true
local function checkTrackingPagename()
	local thisPage = mw.title.getCurrentTitle()
	local thisPageLC = mw.ustring.lower(thisPage.text)
	if (string.match(thisPageLC, "/بایگانی") ~= nil) then
		return false
	end
	if (string.match(thisPageLC, "/توضیحات") ~= nil) then
		return false
	end
	if (string.match(thisPageLC, "/تمرین") ~= nil) then
		return false
	end
	return true
end

local redlinkedportal = ""

function p._main(args)
	-- Tracking is on by default.
	-- It is disabled if any of the following is true
	-- 1/ the parameter "tracking" is set to 'no, 'n', or 'false'
	-- 2/ the current page fails the namespace tests in checkTrackingNamespace()
	-- 3/ the current page fails the pagename tests in checkTrackingPagename()
	if (args.tracking == 'no') or (args.tracking == 'n') or (args.tracking == 'false') then
		trackingEnabled = false
	end
	if (checkTrackingNamespace() == false) then
		trackingEnabled = false
	end
	if (checkTrackingPagename() == false) then
		trackingEnabled = false
	end

    local rows = {}
    --[=[ disabled per [[Wikipedia:Village pump (technical)/Archive 176#Suppress rendering of Template:Wikipedia books]]
    -- Get the book row text.
    local bookHeading = "'''[[Wikipedia:Books|Books]]'''"
    local bookSubheading = 'مشاهده یا ترتیب مجموعهٔ مقاله‌ها'
    local function getBookItemVals(book)
        local image = '[[File:Office-book.svg|30px|alt=|link=]]'
        local text = mw.ustring.format("'''''[[Book:%s|%s]]'''''", book, book)
        return image, text
    end
    local bookRow = makeNumberedRow('book', args, bookHeading, bookSubheading, getBookItemVals)
    table.insert(rows, bookRow)
    ]=]
    -- Get the portal row text
    local portalHeading = "'''[[درگاه:درونمایه/درگاه‌ها|درگاه‌ها]]'''"
    local portalSubheading = 'موضوع‌های مرتبط'
    local function getPortalItemVals(portal)
        local image = mw.ustring.format('[[File:%s|30x30px]]', getPortalImage{portal})
        local text = mw.ustring.format("'''''[[درگاه:%s|درگاه %s]]'''''", portal, portal)
		if not pcall(checkPortalExists, portal) or not checkPortalExists(portal) then
			-- Getting here means a redlinked portal has been found
				if trackingEnabled then
					redlinkedportal = '[[رده:الگوهای نوار موضوع با درگاه‌های پیوند قرمز]]'
				end
		end
        return image, text
    end
    local portalRow = makeNumberedRow('portal', args, portalHeading, portalSubheading, getPortalItemVals)
    table.insert(rows, portalRow)

    -- Get the sister projects row text.
    local sisters = {
        {arg = 'commons', image = 'Commons-logo.svg', prefix = 'commons', display = 'رسانه', from = 'ویکی‌انبار'},
        {arg = 'species', image = 'Wikispecies-logo.svg', prefix = 'wikispecies', display = 'دایرکتوری گونه‌ها', from = 'ویکی‌گونه'},
        {arg = 'voy', image = 'Wikivoyage-Logo-v3-icon.svg', prefix = 'voy', display = 'راهنمای سفر', from = 'ویکی‌سفر'},
        {arg = 'n', image = 'Wikinews-logo.svg', prefix = 'wikinews', display = 'گزارش‌های خبری', from = 'ویکی‌خبر'},
        {arg = 'wikt', image = 'Wiktionary-logo-v2.svg', prefix = 'wiktionary', postfix = 'English', display = 'تعاریف', from = 'ویکی‌واژه'},
        {arg = 'b', image = 'Wikibooks-logo.svg', prefix = 'wikibooks', display = 'کتاب‌های متنی', from = 'ویکی‌کتاب'},
        {arg = 'q', image = 'Wikiquote-logo.svg', prefix = 'wikiquote', display = 'گفتاوردها', from = 'ویکی‌گفتاورد'},
        {arg = 's', image = 'Wikisource-logo.svg', prefix = 'wikisource', display = 'متن منابع', from = 'ویکی‌نبشته'},
        {arg = 'v', image = 'Wikiversity logo 2017.svg', prefix = 'wikiversity', display = 'منابع یادگیری', from = 'ویکی‌دانشگاه'},
        {arg = 'd', image = 'Wikidata-logo.svg', prefix = 'wikidata', display = 'ویکی‌داده', from = 'ویکی‌داده'},
        {arg = 'spoken', image = 'Sound-icon.svg', prefix = 'spoken wikipedia', display = 'گوش‌دادن به این صفحه', from = 'اسلامیکال گفتاری'},
    }
    local sisterItems = {}
    for i, t in ipairs(sisters) do
        if args[t.arg] then
            -- Get the image value.
            local image = mw.ustring.format('[[File:%s|30x30px|alt=|link=]]', t.image)
            -- Get the text value.
            local prefix = t.prefix
            local search = args[t.arg .. '-search'] or mw.title.getCurrentTitle().text
            local postfix = t.postfix
            postfix = postfix and ('#' .. postfix) or ''
            local display = t.display
            local from = t.from
            local text = mw.ustring.format(
                '[[%s:Special:Search/%s%s|%s]]<br />از %s',
                prefix,    search,    postfix, display, from
            )
            if t.arg == 'spoken' then
            	 text = mw.ustring.format('%s در %s<br />[[File:%s]]',
                				display, from, args[t.arg] 
                )		
            end
            -- Add the values to the items table.
            table.insert(sisterItems, {image, text})
        end
    end
    local sisterHeading = "اطلاعات بیشتر کسب کنید"
    local sisterSubheading = "'''[[اسلامیکال:پروژه‌های خواهر ویکی‌مدیا|پروژه‌های خواهر]]'''"
    local sisterRow = makeRow(sisterItems, sisterHeading, sisterSubheading, {swapHeadingSize = true})
    table.insert(rows, sisterRow)

    -- Make the table.
    local root = mw.html.create('table')
    root
        :attr('role', 'presentation')
        :addClass('subjectbar')
        :addClass('noprint')
        :addClass('metadata')
        :addClass('plainlist')
        :wikitext(table.concat(rows, makeHorizontalRule()))

    return tostring(root)
end

function p.main(frame)
    -- If called via #invoke, use the args passed into the invoking template, or the args passed to #invoke if any exist. Otherwise
    -- assume args are being passed directly in from the debug console or from another Lua module.
    local origArgs
    if frame == mw.getCurrentFrame() then
        origArgs = frame:getParent().args
        for k, v in pairs(frame.args) do
            origArgs = frame.args
            break
        end
    else
        origArgs = frame
    end
    -- Remove blank arguments.
    local args = {}
    for k, v in pairs(origArgs) do
        if v ~= '' then
            args[k] = v
        end
    end
    return frame:extensionTag{ name = 'templatestyles', args = { src = 'نوار موضوع/styles.css'} } .. p._main(args) .. redlinkedportal
end

return p