$config["title"]); $rev_id = exec("git rev-parse --short HEAD", $output, $retval); if ($retval != 0) { $rev_id = "unknown"; } $substitutions["{GIT_REV_ID}"] = $rev_id; date_default_timezone_set('UTC'); $substitutions["{TIMESTAMP}"] = date("Y-m-d H:i:s e"); // Copy resources across $resources_to_copy = array_merge(glob("resources/common/*"), glob($config["resources_dir"] . "/*")); $res_out_dir = $config["output_dir"] . "/" . $config["resources_output_dir"]; if (!is_dir($res_out_dir)) { mkdir($res_out_dir, 0777, true); } foreach ($resources_to_copy as $res) { $res_name = basename($res); $substitutions["{RES:$res_name}"] = $config["resources_output_dir"] . "/$res_name"; copy($res, "$res_out_dir/$res_name"); } if (!is_dir($config["output_dir"])) { mkdir($config["output_dir"], 0777, true); } // We need to pre-process all the pages to get the section headings ready $sections = array(); // entries are associative arrays $template_texts = array(); $page_no = 1; foreach ($config["pages"] as $page) { // Read in the text $template_html = $config["html_dir"] . "/" . $page["id"] . ".html"; $text = file_get_contents($template_html); $section_no = 0; $subsection_no = 0; // Look for things we need to convert to h1, h2, h3 preg_match_all("/{HEADING:(PAGE|SECTION|SUBSECTION):([^:]*):([^}]+)}/", $text, $section_matches); $originals = $section_matches[0]; $types = $section_matches[1]; $ids = $section_matches[2]; $titles = $section_matches[3]; // TOC gets its info from the config file, not from an h1 which may or may not be present $page_id = $page["id"]; $sections[] = array("type" => "PAGE", "page" => "$page_id.html", "section" => "", "number" => "$page_no.", "title" => $page["title"]); for ($i = 0; $i < count($types); $i++) { $tag = "h1"; $number = "$page_no."; if ($types[$i] == "SECTION") { $tag = "h2"; $section_no++; $subsection_no = 0; $number = "$page_no.$section_no."; } if ($types[$i] == "SUBSECTION") { $tag = "h3"; $subsection_no++; $number = "$page_no.$section_no.$subsection_no."; } // If we have an ID $anchor_start = ""; $anchor_end = ""; if (strlen($ids[$i]) > 0 && $types[$i] != "PAGE") { // pages are always added the TOC and have empty section_id // Add it to the TOC array $sections[] = array("type" => $types[$i], "page" => "$page_id.html", "section" => $ids[$i], "number" => $number, "title" => $titles[$i]); // Also create an internal anchor $anchor_start = ""; $anchor_end = ""; } $final_tag = "<$tag>$anchor_start$number $titles[$i]$anchor_end"; // Replace the template with the tag $text = str_replace($originals[$i], $final_tag, $text); // Now create substitutions for this tag so other pages can refer to them $page_id = $page["id"]; $section_id = $ids[$i]; $title = $titles[$i]; $substitutions["{LINK:$section_id}"] = "$title"; $substitutions["{TITLE:$section_id}"] = $title; } // Save the text for later $template_texts[$page["id"]] = $text; $page_no++; } // Render each page for ($i = 0; $i < count($config["pages"]); $i++) { $page = $config["pages"][$i]; // Configure page-specific substitutions $substitutions["{PREV_URL}"] = ""; $substitutions["{PREV_TITLE}"] = ""; $substitutions["{NEXT_URL}"] = ""; $substitutions["{NEXT_TITLE}"] = ""; $substitutions["{TOC_URL}"] = "index.html"; $substitutions["{TOC_TITLE}"] = "Contents"; $substitutions["{PAGE_TITLE}"] = $page["title"]; if (isset($config["pages"][$i-1])) { $prev_page = $config["pages"][$i-1]; $substitutions["{PREV_URL}"] = $prev_page["id"] . ".html"; $substitutions["{PREV_TITLE}"] = $prev_page["title"]; } if (isset($config["pages"][$i+1])) { $next_page = $config["pages"][$i+1]; $substitutions["{NEXT_URL}"] = $next_page["id"] . ".html"; $substitutions["{NEXT_TITLE}"] = $next_page["title"]; } $template_html = $config["html_dir"] . "/" . $page["id"] . ".html"; $out_html = $config["output_dir"] . "/" . $page["id"] . ".html"; if (is_file($out_html)) { unlink($out_html); } append_file_and_sub($out_html, "html/common/header.html", $substitutions); $text = do_substitutions($template_texts[$page["id"]], $substitutions); file_put_contents($out_html, $text, FILE_APPEND); append_file_and_sub($out_html, "html/common/footer.html", $substitutions); } // Render the index / TOC now that we have all the information at hand $toc_html = $config["output_dir"] . "/index.html"; $toc_text = file_get_contents("html/common/toc.html"); $toc_h1 = file_get_contents("html/common/toc-h1.html"); $toc_h2 = file_get_contents("html/common/toc-h2.html"); $toc_h3 = file_get_contents("html/common/toc-h3.html"); foreach ($sections as $section) { $start = $toc_h1; if ($section["type"] == "SECTION") $start = $toc_h2; if ($section["type"] == "SUBSECTION") $start = $toc_h3; $toc_subs["{TOC_ENTRY_NUMBER}"] = $section["number"]; $toc_subs["{TOC_ENTRY_TITLE}"] = $section["title"]; $toc_subs["{TOC_ENTRY_PAGE}"] = $section["page"]; $toc_subs["{TOC_ENTRY_SECTION}"] = $section["section"]; $line = do_substitutions($start, $toc_subs); $toc_text .= "$line\n"; } $substitutions["{PREV_URL}"] = ""; $substitutions["{PREV_TITLE}"] = ""; $substitutions["{NEXT_URL}"] = $config["pages"][0]["id"] . ".html"; $substitutions["{NEXT_TITLE}"] = $config["pages"][0]["title"]; // Write it to disk if (is_file($toc_html)) { unlink($toc_html); } append_file_and_sub($toc_html, "html/common/header.html", $substitutions); file_put_contents($toc_html, $toc_text, FILE_APPEND); append_file_and_sub($toc_html, "html/common/footer.html", $substitutions); // This manual is all done } function append_file_and_sub($dest, $src, $substitutions) { // Read in starting text $text = file_get_contents($src); $text = do_substitutions($text, $substitutions); // Append processed text to the destination file touch($dest); file_put_contents($dest, $text, FILE_APPEND); } function do_substitutions($text, $substitutions) { // Perform all template substitutions foreach ($substitutions as $from => $to) { $text = str_replace($from, $to, $text); } return $text; } ?>