🇮🇷 Iran Proxy | https://www.wikipedia.org/wiki/Module:Sandbox/ElanHR/test-category-module
Jump to content

Module:Sandbox/ElanHR/test-category-module

From Wikipedia, the free encyclopedia
-- For unit tests, see [[Module:Bananas/testcases]]
local p = {}

local messageBox = require('Module:Message box')
local mArguments -- Lazily initialise Module:Arguments
local wd = require('Module:Wikidata')

local wikidata_category_subclasses = {'Q28326730', 'Q23894246', 'Q13331174', 'Q20010800', 'Q58118449', 'Q38084761', 'Q30330522', 'Q24514938', 'Q24046192', 'Q23894233', 'Q20769287', 'Q59542487', 'Q59541917', 'Q56428020', 'Q54662266', 'Q30432511', 'Q24574745', 'Q24571879', 'Q15647814', 'Q15407973', 'Q4167836'}

-- local wd_id = 'Q4115189'
local wd_id = wd.pageId()

local set_cat_desc = 'Wikipedia:Categorization#Set category'

local topic_cat_desc = 'Wikipedia:Categorization#Topic category'

function p.get_page_type()
	local page_types = {}
	
	-- check if it's an instance of (P31) a country (Q6256) and terminate the chain if it is
	local inst = mw.wikibase.getAllStatements(wd_id, "P31")
	if #inst > 0 then
		for k, v in ipairs(inst) do
			local instid = v.mainsnak.datavalue.value.id
			-- stop if it's a country (or a country within the United Kingdom if skip is true)
			--if instid == "Q6256" or (skip and instid == "Q3336843") then
			if instid == 'Q59542487' then
				page_types['SET'] = true
			elseif instid == 'Q59541917' then
				page_types['TOPIC'] = true
			elseif instid == 'Q15647814' then
				page_types['ADMIN'] = true
			end
		end
	end
	

	return page_types
end

