local _debug=nil
local p = {}
----------------------------------------------------------------------------------------------------
---------- Debug utilities -------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
-- addDebug() in /sanbox templates/modules adds a debug information to a global variable.
-- in non sandbox templates/modules is does nothing
function p.addDebug(functionName, text)
if not _debug then
return
end
_debug = _debug .. functionName .. ': ' .. mw.text.nowiki(text) .. '<BR/>'
end
-- getDebug() returns '' or a string prefixed by <prefix> containing the debug to be displayed
function p.getDebug(prefix)
if string.isNilOrEmpty(_debug) then
return ''
end
return prefix .. _debug
end
----------------------------------------------------------------------------------------------------
---------- String utilities ------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
-- Equivalent to java startsWith()
-- It has a testcase/non-regression module Module:Biology/testcases using testcase_string_startsWith()
function string.startsWith(longString, start)
if not longString or not start then
return false
end
local startLen = string.len(start)
if startLen > string.len(longString) then
return false
end
return string.sub(longString, 1, startLen) == start
end
-- Equivalent to java endsWith()
-- It has a testcase/non-regression module Module:Biology/testcases using testcase_string_endsWith()
function string.endsWith(longString, ending)
if not longString or not ending then
return false
end
local endingLen = string.len(ending)
if endingLen > string.len(longString) then
return false
end
return ending=='' or string.sub(longString,-endingLen)==ending
end
-- stringContains(long,small) is an improvment of string.find(longlower, smalllower)
-- it is case insensitiv + also returns true if long == small
-- It has a testcase/non-regression module Module:Biology/testcases using testcase_string_contains()
function string.contains(long, small)
if not long or not small then
return false
end
local longlower = string.lower(long)
local smalllower = string.lower(small)
if longlower == smalllower or string.find(longlower, smalllower, 1, true) then -- true for plaintext
return true
else
return false
end
end
-- stringUpperFirstLowerOthers(str) returns "Hello" out of "heLLO"
-- It has a testcase/non-regression module Module:Biology/testcases using testcase_string_upperFirstLowerOthers()
function string.upperFirstLowerOthers(str)
if not str then
return Nil
end
local length = string.len(str)
if length == 0 then
return ''
elseif length == 1 then
return string.upper(str)
else
return string.upper(string.sub(str,1,1)) .. string.lower(string.sub(str,2))
end
end
-- stringUpperFirst(str) returns "HeLlO" out of "heLlO"
-- It has a testcase/non-regression module Module:Biology/testcases using testcase_string_upperFirst()
function string.upperFirst(str)
if not str then
return Nil
end
local length = string.len(str)
if length == 0 then
return ''
elseif length == 1 then
return string.upper(str)
else
return string.upper(string.sub(str,1,1)) .. string.sub(str,2)
end
end
-- isTrue() transforms a string into a bool
-- Nil, '', '0', 'false', 'no' return false
-- other values return true
-- It has a testcase/non-regression module Module:Biology/testcases using testcase_string_isTrue()
function string.isTrue(stringValue)
if not stringValue then
return false
end
if string.len(stringValue) == 0 then
return false
end
stringValue = string.lower(mw.text.trim(stringValue))
if stringValue == '0' or stringValue == 'false' or stringValue == 'no' then
return false
end
return true
end
-- string.trimOrNullify() returns a trimmed string or nil if the trimmed string is empty
-- It has a testcase/non-regression module Module:Biology/testcases using testcase_string_trimOrNullify()
function string.trimOrNullify(str)
if not str then
return Nil
end
str = mw.text.trim(str)
if str == '' then
return Nil
end
return str
end
-- string.isNilOrEmpty() returns
-- * true for nil or '' or ' '
-- * false otherwise
-- It has a testcase/non-regression module Module:Biology/testcases using testcase_string_isNilOrEmpty()
function string.isNilOrEmpty(stringValue)
if not stringValue then
return true
end
if string.len(stringValue) == 0 then
return true
end
stringValue = mw.text.trim(stringValue)
if string.len(stringValue) == 0 then
return true
end
return false
end
----------------------------------------------------------------------------------------------------
---------- Namespace/articleName utilities ---------------------------------------------------------
----------------------------------------------------------------------------------------------------
-- getCurrentNamespace() returns the current namespace name ('gallery' instead of '')
-- It has a testcase/non-regression module Module:Biology/testcases using getCurrentNamespace() directly
function p.getCurrentNamespace()
local namespace = string.lower(mw.title.getCurrentTitle().nsText)
if string.len(namespace) == 0 then
namespace = 'gallery'
end
return namespace
end
-- isCurrentNamespaceACategory() returns true when called from a category
-- It has a testcase/non-regression module Module:Biology/testcases using isCurrentNamespaceACategory() directly
function p.isCurrentNamespaceACategory()
local namespace = string.lower(mw.title.getCurrentTitle().nsText)
if namespace == 'category' then
return true
else
return false
end
end
-- isCurrentNamespaceACategoryOrAGallery() returns true when called from a category or gallery
-- It has a testcase/non-regression module Module:Biology/testcases using isCurrentNamespaceACategoryOrAGallery() directly
function p.isCurrentNamespaceACategoryOrAGallery()
local namespace = string.lower(mw.title.getCurrentTitle().nsText)
if string.len(namespace) == 0 then
return true
elseif namespace == 'category' then
return true
else
return false
end
end
-- isCurrentNamespaceACategoryOrAGalleryOrATemplate() returns true when called from a category or gallery or template
-- It has a testcase/non-regression module Module:Biology/testcases using isCurrentNamespaceACategoryOrAGalleryOrATemplate() directly
function p.isCurrentNamespaceACategoryOrAGalleryOrATemplate()
local namespace = string.lower(mw.title.getCurrentTitle().nsText)
if namespace == '' then
return true
elseif namespace == 'category' then
return true
elseif namespace == 'template' then
return true
else
return false
end
end
-- suppressCategory() returns "Platanthera" out of "Category:Platanthera"
-- It has a testcase/non-regression module Module:Biology/testcases using testcase_suppressCategory()
function p.suppressCategory(category)
local twoPointStartPos, twoPointEndPos = string.find(category, ':', 1, true)
if twoPointStartPos then
category = string.sub(category,twoPointEndPos+1)
end
return category
end
-- suppressDisambiguation() returns "Platanthera" out of "Platanthera (genus)"
-- It has a testcase/non-regression module Module:Biology/testcases using testcase_suppressDisambiguation()
function p.suppressDisambiguation(name)
name = string.gsub(name, '_', ' ')
local start = string.find(name, '(', 1, true)
if not start then
return name
end
local endp = string.find(name, ')', start, true)
if not endp then
return name
end
local part1 = mw.text.trim(string.sub(name, 1, start-1))
local part2 = mw.text.trim(string.sub(name, endp+1))
if string.len(part1) == 0 then
return part2
elseif string.len(part2) == 0 then
return part1
else
return part1 .. ' ' .. part2
end
end
-- pageNameCorrespondToSpeciesOrInfraspecies() returns true for "Category:Pantera tigris" or "Pantera tigris subsp. tigris"
-- pageNameCorrespondToSpeciesOrInfraspecies() returns false for "Category:Phyllosasa", "× Phyllosasa", "Rosa nothosect. Cinnastylae", "Category:Rosa subg. Rosa"
-- It has a testcase/non-regression module Module:Biology/testcases using testcase_pageNameCorrespondToSpeciesOrInfraspecies()
function p.pageNameCorrespondToSpeciesOrInfraspecies(pageName)
if string.find(pageName, ' nothosect. ') then
return false
end
if string.find(pageName, ' subg. ') then
return false
end
pageName = p.suppressCategory(pageName)
pageName = p.suppressDisambiguation(pageName)
pageName = string.gsub(pageName, '×', '') -- '× Phyllosasa' is not an infraspecies
pageName = mw.text.trim(pageName)
if string.find(pageName, ' ') then
return true
else
return false
end
end
----------------------------------------------------------------------------------------------------
---------- Error utilities -------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
-- incorrectBiologyTemplateUsage() returns an error text (optional) and a 'Category:Pages with incorrect biology template usage'
-- Param sortkey: the sortkey for the category Pages with incorrect biology template usage
-- Param errorToDisplayOrNil: the error to display or nil in which case no error is displayed (only the category is added)
-- Param templateNameForDocOrNil: name of a template (without Template:) to which the red error will link. Clicking on the link will lead you to the template documentation.
-- If nil, the link will point to 'Category:Pages with incorrect biology template usage'
-- Param ignoreNamespaceOrNil:
-- It has a testcase/non-regression module Module:Biology/testcases using testcase_incorrectBiologyTemplateUsage()
function p.incorrectBiologyTemplateUsage(sortkey, errorToDisplayOrNil, templateNameForDocOrNil, ignoreNamespaceOrNil)
if not string.isTrue(ignoreNamespaceOrNil) then
if (templateNameForDocOrNil == 'Taxonavigation') then
if not p.isCurrentNamespaceACategoryOrAGalleryOrATemplate() then
return ''
end
else
if not p.isCurrentNamespaceACategoryOrAGallery() then
return ''
end
end
end
local text = ''
if errorToDisplayOrNil then
if templateNameForDocOrNil then
templateNameForDocOrNil = 'Template:' .. templateNameForDocOrNil
else
templateNameForDocOrNil = ':Category:Pages with incorrect biology template usage'
end
text = ' [[' .. templateNameForDocOrNil .. '|<span class="error">Error: ' .. errorToDisplayOrNil .. '</span>]]'
end
text = text .. ' [[Category:Pages with incorrect biology template usage|' .. sortkey .. ']] '
return text
end
-- incorrectBiologyTemplateUsageNoLink() returns an error text (optional) and a Category:Pages with incorrect biology template usage
-- Param sortkey: the sortkey for the category Pages with incorrect biology template usage
-- Param errorToDisplayOrNil: the error to display or nil in which case no error is displayed (only the category is added)
-- Param templateNameForDocOrNil:
-- Param ignoreNamespaceOrNil:
-- It has a testcase/non-regression module Module:Biology/testcases using testcase_incorrectBiologyTemplateUsageNoLink()
function p.incorrectBiologyTemplateUsageNoLink(sortkey, errorToDisplayOrNil, templateNameForDocOrNil, ignoreNamespaceOrNil)
if not string.isTrue(ignoreNamespaceOrNil) then
if (templateNameForDocOrNil == 'Taxonavigation') then
if not p.isCurrentNamespaceACategoryOrAGalleryOrATemplate() then
return ''
end
else
if not p.isCurrentNamespaceACategoryOrAGallery() then
return ''
end
end
end
local text = ''
if errorToDisplayOrNil then
text = ' <span class="error">Error: ' .. errorToDisplayOrNil .. '</span>'
end
text = text .. ' [[Category:Pages with incorrect biology template usage|' .. sortkey .. ']] '
return text
end
----------------------------------------------------------------------------------------------------
---------- Testcase public functions (return string) -----------------------------------------------
----------------------------------------------------------------------------------------------------
function p.testcase_string_startsWith(frame)
return tostring(string.startsWith(frame.args['string'],frame.args['start']))
end
function p.testcase_string_endsWith(frame)
return tostring(string.endsWith(frame.args['string'],frame.args['end']))
end
function p.testcase_string_contains(frame)
return tostring(string.contains(frame.args['long'],frame.args['small']))
end
function p.testcase_string_upperFirstLowerOthers(frame)
return tostring(string.upperFirstLowerOthers(frame.args['1'])) -- tostring for nil
end
function p.testcase_string_upperFirst(frame)
return tostring(string.upperFirst(frame.args['1'])) -- tostring for nil
end
function p.testcase_string_isTrue(frame)
return tostring(string.isTrue(frame.args['1']))
end
function p.testcase_string_trimOrNullify(frame)
return tostring(string.trimOrNullify(frame.args['1'])) -- tostring for nil
end
function p.testcase_string_isNilOrEmpty(frame)
return tostring(string.isNilOrEmpty(frame.args['1']))
end
function p.testcase_suppressCategory(frame)
return p.suppressCategory(frame.args['1'])
end
function p.testcase_suppressDisambiguation(frame)
return p.suppressDisambiguation(frame.args['1'])
end
function p.testcase_pageNameCorrespondToSpeciesOrInfraspecies(frame)
return tostring(p.pageNameCorrespondToSpeciesOrInfraspecies(frame.args['1']))
end
function p.testcase_incorrectBiologyTemplateUsage(frame)
local sortkey = frame.args['1']
local errorToDisplayOrNil = frame.args['2']
local templateNameForDocOrNil = frame.args['3']
local ignoreNamespaceOrNil = frame.args.ignoreNamespaceOrNil
if not ignoreNamespaceOrNil then
ignoreNamespaceOrNil = frame.args['4']
end
return mw.text.nowiki(p.incorrectBiologyTemplateUsage(sortkey, errorToDisplayOrNil, templateNameForDocOrNil, ignoreNamespaceOrNil))
end
function p.testcase_incorrectBiologyTemplateUsageNoLink(frame)
local sortkey = frame.args['1']
local errorToDisplayOrNil = frame.args['2']
local templateNameForDocOrNil = frame.args['3']
local ignoreNamespaceOrNil = frame.args.ignoreNamespaceOrNil
if not ignoreNamespaceOrNil then
ignoreNamespaceOrNil = frame.args['4']
end
return mw.text.nowiki(p.incorrectBiologyTemplateUsageNoLink(sortkey, errorToDisplayOrNil, templateNameForDocOrNil, ignoreNamespaceOrNil))
end
return p