WpsGetGermanHolidays Adobe InDesign Skript

Funktionen, Klassen, Prototypes, Libraries, Problemlösungen
Antworten
wernerperplies
Beiträge: 250
Registriert: 6. Aug 2011, 17:48
Wohnort: 18374 Zingst
Kontaktdaten:

WpsGetGermanHolidays Adobe InDesign Skript

Beitrag von wernerperplies » 16. Apr 2017, 08:31

siehe auch wpsGetACalendar - Kalenderobjekt erzeugen und Osterformel für Adobe InDesign JavaScript

Download (erfordert Anmeldung/Registrierung im Forum): WpsGetObjectWithGermanHolidays
Das folgende Skript ermittelt für ein beliebiges Jahr die heute bekannten festen und variablen Feiertage für Deutschland.
Die Funktion loadFixedDayHolidays(/*int*/year) und das Objekt variableHoliDays(/*int*/year, /*bool*/julian, /*object*/baseDays) sind eine wichtige Hilfe zur automatischen Erstellung eines Kalenders mit Adobe InDesign Scripting.

Code: Alles auswählen

// DESCRIPTION erzeugt deutsche Feiertage für ein beliebiges Jahr
// JavaScript für Adobe InDesign Scripting
// Dateiname: WpsGetObjectWithGermanHolidays.jsx
// projPath: C:/Users/WernerPerplies/Source/Workspaces/WpsCSharpProjects/WpsGetObjectWithGermanHolidays
// for this Script
//  © 2013 - 2019 by Werner Perplies, EDV-Anwendungsberatung, 
// http://www.weepee.de, email: werner.perplies@weepee.de 
// created: Mon Aug 12 2013 16:45:44 GMT+0200
// modified: Sun Apr 16 2017 09:13:48 GMT+0200
// modified:  Fri Jun 28 2019 06:11:57 GMT+0200
// modified:  Fri Jun 28 2019 07:24:24 GMT+0200
// [modified]
/*String*/scriptDate = "201906280724"; // DO NOT USE var, because this variable will be later deleted by WpsIncludes!
/*String*/scriptVersion = "1.11"; // DO NOT USE var, because this variable will be later deleted by WpsIncludes!
// includePath = "C:/Users/WernerPerplies/Source/Workspaces/WpsCSharpProjects/AppClasses/AppClasses";
// [lastFileProps:({time:"", size:, checkSum:"", scriptVersion:"", scriptDate:""})] // generated or updated by WpsIncludes!
var scriptName = "WpsGetObjectWithGermanHolidays";
var guid = "// FileID: 113658E0-AD25-43E0-86AA-6514498CC6D7";
var licensee = "Free";
var  zipCodeCity = "-----";
// [end of header]

if (dateMsg === undefined)
{
    var /*Object*/dateMsg = {
            selectedRegionNorth: "nord-/mitteldeutsch",
            selectedRegionSouth: "süddeutsch",
            weekDayNamesNG: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag", "Sonnabend"],
            weekDayNamesSG: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag", "Samstag"],
            monthDayNames: ["Januar","Februar","März","April","Mai","Juni", "Juli","August","September", "Oktober", "November", "Dezember"]
        };
}
String.prototype.fill = function(number){var filled ="";for (var i=0;i<number;++i){filled += this;}return filled;}
String.prototype.padLeft = function(fillc, length)
        {if (this.length<length){return (fillc.fill(length-this.length)+this).substr(-length);}return this;}
Number.prototype.padLeft = function(fillc, length)
    {return this.toString().padLeft(fillc, length);}
