public function __construct($source_filename, $is_draft = -1) { $this->source_filename = $source_filename; $this->is_draft = $is_draft === -1 ? false !== strpos($source_filename, 'drafts/') || false !== strpos($source_filename, 'pages/') : $is_draft; $this->timestamp = filemtime($source_filename); $segments = explode("\n\n", trim(file_get_contents($source_filename)), 2); if (!isset($segments[1])) { $segments[1] = ''; } if (count($segments) > 1) { // Read headers for Tag, Type values $headers = explode("\n", $segments[0]); $has_title_yet = false; foreach ($headers as $header) { if (isset($header[0]) && $header[0] == '=') { $has_title_yet = true; continue; } if (!$has_title_yet) { $has_title_yet = true; $this->title = $header; continue; } if ($this->is_draft && strtolower($header) == 'publish-now') { $this->publish_now = true; continue; } $fields = explode(':', $header, 2); if (count($fields) < 2) { continue; } $fname = strtolower($fields[0]); $fields[1] = trim($fields[1]); if ($fname == 'tags') { $this->tags = self::parse_tag_str($fields[1]); } else { if ($fname == 'type') { $this->type = str_replace('|', ' ', $fields[1]); } else { if ($fname == 'published') { $this->timestamp = strtotime($fields[1]); } else { $this->headers[$fname] = $fields[1]; } } } if (isset($this->headers['link'])) { $this->type = 'link'; } } array_shift($segments); } $this->body = isset($segments[0]) ? $segments[0] : ''; $filename = basename($source_filename); $filename_datestr = substr($filename, 0, 8); if (is_numeric($filename_datestr)) { $this->year = intval(substr($filename_datestr, 0, 4)); $this->month = intval(substr($filename_datestr, 4, 2)); $this->day = intval(substr($filename_datestr, 6, 2)); $this->offset_in_day = intval(substr($filename, 9, 2)); $this->slug = ltrim(substr($filename, 11, -strlen(Updater::$post_extension)), '-'); } else { $this->year = intval(idate('Y', $this->timestamp)); $this->month = intval(idate('m', $this->timestamp)); $this->day = intval(idate('d', $this->timestamp)); $posts_in_ym = Updater::posts_in_year_month($this->year, $this->month); $this->offset_in_day = isset($posts_in_ym[$this->day]) ? count($posts_in_ym[$this->day]) + 1 : 1; $this->slug = substring_before($filename, '.'); } if (!$this->is_draft && $source_filename != $this->expected_source_filename()) { error_log("Expected filename mismatch:\nfilename: {$source_filename}\nexpected: " . $this->expected_source_filename()); } }