220 lines
7.0 KiB
PHP
220 lines
7.0 KiB
PHP
<?php
|
|
|
|
// This is pretty bad code. Sorry. I will clean it up.
|
|
|
|
foreach (glob("configs/*.php") as $config_file) {
|
|
if (is_file($config_file)) {
|
|
echo "Processing render configuration $config_file\n";
|
|
render_with_config_path($config_file);
|
|
}
|
|
|
|
}
|
|
|
|
function render_with_config_path($config_file) {
|
|
$config = array();
|
|
include($config_file);
|
|
|
|
if (!isset($config["pages"])) {
|
|
echo "Not a valid configuration; skipping\n";
|
|
return;
|
|
}
|
|
|
|
// Prepare substitutions
|
|
$substitutions = array("{TITLE}" => $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"]);
|
|
$page_title = $page["title"];
|
|
$substitutions["{LINK:$page_id}"] = "<a href=\"$page_id.html\">$page_title</a>";
|
|
|
|
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 = "<a name=\"$ids[$i]\">";
|
|
$anchor_end = "</a>";
|
|
}
|
|
|
|
$final_tag = "<$tag>$anchor_start$number $titles[$i]$anchor_end</$tag>";
|
|
|
|
// 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}"] = "<a href=\"$page_id.html#$section_id\">$title</a>";
|
|
$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"];
|
|
$substitutions["{PAGE_TITLE}"] = "Contents";
|
|
|
|
// 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
|
|
echo "Manual '" . $config["title"] . "' completed rendering at: " . $config["output_dir"] . "\n\n";
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
|
|
|
|
?>
|