Module:Index
Documentation for this module may be created at Module:Index/doc
local getArgs = require('Module:Arguments').getArgs; local defArgs = require('Module:Arguments').defaultArgs; local index = {}; function index.Author( frame ) local args = defArgs(getArgs(frame), 1, ""); local arg = args[1]; local key = arg:match("%w+"); local H = {}; local I = {}; for line in arg:gmatch("(%S+)") do for names, ja, yr in string.gmatch(line,"([%a:_']+),([%w\._]+),([%d]+),") do for name in string.gmatch(names,"([%a_']+)") do if (string.sub(name,0,1) == key) then if (H[name] == nil) then tmp = {}; tmp[line] = tonumber(yr); H[name] = tmp; table.insert(I, name); else tmp = H[name]; tmp[line] = tonumber(yr); end end end end end table.sort(I); local ret = ""; for i=1,table.getn(I) do local author = I[i]; local tmp = H[author]; local count = 0; local peakDist = {}; local coAu = {}; local earliest = 3000; local latest = 0; for k,v in pairs(tmp) do --check earliest and latest publications if (earliest > v) then earliest = v; end if (latest < v) then latest = v; end count = count + 1; for i=v-2,v+2 do if (peakDist[i] == nil) then peakDist[i] = 3-math.abs(v-i); else peakDist[i] = peakDist[i] + 3-math.abs(v-i); end end --check major coauthors for names, ja, yr in string.gmatch(k,"([%a:_']+),([%w\._]+),([%d]+),") do for name in string.gmatch(names,"([%a_']+)") do if (name ~= author) then if (coAu[name] == nil) then coAu[name] = 1; else coAu[name] = coAu[name] + 1; end end end end end local peak = 0; local peakY = 0; for k,v in pairs(peakDist) do if (v > peak) then peakY = k; peak = v; end end local auL = ""; if (count > 4) then for k,v in pairs(coAu) do if (v >= 3) then if (auL == "") then auL = k; else auL = auL .. ":" .. k; end end end end ret = ret .. "&&" .. author .. "&&" .. count .. "&&" .. earliest .. "&&" .. latest .. "&&" .. peakY .. "&&" .. auL .. "\n"; end return ret; end function index.FormulaFunc1( frame ) local args = defArgs(getArgs(frame), 4, "", "", "", ""); local arg = args[1]; local arg1 = args[2]; local arg2 = tonumber(args[3])-1; local arg4 = args[4]; local output = ""; for id in arg:gmatch("&&(%w+)") do output = output.."%formula%" .. arg1 .. "%" .. arg2 .. "%Index/formula%"..id.."%" .. arg4; end return output; end function index.FormulaFunc2( frame ) local args = defArgs(getArgs(frame), 4, "", "", "", ""); local arg = args[1]; local arg1 = args[2]; local arg2 = tonumber(args[3])+1; local arg4 = args[4]; local id; local output = ""; for id in arg:gmatch("&&(%w+)") do output = output.."%formula%" .. arg1 .. "%" .. arg2 .. "%Index/formula%"..id.."%" .. arg4; end return output; end function index.FormulaIndexTable( frame ) local args = defArgs(getArgs(frame), 3, "", "C", "20"); local arg = args[1]; local arg1 = args[2]; local arg2 = args[3]; local id, formula; local pat = arg1 .. arg2; local hash = {}; local idx = {}; for id, formula in arg:gmatch("&&(%w+)&&([%a%d]+)") do if (formula.match(formula, pat) ~= null) then if (hash[formula] == null) then hash[formula] = id; table.insert(idx, formula); else hash[formula] = hash[formula].."&&"..id; end end end table.sort(idx); local output = ""; for id, val in pairs(idx) do output = output .. val .."&&".. hash[val] .. "\n"; end return output; end function index.MassIndexTable( frame ) local args = defArgs(getArgs(frame), 3, "", "0", "2000"); local arg = args[1]; local arg1 = args[2]; local arg2 = args[3]; local id, ms, msd; local min = arg1; local max = arg2; local hash = {}; local idx = {}; for id, ms in arg:gmatch("&&(%w+)&&([%d\.]+)") do msd = tonumber(ms); ---質量の最小と最大の間に入る部分のみ考慮 if ((msd >= min) and (msd <= max)) then if (hash[msd] == null) then hash[msd] = id; table.insert(idx, msd); else hash[msd] = hash[msd].."&&"..id; end end end table.sort(idx); local output = ""; for id, val in pairs(idx) do output = output .. val .."&&".. hash[val] .. "\n"; end return output; end function index.Name( frame ) local args = defArgs(getArgs(frame), 1, ""); local arg = args[1]; local key = arg:match("%w+"); local H = {}; local I = {}; for id, name in arg:gmatch("&&(%w+).Common Name=&&(%S+)") do name = string.lower(name); for term in string.gmatch(name,"(%a+)") do if ((string.len(term) > 3) and (string.sub(term,0,1) == key)) then if (H[term] == nil) then H[term] = id; table.insert(I, term); else H[term] = H[term] .. ";" .. id; end end end end table.sort(I); local ret = ""; for i=1,table.getn(I) do local k = I[i]; ret = ret .. "* '''" .. k; for id in string.gmatch(H[k],"%w+") do ret = ret .. "''' [[" .. id .."]] "; end ret = ret .. "\n"; end return ret; end return index