そんなことやってるバヤイじゃないでしょという気もしなくもないですが、コレ更新しないとどうしても気が済まないので。
例によってイラレのJavaScriptで作ってあります。コードを見たい方は、以下。
今年は祝日どうなるのか、なかなか確定せず、情報も五月雨式に出たので、ネットでの言及もバラバラとしていて結構難儀しました。
結局、2018年現在の日本においては
●その日でないとダメなやつ(元旦・天皇誕生日等)
●天文学的な計算値によって決定するもの(春分の日・秋分の日)
●○月の第○週(の月曜日)系(成人の日等)
の3系統がある上、
●「休日オセロ」(平日の前後が祝日に挟まれると、その日も休日になる。正式名称は「国民の休日」。GW、SWで発生しがち
参考→ 参議院法制局/国民の休日 – Wikipedia )
●「振替休日のマルチスライド」(例:日曜日が祝日、月曜日も祝日、の場合は、振替休日が火曜日に出現する等。今のところGWにのみ発生、かな? 参考→ 振替休日 – Wikipedia )
という例外処理が存在しており、なんというか「どうしてこうなった」感しかないですね。
しかも2019年は「その年限り(?)」の祝日とかもあるし(まあこちらは平成のド頭にもあったようですが、なぜか全く記憶に無いですねえ)。
そんなこんなで、冷静に考えると、こと祝日に関しては「万年カレンダー生成スクリプト」ではなく、「その年(来年)カレンダー生成スクリプト」になってしまっているのですが……まあ、いいや。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 | // Calendar Script for Adobe Illustrator CS〜CS6/CS20xx //CSの場合は文字コードをShift_JISに、CS2の場合はUTF-8にすること //祝日ロジックは2019年のみに完全対応 //初期値いろいろ(長さ系の単位はすべてピクセル) //ドキュメントサイズを決定 var docX = 1280; var docY = 854; // ベースのフォントサイズ; var fontSize = 10; //1日あたりの幅 var calDX = 26; var calDY = 26; //1月あたりのブロックの幅(「s(日曜)」から「s(日曜)」まで) var blockX = 200; var blockY = 250; //カレンダーの最初の表示位置 var baseX = (docX - ( blockX * 5 ) - (calDX * 6 ))/2 ; var baseY = 500; //複数年にまたがるかどうかのフラグ var yearTimes = 0; docObj = documents.add(DocumentColorSpace.RGB,docX,docY); function setColor(r,g,b) { var tmpColor = new RGBColor(); tmpColor.red = r; tmpColor.green = g; tmpColor.blue = b; return tmpColor; } pObj = docObj.pathItems.rectangle(0,0,1280,-854); pObj.fillColor = setColor(255,255,255); pObj.stroked = false ; txtColor = new RGBColor(); docObj = activeDocument; function calendar(theYear__,theMonth__){ var wrtMonth= new Array(0,31,28,31,30,31,30,31,31,30,31,30,31); var wrtDate = new Array( "S" , "M" , "T" , "W" , "T" , "F" , "S" ); //曜日の表示文字列を定義 var yearCol = [153,153,153]; var monthCol = [64,64,64]; var weekCol = [0,84,71]; //■↓一週間分の色(赤輝度,青輝度,緑輝度) var wrtColor= new Array([144,144,144],[26,26,26],[26,26,26],[26,26,26],[26,26,26],[26,26,26],[128,128,128]); var special = new Array(3,21, 9,23, 1,1, 2,11, 4,29, 4,30, 5,1, 5,2, 5,3, 5,4, 5,5, 8,11, 10,22, 11,3, 11,23); //2019〜休日 ただし、「○月第○週」のようなもの(成人の日、海の日、敬老の日、体育の日)は別ロジック。また、2020年はさらに変更あり。 var specCnt = special.length / 2; var specCol = [144,144,144]; // 休日の文字色 var theDate = new Date(); // 日付オブジェクトを生成 var monthNames = new Array( "january" , "february" , "march" , "april" , "may" , "june" , "july" , "august" , "september" , "october" , "november" , "december" ); //月の表示文字列を定義 //###var specCnt = 13; // Happy Monday対策 if (theYear__){ // 年月が指定されていた場合は年月を再設定 theDate.setYear(theYear__); // 指定年を設定 theDate.setMonth(theMonth__-1); // 指定月を設定 } else { theYear__ = theDate.getFullYear(); theMonth__= theDate.getMonth()+1; } // 閏年だったら2月を29日にする if (((theYear__ % 4 == 0) && (theYear__ % 100 != 0)) || (theYear__ % 400 == 0)){ wrtMonth[2] = 29; } // 春分/秋分の日を求める(1980-2099まで) #special[0]special[2]では??? special[1] = Math.floor(20.8431 + 0.242194 * (theYear__ - 1980)- Math.floor((theYear__ - 1980)/4)); special[3] = Math.floor(23.2488 + 0.242194 * (theYear__ - 1980)- Math.floor((theYear__ - 1980)/4)); theDate.setFullYear(theYear__); // 指定年を設定 theDate.setMonth(theMonth__-1); // 指定月を設定 theDate.setDate(1); // 日付を1日にし曜日を次の行で取得 var count = theDate.getDay(); var day = 0; // 曜日カウンタを0にする var date = 1; // 日付を1日にする var flag = false ; // 休日&日曜日フラグ var hFlag = false ; // 休日フラグ var xFlag = false ; // 成人の日/体育の日等の、Happy Mondayで変動する系の休日 var i,j; var week = 0; // 2000年からの体育の日と成人の日対策 var calX = 0; //■カレンダーを表示する相対座標(X) var calY = 60; //■カレンダーを表示する相対座標(Y) drawColor([0,0,0]); // 色の初期化 //年の描画。複数年にまたがるかどうかで処理を分岐 drawColor(yearCol); if (yearTimes < 1){ if ( calMonthStart == 1){ write(theYear__, 1174, -200,146, "HelveticaNeue-Light" ,5,Justification.RIGHT); } else { var nextYear = Number(theYear__) + 1; write(theYear__ + "–" + nextYear, 1174, -200,146, "HelveticaNeue-Light" ,5,Justification.RIGHT); } } yearTimes++; //月名の描画 drawColor(monthCol); if (theMonth__ == 12) { var theMonth = 12 ; } else { var theMonth = Number(theMonth__) % 12; } write(theMonth, 0, 0,18); // 相対座標(0pt,0pt)に描画 write(monthNames[theMonth -1], 20, 0,12, "MyriadPro-Regular" ,400,Justification.LEFT); // 相対座標(20pt,0pt)に描画 drawColor(weekCol); for (i=0;i< 7;i++) {write(wrtDate[i], 0+i*calDX, 30, 10); } // 曜日書き出し //日付の描画 flag = false ; //デフォでfalseにしとく(休日が日曜日だった場合、trueに変える) for (i=1;i<=wrtMonth[theMonth]+count;i++){hFlag = false ; // 休日だったらtrue if (day >=count){ wrt = "" +date; for (j=0; j< specCnt; j++){ if ((special[j*2] == theMonth) && (special[j*2+1] == date)){ drawColor(specCol); if ((day % 7) == 0) flag = true ; // 休日が日曜日だったらtrue hFlag = true ; } } date++; if ((day % 7) == 1) week++; // 月曜日の場合は週の数を増やす } else { wrt = " " ; } // 1月と7月と9月と10月の休日処理(Happy Mondayの処理) xFlag = false ; if ( ((theMonth == 1) || (theMonth == 10)) && (week== 2) && ((day % 7) == 1)) xFlag = true ; if ( ((theMonth == 7) || (theMonth == 9)) && (week== 3) && ((day % 7) == 1)) xFlag = true ; truedate = date-1; //var thisD = new Date("09-" + truedate + "-" + theYear__ ); var thisD = new Date(theMonth + "-" + truedate + "-" + theYear__ ); y = thisD.getFullYear(); m = thisD.getMonth() + 1; d = thisD.getDate(); yb = thisD.getDay(); var thisDate = y + "-" + m + "-" + d; var shuubunD = new Date( "09-" + special[3] + "-" + theYear__ ); y = shuubunD.getFullYear(); m = shuubunD.getMonth() + 1; d = shuubunD.getDate(); yb = shuubunD.getDay(); var shuubunDate = y + "-" + m + "-" + d; var calcWeekCountInTargetYearAndMonthByDate = function (year, month, day) { var d = new Date(year, month, day); return Math.floor((d.getDate() - d.getDay() + 12) / 7); } function getDateOfWeekOfDay(year, month, week, day) { //第n週のd曜日、の算出。日付だけ戻す。 // 1・指定した年月の最初の曜日を取得 var mydate = new Date(month+ "/1" + "/" +year); var firstDay = mydate.getDay(); // 2・求めたい曜日の第1週の日付けを計算する var day = day - firstDay + 1; if (day <= 0) day += 7; // 3・n週まで1週間を足す day += 7 * (week - 1); // 4・結果 result = new Date(month+ "/" +day+ "/" +year); var Y = parseInt(result.getFullYear()); var m = parseInt(result.getMonth())+1; var d = parseInt(result.getDate()); return (d); } gwdate = getDateOfWeekOfDay(theYear__,9,3,1); if ( theMonth == 9 && (shuubunD.getDate() - truedate == 1 && truedate - gwdate == 1) ){ xFlag = true ; //「9月における「国民の休日」」成立! } if (xFlag){ drawColor(specCol); } else { if ((hFlag == false ) && flag == false ) drawColor(wrtColor[day % 7]); if (((day % 7) == 1) && flag == true ) { drawColor(specCol); flag = false ;} } ////////drawBox(calX, calY); //■枠を表示する部分。しない場合は行ごと削除 write(wrt, calX, calY); //fontSize明示せず calX += calDX; if (day % 7 == 6) { calX = 0; calY += calDY; } day++; // 1日増やす } // end of for() } // end of function calendar() //function write(txt, x,y, fontSize){ function write(){ var textObj = docObj.textFrames.add(); var fontSize = 11; var fontName = app.textFonts.getByName( "MyriadPro-Regular" ); var trackVal= 0; var justification = Justification.CENTER; switch (arguments.length) { default : case 7: var justification = arguments[6]; // 第7引数まであれば justification に代入 case 6: var trackVal = arguments[5]; // 第6引数まであれば trackVal に代入 case 5: var fontName = app.textFonts.getByName(arguments[4]);; // 第5引数まであれば fontName に代入 case 4: var fontSize = arguments[3]; // 第4引数まであれば fontSize に代入 case 3: y = arguments[2]; // 第3引数まであれば y に代入 case 2: x = arguments[1]; // 第2引数まであれば x に代入 case 1: txt = arguments[0]; // 第1引数まであれば arg1 に代入 case 0: } //テキストプロパティの指定 textObj.contents = txt; for ( j = 0; j < textObj.contents.length; j++){ textObj.characters[j].size = fontSize; textObj.characters[j].textFont = fontName; textObj.characters[j].tracking = trackVal; } textObj.translate(baseX + x, baseY - y); for ( var i=0; i< textObj.characters.length; i++){ textObj.characters[i].fillColor = txtColor; //ハイフンの色の処理 for ( j = 0; j < textObj.contents.length; j++){ extraColor = new RGBColor(); extraColor.red = 204; extraColor.green = 204; extraColor.blue = 204; if (textObj.characters[j].contents == "-" ){ textObj.characters[j].fillColor = extraColor; } } } textObj.paragraphs[0].justification = justification; } function drawColor(col){ txtColor.red = col[0]; txtColor.green = col[1]; txtColor.blue = col[2]; } function setColor(r,g,b){ var tmpColor = new RGBColor(); tmpColor.red = r; tmpColor.green = g; tmpColor.blue = b; return tmpColor; } // var nextYear = new Date(); calYear = prompt( "作成する年を入れてください" ,nextYear.getFullYear()+1); calMonthStart = prompt( "開始する月を入れてください" ,1); storeX = baseX; for (cy=0; cy< 2; cy++){ //■縦に2つ for (cx=0; cx< 6; cx++){ //■横に6つ calendar(calYear, calMonthStart); baseX += blockX; calMonthStart++; } baseX = storeX; baseY -= blockY; } |