mirror of
https://gitlab.com/parroquia-san-leandro/cancionero-web.git
synced 2025-06-06 15:03:13 +02:00
Nuevo generador de cancioneros en línea.
This commit is contained in:
parent
3d9bb9a26b
commit
c622a27e34
13 changed files with 5870 additions and 0 deletions
209
res_gen/static/generar_pdf.php
Normal file
209
res_gen/static/generar_pdf.php
Normal file
|
@ -0,0 +1,209 @@
|
|||
<?php
|
||||
|
||||
$errorlist = array();
|
||||
|
||||
function delTree($dir) {
|
||||
$files = array_diff(scandir($dir), array('.', '..'));
|
||||
foreach ($files as $file) {
|
||||
if (!is_dir("$dir/$file")) {
|
||||
unlink("$dir/$file");
|
||||
}
|
||||
}
|
||||
return rmdir($dir);
|
||||
}
|
||||
|
||||
function param_conversion($name, $type) {
|
||||
global $errorlist;
|
||||
if (validParam($name, "string")) {
|
||||
if (!is_numeric($_POST[$name])) {
|
||||
$errorlist[] = "El parámetro $name debería ser numérico, y es: " . $_POST[$name];
|
||||
} else {
|
||||
if ($type == "integer")
|
||||
$_POST[$name] = intval($_POST[$name]);
|
||||
else if ($type == "double")
|
||||
$_POST[$name] = doubleval($_POST[$name]);
|
||||
else {
|
||||
$errorlist[] = "$type es un tipo inválido al que convertir el parámetro $name";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function validParam($name, $type) {
|
||||
global $errorlist;
|
||||
if (!isset($_POST[$name]))
|
||||
$errorlist[] = "No se ha incluido el parámetro '$name'";
|
||||
else if (($realtype = gettype($_POST[$name])) != $type)
|
||||
$errorlist[] = "El parámetro '$name' debería ser de tipo $type, y es de tipo $realtype";
|
||||
else
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
function validEmptyBool($name) {
|
||||
if (!isset($_POST[$name]))
|
||||
$_POST[$name] = "false";
|
||||
return validBool($name);
|
||||
}
|
||||
|
||||
function validBool($name) {
|
||||
if (validParam($name, "string")) {
|
||||
if ($_POST[$name] != "true")
|
||||
$_POST[$name] = "false";
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function validInt($name, $min, $max) {
|
||||
global $errorlist;
|
||||
if (param_conversion($name, "integer") && validParam($name, "integer")) {
|
||||
if ($_POST[$name] < $min || $_POST[$name] > $max)
|
||||
$errorlist[] = "El parámetro numérico '$name' tiene un valor fuera de rango. Valor: " . $_POST[$name] . ". Rango válido: [$min, $max].";
|
||||
else
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function validDouble($name, $min, $max) {
|
||||
global $errorlist;
|
||||
if (param_conversion($name, "double") && validParam($name, "double")) {
|
||||
if ($_POST[$name] < $min || $_POST[$name] > $max)
|
||||
$errorlist[] = "El parámetro numérico '$name' tiene un valor fuera de rango. Valor: " . $_POST[$name] . ". Rango válido: [$min, $max].";
|
||||
else
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
$TEX_ERROR = "Fatal error occurred, no output PDF file produced!";
|
||||
|
||||
$error = false;
|
||||
// Check fields and their correctness
|
||||
$error |= !validBool("chorded");
|
||||
if (!$error && $_POST["chorded"] != "true") {
|
||||
$error |= !validInt("paperheight", 1, 9999);
|
||||
$error |= !validInt("paperwidth", 1, 9999);
|
||||
$error |= !validDouble("margin", 0.01, 999);
|
||||
$error |= !validInt("fontsize", 8, 100);
|
||||
$error |= !validInt("titlefontsize", 8, 100);
|
||||
$error |= !validInt("subtitlefontsize", 8, 100);
|
||||
}
|
||||
$error |= !validEmptyBool("ifcolumns");
|
||||
if (!$error && $_POST["ifcolumns"] == "true") {
|
||||
$error |= !validInt("columns", 1, 20);
|
||||
}
|
||||
$error |= !validEmptyBool("ifcolumnsep");
|
||||
if (!$error && $_POST["ifcolumnsep"] == "true") {
|
||||
$error |= !validDouble("columnsep", 0.01, 999);
|
||||
}
|
||||
$error |= !validInt("breaksallowed", 0, 3);
|
||||
$error |= !validParam("title", "string");
|
||||
$error |= !validParam("songs", "array");
|
||||
if (!$error) {
|
||||
foreach ($_POST["songs"] as $song) {
|
||||
if (!str_starts_with($song, "canciones/") || str_contains($song, "..")) {
|
||||
$error = true;
|
||||
$errorlist[] = "La canción $song no cumple los requisitos.";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Create tmp dir and copy/link necessary files
|
||||
if (!$error) {
|
||||
$resdir = getcwd() . "/res";
|
||||
$tmpdir = substr(shell_exec("mktemp -d"), 0, -1); // remove trailing newline
|
||||
symlink("$resdir/songs.sty", "$tmpdir/songs.sty");
|
||||
symlink("$resdir/estilo.sty", "$tmpdir/estilo.sty");
|
||||
symlink("$resdir/acordes.sty", "$tmpdir/acordes.sty");
|
||||
symlink("$resdir/canciones", "$tmpdir/canciones");
|
||||
symlink("$resdir/changepage.sty", "$tmpdir/changepage.sty");
|
||||
symlink("$resdir/tocloft.sty", "$tmpdir/tocloft.sty");
|
||||
symlink("$resdir/uarial.sty", "$tmpdir/uarial.sty");
|
||||
}
|
||||
|
||||
// Generate and fill template
|
||||
if (!$error) {
|
||||
$lines = file("$resdir/template.tex");
|
||||
if ($_POST["chorded"] == "true") {
|
||||
$lines = preg_replace('/%CHORDED%/', '', $lines);
|
||||
} else {
|
||||
$lines = preg_replace('/%LYRICS%/', '', $lines);
|
||||
$lines = preg_replace('/%PAPERHEIGHT%/', $_POST["paperheight"], $lines);
|
||||
$lines = preg_replace('/%PAPERWIDTH%/', $_POST["paperwidth"], $lines);
|
||||
$lines = preg_replace('/%MARGIN%/', $_POST["margin"], $lines);
|
||||
if ($_POST["ifcolumns"] == "true") {
|
||||
$lines = preg_replace('/%SONGCOLUMNS%/', '', $lines);
|
||||
$lines = preg_replace('/%SONGCOLNUM%/', "\\songcolumns{" . $_POST["columns"] . "}", $lines);
|
||||
} else {
|
||||
$lines = preg_replace('/%SONGCOLUMNS%/', 'onesongcolumn', $lines);
|
||||
}
|
||||
$lines = preg_replace('/%FONTSIZE%/', $_POST["fontsize"], $lines);
|
||||
$lines = preg_replace('/%LINESKIP%/', $_POST["fontsize"] + 4, $lines);
|
||||
$lines = preg_replace('/%TITLEFONTSIZE%/', $_POST["titlefontsize"], $lines);
|
||||
$lines = preg_replace('/%TITLELINESKIP%/', $_POST["titlefontsize"] + 4, $lines);
|
||||
$lines = preg_replace('/%SUBTITLEFONTSIZE%/', $_POST["subtitlefontsize"], $lines);
|
||||
}
|
||||
$lines = preg_replace('/%TITLE%/', $_POST["title"], $lines);
|
||||
if ($_POST["ifcolumnsep"] == "true") {
|
||||
$lines = preg_replace('/%IFCOLUMNSEP%/', '', $lines);
|
||||
$lines = preg_replace('/%COLUMNSEP%/', $_POST["columnsep"], $lines);
|
||||
}
|
||||
$songinput = "";
|
||||
foreach ($_POST["songs"] as $song) {
|
||||
$songinput .= '\input{' . $song . "}\n";
|
||||
}
|
||||
$lines = preg_replace('/%SONGLIST%/', $songinput, $lines);
|
||||
$fwrite = file_put_contents("$tmpdir/cancionero.tex", $lines);
|
||||
if (!$fwrite) {
|
||||
$error = true;
|
||||
$errorlist[] = "No se pudo escribir el archivo LaTeX.";
|
||||
}
|
||||
}
|
||||
|
||||
// Compile PDF
|
||||
if (!$error) {
|
||||
chdir($tmpdir);
|
||||
do {
|
||||
$latexlog = shell_exec("/usr/bin/pdflatex -interaction=nonstopmode cancionero.tex");
|
||||
if (str_contains($latexlog, $TEX_ERROR)) {
|
||||
$error = true;
|
||||
$errorlist[] = "Ha sucedido un error en la ejecución, véase el log más abajo.";
|
||||
break;
|
||||
}
|
||||
} while (str_contains($latexlog, "(rerunfilecheck)"));
|
||||
}
|
||||
// Return PDF or error page
|
||||
if (!$error && file_exists($pdffile = "$tmpdir/cancionero.pdf")) {
|
||||
header("Content-Type: application/pdf");
|
||||
header('Content-Disposition: inline;filename=cancionero.pdf');
|
||||
header('Content-Length: ' . filesize($pdffile));
|
||||
readfile($pdffile);
|
||||
} else {
|
||||
echo '<h1>Ha ocurrido un error...</h1>';
|
||||
echo '<p>No se ha podido generar el cancionero.</p>';
|
||||
echo '<p><strong>Por favor,</strong> guarda (Ctrl+S) o imprime (Ctrl+P) esta página y envíasela a Carlos, para que lo pueda solucionar.</p>';
|
||||
echo '<h2>Errores individuales</h2>';
|
||||
echo '<ul>';
|
||||
foreach ($errorlist as $errormsg) {
|
||||
echo "<li>$errormsg</li>";
|
||||
}
|
||||
echo '</ul>';
|
||||
if (isset($tmpdir) && file_exists("$tmpdir/cancionero.log")) {
|
||||
echo '<h2>Detalles del error</h2>';
|
||||
echo '<pre>';
|
||||
readfile("$tmpdir/cancionero.log");
|
||||
echo '</pre>';
|
||||
}
|
||||
echo '<p>Fin de la página.</p>';
|
||||
}
|
||||
|
||||
// Cleanup
|
||||
if (isset($tmpdir) && file_exists($tmpdir))
|
||||
delTree($tmpdir);
|
||||
|
||||
?>
|
Loading…
Add table
Add a link
Reference in a new issue