לדלג לתוכן

יחידה:טווח זמנים

היחידה מיועדת לבנייה נוחה של תבניות עם טווחי זמנים.

טווח זמנים יהיה מהצורה של <תאריך התחלה> - <תאריך סיום> או <נקודת זמן>

הצגת משך זמן

כאשר עוסקים בפרט חשוב דיו לציון משך הזמן בין תאריך ההתחלה לסיום ניתן לציין "הצגת הפרשת זמנים=כן" שיחשב את משך הזמן מהתחלה לסיום או יסתמך על ויקינתונים לצורך זה. ניתן לציין בצורה מפורשת "משך" לציון ידני של משך הזמן.

דוגמאות שימוש

פורמט דוגמה תוצאה הערה
טווח פשוט {{#invoke:טווח זמנים|טווח זמנים|תאריך התחלה=26 באוגוסט 2020|תאריך סיום=26 באוגוסט 2021}} 26 באוגוסט 2020 – 26 באוגוסט 2021
אירוע פשוט {{#invoke:טווח זמנים|טווח זמנים|נקודת זמן=26 באוגוסט 2020}} 26 באוגוסט 2020
משך - פשוט יחד עם משך מפורש {{#invoke:טווח זמנים|טווח זמנים|תאריך התחלה=26 באוגוסט 2020|תאריך סיום=26 באוגוסט 2021|הצגת הפרשת זמנים=כן|משך=שנה}} 26 באוגוסט 2020 – 26 באוגוסט 2021 (שנה)
הצגת הפרשת זמנים - פשוט יחד עם משך אוטומטי {{#invoke:טווח זמנים|טווח זמנים|תאריך התחלה=26 באוגוסט 2020|תאריך סיום=26 באוגוסט 2021|הצגת הפרשת זמנים=כן}} 26 באוגוסט 2020 – 26 באוגוסט 2021 (שנה)
פשוט יחד עם משך אוטומטי (דוגמה נוספת) {{#invoke:טווח זמנים|טווח זמנים|תאריך התחלה=10 בינואר 2005|תאריך סיום=23 בנובמבר 2005|הצגת הפרשת זמנים=כן}} 10 בינואר 2005 – 23 בנובמבר 2005 (318 ימים)
פורמט הצגה - כיצד להציג את משך הזמן {{#invoke:טווח זמנים|טווח זמנים|תאריך התחלה=26 באוגוסט 2020|תאריך סיום=26 באוגוסט 2021|הצגת הפרשת זמנים=כן|פורמט הצגה=%s<br>%s}} 26 באוגוסט 2020 – 26 באוגוסט 2021
(משך הזמן: שנה)
שימוש בוויקינתונים {{#invoke:טווח זמנים|טווח זמנים}} 1 בינואר 2011‏-2 בינואר 2012 בהנחה שהוזנו הפרטים בוויקינתונים
תאריך התחלה-ויקינתונים, תאריך סיום-ויקינתונים - הגדרת המזהים אשר ימשכו מוויקינתונים {{#invoke:טווח זמנים|טווח זמנים|תאריך התחלה-ויקינתונים=P2031|תאריך סיום-ויקינתונים=P2032}} 1 בינואר 2011‏-2 בינואר 2012 בהנחה שהוזנו הפרטים בוויקינתונים
qid - הגדרת הדף בויקינתונים ממנו נמשכים התאריכים {{#invoke:טווח זמנים|טווח זמנים|qid=Q27020128}} 1 בינואר 2011‏-2 בינואר 2012 בהנחה שהוזנו הפרטים בוויקינתונים. ניתן להזין |qid=- על מנת למנוע משיכה מוויקינתונים
הווה (ציון אירוע מתמשך) {{#invoke:טווח זמנים|טווח זמנים|תאריך התחלה=21 בינואר 2020|תאריך סיום=מכהנת|הצגת הפרשת זמנים=כן|הווה=מולך,מולכת,מכהן,מכהנת,לא כיהן,נוכחי,נוכחית,הווה,ואילך}} 21 בינואר 2020 – מכהנת (6 שנים) הווה מאפשר לציין שהאירוע לא הסתיים והוא נמשך בהווה, ומאפשר להכניס ערכים שונים אשר היחידה תקרא כהווה
נמשך - הגדרת ברירת מחדל של תאריך סיום כהווה {{#invoke:טווח זמנים|טווח זמנים|תאריך התחלה=26 ביולי 2020|נמשך=כן|הצגת הפרשת זמנים=כן}} 26 ביולי 2020 – הווה (5 שנים) באם יוזן תאריך סיום היחידה תתחשב בו
טקסט התחלה - טקסט להציג במקרה שבו ידוע רק תאריך התחלה ולא תאריך סיום. {{#invoke:טווח זמנים|טווח זמנים|תאריך התחלה=26 ביולי 2020|טקסט התחלה= מ-%s}} מ-26 ביולי 2020
טקסט סיום - הצגת תאריך הסיום במקרה בו לא יוזן תאריך התחלה (במקום ברירת המחדל של ?) {{#invoke:טווח זמנים|טווח זמנים|תאריך סיום=26 ביולי 2020|טקסט סיום= נגמר ב-%s}} נגמר ב-26 ביולי 2020

local Date = require('Module:תאריך')
local Arguments = require("Module:Arguments")
local HebrewDate = require("Module:תאריך עברי")

local function convertDate(date)
    local success, hebrewDate = pcall(HebrewDate.fromhebrew, mw.getCurrentFrame():newChild { args = { date } })
    if success then
        return hebrewDate
    else
        return date
    end
end

local function render(frame)
    local args = Arguments.getArgs(frame, {
        ['trim'] = true,
        ['removeBlanks'] = true
    })
    local res = ''
    local dateFormat = ''
    local maintainceCategory = ''
    local entityId = args['qid']
    if (entityId == '-' or entityId == '') then
        entityId = nil
    end
    local pointInTime = args['נקודת זמן']
    local startDate = args['תאריך התחלה']
    local endDate = args['תאריך סיום']
    local tempStart = startDate
    local tempEnd = endDate

    if startDate then
        startDate = convertDate(startDate)
    end
    if endDate then
        endDate = convertDate(endDate)
    end

    local wikidataStartDate = args['תאריך התחלה-ויקינתונים'] or 'P580'
    local wikidataEndDate = args['תאריך סיום-ויקינתונים'] or 'P582'
    local wikidataEndDateLimit = args['גבול תאריך סיום-ויקינתונים']
    local showEditWikidata = true

    -- text to show if we have only end date. Example: "Last even - %s" where %s is time. nil - will not show end date
    local onlyEndDateText = args['טקסט סיום']
    -- text to show if we have only start date. Example: "First even - %s" where %s is time. nil - will not show end date
    local onlyStartDateText = args['טקסט התחלה']

    local duration = args['משך'] -- P2047
    -- Whether to show time diff between start and end day when applicable. Example: כן.
    local showTimeDiff = args['הצגת הפרשת זמנים']
    local dateRangeDiffFormat = args['פורמט הצגה'] or '%s (%s)'

    local usingWikidata = false

    -- Whether the event still continues. this will show <START>-present. Example: כן
    local defaultOngoingEvent = args['נמשך'] == 'כן'
    local ongoingEvent = defaultOngoingEvent
    local endDateOngoingEvent = args['הווה']
    local presentText = args['טקסט הווה']
    local diffFormat = 'auto' -- TODO: better handling for different scales

    if endDate ~= nil and endDate ~= '' then
        if endDateOngoingEvent ~= nil then
            -- set default ongoingEvent as false
            ongoingEvent = false
            for v in string.gmatch(endDateOngoingEvent, "[^,]+") do
                if v:match('^%s*(.-)%s*$') == endDate then
                    -- set as true if end date specific that match endDateOngoingEvent
                    ongoingEvent = true
                    if presentText then
                        endDate = presentText
                    end
                end
            end
        else
            -- explicity end date was specified, hence it is not ongoing
            ongoingEvent = false
        end
    end

    -- simple case of single point in time
    if pointInTime ~= nil or startDate == endDate then
        if pointInTime == nil and startDate == endDate then
            pointInTime = startDate
        end
        res = pointInTime
    else -- date ranges
        if startDate == nil and endDate ~= nil then
            if onlyEndDateText == nil then
                dateFormat = '%s–%s'
                if mw.ustring.match(endDate, ' ') then
                    dateFormat = '%s – %s'
                end
                res = mw.ustring.format(dateFormat, '?', tempEnd)
            else
                res = mw.ustring.format(onlyEndDateText, tempEnd)
            end
        elseif startDate ~= nil and (endDate == nil or (ongoingEvent and endDate ~= nil)) then
            if onlyStartDateText then
                -- in corner cases where the start date is actually more complex text, avoid wrapping it
                if mw.ustring.match(startDate, '.+\n.+') or mw.ustring.find(startDate, '<br />') ~= nil or
                    mw.ustring.match(startDate, '.+[•,].+') ~= nil then
                    res = startDate
                else
                    res = mw.ustring.format(onlyStartDateText, tempStart)
                end
            else
                if ongoingEvent then
                    dateFormat = '%s–%s'
                    if mw.ustring.match(startDate, ' ') or (endDate and mw.ustring.match(endDate, ' ')) then
                        dateFormat = '%s – %s'
                    end
                    res = mw.ustring.format(dateFormat, startDate, endDate or 'הווה')
                    -- try to fallback to automatic duration if duration is not available
                    if showTimeDiff == 'כן' and duration == nil then
                        local success, automaicDuration = pcall(Date.parseDateRange, startDate, diffFormat, true)
                        if success then
                            duration = automaicDuration
                        end
                    end
                    res = mw.ustring.format(dateFormat, tempStart, tempEnd or 'הווה')
                else
                    res = startDate
                end
            end
        elseif startDate ~= nil and endDate ~= nil then
            dateFormat = '%s–%s'
            if mw.ustring.match(startDate, ' ') or mw.ustring.match(endDate, ' ') then
                dateFormat = '%s – %s'
            end
            res = mw.ustring.format(dateFormat, startDate, endDate)
            if showTimeDiff == 'כן' and duration == nil then
                local success, automaicDuration = pcall(Date.parseDateRange, res, diffFormat, true)
                if success then
                    duration = automaicDuration
                end
            end
            res = mw.ustring.format(dateFormat, tempStart, tempEnd)
        end
    end

    -- append the duration
    if showTimeDiff == 'כן' and duration ~= nil and duration ~= '' and res ~= nil then
        res = mw.ustring.format(dateRangeDiffFormat, res, duration)
    end

    if showEditWikidata and usingWikidata and res ~= nil and res ~= '' and entityId ~= nil then
        local link = mw.title.makeTitle(0, entityId, '', 'wikidata'):fullUrl('uselang=he')
        res = res ..
            mw.ustring
            .format(
                ' [[File:Blue pencil RTL.svg|15px|link=%s|עריכת הנתון בוויקינתונים]]', link)
    end

    if maintainceCategory ~= nil and res ~= nil then
        res = res .. maintainceCategory
    end

    return res
end

return {
    ['טווח זמנים'] = render
}