From 86881ec57b71d448f00906557b8550c050a5e1c1 Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Mon, 5 Sep 2011 15:42:47 +0200
Subject: [PATCH] Moved form to php, ready for include, better layout, etc.

---
 create_lily_jail.sh          |   2 +-
 empty_sheet.php              |  22 +++-
 empty_sheet_form.html        | 180 ----------------------------
 empty_sheet_form.php         | 220 +++++++++++++++++++++++++++++++++++
 index.php                    |  10 ++
 templates/empty_sheet.tpl.ly |   8 ++
 6 files changed, 255 insertions(+), 187 deletions(-)
 delete mode 100644 empty_sheet_form.html
 create mode 100644 empty_sheet_form.php
 create mode 100644 index.php

diff --git a/create_lily_jail.sh b/create_lily_jail.sh
index 4b06452..9e8ef0e 100755
--- a/create_lily_jail.sh
+++ b/create_lily_jail.sh
@@ -179,7 +179,7 @@ echo \
 | users of the group `$user') and run lilypond as:
 |       sudo /$i/bin/lilypond -j$user,$user,$jaildir,/lilyhome lilyfile_relative_to_lilyhome.ly
 | 
-| If you want user `a' to be able to copy files to $lilyhome, then
+| If you want user 'a' to be able to copy files to $lilyhome, then
 | simply add him to the $user group:
 |       adduser a $user
 |
diff --git a/empty_sheet.php b/empty_sheet.php
index 4a997c6..1c6c37d 100644
--- a/empty_sheet.php
+++ b/empty_sheet.php
@@ -9,14 +9,10 @@ $lilyhome = "/lilyhome";
 $lilyworkdir = "$lilyhome/empty_sheet";
 
 $ly_cmd = "/usr/bin/sudo /opt/lily2.14/bin/lilypond -j$user,$user,$lilymnt,$lilyhome --png --pdf -dpixmap-format=pngalpha -dresolution=20 ";
-// print "<p>basedir: $basedir</p>";
-// print "<p>ly_cmd: $ly_cmd</p>";
 
 include('smarty3/Smarty.class.php');
 $smarty = new Smarty();
 
-// $smarty->setTemplateDir($basedir.'/smarty/templates');
-// $smarty->setTemplateDir($basedir.'/smarty/templates');
 $smarty->setCompileDir($basedir.'/smarty/templates_c');
 $smarty->setCacheDir($basedir.'/smarty/cache');
 $smarty->setConfigDir($basedir.'/smarty/configs');
@@ -44,6 +40,13 @@ function robust_request_number ($parm, $default, $min, $max) {
     return $default;
   }
 }
+function robust_request_bool ($parm, $default) {
+  if (isset ($_REQUEST[$parm])) {
+    return $_REQUEST[$parm];
+  } else {
+    return $default;
+  }
+}
 
 
 // Score type: 
@@ -120,6 +123,7 @@ $type = robust_request_string ("score_type", NULL);
 
 $psz = explode (" ", robust_request_string ("paper_size", "a4"), 2);
 $paper_size = array_shift ($psz);
+$orientation = "";
 if ($psz) {
   $orientation = array_shift($psz);
 }
@@ -130,12 +134,16 @@ $pages = robust_request_number ("pages", 2, 1, 20);
 $title = robust_request_string ("title", NULL);
 $subtitle = robust_request_string ("subtitle", NULL);
 $composer = robust_request_string ("composer", NULL);
+$arranger = robust_request_string ("composer", NULL);
 $instrument = robust_request_string ("instrument", NULL);
-$metainfo = $title . $subtitle . $composer . $instrument;
+$header_space = robust_request_bool ("header_space", false);
+$metainfo = $title . $subtitle . $composer . $instrument.$header_space;
 $metahash = md5( $metainfo );
 
 //////// Use cache file name composed from the arguments
 $out_file_basename = "Score_${type}_${paper_size}${orientation}_${staff_size}pt_${systems}Systems_${pages}Pages";