/*String*/Date.prototype.sDay=function(/*int*/length, /*Boolean*/string, /*Boolean*/alternate)
{
    if (length==null) length = 2;
    if (!(string))
        return this.getDate().toString().padLeft("0",length);   
    else if ((string) && (alternate))
        return dateMsg.weekDayNamesNG[this.getDay()].substr(0,length);
    else
        return dateMsg.weekDayNamesSG[this.getDay()].substr(0,length);
}
/*String*/Date.prototype.sMonth=function(/*int*/length, /*Boolean*/string)
{
    if (length==null)length = 2;

    if (!(string))
        return (this.getMonth()+1).toString().padLeft("0",length);   
    else (string)
        return dateMsg.monthDayNames[this.getMonth()].substr(0,length);
}
/*String*/Date.prototype.sFullYear=function()
{
    return this.getFullYear().toString();
}
/*String*/Date.prototype.sGermanDate=function()
{
    return this.sDay()+"."+this.sMonth()+"."+this.sFullYear();
}

// wird zur Berechnung der Variablen Feiertage benötigt
/*String*/Date.prototype.days2Ms=function(/*int*/ days)
{
    return days*24*60*60*1000;
}
// wird zur Berechnung der Variablen Feiertage benötigt
/*String*/Date.prototype.addDays2Date=function( /*int*/ days)
{
    var date = new Date();
    date.setTime(this.getTime()+this.days2Ms(days)*1);
    return date;
}
// wird zur Berechnung der Variablen Feiertage benötigt
/*String*/Date.prototype.getSpecialDay = function( /*int*/ dayOfWeek, /*int*/ whichFromStart, /*boolean*/countFirstDay)
{
    // sucht den n-ten Wochentag vor/nach einem Datum
    var date = this;
    var day = date.getDay();
    if (whichFromStart <0)
        var step = -1;
    else 
        var step = 1;
    // die Anzahl der gesuchten Wochentage muss immer >= 0 sein
    var c = Math.abs(whichFromStart);            
    if (countFirstDay != null)
        if (day==dayOfWeek)
            --c;
    while (c > 0)
    {
        // je nach Vorzeichen von Step einen Tag vor oder zurück
        date = date.addDays2Date(step);
        if (date.getDay()==dayOfWeek)
            --c; // die Anzahl der gefundenen Wochentage dekrementieren
    }
    return date;
}

// wird nur für das Ausgabeprogramm benötigt
//  fügt zwei Arrays zusammen
/*array*/Array.prototype.add=function(array)
{
    var ta = this; var l = array.length;
    for (var i = 0; i<l;i++)
        ta.push(array[i]);
    return ta;
}
// wird nur für das Ausgabeprogramm benötigt
// sortiert ein Array: field-> numerisch oder String, adressiert das Sortierfeld
// default Feld 0
// reverse true->absteigend, default aufsteigend 
/*array*/Array.prototype.sortThis=function(/*String*/field, reverse)
{
    if (reverse == null) reverse = false;
    if (reverse) return this.sort(sortthisDown);
    else  return this.sort(sortthisUp);
         
    /*int*/function sortthisUp(e1, e2)
    {
        if (field==null)
        {
            if (e1<e2) return -1;
            if (e1>e2) return 1;
            return 0;
        }
        else 
        {
            if (e1[field]<e2[field]) return -1;
            if (e1[field]>e2[field]) return 1;
                return 0;
        }
    }
    /*int*/function sortthisDown(e1, e2)
    {
        if (field==null)
        {
            if (e1>e2) return -1;
            if (e1<e2) return 1;
            return 0;
        }
        else 
        {
        if (e1[field]>e2[field]) return -1;
        if (e1[field]<e2[field]) return 1;
            return 0;
        }
    }
}
// wird nur für das Ausgabeprogramm benötigt
// schneidet einen String von links mit einer bestimmten Länge ab
String.prototype.left=function(length){if (this.length<length) return this; return this.substr(0,length)};
// wird nur für das Ausgabeprogramm benötigt
// ermittelt die Feldnamen eines JavaScript-Objektes
/*array */Object.prototype.properties=function()
{
    var a = new Array();
    for (var prop in this)
    {
        a.push(prop);
    }
    return a;
}
main();

    // DESCRIPTION variableHoliDays
    // Dateiname: variableHoliDays.jsx
    //  © 2013 by Werner Perplies, EDV-Anwendungsberatung, 
    // https://www.weepee.de, email: werner.perplies@weepee.de 
    // [created]
    // [modified]
    // [end of header]