-- {{#invoke:Message box|cmbox}}

-- {{set cat}} definition
-- {{Cmbox
-- | type = notice
-- | text = This is a '''[[Wikipedia:Categorization#Set category|set category]]'''. It should only contain pages that are '''{{#if:{{{first|}}}|{{{first}}}|{{#if:{{{alternative|}}}|{{{alternative}}}|{{PAGENAME}}}}}}''' or '''lists of {{#if:{{{alternative|}}}|{{{alternative}}}|{{PAGENAME}}}}''', as well as '''[[Wikipedia:Categorization#Subcategorization|subcategories]]''' containing those things. Topics about {{#if:{{{alternative|}}}|{{{alternative}}}|{{PAGENAME}}}} in general should be placed in {{#if:{{{topic|}}}|[[:Category:{{{topic}}}]] or one of it subcategories|relevant [[Wikipedia:Categorization#Topic category|topic categories]]}}. {{#if:{{{single}}}|Categories related to only an individual {{{single}}} should not be in this category.}}
-- }}

-- {{Single namespace|category|[[Category:Set categories]]}

-- {{Wikipedia category|container=yes|hidden=yes|tracking=yes|shortcut=WP:CINA}}

local function get_sparql_queries()
	local sparql_queries = {}
	for i, item in pairs(mw.wikibase.getBestStatements(wd_id, 'P3921' )) do
	   sparql_queries[i] = item['mainsnak']['datavalue']['value']
	end
	return sparql_queries
end

-- {{#if:{{{sparql|}}}|
--	[//query.wikidata.org/# {{urlencode:{{{sparql|}}}|PATH}} SPARQL] {{!}} }}
function p.get_wdqs_link_for_query_with_en_articles(query)
	local select_query = 'SELECT ?item ?itemLabel ?itemDescription ?article  WHERE {SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }' .. query .. '  ?article schema:about ?item . ?article schema:isPartOf <https://en.wikipedia.org/>. }'
	local link_text = ''
	if query then 
		link_text = "https://query.wikidata.org/#" .. mw.uri.encode( select_query, "PATH" ) ..""
	end
	
	return link_text
end

function p.get_wdqs_link_for_query_without_en_articles(query)
	local select_query = 'SELECT ?item ?itemLabel ?itemDescription ?article  WHERE {SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }' .. query .. '  FILTER NOT EXISTS { ?article schema:about ?item . ?article schema:isPartOf <https://en.wikipedia.org/>. } }'
	local link_text = ''
	if query then 
		link_text = "https://query.wikidata.org/#" .. mw.uri.encode( select_query, "PATH" ) ..""
	end
	
	return link_text
end


local function get_category_contains()
	return ''
end

function p.hello()
	return "Hello, world!"
end

function p.test_template()
	local box = messageBox.main( 'cmbox', {
	    type='notice',
	    text='This is a test template. Wikidata ID:' .. wd.pageId(),
	    -- More parameters...
	})
	return box
end


function p.get_set_cat_template(set_item, set_item_pluralized, topic)
	local _item
	
	if set_item then
		_item = set_item
	elseif set_item_pluralized then
		_item = set_item_pluralized
	else
		_item = mw.title.getCurrentTitle().text
	end
	
	local _item_pluralized
	if set_item then
		_item_pluralized = set_item
	elseif set_item_pluralized then
		_item_pluralized = set_item_pluralized
	else
		_item_pluralized = mw.title.getCurrentTitle().text
	end
	
	local _topic
	if topic then
		_topic = topic
	else
		_topic = "[[:Category:{{{topic}}}]]"
	end
	
	-- local set_cat_item  = {}
	-- set_cat_item['entity-type'] = 'item'
	-- set_cat_item['numeric-id'] = '59542487'
	local set_cat_text = "This is a  [[".. set_cat_desc .."|set category]]. It should only contain pages that are " .. _item .. " or lists of " .. _item_pluralized ..  "as well as [[Wikipedia:Categorization#Subcategorization|subcategories]] containing those things."
	-- "Topics about " .. _item_pluralized .. " in general should be placed in " .. _topic .. " or one of it subcategories|relevant [[Wikipedia:Categorization#Topic category|topic categories]]}}. {{#if:{{{single}}}|Categories related to only an individual {{{single}}} should not be in this category.}}"
	
	
	local sparql_queries = get_sparql_queries()
	if sparql_queries then
		set_cat_text = set_cat_text .. '\n\n\nTools:\n<div class="toccolours mw-collapsible mw-collapsed";">\n'
		for i, item in pairs(sparql_queries) do
			set_cat_text = set_cat_text .. '* ['.. p.get_wdqs_link_for_query_with_en_articles(item) ..' EN articles]\n'
			set_cat_text = set_cat_text .. '* ['.. p.get_wdqs_link_for_query_without_en_articles(item) ..' No EN articles]\n'
			set_cat_text = set_cat_text .. '*  [https://petscan.wmflabs.org/?common_wiki_other=&edits%5Bbots%5D=both&ns%5B0%5D=1&wikidata_item=any&interface_language=en&language=en&search_max_results=500&categories='.. mw.title.getCurrentTitle().text ..'&edits%5Bflagged%5D=both&edits%5Banons%5D=both&cb_labels_any_l=1&project=wikipedia&cb_labels_no_l=1&depth=5&cb_labels_yes_l=1&langs_labels_any=&doit= petscan]'
			set_cat_text = set_cat_text .. '</div>'
			
			
			

		end
	end 
	
	local output_wikitext = messageBox.main( 'cmbox', {
	    type='notice',
	    text=set_cat_text
	    -- More parameters...
	})

	return output_wikitext
end 


function p._main(args)
	local page_types = p.get_page_type()
	

	if page_types['SET'] then
		return p.get_set_cat_template(args['first'], args['alternative'])
		--.. mw.title.getCurrentTitle().prefixedText .. '\n      ' .. mw.title.getCurrentTitle().text .. '\n      ' .. mw.title.getCurrentTitle().baseText .. '\n      ' .. mw.title.getCurrentTitle().subpageText .. '      '
	elseif page_types['TOPIC'] then
		return 'TOPIC CAT'
	end
	--if page_types['TOPIC'] then
		return tostring(page_types) ..' | HELLO |'.. tostring(wd_id)
		
	--end
end

function p.set_cat_template(frame)
	mArguments = require('Module:Arguments')
	local args = mArguments.getArgs(frame, {removeBlanks = false})
	local ret = p._main(args)
	return ret or ''
end


function p.dump(o)
	if type(o) == 'table' then
	  local s = '{ '
	  for k,v in pairs(o) do
	     if type(k) ~= 'number' then k = '"'..k..'"' end
	     s = s .. '['..k..'] = ' .. dump(v) .. ','
	  end
	  return s .. '} '
	else
	  return tostring(o)
	end
end

return p