224 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?PHP
 | |
| /**
 | |
|  * File containing functions for generating PDFs from HTML contents.
 | |
|  *
 | |
|  * @author Joshua Ramon Enslin <joshua@jrenslin.de>
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * Converts a DOM div element to TeX.
 | |
|  *
 | |
|  * @param DOMElement|DOMText $node Element to convert.
 | |
|  *
 | |
|  * @return string
 | |
|  */
 | |
| function divToTeX($node):string {
 | |
| 
 | |
|     $type = get_class($node);
 | |
|     $output = "";
 | |
| 
 | |
|     if ($type === "DOMText") {
 | |
|         if (trim($node->nodeValue) == "") return "";
 | |
|         return $node->textContent;
 | |
|     }
 | |
|     else {
 | |
|         if ($node->tagName == "img") {
 | |
|             $output = "
 | |
| \\begin{figure}[h]
 | |
|     \\begin{center}
 | |
|         \\includegraphics[width=\columnwidth]{../../" . transform($node->getAttribute("src")) . "}
 | |
|     \\end{center}
 | |
| \\end{figure}
 | |
|             ";
 | |
|         }
 | |
|         else if ($node->tagName == "ul") {
 | |
|             if ($node->getAttribute("class") == "dl") {
 | |
|                 $output .= "
 | |
| \\begin{description}
 | |
| ";
 | |
|                 foreach ($node->childNodes as $childNode) {
 | |
|                     $output .= divToTeX($childNode);
 | |
|                 }
 | |
|                 $output .= "
 | |
| \\end{description}
 | |
| %";
 | |
|             }
 | |
|             else {
 | |
|                 $output .= "
 | |
| {
 | |
| \\begin{itemize}%
 | |
| ";
 | |
|                 foreach ($node->childNodes as $childNode) {
 | |
|                     $output .= divToTeX($childNode);
 | |
|                 }
 | |
|                 $output .= "
 | |
| \\end{itemize}
 | |
| }%
 | |
| %";
 | |
|             }
 | |
|         }
 | |
|         else if ($node->tagName == "li") {
 | |
|             $output .= "
 | |
| \\item";
 | |
|             if ($node->getAttribute("data-title") != "") $output .= "[" . transform($node->getAttribute("data-title")) . "]{ \\hfill \\\\";
 | |
|             else $output .= "{%
 | |
| ";
 | |
|             foreach ($node->childNodes as $childNode) {
 | |
|                 $output .= divToTeX($childNode);
 | |
|             }
 | |
|             $output .= "%
 | |
| }%
 | |
| ";
 | |
|         }
 | |
|         else if ($node->tagName == "h4") {
 | |
|             $output .= "
 | |
| \\subsection{%
 | |
| ";
 | |
|             foreach ($node->childNodes as $childNode) {
 | |
|                 $output .= divToTeX($childNode);
 | |
|             }
 | |
|             $output .= "%
 | |
| }%
 | |
| ";
 | |
|         }
 | |
|         else if ($node->tagName == "h5") {
 | |
|             $output .= "
 | |
| \\subsubsection{%
 | |
| ";
 | |
|             foreach ($node->childNodes as $childNode) {
 | |
|                 $output .= divToTeX($childNode);
 | |
|             }
 | |
|             $output .= "%
 | |
| }%
 | |
| ";
 | |
|         }
 | |
|         else if ($node->tagName == "div") {
 | |
|             $output .= "{%
 | |
| ";
 | |
|             foreach ($node->childNodes as $childNode) {
 | |
|                 $output .= divToTeX($childNode);
 | |
|             }
 | |
|             $output .= "%
 | |
| }%
 | |
| ";
 | |
|         }
 | |
|         else if ($node->tagName == "p") {
 | |
|             $output .= "
 | |
| ";
 | |
|             foreach ($node->childNodes as $childNode) {
 | |
|                 $output .= divToTeX($childNode);
 | |
|             }
 | |
|             $output .= "
 | |
| 
 | |
| ";
 | |
|         }
 | |
