/** * Format a timestamp * * This function can convert an input timestamp into specific PHP strftime() outputs, including applying necessary timezone calculations. * * @access public * @param string Output format for the timestamp * @param int Timestamp to use for displaying * @param boolean Indicates, if timezone calculations shall be used. * @param boolean Whether to use strftime or simply date * @return string The formatted timestamp */ function serendipity_strftime($format, $timestamp = null, $useOffset = true, $useDate = false) { global $serendipity; static $is_win_utf = null; if ($is_win_utf === null) { // Windows does not have UTF-8 locales. $is_win_utf = LANG_CHARSET == 'UTF-8' && strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' ? true : false; } if ($useDate) { $out = date($format, $timestamp); } else { switch ($serendipity['calendar']) { default: case 'gregorian': if ($timestamp == null) { $timestamp = serendipity_serverOffsetHour(); } elseif ($useOffset) { $timestamp = serendipity_serverOffsetHour($timestamp); } $out = strftime($format, $timestamp); break; case 'persian-utf8': if ($timestamp == null) { $timestamp = serendipity_serverOffsetHour(); } elseif ($useOffset) { $timestamp = serendipity_serverOffsetHour($timestamp); } require_once S9Y_INCLUDE_PATH . 'include/functions_calendars.inc.php'; $out = persian_strftime_utf($format, $timestamp); break; } } if ($is_win_utf && (empty($serendipity['calendar']) || $serendipity['calendar'] == 'gregorian')) { $out = utf8_encode($out); } return $out; }
/** * Format a string according to Persian calendar (UTF) * * @author Omid Mottaghi * @access public * @param string Formatting string * @param int Timestamp to format * @return string Formatted local time/date according to locale settings */ function persian_strftime_utf($format, $timestamp = '') { if ($timestamp == '') { $timestamp = mktime(); } $g_d = date('j', $timestamp); $g_m = date('n', $timestamp); $g_y = date('Y', $timestamp); list($jy, $jm, $jd, $j_all_days) = g2p($g_y, $g_m, $g_d); $j_month_name = array('', 'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'); $j_week_name = array('Saturday' => 'شنبه', 'Sunday' => 'یک شنبه', 'Monday' => 'دوشنبه', 'Tuesday' => 'سه شنبه', 'Wednesday' => 'چهارشنبه', 'Thursday' => 'پنج شنبه', 'Friday' => 'جمعه', 'Sat' => 'ش', 'Sun' => 'ی', 'Mon' => 'د', 'Tue' => 'س', 'Wed' => 'چ', 'Thu' => 'پ', 'Fri' => 'ج'); $j_week_number = array('Sat' => '1', 'Sun' => '2', 'Mon' => '3', 'Tue' => '4', 'Wed' => '5', 'Thu' => '6', 'Fri' => '7'); // calculate string $output_str = ''; for ($i = 0; $i < strlen($format); $i++) { if ($format[$i] == '%') { $i++; switch ($format[$i]) { case 'a': $output_str .= $j_week_name[date('D', $timestamp)]; break; case 'A': $output_str .= $j_week_name[date('l', $timestamp)]; break; case 'b': case 'B': case 'h': $output_str .= $j_month_name[$jm]; break; case 'c': $output_str .= persian_strftime_utf('%y/%m/%d %I:%M:%S', $timestamp); break; case 'C': $output_str .= floor($jy / 100); break; case 'd': if ($jd < 10) { $output_str .= '0' . $jd; } else { $output_str .= $jd; } break; case 'D': $output_str .= $jy . '/' . $jm . '/' . $jd; break; case 'e': if ($jd < 10) { $output_str .= ' ' . $jd; } else { $output_str .= $jd; } break; case 'H': $output_str .= date('H', $timestamp); break; case 'I': $output_str .= date('h', $timestamp); break; case 'j': $output_str .= sprintf('%03d', $j_all_days); break; case 'm': if ($jm < 10) { $output_str .= '0' . $jm; } else { $output_str .= $jm; } break; case 'M': $output_str .= date('i', $timestamp); break; case 'n': $output_str .= "\n"; break; case 'r': case 'p': if (date('a', $timestamp) == 'pm') { $output_str .= 'بعد از ظهر'; } else { $output_str .= 'قبل از ظهر'; } break; case 'R': $output_str .= strftime('%R', $timestamp); break; case 'S': $output_str .= date('s', $timestamp); break; case 't': $output_str .= "\t"; break; case 'U': case 'V': case 'W': $output_str .= sprintf('%02d', floor(($j_all_days + 1) / 7)); break; case 'u': case 'w': $output_str .= $j_week_number[date('D', $timestamp)]; break; case 'x': $output_str .= persian_strftime_utf('%y/%m/%d', $timestamp); break; case 'X': $output_str .= persian_strftime_utf('%I:%M:%S', $timestamp); break; case 'g': case 'y': $output_str .= $jy - floor($jy / 100) * 100; break; case 'G': case 'Y': $output_str .= $jy; break; case 'z': case 'Z': $output_str .= strftime('%z', $timestamp); break; case '%': $output_str .= '%'; break; } } else { $output_str .= $format[$i]; } } return $output_str; }
function generate_content(&$title) { global $serendipity; $title = $this->title; // Usage of serendipity_serverOffsetHour is as follow: // * Whenever a date to display needs to be set, apply the timezone offset // * Whenever we USE the date anywhere in the database, subtract the timezone offset // * Whenever we DISPLAY the date, we do not apply additional timezone addition to it. if (!isset($serendipity['GET']['calendarZoom'])) { if (!isset($serendipity['range'])) { $serendipity['GET']['calendarZoom'] = serendipity_serverOffsetHour(time()); } else { $serendipity['GET']['calendarZoom'] = serendipity_serverOffsetHour($serendipity['range'][0]); } } $month = date('m', serendipity_serverOffsetHour($serendipity['GET']['calendarZoom'], true)); $year = date('Y', serendipity_serverOffsetHour($serendipity['GET']['calendarZoom'], true)); $bow = (int) $this->get_config('beginningOfWeek', 1); // Check for faulty input, is so - run the default if ($bow > 6) { $bow = 1; } // Catch faulty month $month = (int) $month; if ($month < 1) { $month = 1; } switch ($serendipity['calendar']) { default: case 'gregorian': // How many days does the month have? $ts = strtotime($year . '-' . sprintf('%02d', $month) . '-01'); $now = serendipity_serverOffsetHour(time()); $nrOfDays = date('t', $ts); $firstDayWeekDay = date('w', $ts); $firstts = $ts; $endts = mktime(0, 0, 0, $month + 1, 1, $year); break; case 'persian-utf8': require_once S9Y_INCLUDE_PATH . 'include/functions_calendars.inc.php'; list(, $jy, $jm, $jd) = $serendipity['uriArguments']; if (isset($jd) && $jd) { list($gy, $gm, $gd) = p2g($jy, $jm, $jd); } elseif (isset($jm) && $jm) { list($gy, $gm, $gd) = p2g($jy, $jm, 1); } else { $gy = $year; $gm = $month; $gd = (int) date('d'); } list($year, $month, $day) = g2p($gy, $gm, $gd); // How many days does the month have? $ts = strtotime($gy . '-' . sprintf('%02d', $gm) . '-' . sprintf('%02d', $gd)); $now = serendipity_serverOffsetHour(time()); $nrOfDays = persian_strftime_utf('%m', $ts); $j_days_in_month = array(0, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29); if ($year % 4 == 3 && $nrOfDays == 12) { $nrOfDays = $j_days_in_month[(int) $nrOfDays] + 1; } else { $nrOfDays = $j_days_in_month[(int) $nrOfDays]; } // Calculate first timestamp of the month list($firstgy, $firstgm, $firstgd) = p2g($year, $month, 1); $firstts = mktime(0, 0, 0, $firstgm, $firstgd, $firstgy); // Calculate first persian day, week day name $firstDayWeekDay = date('w', $firstts); // Calculate end timestamp of the month list($end_year, $end_month, $end_day) = p2g($year, $month + 1, 1); $endts = mktime(0, 0, 0, $end_month, $end_day, $end_year); break; } // end switch // Calculate the first day of the week, based on the beginning of the week ($bow) if ($bow > $firstDayWeekDay) { $firstDayWeekDay = $firstDayWeekDay + 7 - $bow; } elseif ($bow < $firstDayWeekDay) { $firstDayWeekDay = $firstDayWeekDay - $bow; } else { $firstDayWeekDay = 0; } // Calculate the number of next/previous month if ($month > 1) { $previousMonth = $month - 1; $previousYear = $year; } else { $previousMonth = 12; $previousYear = $year - 1; } if ($month < 12) { $nextMonth = $month + 1; $nextYear = $year; } else { $nextMonth = 1; $nextYear = $year + 1; } // Get first and last entry $minmax = serendipity_db_query("SELECT MAX(timestamp) AS max, MIN(timestamp) AS min FROM {$serendipity['dbPrefix']}entries"); if (!is_array($minmax) || !is_array($minmax[0]) || $minmax[0]['min'] < 1 || $minmax[0]['max'] < 1) { // If no entry is available yet, allow scrolling a year back and forth $minmax = array('0' => array('min' => mktime(0, 0, 0, 1, 1, date('Y', $now) - 1), 'max' => mktime(0, 0, 0, 1, 1, date('Y', $now) + 1))); } // Find out about diary entries $add_query = ''; $base_query = ''; $cond = array(); $cond['and'] = "WHERE e.timestamp >= " . serendipity_serverOffsetHour($firstts, true) . "\n AND e.timestamp <= " . serendipity_serverOffsetHour($endts, true) . "\n " . (!serendipity_db_bool($serendipity['showFutureEntries']) ? " AND e.timestamp <= " . serendipity_db_time() : '') . "\n AND e.isdraft = 'false'"; serendipity_plugin_api::hook_event('frontend_fetchentries', $cond, array('noCache' => false, 'noSticky' => false, 'source' => 'calendar')); // Event Calendar $cat = $this->get_config('category', 'all'); if ($cat != 'all') { $catid = (int) $cat; } elseif (isset($serendipity['GET']['category'])) { $catid = (int) $serendipity['GET']['category']; } else { $catid = false; } if ($catid) { $base_query = 'C' . $catid; $add_query = '/' . $base_query; $querystring = "SELECT timestamp\n FROM {$serendipity['dbPrefix']}category c,\n {$serendipity['dbPrefix']}entrycat ec,\n {$serendipity['dbPrefix']}entries e\n {$cond['joins']}\n {$cond['and']}\n AND e.id = ec.entryid\n AND c.categoryid = ec.categoryid\n AND (" . serendipity_getMultiCategoriesSQL($catid) . ")"; } if (!isset($querystring)) { $querystring = "SELECT id, timestamp\n FROM {$serendipity['dbPrefix']}entries e\n {$cond['joins']}\n {$cond['and']}"; } $rows = serendipity_db_query($querystring); switch ($serendipity['calendar']) { default: case 'gregorian': $activeDays = array(); if (is_array($rows)) { foreach ($rows as $row) { $row['timestamp'] = serendipity_serverOffsetHour($row['timestamp']); $activeDays[date('j', $row['timestamp'])] = $row['timestamp']; } } $today_day = date('j', $now); $today_month = date('m', $now); $today_year = date('Y', $now); break; case 'persian-utf8': $activeDays = array(); if (is_array($rows)) { foreach ($rows as $row) { $row['timestamp'] = serendipity_serverOffsetHour($row['timestamp']); $activeDays[(int) persian_date_utf('j', $row['timestamp'])] = $row['timestamp']; } } $today_day = persian_date_utf('j', $now); $today_month = persian_date_utf('m', $now); $today_year = persian_date_utf('Y', $now); break; } // end switch $externalevents = array(); if (serendipity_db_bool($this->get_config('enableExtEvents', false))) { serendipity_plugin_api::hook_event('frontend_calendar', $externalevents, array('Month' => $month, 'Year' => $year, 'TS' => $ts, 'EndTS' => $endts)); } // Print the calendar $currDay = 1; $nrOfRows = ceil(($nrOfDays + $firstDayWeekDay) / 7); for ($x = 0; $x < 6; $x++) { // Break out if we are out of days if ($currDay > $nrOfDays) { break; } // Prepare row for ($y = 0; $y < 7; $y++) { $cellProps = array(); $printDay = ''; $link = ''; if ($x == 0) { $cellProps['FirstRow'] = 1; } if ($y == 0) { $cellProps['FirstInRow'] = 1; } if ($y == 6) { $cellProps['LastInRow'] = 1; } if ($x == $nrOfRows - 1) { $cellProps['LastRow'] = 1; } // If it's not a blank day, we print the day if (($x > 0 || $y >= $firstDayWeekDay) && $currDay <= $nrOfDays) { $printDay = $currDay; if ($today_day == $currDay && $today_month == $month && $today_year == $year) { $cellProps['Today'] = 1; } if (isset($externalevents[$currDay])) { if (isset($externalevents[$currDay]['Class'])) { $cellProps[$externalevents[$currDay]['Class']] = 1; } if (isset($externalevents[$currDay]['Title'])) { $cellProps['Title'] = htmlspecialchars($externalevents[$currDay]['Title']); } if (isset($externalevents[$currDay]['Extended'])) { foreach ($externalevents[$currDay]['Extended'] as $ext_key => $ext_val) { $cellProps[$ext_key] = $ext_val; } } } if (isset($activeDays[$currDay]) && $activeDays[$currDay] > 1) { $cellProps['Active'] = 1; $cellProps['Link'] = serendipity_archiveDateUrl(sprintf('%4d/%02d/%02d', $year, $month, $currDay) . $add_query); } $currDay++; } $smartyRows[$x]['days'][] = array('name' => $printDay, 'properties' => $cellProps, 'classes' => implode(' ', array_keys($cellProps))); } // end for } // end for $serendipity['smarty']->assignByRef('plugin_calendar_weeks', $smartyRows); $dow = array(); for ($i = 1; $i <= 7; $i++) { $dow[] = array('date' => mktime(0, 0, 0, 3, $bow + $i - 1, 2004)); } $serendipity['smarty']->assignByRef('plugin_calendar_dow', $dow); $plugin_calendar_data = array('month_date' => $ts, 'uri_previous' => serendipity_archiveDateUrl(sprintf('%04d/%02d', $previousYear, $previousMonth) . $add_query), 'uri_month' => serendipity_archiveDateUrl(sprintf('%04d/%02d', $year, $month) . $add_query), 'uri_next' => serendipity_archiveDateUrl(sprintf('%04d/%02d', $nextYear, $nextMonth) . $add_query), 'minScroll' => $minmax[0]['min'], 'maxScroll' => $minmax[0]['max']); $serendipity['smarty']->assignByRef('plugin_calendar_head', $plugin_calendar_data); echo serendipity_smarty_fetch('CALENDAR', 'plugin_calendar.tpl'); }