function main()
{
    // gewünschtes Jahr laden
    var year = 2021;
    // slle Feiertage mit festem Datum laden 
    var fixedDateHolidays = loadFixedDayHolidays(year);
    // initialisert das Objekt variableHoliDays und gibt die variablen 
    // Feiertage zurück
    var variableHolidays = new variableHoliDays(year, false).holidays;
    // ergänzt die erhaltene Liste um die festen Feiertage
    var holidays = variableHolidays.add(fixedDateHolidays);
    // gibt die erhaltenen Feiertage in einem Fenster sortiert (nach Datum) aus
    out(variableHolidays);
    return;
    function out(/*Array*/holidays)
    {
        // prepare array for sorting:
        holidays = holidays.sortThis("value");
        for (var i = 0; i<holidays.length; i++)
            holidays[i].germanDate =  holidays[i].value.sGermanDate();
        var output = "";
        for (var i = 0; i<holidays.length; i++)
            output += holidays[i].name + ": " + holidays[i].germanDate + "\n";             
        alert(output);    
    }
    // lädt die festen Feiertage in ein Array
    /*object*/function loadFixedDayHolidays(/*int*/year)
    {
        var fixedHolidays = [];
        fixedHolidays.push({name: "Neujahr", value:  new Date(year,0,1)}); 
        fixedHolidays.push({name: "HeiligeDreiKönige", value: new Date(year,0,6)}); 
        fixedHolidays.push({name: "Valentinstag", value: new Date(year,1,14)}); 
        fixedHolidays.push({name: "Maifeiertag", value: new Date(year,4,1)}); 
        fixedHolidays.push({name: "Friedensfest", value: new Date(year,7,8)}); 
        fixedHolidays.push({name: "MariäHimmelfahrt", value: new Date(year,7,8)}); 
        fixedHolidays.push({name: "TagDerDeutschenEinheit", value: new Date(year,9,3)}); 
        fixedHolidays.push({name: "Halloween", value: new Date(year,9,31)}); 
        fixedHolidays.push({name: "Reformationstag", value: new Date(year,9,31)}); 
        fixedHolidays.push({name: "Allerheiligen", value: new Date(year,10,1)}); 
        fixedHolidays.push({name: "Allerseelen", value: new Date(year,10,2)}); 
        fixedHolidays.push({name: "Martinstag", value: new Date(year,10,11)}); 
        fixedHolidays.push({name: "Barbaratag", value: new Date(year,11,4)}); 
        fixedHolidays.push({name: "Nikolaus", value: new Date(year,11,6)}); 
        fixedHolidays.push({name: "Heiligabend", value: new Date(year,11,24)}); 
        fixedHolidays.push({name: "ErsterWeihnachtsfeiertag", value: new Date(year,11,25)}); 
        fixedHolidays.push({name: "ZweiterWeihnachtsfeiertag", value: new Date(year,11,26)}); 
        fixedHolidays.push({name: "Silvester", value: new Date(year,11,31)}); 
        return fixedHolidays;
    }
    // berechnet die variablen Feiertage - property holidays enthält Array mit Feiertagen
    /*object*/function variableHoliDays(/*int*/year,  /*bool*/julian, /*object*/baseDays)
    {
        // var holidays = {};
        // this.holidays = holidays;
        this.holidays = [];
        // var dEaster = GetDateOfEasterAsDate(/*int*/year, /*bool*/julian);
        // this.dEaster  = dEaster;
        this.dEaster  = GetDateOfEasterAsDate(/*int*/year, /*bool*/julian);
        // var sEaster = GetDateOfEasterAsString(/*int*/year, /*bool*/julian);
        // this.sEaster  = sEaster;
        this.sEaster  = GetDateOfEasterAsString(/*int*/year, /*bool*/julian);
        if (baseDays==null)
        {
            var baseDays = {};
            baseDays.eastSun = this.dEaster;
            var date = new Date(year,11,24);
            baseDays.firstAdvent = date.getSpecialDay(0,-4, true); // 4. Advent kann auf Startdatum liegen!
        }
        this.holidays.push({name: "Rosenmontag", value: baseDays.eastSun.addDays2Date(-48)}); // Rosenmontag
        this.holidays.push({name: "Faschingsdienstag", value: baseDays.eastSun.addDays2Date(-47)}); // Faschingsdienstag
        this.holidays.push({name: "Aschermittwoch", value: baseDays.eastSun.addDays2Date(-46)}); // Aschermittwoch
        this.holidays.push({name: "Gründonnerstag", value: baseDays.eastSun.addDays2Date(-3)}); // Gründonnerstag
        this.holidays.push({name: "Karfreitag", value: baseDays.eastSun.addDays2Date(-2)}); // Karfreitag
        this.holidays.push({name: "Ostersonntag", value: baseDays.eastSun}); // Ostersonntag
        this.holidays.push({name: "Ostermontag", value: baseDays.eastSun.addDays2Date(1)}); // Ostermontag
        this.holidays.push({name: "Muttertag", value: (new Date(year,4,1)).getSpecialDay(0,2)}); // Muttertag
        this.holidays.push({name: "Himmelfahrt", value : baseDays.eastSun.addDays2Date(39)}); // Christi Himmelfahrt
        this.holidays.push({name: "Pfingstsonntag", value: baseDays.eastSun.addDays2Date(49)}); // Pfingstsonntag
        this.holidays.push({name: "Pingstmontag", value: baseDays.eastSun.addDays2Date(50)}); // Pfingstmontag
        this.holidays.push({name: "Fronleichnam", value: baseDays.eastSun.addDays2Date(60)}); // Fronleichnam
        this.holidays.push({name: "Volkstrauertag", value: baseDays.firstAdvent.getSpecialDay(0,-2)}); //  Volkstrauertag
        this.holidays.push({name: "BußUndBettag", value: baseDays.firstAdvent.addDays2Date(-11)}); //  Buß und Bettag
        this.holidays.push({name: "Totensonntag", value: baseDays.firstAdvent.getSpecialDay(0,-1)}); // Totensonntag
        this.holidays.push({name: "ErsterAdvent", value: baseDays.firstAdvent}); // 1. Advent
        this.holidays.push({name: "ZweiterAdvent", value: baseDays.firstAdvent.addDays2Date(7)}); // 2. Advent
        this.holidays.push({name: "DritterAdvent", value: baseDays.firstAdvent.addDays2Date(14)}); // 3. Advent
        this.holidays.push({name: "VierterAdvent", value: baseDays.firstAdvent.addDays2Date(21)}); // 4. Advent
        // DESCRIPTION ermittelt das Osterdatum eines Jahres
        /*date*/function GetDateOfEasterAsDate(/*int*/year, /*bool*/julian)
        {
            // entwickelt nach https://de.wikipedia.org/wiki/Gaußsche_Osterformel
            var a =year%19;
            var b = year%4;
            var c = year%7
            var k = Math.floor(year/100);
            var p = Math.floor(k/3);
            var q = Math.floor(k/4);
            if (julian)
            {
                var m = 15;
                var n= 6;
            }
            else
            {
                var m = (15 + k -p -q)%30;
                var n = (4 + k -q)%7;        
            }
            var d = (19*a + m)%30;
            var e = (2*b + 4*c + 6*d + n)%7;
            var day = 22+d+e;
            if (day > 31) {day = day-31; var month = 3;}
            else var month = 2;
            return new Date(year,month,day); // day+"."+month+"."+year;
        }
        /*string*/function GetDateOfEasterAsString(/*int*/year, /*bool*/julian)
        {
            var dateC =  GetDateOfEasterAsDate(year, julian).toLocaleString();
            return dateC.left(dateC.length-" 00:00:00".length);
        }
    }  
}
Beispiel:
out.png
Ergebnis für das Jahr 2021
Zuletzt geändert von wernerperplies am 13. Aug 2013, 07:15, insgesamt 4-mal geändert.
einen schönen Tag wünscht

Werner Perplies
https://www.weepee.de

Antworten

Zurück zu „Snippets und Libs“