|         else if ($node->tagName == "a") {
 | |
|             if ($node->getAttribute("class") == "url") {
 | |
|                 $output .= "\\url{" . transform($node->textContent) . "}";
 | |
|             }
 | |
|             else {
 | |
|                 $output .= "\\href{" . $node->getAttribute("href") . "}{%
 | |
| ";
 | |
|                 foreach ($node->childNodes as $childNode) {
 | |
|                     $output .= divToTeX($childNode);
 | |
|                 }
 | |
|                 $output .= "
 | |
| }%
 | |
| ";
 | |
|             }
 | |
|         }
 | |
|         else
 | |
|             print_r($node);
 | |
|     }
 | |
| 
 | |
|     return $output;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Function DOMtoTeX transforms a DOM element into its proper TeX output.
 | |
|  *
 | |
|  * @param DOMElement $inputs A section element.
 | |
|  * @param string     $folder Folder to store in.
 | |
|  *
 | |
|  * @return void
 | |
|  */
 | |
| function DOMtoTeX(DOMElement $inputs, string $folder) {
 | |
| 
 | |
|     $centerTextTeX = function($content, $centered = false) {
 | |
|         if ($centered) $output = "
 | |
| \centerVertically{%
 | |
| $content
 | |
| }
 | |
|         ";
 | |
|         else $output = $content;
 | |
|         return $output;
 | |
|     };
 | |
| 
 | |
|     $concordanceIDFile = [
 | |
|         "introduction"      => "contentsIntroduction.tex",
 | |
|         "frontend"          => "contentsFrontend.tex",
 | |
|         "musdb"             => "contentsMusdb.tex",
 | |
|         "themator"          => "contentsThemator.tex",
 | |
|         "learnMore"         => "contentsTail.tex",
 | |
|         "contact"           => "contentsContact.tex",
 | |
|         "introductionPress" => "contentsIntroductionPress.tex",
 | |
|         "germanTexts"       => "contentsPressGerman.tex",
 | |
|     ];
 | |
| 
 | |
|     $chapterID    = $inputs->getAttribute("id");
 | |
|     $chapterTitle = $inputs->getElementsByTagName("h2")[0]->nodeValue;
 | |
| 
 | |
|     $output = "%
 | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | |
| %%%%%% Chapter: $chapterID
 | |
| %
 | |
| \\chapter{" . transform($chapterTitle) . "}%
 | |
| ";
 | |
| 
 | |
|     foreach ($inputs->childNodes as $section) {
 | |
|         if (!isset($section->tagName) or $section->tagName != "div") continue;
 | |
| 
 | |
|         foreach ($section->childNodes as $sectionElem) {
 | |
| 
 | |
|             if (!isset($sectionElem->tagName)) continue;
 | |
|             if ($sectionElem->tagName == "h3") {
 | |
| 
 | |
|                 $output .= "
 | |
| \\section{" . transform($sectionElem->textContent) . "}%";
 | |
| 
 | |
|             }
 | |
|             else if ($sectionElem->tagName == "div") {
 | |
| 
 | |
|                 if ($sectionElem->getAttribute("class") == "centerVertically") $centered = true;
 | |
|                 else $centered = false;
 | |
| 
 | |
|                 $sectionOutput = "";
 | |
| 
 | |
|                 foreach ($sectionElem->childNodes as $node) {
 | |
|                     $sectionOutput .= divToTeX($node);
 | |
|                 }
 | |
| 
 | |
|                 $output .= $centerTextTeX($sectionOutput, $centered);
 | |
| 
 | |
|                 $output .= "%
 | |
| \\newpage%
 | |
| %";
 | |
| 
 | |
|             }
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
|     $output = explode(PHP_EOL, $output);
 | |
|     foreach ($output as $key => $value) $output[$key] = trim($value);
 | |
|     $output = implode(PHP_EOL, $output);
 | |
| 
 | |
|     if (isset($concordanceIDFile[$chapterID])) {
 | |
|         if (!file_exists(__DIR__ . "/$folder")) mkdir(__DIR__ . "/$folder");
 | |
|         file_put_contents(__DIR__ . "/" . $folder . "/" . $concordanceIDFile[$chapterID], $output);
 | |
|     }
 | |
| 
 | |
| }
 | |
| 
 | |
| ?>
 |