Home
Random
Recent changes
Special pages
Community portal
Preferences
About Stockhub
Disclaimers
Search
User menu
Talk
Contributions
Create account
Log in
Editing
Module:Sandbox/Peter coxhead/Tests
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
require('strict') local TaxonItalics = require('Module:TaxonItalics') local ItalicTitle = require('Module:Italic title') local p = {} local l = {} -- separate out local functions function l.show(items) local result = "" for i = 1,#items,1 do result = result .. "|" .. items[i] .. "<sub>" .. mw.ustring.len(items[i]) .. "</sub>" end return result .. "|" end -- ***************************************************************************** -- ========= Constants for states ========= local startState = 0 local italState = 1 local whiteSpState = 2 local nonItalState = 3 local entityState = 4 local endState = 9 -- Split a string representing a taxon name into 'units'. function l.doSplitTaxonName(str) -- connecting terms that are not italicized local cTerms = { --subsp. subspecies = "subsp.", ["subsp."] = "subsp.", subsp = "subsp.", ["ssp."] = "subsp.", ssp = "subsp.", --var. varietas = "var.", ["var."] = "var.", var = "var.", --subvar. subvarietas = "subvar.", ["subvar."] = "subvar.", subvar = "subvar.", --f. forma = "f.", ["f."] = "f.", f = "f.", --subf. subforma = "subf.", ["subf."] = "subf.", subf = "subf.", --subg. subgenus = "subg.", ["subg."] = "subg.", subg = "subg.", --sect. section = "sect.", ["sect."] = "sect.", sect = "sect.", --subsect. subsection = "subsect.", ["subsect."] = "subsect.", subsect = "subsect.", --ser. series = "ser.", ["ser."] = "ser.", ser = "ser.", --subser. subseries = "subser.", ["subser."] = "subser.", subser = "subser.", --cf. cf = "cf.", ["cf."] = "cf.", ["c.f."] = "cf." } local specialChrs = '[%(%)Γ%+]' -- pattern listing all specially treated characters local units = {} local states = {} local state = startState local j = 0 local currUnit = '' local chr -- startUnit starts a new unit to be taken from the string str local startUnit = function (nextState) currUnit = chr state = nextState end -- saveUnit saves the current unit taken from the string str and starts a -- new one local saveUnit = function (nextState) -- check for words that don't get italicized (?at this position) if state == italState and cTerms[currUnit] then currUnit = cTerms[currUnit] state = nonItalState end j = j + 1 units[j] = currUnit states[j] = state currUnit = chr state = nextState end local n = mw.ustring.len(str) local i = 1 while i <= n do chr = mw.ustring.sub(str, i, i) if state == startState then if chr == ' ' then startUnit(whiteSpState) elseif mw.ustring.match(chr, specialChrs) then -- chr == '(' or chr == ')' or chr == 'Γ' or chr == '+' startUnit(nonItalState) elseif chr == '&' then startUnit(entityState) else -- other kind of character startUnit(italState) end elseif state == whiteSpState then if chr == ' ' then -- ignore elseif mw.ustring.match(chr, specialChrs) then -- chr == '(' or chr == ')' or chr == 'Γ' or chr == '+' saveUnit(nonItalState) elseif chr == '&' then saveUnit(entityState) else -- other kind of character saveUnit(italState) end elseif state == nonItalState then if chr == ' ' then saveUnit(whiteSpState) elseif mw.ustring.match(chr, specialChrs) then -- chr == '(' or chr == ')' or chr == 'Γ' or chr == '+' saveUnit(nonItalState) elseif chr == '&' then saveUnit(entityState) else -- other kind of character saveUnit(italState) end elseif state == entityState then if chr == ';' then currUnit = currUnit .. chr chr = '' -- nonbreaking spaces are treated a whitespace if currUnit == ' ' or currUnit == ' ' or currUnit == ' ' or currUnit == ' ' then state = whiteSpState end saveUnit(startState) else currUnit = currUnit .. chr end else -- state == italState if chr == ' ' then saveUnit(whiteSpState) elseif mw.ustring.match(chr, specialChrs) then -- chr == '(' or chr == ')' or chr == 'Γ' or chr == '+' saveUnit(nonItalState) elseif chr == '&' then saveUnit(entityState) else -- other kind of character currUnit = currUnit .. chr end end i = i + 1 end j = j + 1 -- save the last unit and its state units[j] = currUnit states[j] = state return units, states end function p.italicizeTaxonName(frame) local str = frame.args[1] or "" -- first clean up the name str = mw.ustring.gsub(str, "%s+", " ") str = mw.ustring.gsub(str, "'''", "") str = mw.ustring.gsub(str, "''", "") str = mw.ustring.gsub(str, "</?span.->", "") -- remove the last 'word' if it appears to be a disambiguating term local last = l.lastWord(str) local ln = mw.ustring.len(last) if mw.ustring.match(last, "%([a-z].*%)") then str = mw.ustring.sub(str, 1, -ln-1) else last = '' end -- now split up the name into 'units' units, states = l.doSplitTaxonName(str) -- finally, put everything back together, correctly italicized return l.joinUnits(units, states) .. last end function l.joinUnits(units, states) local res = '\n|' local j = 1 local n = #units while j <= n do res = res .. units[j] .. '<sub>' .. tostring(states[j]) .. '</sub>|' j = j + 1 end res = '\n' states[n+1] = endState states[n+2] = endState local openItalics = true j = 1 while j <= n do -- res = res .. '<sub>' .. tostring(states[j]) .. tostring(italState) .. '</sub>' if states[j] == italState then if openItalics then res = res .. "<i>" .. units[j] openItalics = false else res = res .. units[j] end if not (states[j+1] == whiteSpState and states[j+2] == italState) then res = res .. "</i>" openItalics = true end else res = res .. units[j] end j = j + 1 end return res end -- ***************************************************************************** function p.test(frame) local taxon = frame.args[1] or "" local item = frame.args[2] or "" local ok, info = pcall(frame.expandTemplate, frame, { title = 'Template:Taxonomy/' .. taxon, args = {['machine code'] = item } }) if ok then return 'ok=true; >' .. info .. '<' else return 'ok=false; >' .. info .. '<' end end function p.test1(frame) local str = frame.args[1] or '' local pattern = frame.args[2] or "%([A-Z].*%)" if mw.ustring.match(str, pattern) then return 'matched' else return 'not matched' end end function p.test2(frame) local a1 = frame.args[1] or '' local t = {} t[1] = {} t[1].a = a1 t[1].e = 'Argument 1 = ' return t[1].e .. t[1].a end function p.test3(frame) local a1 = frame.args[1] or '' local a2 = frame.args[2] or '' local t = mw.text.split( a1, a2, true ) res = '' for i = 1, #t do if t[i] == nil then t[i] = 'NIL' elseif t[i] == '' then t[i] = 'EMPTY' end res = res .. t[i] .. '<br>' end local tbl = {} tbl[1] = {} tbl[1][9] = 'TEST' return res .. '<br>/' .. tbl[1][9].. '<br>/' .. '<br>/' .. table.concat(tbl[1],',',9,9) end function p.test4(frame) local a1 = frame.args[1] or '' local firstCh = mw.ustring.sub(a1,1,1) if firstCh == '[' then firstCh = '*wikilink*' end return 'Frame arg1 = '..a1..', first char = '..firstCh end function p.test5(frame) local tab1 = {} local tab2 = {} tab1[1] = 'test' tab2[1] = {} tab2[1].k = 'test' tab2[1].v = 0 return tab1[1]..' '..' '..tab2[1].k..'+'..tab2[1].v end function p.existsTest1(frame) local taxon = frame.args[1] or 'Life' local res if mw.title.new('Taxonomy/'..taxon, 'Template').exists then res = 'Taxonomy/'..taxon..'exists' else res = 'Taxonomy/'..taxon..'does not exist' end return res end function p.existsTest2(frame) local taxon = frame.args[1] or 'Life' local template = 'Template:Taxonomy/' .. taxon local item = frame.args[2] or 'all' local ok, dummy = pcall(frame.expandTemplate, frame, { title = template, args = {['machine code'] = item } }) local res = template if ok then return res .. ' exists' else return res .. ' does not exist' end end function p.getGenus(frame) local str = frame.args[1] or '' return l.genus(str, 1) end function l.genus(str, init) local res = mw.ustring.match(str, '^[^%s]*', init) if res == mw.ustring.char(215) then res = res .. ' ' .. l.genus(str, 3) end return res end function p.getLastWord(frame) local str = frame.args[1] or '' return l.lastWord(str) end function l.lastWord(str) local res, n = mw.ustring.gsub(str, '.*%s', '', 1) if n == 0 then return str else return res end end function p.abbreviate(frame) local str = frame.args[1] or '' local res, n = mw.ustring.gsub(str, '([A-Z]).- (.*)', '%1. %2') return res .. ' (' .. tostring(n) .. ' matches)' end function p.italicTaxonTitle(frame) local pageName = frame.args[1] or '' pageName = frame:expandTemplate{ title = 'Taxon italics', args = {pageName} } return frame:callParserFunction{ name = 'DISPLAYTITLE', args = {pageName} } end function p.linkCheck(frame) local linkTarget = frame.args[1] or '' local linkText = frame.args[2] or '' local res = true if linkTarget ~= '' and linkText ~= '' and linkTarget ~= linkText then local linkTargetTitle = mw.title.new(linkTarget) local linkTextTitle = mw.title.new(linkText) res = linkTextTitle.redirectTarget == linkTargetTitle end return res end function p.parseSpeciesName(frame) local speciesName = frame.args[1] or '' local genus, disambig, species = l.doParseSpeciesName(speciesName) return 'genus ='..genus..', disambig='..disambig..', species='..species end function l.doParseSpeciesName(speciesName) local genus = '' local disambig = '' local species = '' local words = mw.text.split(speciesName, " ", true) local nWords = #words local currWord = 1 if currWord > nWords then return genus, disambig, species end genus = words[currWord] if genus == mw.ustring.char(215) then -- hybrid sign currWord = currWord + 1 if currWord > nWords then return '', disambig, species end genus = genus .. ' ' .. words[currWord] end currWord = currWord + 1 if currWord > nWords then return genus, disambig, species end local disambig = '' local species = words[currWord] local test = mw.ustring.sub(species,1,1) if mw.ustring.sub(species,1,1) == mw.ustring.char(40) then -- '(' disambig = species currWord = currWord + 1 if currWord > nWords then return genus, disambig, '' end species = words[currWord] end if species == mw.ustring.char(215) then -- hybrid sign currWord = currWord + 1 if currWord > nWords then return genus, disambig, '' end species = species .. ' ' .. words[currWord] end return genus, disambig, species end -- ============================================================================= function p.infraspeciesboxName(frame) local name = frame.args[1] or '' local genus = frame.args[2] or '' local species = frame.args[3] or '' local ct = frame.args[4] or '' local infraspecies = frame.args[5] or '' local basePageTitle = frame.args[6] or '' local italicTitle = frame.args[7] or '' return l.doinfraspeciesboxName(name, genus, species, ct, infraspecies, basePageTitle, italicTitle) end function l.doinfraspeciesboxName(name, genus, species, ct, infraspecies, basePageTitle, italicTitle) genus = mw.ustring.gsub(mw.ustring.gsub(genus, '%s+%b()$', '', 1), '/.*$', '', 1) -- strip any disambig and qualifier local taxon = genus .. ' ' .. species if ct == '' then taxon = taxon .. ' ' .. infraspecies else taxon = taxon .. ' ' .. ct .. ' ' .. infraspecies end local italicizeP = italicTitle ~= 'no' and (basePageTitle == taxon) -- use basePageTitle to match taxon -- deal with taxobox name (i.e. its caption) if name == '' then name = basePageTitle if italicizeP then name = TaxonItalics.italicizeTaxonName(name, false, false) end end -- deal with page title if italicizeP then local pageTitle = mw.title.getCurrentTitle().text -- formatting the page title with DISPLAYTITLE needs the full page title pageTitle = TaxonItalics.italicizeTaxonName(pageTitle, false, false, true) -- format pageTitle, not italicizing any parenthesized term if italicTitle ~= 'test' then mw.getCurrentFrame():callParserFunction('DISPLAYTITLE', pageTitle) else name = name .. ' \\Italic title\\ ' .. pageTitle -- for testing and debugging end end return name end -- ============================================================================= function p.boldList(frame) local items = {} for i, v in ipairs(frame:getParent().args) do table.insert(items, v) end local conj = "'''" .. (#items > 2 and ", " or " ") .. (frame.args.conj or "or") .. " '''" return "'''"..mw.text.listToText(items, "''', '''", conj).."'''" end return p
Summary:
Please note that all contributions to Stockhub may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Stockhub:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Template used on this page:
Module:Sandbox/Peter coxhead/Tests/doc
(
edit
)