+if ($header_space)
+  $out_file_basename .= "_Header";
 if ($metainfo != "")
   $out_file_basename .= "_${metahash}";
   
@@ -189,7 +197,9 @@ $smarty->assign('pages', $pages);
 $smarty->assign('title', $title);
 $smarty->assign('subtitle', $subtitle) ;
 $smarty->assign('composer', $composer);
+$smarty->assign('arranger', $arranger);
 $smarty->assign('instrument', $instrument);
+$smarty->assign('header_space', $header_space);
 
 $smarty->assign('indent', '');
 $smarty->assign('contents', $score_type);
@@ -211,6 +221,7 @@ if (!file_exists ($pdf_file)) {
   // run it through lilypond to create the pdf
   // As we are running inside the jail, we don't include $lilymnt in the pathes!
   $cmd = "$ly_cmd -o $base_file $ly_file 2>&1";
+// print "<p>Command: <pre>$cmd</pre></p>";
   $lily_result = exec($cmd, $output, $retval);
 }
 
@@ -233,7 +244,6 @@ if (isset ($_REQUEST["preview"])) {
   print ("The output from running lilypond is:\n<pre>");
   print_r ($output);
   print ("</pre>\n");
-//   die ("Unable to create the score file. Wrong input or server error encountered.");
 }
 
 ?>
