יחידה:נתוני מכירות
ניתן ליצור תיעוד על היחידה הזאת בדף יחידה:נתוני מכירות/תיעוד
-- Check the next pages:
-- Template:Certification Table Entry/Region
-- Template:Certification Table Entry/Sales
-- Template:Certification Table Entry/Foot
-- Template:Certification Table Entry/Foot/helper
local p = {}
local Date = require('Module:תאריך')
local data = require('Module:נתוני מכירות/נתונים')
local CountryData = data[1]
local StyleData = data[2]
local naStyle = 'style="background: #ececec; color: #2C2C2C; vertical-align: middle; font-size: smaller; text-align: center" class="table-na" |—'
local function splitStringByIndex(str, index)
local length = #str
local firstPart = string.sub(str, 1, length - index)
local lastChar = string.sub(str, length - index + 1, length)
return {firstPart, lastChar}
end
-- Split the comma-separated lists into tables and sort them
local function splitString(inputstr, sep)
local sep, fields = sep or ",", {}
local pattern = string.format("([^%s]+)", sep)
inputstr:gsub(pattern, function(c) fields[#fields + 1] = c end)
return fields
end
function splitStringToCharsAndNumbers(inputString)
local letters = {}
local numbers = {}
for i = 1, #inputString do
local char = inputString:sub(i, i)
if char:match('%d') then -- Check if the character is a number
table.insert(numbers, tonumber(char))
else
table.insert(letters, char)
end
end
return letters, numbers
end
local function trim(s)
return (s:gsub("^%s*(.-)%s*$", "%1"))
end
local function detailStyle(detail)
local sDetail = splitString(detail, ",")
for i, sd in ipairs(sDetail) do sDetail[i] = trim(sd) end
if #sDetail == 0 then
return naStyle
elseif #sDetail == 1 then
return detail
else
return sDetail[2] .. "× " .. sDetail[1]
end
end
-- Function to compare dates for sorting
local function compareDates(date1, date2)
if date1 == "הווה" then
return false
elseif date2 == "הווה" then
return true
else
return os.time(date1) < os.time(date2)
end
end
-- Function to check if the middle date is the same before and after sorting
local function isMiddleDateSameBeforeAndAfterSort(dates)
-- Copy the original array
local originalDates = {}
for _, tDate in ipairs(dates) do
table.insert(originalDates, tDate)
end
-- Sort the dates
table.sort(dates, compareDates)
if (dates[2] ~= "הווה" and originalDates[2] == "הווה") or (dates[2] == "הווה" and originalDates[2] ~= "הווה") then
return false
end
if (dates[2] == "הווה" and originalDates[2] == "הווה") then
return true
end
-- Check if the middle date is the same before and after sorting
return os.time(originalDates[2]) == os.time(dates[2])
end
local function findData(country, originCountry, detail, tDate, dType)
local letters, numbers = splitStringToCharsAndNumbers(country)
local rc = table.concat(letters, "")
for i, cd in pairs(CountryData) do
if rc == i then
for j, cin in ipairs(cd) do
if dType == cin[1] or (country == originCountry and
((originCountry == "צרפת" or originCountry == "הולנד" and dType == "video album" and cin[1] == "french-dutch video album") -- in case of Belgium (french or dutch nationality)
or (originCountry == "בלגיה" and dType == "video album" and cin[1] == "belgium video album") -- in case of Belgium (belgium nationality)
or cin[1] == 'local ' .. dType)) then
if (cin[6] == nil and cin[7] == nil) or (cin[6] and cin[7] and isMiddleDateSameBeforeAndAfterSort({cin[6], tDate, cin[7]})) then
if detail then
if detail == 'כסף' then
return cin[2]
elseif detail == 'זהב' then
return cin[3]
elseif detail == 'פלטינה' then
return cin[4]
elseif detail == 'יהלום' or 'מיליון' then
return cin[5]
end
end
end
end
end
end
end
return nil
end
local function returnTypeOfFootnote(country, tDate, dType)
local footnoteStyle = {
['sales'] = '*',
['shipments'] = '^',
['streamsonly'] = '†',
['streaming'] = '‡'
}
local letters, numbers = splitStringToCharsAndNumbers(country)
local rc = table.concat(letters, "")
for i, cd in pairs(StyleData) do
if rc == i then
for j, cin in ipairs(cd) do
if cin[1] == nil or (cin[1] and dType == cin[1]) then
if cin[4] and ((cin[2] == nil and cin[3] == nil) or (cin[2] and cin[3] and isMiddleDateSameBeforeAndAfterSort({cin[2], tDate, cin[3]}))) then
return footnoteStyle[cin[4]]
end
end
end
end
end
return ""
end
local function unitsPerDetail(country, originCountry, detail, tDate, dType)
local sDetail = splitString(detail, ",")
for i, sd in ipairs(sDetail) do sDetail[i] = trim(sd) end
if #sDetail == 0 then
return naStyle
end
local sd = findData(country, originCountry, sDetail[1], tDate, dType)
if sd == nil or sd == "" then return naStyle end
if #sDetail > 1 then
return sd * tonumber(sDetail[2])
else
return sd
end
end
local function countryStyle(country)
local letters, numbers = splitStringToCharsAndNumbers(country)
local res = table.concat(letters, "")
local countryStyles = {
["ארגנטינה"] = '[[CAPIF]]',
["אוסטרליה"] = '[[ARIA]]',
["אוסטריה"] = '[[IFPI Austria]]',
["בלגיה"] = "[[BEA]]",
["ברזיל"] = "[[Pro-Música Brasil]]",
["קנדה"] = "[[Music Canada]]",
["צ'ילה"] = "[[IFPI Chile]]",
["סין"] = "[[NRTA]]",
["קולומביה"] = "[[ASINCOL]]",
["קרואטיה"] = "[[HDU]]",
["צ'כיה"] = "[[ČNS IFPI]]",
["צ'כוסלובקיה"] = "[[ČNS IFPI]]",
["דנמרק"] = "[[IFPI Denmark]]",
["אקוודור"] = "[[IFPI Ecuador]]",
["פינלנד"] = "[[Musiikkituottajat]]",
["צרפת"] = "[[SNEP]]",
["גרמניה"] = "[[BVMI]]",
["יוון"] = "[[IFPI Greece]]",
["הונג קונג"] = "[[IFPI Hong Kong]]",
["הונגריה"] = "[[MAHASZ]]",
["איסלנד"] = "[[FHF]]",
["הודו"] = "[[IMI]]",
["אינדונזיה"] = "[[ASIRI]]",
["אירלנד"] = "[[IRMI]]",
["ישראל"] = "[[הפדרציה לתקליטים]]",
["איטליה"] = "[[FIMI]]",
["יפן"] = "[[RIAJ]]",
["לטביה"] = "[[LaIPA]]",
["לבנון"] = "[[IFPI Lebanon]]",
["מלזיה"] = "[[RIM]]",
["מקסיקו"] = "[[AMPROFON]]",
["הולנד"] = "[[NVPI]]",
["ניו זילנד"] = "[[Recorded Music NZ]]",
["ניגריה"] = "[[TCSN]]",
["נורווגיה"] = "[[IFPI Norge]]",
["פרגוואי"] = "[[SGP]]",
["פרו"] = "[[UNIMPRO]]",
["הפיליפינים"] = "[[PARI]]",
["פולין"] = "[[ZPAV]]",
["פורטוגל"] = "[[איגוד תעשיית ההקלטות הפורטוגזי|AFP]]",
["רומניה"] = "[[UPFR]]",
["רוסיה"] = "[[NFPF]]",
["סינגפור"] = "[[RIAS]]",
["סלובקיה"] = "[[ČNS IFPI]]",
["דרום אפריקה"] = "[[RiSA]]",
["קוריאה הדרומית"] = "[[KMCA]]",
["ספרד"] = "[[PROMUSICAE]]",
["שוודיה"] = "[[IFPI Sweeden]]",
["שווייץ"] = "[[IFPI Switzerland]]",
["טאיוואן"] = "[[RIT]]",
["תאילנד"] = "[[TECA]]",
["טורקיה"] = "[[Mü-Yap]]",
["אוקראינה"] = "[[IFPI Ukraine]]",
["בריטניה"] = "[[BPI]]",
["ארצות הברית"] = "[[RIAA]]",
["אורווגאי"] = "[[CUD]]",
["ונצואלה"] = "[[APFV]]",
["אירופה"] = "[[IFPI]]",
["מועצת שיתוף הפעולה של מדינות המפרץ"] = "[[IFPI]]",
["מצרים"] = "[[IFPI Egypt]]",
['אורוגוואי'] = "[[CUD]]",
['אמריקה המרכזית'] = "[[CFC]]",
['בולגריה'] = "[[BAMP]]"
}
if countryStyles[res] then
res = res .. " (" .. countryStyles[res] .. ")"
end
if res == 'איגוד חברות התקליטים העצמאיות' then
res = 'אירופה ([[IMPALA]])'
end
if res == 'איגוד המפיקים הפונוגרפיים הצרפתיים העצמאיים' then
res = 'צרפת ([[UPFI]])'
end
return res
end
local function formatNumberWithCommas(number)
if number == naStyle then return number end
local formattedNumber = tostring(number)
local reverseFormattedNumber = string.reverse(formattedNumber)
local result = ""
for i = 1, string.len(reverseFormattedNumber) do
result = result .. string.sub(reverseFormattedNumber, i, i)
if i % 3 == 0 and i < string.len(reverseFormattedNumber) then
result = result .. ","
end
end
return string.reverse(result)
end
local function isCountry(country)
return string.find(country, "הערה", 1, true) == nil and string.find(country, "סיווג", 1, true) == nil and string.find(country, "סיכום", 1, true) == nil and string.find(country, "הערת מכירות", 1, true) == nil and country ~= "מדינת מקור" and country ~= "תאריך"
end
local function sameLang(value)
if value == "אלבום" or value == "album" then
return "album"
elseif value == "mini-album" or value == "מיני-אלבום" or value == "EP" then
return "mini-album"
elseif value == "video album" or value == "אלבום וידאו" or value == "video clip" or value == "music video" or value == "וידאו קליפ" or value == "video" then
return "video album"
elseif value == "belgium video album" or value == "אלבום וידאו בלגי" then
return "belgium video album"
elseif value == "french video album" or value == "אלבום וידאו צרפתי" or value == "dutch video album" or value == "אלבום וידאו הולנדי" then
return "french-dutch video album"
elseif value == "video single" or value == "סינגל וידאו" then
return "video single"
elseif value == "סינגל" or value == "single" then
return "single"
elseif value == "rington" or value == "masterton" or value == "רינגטון" or value == "מאסטרטון" then
return "rington"
elseif value == "digital download" or value == "download" or value == "הורדת מוזיקה" or value == "הורדה" then
return "download"
elseif value == "streaming" or value == "סטרימינג" or value == "הזרמת מוזיקה" then
return "streaming"
elseif value == "אלבום פופולרי" or value == "popular album" then
return "popular album"
elseif value == "אלבום ג'אז" or value == "jazz album" or value == "classical album" or value == "אלבום קלאסי" then
return "classical album"
elseif value == "latin" or value == "לטיני" or value == "latin music" or value == "מוזיקה לטינית" then
return "latin music"
elseif value == "DVD" then
return "DVD"
elseif value == "compilation album" or value == "אלבום אוסף" then
return "compilation album"
end
return ""
end
-- Custom comparison function for sorting keys
local function compareKeys(a, b)
return tostring(a) < tostring(b)
end
function p.generateTable(frame)
local pargs = frame:getParent().args
local args = frame.args
-- Construct the table in the desired format
local table_text = "{| class=\"wikitable\"\n"
table_text = table_text .. "|-\n! אזור !! תואר !! מכירות\n"
local sum = 0
local originCountry = pargs['מדינת מקור'] or ""
originCountry = trim(originCountry)
local keys = {}
for key in pairs(pargs) do
table.insert(keys, key)
end
-- Sort the keys
table.sort(keys, compareKeys)
for _, key in ipairs(keys) do
country = key
detail = pargs[key]
country = trim(country)
table_text = table_text .. "|-\n"
local temp = splitStringByIndex(country, 13)
if isCountry(country) then
if temp[2] ~= " מכירות" then
table_text = table_text .. "|-\n"
table_text = table_text .. "! " .. countryStyle(country) .. (pargs[country .. " הערה"] or "") .. "\n"
table_text = table_text .. "| " .. detailStyle(detail) .. "\n"
if pargs[country .. " מכירות"] then
sum = sum + pargs[country .. " מכירות"]:gsub(",", "")
table_text = table_text .. "| " .. formatNumberWithCommas(pargs[country .. " מכירות"]:gsub(",", "")) .. (pargs[country .. " הערת מכירות"] or "") .. "\n"
else
local tDate = pargs[country .. " תאריך"] or pargs['תאריך'] or "הווה"
if tDate ~= "הווה" then
local success, DateRes = pcall(Date.newFromWikitext, tDate)
if success then
tDate = DateRes
end
end
local upd = unitsPerDetail(country, originCountry, detail, tDate, sameLang(pargs[country .. ' סיווג'] or pargs['סיווג']))
local footnote = returnTypeOfFootnote(country, tDate, sameLang(pargs[country .. ' סיווג'] or pargs['סיווג']))
table_text = table_text .. "| " .. formatNumberWithCommas(upd)
if upd ~= naStyle then
sum = sum + upd
table_text = table_text .. footnote
end
table_text = table_text .. "\n"
end
else
if pargs[temp[1]] == nil then
local r = string.gsub(detail, ",", "")
r = string.gsub(r, "%.", ".")
table_text = table_text .. "|-\n"
table_text = table_text .. "! " .. countryStyle(temp[1]) .. (pargs[temp[1] .. " הערה"] or "") .. "\n"
table_text = table_text .. "| " .. naStyle .. '\n'
table_text = table_text .. "| " .. formatNumberWithCommas(r) .. (pargs[temp[1] .. " הערת מכירות"] or "") .. "\n"
sum = sum + r
end
end
end
end
if pargs['ללא סיכום'] ~= 'כן' then
table_text = table_text .. "|-\n!colspan=3| סיכום\n"
table_text = table_text .. "|-\n"
table_text = table_text .. "! בכל העולם\n"
table_text = table_text .. "| " .. naStyle .. '\n'
table_text = table_text .. "| " .. (pargs['סיכום'] or formatNumberWithCommas(sum)) .. (pargs["הערת סיכום"] or "") .. "\n"
end
table_text = table_text .. "|}"
return table_text
end
return p