diff --git a/empty_sheet_form.html b/empty_sheet_form.html
deleted file mode 100644
index e3b766c..0000000
--- a/empty_sheet_form.html
+++ /dev/null
@@ -1,180 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-  <style>
-    #preview { border: 1px solid black; }
-    .vsep { background: darkgray; }
-    #previewdiv {
-      position: relative;
-    }
-    #loadingOverlay {
-      background-image: url('loading.gif');
-      position: absolute;
-      z-index: 1;
-      top: 40%;
-      left: 35%;
-      width: 32px;
-      height: 32px;
-    }
-
-  </style>
-  <script type="text/javascript">
-  <!--
-    function loadPreview () {
-      // Show loading overlay, will be hidden in onLoad handler of the image!
-      document.getElementById("loadingOverlay").style.visibility = "visible";
-
-      // Add all non-button form elements:      
-      var src = "empty_sheet.php?preview=True";
-      var elt = document.score_form.elements;
-      for(var i=0; i < elt.length; i++)
-      {
-        if (elt[i].type != 'submit' && elt[i].type != 'reset') {
-          src += "&" + encodeURIComponent (elt[i].name) + "=" + 
-                 encodeURIComponent (elt[i].value);
-        }
-      }
-      document.getElementById("preview").src = src;
-    }
-  //-->
-  </script>
-</head>
-<body onLoad="javascript:loadPreview();">
-  <FORM action="empty_sheet.php" name="score_form" onreset="javascript:loadPreview();">
-  <table>
-  <TR>
-    <td><label for="paper_size">Paper size:</label></td>
-    <td><select name="paper_size" id="paper_size" onchange="javascript:loadPreview();">
-        <option value="a4" selected="selected">A4</option>
-        <option value="a5">A5</option>
-        <option value="a6">A6</option>
-        <option value="letter">US letter</option>
-        <option value="legal">Legal</option>
-        <option value="11x17">Ledger</option>
-        <option value="a4 landscape">A4 (landscape)</option>
-        <option value="a5 landscape">A5 (landscape)</option>
-        <option value="a6 landscape">A6 (landscape)</option>
-        <option value="letter landscape">US letter (landscape)</option>
-        <option value="legal landscape">Legal (landscape)</option>
-        <option value="11x17 landscape">Ledger (landscape)</option>
-      </select></td>
-    <td rowspan=5 class="vsep"></td>
-    <td rowspan=5 colspan=2 align=center>
-      <div id=previewdiv class="foo">
-        <div id="loadingOverlay"></div>
-        <img id=preview onLoad="javascript:document.getElementById('loadingOverlay').style.visibility = 'hidden';"/>
-      </div>
-    </td>
-
-<!--     <td><INPUT type="checkbox" name="title_check" size="15" accesskey="t" onchange="document.score_form.title.disabled = !this.checked" id="title_check"><label for="title_check" >Title: </label></td> -->
-<!--     <td><INPUT type="text" checked name="title" size="25" maxlength="100" id="title" disabled="true"></td> -->
-  </tr>
-  <tr>
-    <td><label for="staff_size">Staff size:</label></td>
-    <td><select name="staff_size" id="staff_size" onchange="javascript:loadPreview();">
-        <option value="11">11pt (Pocket scores)</option>
-        <option value="12.5">12.5pt</option>
-        <option value="14">14pt</option>
-        <option value="15">15pt</option>
-        <option value="16">16pt</option>
-        <option value="17">17pt</option>
-        <option value="18">18t</option>
-        <option value="19">19pt</option>
-        <option value="20" selected="selected">20pt (default)</option>
-        <option value="22">22</option>
-        <option></option>
-      </select></td>
-<!--     <td><INPUT type="checkbox" name="subtitle_check" size="15" accesskey="c" onchange="document.score_form.subtitle.disabled = !this.checked" id="subtitle_check"><label for="subtitle_check" >Subtitle: </label></td> -->
-<!--     <td><INPUT type="text" checked name="subtitle" size="25" maxlength="100" id="subtitle" disabled="true"></td> -->
-  </tr>
-  <tr>
-    <td><label for="systems">Systems/page:</label></td>
-    <td><select name="systems" id="systems" onchange="javascript:loadPreview();">
-        <option value="1">1</option>
-        <option value="2">2</option>
-        <option value="3">3</option>
-        <option value="4">4</option>
-        <option value="5">5</option>
-        <option value="6">6</option>
-        <option value="7">7</option>
-        <option value="8">8</option>
-        <option value="9">9</option>
-        <option value="10" selected="selected">10</option>
-        <option value="11">11</option>
-        <option value="12">12</option>
-        <option value="13">13</option>
-        <option value="14">14</option>
-        <option value="15">15</option>
-      </select></td>
-<!--     <td><INPUT type="checkbox" name="composer_check" size="15" accesskey="c" onchange="document.score_form.composer.disabled = !this.checked" id="composer_check"><label for="composer_check" >Composer: </label></td> -->
-<!--     <td><INPUT type="text" checked name="composer" size="25" maxlength="100" id="composer" disabled="true"></td> -->
-  </tr>
-  <tr>
-    <td><label for="pages">Pages:</label></td>
-    <td><select name="pages" id="pages" onchange="javascript:loadPreview();">
-        <option value="1">1</option>
-        <option value="2" selected="selected">2</option>
-        <option value="3">3</option>
-        <option value="4">4</option>
-        <option value="5">5</option>
-        <option value="6">6</option>
-        <option value="7">7</option>
-        <option value="8">8</option>
-        <option value="9">9</option>
-        <option value="10">10</option>
-        <option value="11">11</option>
-        <option value="12">12</option>
-        <option value="13">13</option>
-        <option value="14">14</option>
-        <option value="15">15</option>
-      </select></td>
-<!--     <td><INPUT type="checkbox" name="instrument_check" size="15" accesskey="i" onchange="document.score_form.instrument.disabled = !this.checked" id="instrument_check"><label for="instrument_check" >Instrument: </label></td> -->
-<!--     <td><INPUT type="text" checked name="instrument" size="25" maxlength="100" id="instrument" disabled="true"></td> -->
-  </tr>
-  <tr>
-    <td colspan=2>
-      <INPUT type="checkbox" name="header_check" id="header_check"><label for="header_check" >Reserve space for title</label>
-    </td>
-  </tr>
-
-  <tr><TD colspan=5><hr></TD></tr>
-
-  <tr>
-    <td valign=top><label for="score_type">Score type:</label></td>
-    <td colspan=4>
-      <SELECT name="score_type" id="score_type" style='width: 100%' size="20" onchange="javascript:loadPreview();">
-        <option value="S0" selected="selected">Single staff, no clef</option>
-        <option value="S">Single staff, treble clef</option>
-        <option value="Sb">Single staff, bass clef</option>
-        <option value="St">Single staff, tenor clef</option>
-        <option value="Sa">Single staff, alto clef</option>
-        <option disabled="disabled">---------</option>
-        <option value="P">Piano staff</option>
-        <option value="O">Organ staff</option>
-        <option disabled="disabled">---------</option>
-        <option value="Ch2">Choir, 2 staves (SA + TB)</option>
-        <option value="Ch4">Choir, 4 staves (S, A, T, B)</option>
-        <option disabled="disabled">---------</option>
-        <option value="Ch4P">Piano reduction for choir</option>
-        <option value="S0P">Piano reduction for single soloist</option>
-        <option disabled="disabled">---------</option>
-        <option value="[StSaSb]">String Trio</option>
-        <option value="[StStSaSb]">String Quartett</option>
-        <option value="[StSbP]">Piano Trio</option>
-        <option value="[StSaSbP]">Piano Quartett</option>
-        <option disabled="disabled">---------</option>
-        <option value="">Full Score, Chamber Orchestra</option>
-        <option value="[SSb][SS][Sb][{SS}SaSb]">Full Score, Symphonic Orchestra</option>
-        <option value="18">Full Score, Chamber Orchestra + Choir</option>
-        <option value="[SSb][SS][Sb][{SS}Sa]Ch4[Sb]">Full Score, Symphonic Orchestra + Choir</option>
-      </SELECT>
-    </td>
-  </tr>
-  <tr><TD colspan=5 align=center>
-     <INPUT type="submit" name="create_score" value="Create Score"><INPUT type="reset" value="Reset Values">
-  </TD></tr>
-</table>
-
-  </FORM>
-</body>
-</html>
diff --git a/empty_sheet_form.php b/empty_sheet_form.php
new file mode 100644
index 0000000..002128c
--- /dev/null
+++ b/empty_sheet_form.php
@@ -0,0 +1,220 @@
+<div id="music_score_form">
+
+  <style type="text/css" >
+    #preview { border: 1px solid black; }
+    .vsep { background: darkgray; }
+    #previewdiv {
+      position: relative;
+    }
+    #loadingOverlay {
+      background-image: url('loading.gif');
+      position: absolute;
+      z-index: 1;
+      top: 40%;
+      left: 35%;
+      width: 32px;
+      height: 32px;
+      visibility: "hidden";
+    }
+  </style>
+
+<script type="text/javascript">
+  function loadPreview () {
+    // Show loading overlay, will be hidden in onLoad handler of the image!
+    document.getElementById("loadingOverlay").style.visibility = "visible";
+    // Add all non-button form elements:      
+    var src = "empty_sheet.php?preview=True";
+    var elt = document.score_form.elements;
+    for(var i=0; i < elt.length; i++){
+      if (elt[i].type != 'submit' && elt[i].type != 'reset') {
+        src += "&" + encodeURIComponent (elt[i].name) + "=" + 
+               encodeURIComponent (elt[i].value);
+      }
+    }
+    document.getElementById("preview").src = src;
+  }
+</script>
+<?php
+  $paper_sizes = array( 
+      "a4" => "A4", 
+      "a5" => "A5", 
+      "a6" => "A6", 
+      "a4 landscape" => "A4 (landscape)", 
+      "a5 landscape" => "A5 (landscape)", 
+      "a6 landscape" => "A6 (landscape)", 
+      "letter" => "US letter", 
+      "legal" => "Legal", 
+      "11x17" => "Ledger",
+      "letter landscape" => "US letter (landscape)", 
+      "legal landscape" => "Legal (landscape)", 
+      "11x17 landscape" => "Ledger (landscape)");
+  $paper_sizes_default = "a4";
+
+  $staff_sizes = array (
+      "11" => "11pt (Pocket scores)",
+      "12.5" => "12.5pt",
+      "14" => "14pt",
+      "15" => "15pt",
+      "16" => "16pt",
+      "17" => "17pt",
+      "18" => "18pt",
+      "19" => "19pt",
+      "20" => "20pt (default)",
+      "22" => "22pt");
+  $staff_sizes_default = "20";
+  
+  $systems_max = 15;
+  $systems_default = 7;
+
+  $pages_max = 15;
+  $pages_default = 2;
+
+  $score_header_fields = array (
+      "title" => "Title",
+      "subtitle" => "Subtitle",
+      "composer" => "Composer",
+      "arranger" => "Arranger",
+      "instrument" => "Instrument");
+
+  $score_types = array (
+      "S0" =>        "Single staff, no clef",
+      "S" =>         "Single staff, treble clef",
+      "Sb" =>        "Single staff, bass clef",
+      "St" =>        "Single staff, tenor clef",
+      "Sa" =>        "Single staff, alto clef",
+      "sep1" =>      Null,
+      "P" =>         "Piano staff",
+      "O" =>         "Organ staff",
+      "sep2" =>      Null,
+      "Ch2" =>       "Choir, 2 staves (SA + TB)",
+      "Ch4" =>       "Choir, 4 staves (S, A, T, B)",
+      "sep3" =>      Null,
+      "Ch4P" =>      "Piano reduction for choir",
+      "S0P" =>       "Piano reduction for single soloist",
+      "sep4" =>      Null,
+      "[SSSb]" =>    "String Trio (2 V, Vc)",
+      "[SSaSb]" =>   "String Trio (V, Va, Vc)",
+      "[SStSaSb]" => "String Quartett",
+      "[StSbP]" =>   "Piano Trio",
+      "[StSaSbP]" => "Piano Quartett",
+      "sep5" =>      Null,
+      "" =>                             "Full Score, Chamber Orchestra",
+      "[SSb][SS][Sb][{SS}SaSb]" =>      "Full Score, Symphonic Orchestra",
+      "" =>                             "Full Score, Chamber Orchestra + Choir",
+      "[SSb][SS][Sb][{SS}Sa]Ch4[Sb]" => "Full Score, Symphonic Orchestra + Choir",
+      );
+  $score_types_default = "S0";
+  
+  $fullheader = array_key_exists ("full", $_REQUEST);
+  $headercount = $fullheader ? count($score_header_fields) : 1;
+  
+function write_option ($optkey, $optlabel, $optdefault) {
+  $sel = ($optkey == $optdefault) ? ' selected="selected"' : '';
+  if ($optlabel) {
+    print ("    <option value=\"$optkey\"$sel>$optlabel</option>\n");
+  } else {
+    print ("        <option disabled=\"disabled\">---------</option>\n");
+  }
+}
+
+function write_headerfield ($field, $label) {
+?>
+    <tr>
+    <td><INPUT type="checkbox" name="<?php echo $field ?>_check" size="15" onchange="loadPreview();document.score_form.<?php echo $field ?>.disabled = !this.checked" id="<?php echo $field ?>_check"><label for="<?php echo $field ?>_check" ><?php echo $label ?>: </label></td>
+    <td><INPUT type="text" checked name="<?php echo $field ?>" size="25" maxlength="100" id="<?php echo $field ?>" disabled="disabled" onchange="loadPreview();"></td>
+  </tr>
+<?php
+}
+?>
+
+  <FORM action="empty_sheet.php" name="score_form" onreset="loadPreview();">
+  <table class="music_score_settings_table" >
+  <TR>
+    <td><label for="paper_size">Paper size:</label></td>
+    <td><select name="paper_size" id="paper_size" onchange="loadPreview();">
+      <?php
+        foreach ($paper_sizes as $i => $value) { 
+          write_option ($i, $value, $paper_sizes_default);
+        }
+      ?>
+      </select></td>
+    <td rowspan="<?php echo 4+$headercount?>" class="vsep"></td>
+    <td rowspan="<?php echo 4+$headercount?>" colspan=2 align=center class="previewcell">
+      <div id=previewdiv class="foo">
+        <div id="loadingOverlay"></div>
+        <img id=preview src="" onLoad="document.getElementById('loadingOverlay').style.visibility = 'hidden';" alt="PREVIEW">
+      </div>
+    </td>
+
+  </tr>
+  <tr>
+    <td><label for="staff_size">Staff size:</label></td>
+    <td><select name="staff_size" id="staff_size" onchange="loadPreview();">
+      <?php
+        foreach ($staff_sizes as $i => $value) { 
+          write_option ($i, $value, $staff_sizes_default);
+        }
+      ?>
+      </select></td>
+  </tr>
+  <tr>
+    <td><label for="systems">Systems/page:</label></td>
+    <td><select name="systems" id="systems" onchange="loadPreview();">
+      <?php
+        for ($i = 1; $i <= $systems_max; $i++) {
+          write_option ($i, $i, $systems_default);
+        }
+      ?>
+    </select></td>
+  </tr>
+  <tr>
+    <td><label for="pages">Pages:</label></td>
+    <td><select name="pages" id="pages" onchange="loadPreview();">
+      <?php
+        for ($i = 1; $i <= $pages_max; $i++) {
+          write_option ($i, $i, $pages_default);
+        }
+      ?>
+      </select></td>
+  </tr>
+  
+<?php 
+if ($fullheader) {
+  foreach ($score_header_fields as $i => $value) {
+    write_headerfield ($i, $value);
+  }
+} else {
+?> 
+  <tr>
+    <td colspan="2">
+      <INPUT type="checkbox" name="header_space" id="header_space" onchange="loadPreview();"><label for="header_space" >Reserve space for title</label>
+    </td>
+  </tr>
+<?php } ?>
+
+<!--   <tr><TD colspan=5><hr></TD></tr> -->
+
+  <tr>
+    <td valign=top><label for="score_type">Score type:</label></td>
+    <td colspan=4>
+      <SELECT name="score_type" id="score_type" style='width: 100%' size="20" onchange="loadPreview();">
+        <?php
+          foreach ($score_types as $i => $value) { 
+            write_option ($i, $value, $score_types_default);
+          }
+        ?>
+      </SELECT>
+    </td>
+  </tr>
+  <tr><TD colspan=5 align=center>
+     <INPUT type="submit" name="create_score" value="Create Score"><INPUT type="reset" value="Reset Values">
+  </TD></tr>
+</table>
+
+  </FORM>
+
+<script type="text/javascript">
+loadPreview ();
+// document.getElementById('loadingOverlay').style.visibility = 'hidden';
+</script>
+</div>
\ No newline at end of file
diff --git a/index.php b/index.php
new file mode 100644
index 0000000..844781a
--- /dev/null
+++ b/index.php
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+  <title>Empty score sheet generator -- by Edition Kainhofer</title>
+</head>
+<?php
+  include ("empty_sheet_form.php");
+?>
+</body>
+</html>
diff --git a/templates/empty_sheet.tpl.ly b/templates/empty_sheet.tpl.ly
index 1c36414..44f5f61 100644
--- a/templates/empty_sheet.tpl.ly
+++ b/templates/empty_sheet.tpl.ly
@@ -10,6 +10,8 @@
 {{if $composer}}  composer="{{$composer}}"
 {{/if}}
 {{if $instrument}}  instrument="{{$instrument}}"
+{{/if}}
+{{if $arranger}}  arranger="{{$arranger}}"
 {{/if}}
   copyright="Created by Edition Kainhofer, http://www.edition-kainhofer.com/, using LilyPond 2.14"
 }
@@ -21,6 +23,12 @@
   ragged-last=##f
   ragged-right=##f
   #(set-paper-size "{{$paper_size}}"{{if $orientation}} '{{$orientation}}{{/if}})
+  top-system-spacing #'stretchability = #60
+  top-markup-spacing #'stretchability = #60
+  last-bottom-spacing #'stretchability = #60
+  system-system-spacing #'stretchability = #40
+{{if $header_space}}  bookTitleMarkup = \markup { \vspace #5 }
+{{/if}}
 }
 
 \layout {
-- 
GitLab