function do_table($w, $values0, $values1, $values2, $values3, $values4, $ignore, $format_value, $format_word, $get_link = NULL, $extras = NULL, $optimization = 0) { ?> <div class="scrollable"><?php if ($values1 and !$values2 and !$values3 and !$values4 and !$values0) { ?> <table class="text-center inflection inflection-small" id="word<?php echo $w->id(); ?> _forms"><?php foreach ($values1[false] as $_1) { ?> <tr><th><?php echo format_value($_1); ?> </th></tr><tr><td><?php echo format_word(PATH($w, $_1)->get(), $w->lang(), true); ?> </td></tr><?php } } else { ?> <table class="text-left inflection" id="word<?php echo $w->id(); ?> _forms"><?php $first0 = $last0 = NULL; _get_first_last($values0, $first0, $last0); if (!$values0) { $values0 = [FALSE]; $values1 = [$values1, "_" => $values1]; $values2 = [$values2, "_" => $values2]; $values3 = [$values3, "_" => $values3]; $values4 = [$values4, "_" => $values4]; } foreach ($values0 as $_key => $_0) { $name0 = $_0; // FIXME if ($name0 === " ") { $name0 = FALSE; } if (!$values1[$_0]) { $values1[$_0] = [FALSE]; } if (!$values2[$_0]) { $values2[$_0] = [FALSE]; } if (!$values3[$_0]) { $values3[$_0] = [FALSE]; } if (!$values4[$_0]) { $values4[$_0] = [FALSE]; } $path = PATH($w, $_0); if ($_0 !== $first0) { // Blank row to separate sub-tables based on $values0 ?> <tr><th> </th></tr><?php } // values0 : table name // values1 : major vertical // values2 : minor vertical // values3 : major horizontal // values4 : minor horizontal $_1 = (count($values1[$_0]) > 1 or $values1[$_0][0] !== FALSE); ?> <tr><?php $hspan1 = $_1 !== FALSE ? 2 : 1; if ($name0 === FALSE) { ?> <th colspan="<?php echo $hspan1; ?> "> </th><?php } else { ?> <th colspan="<?php echo $hspan1; ?> " class="greatest"><?php echo $format_value($name0); ?> </th><?php } if ($values3[$_0]) { foreach ($values3[$_0] as $_3) { ?> <th colspan="<?php echo count($values4[$_0][$_3]); ?> " class="major"><?php echo $format_value($_3); ?> </th><?php } } ?> </tr><?php if (!array_key_exists("_", $values4[$_0])) { $values4[$_0]["_"] = []; } if ($values4[$_0]["_"] and $values4[$_0]["_"][0] !== FALSE) { ?> <tr><th colspan="<?php echo $hspan1; ?> "> </th><?php foreach ($values3[$_0] as $_3) { if ($values4[$_0][$_3]) { foreach ($values4[$_0][$_3] as $_4) { ?> <th class="minor"><?php echo $format_value($_4); ?> </th><?php } } } ?> </tr><?php $hspan4 = 1; } elseif ($values4[$_0]["_"]) { $hspan4 = count($values4[$_0]["_"]); foreach ($values4[$_0] as &$v) { $v = [""]; } } else { $hspan4 = 1; } foreach ($values1[$_0] as $_1) { if ($_1 !== FALSE) { ?> <tr><?php ?> <th colspan="2" class="major"><?php echo $format_value($_1); ?> </th><?php ?> </tr><?php } // Previous row (directly above) $p_2 = NULL; foreach ($values2[$_0][$_1] as $_2) { ?> <tr><?php if ($_1 !== FALSE) { ?> <th> </th><?php } ?> <th class="minor"><?php echo $format_value($_2); ?> </th><?php $row = []; $last = NULL; foreach ($values3[$_0] as $_3) { $acc = []; $i = -1; foreach ($values4[$_0][$_3] as $_4) { $p = PATH($w, $_0, $_1, $_3, $_4, $_2); if ($i < 0 or $p->get() != $last or !$last) { $acc[] = []; $last = $p->get(); $i += 1; } $acc[$i][] = [$p, 2 => $_3, $_4]; } if (!($optimization & 2) or count($acc) != 1 and count($acc) != count($values4)) { $acc = []; foreach ($values4[$_0][$_3] as $_4) { $p = PATH($w, $_0, $_1, $_3, $_4, $_2); $acc[] = [[$p, 2 => $_3, $_4]]; } } $row = array_merge($row, $acc); } $first1 = $last1 = NULL; _get_first_last($values1[$_0], $first1, $last1); $first2 = $last2 = NULL; _get_first_last($values2[$_0][$_1], $first2, $last2); $first3 = $last3 = NULL; _get_first_last($values3[$_0], $first3, $last3); $first4 = $last4 = NULL; _get_first_last($values4[$_0][$_3], $first4, $last4); foreach ($row as $val_group) { $p = $val_group[0][0]; $_ = count($val_group) - 1; $_30 = $val_group[0][2]; $_40 = $val_group[0][3]; $_31 = $val_group[$_][2]; $_41 = $val_group[$_][3]; if ($_ === 0) { $_3 = $_30; $_4 = $_40; $ditto = ($p_2 and $p->get() and PATH($w, $_0, $_1, $_3, $_4, $p_2)->get() == $p->get()); } else { $_3 = $_4 = NULL; $ditto = FALSE; } ?> <td colspan="<?php echo $hspan4 * count($val_group); ?> " <?php $classes = ""; if (!$first4 or $_40 === $first4) { $classes .= " leftline"; } if (!$last4 or $_41 === $last4) { $classes .= " rightline"; } if (!$first2 or $_2 === $first2) { $classes .= " topline"; } if (!$last2 or $_2 === $last2) { $classes .= " bottomline"; } if ((!$first4 or $_40 === $first4) and $_30 !== $first3) { $classes .= " leftline"; } echo " class='{$classes}' "; if (count($val_group) > 1) { echo " style='text-align: center;'"; } ?> ><?php if ($get_link !== NULL) { $link = $get_link($p); } else { $link = NULL; } if (ISWORD($link)) { $link = "dictionary.php?id=" . $link->id(); } if ($link) { ?> <a class="word-ref" href="<?php echo $link; ?> "><?php } if (!_in_ignore($p, $ignore) or !$p->hasvalue()) { $val = $format_word($p->get(), $p); } else { $val = '<abbr class="symbolic" title="You\'ve not learned this yet">—</abbr>'; } if (count($val_group) > 1) { $val = "" . "<span style='float: right;'>→</span>" . "<span style='float: left;'>←</span>" . $val; } elseif ($ditto and $optimization & 1) { $val = " ″"; # ditto mark $val = " ⁄ ⁄"; #echo "↓"; } echo $val; if ($link) { ?> </a><?php } if ($extras !== NULL) { $extras($p); } ?> </td><?php } ?> </tr><?php $p_2 = $_2; } } } } ?> </table></div><?php }
function make_chart($w, $values = NULL, $ignore = NULL, $legend = "this chart", $add = NULL, $translate = FALSE) { if ($translate === TRUE) { $translate = []; } ob_start(); if ($values === NULL) { $values = word_table_values($w, $ignore); list($values0, $values1, $values2, $values3, $values4) = $values; } else { list($values0, $values1, $values2, $values3, $values4) = $values; $values0 = _do_ignore($values0, $ignore); if (is_fillable($values1)) { $values1 = _fill($values1, $values0); } if (is_fillable($values2)) { $values2 = _fill($values2, $values0); } if (is_fillable($values3)) { $values3 = _fill($values3, $values0); } if (is_fillable($values4)) { $values4 = _fill($values4, $values0); } _filter_ignore2($values1, $ignore, PATH($w), $values0); _filter_ignore2($values2, $ignore, PATH($w), $values0, $values1); _filter_ignore2($values3, $ignore, PATH($w), $values0); _filter_ignore2($values4, $ignore, PATH($w), $values0, $values3); } global $OP_USER_INPUT; $w->read_paths(); $w->read_attrs(); if (is_string($add) && $add) { $add = ", {$add}"; } $ret = ["help" => !is_callable($legend) && !is_callable($add) ? "Fill in {$legend} for “" . display_word_name($w) . "”{$add}." : function ($pick_db, $db) use($w, $add, $legend) { if (is_callable($add)) { $add = $add($pick_db, $db); if ($add) { $add = ", {$add}"; } } if (is_callable($legend)) { $legend = $legend($pick_db, $db); } return "Fill in " . $legend . " for “" . display_word_name($w) . "”{$add}."; }, "selections" => [], "sentence" => []]; $i = 0; $get_question = function ($form, $path) use(&$i, &$ret, $translate) { $ret["answer{$i}-hidden"] = TRUE; $ret["answer{$i}"] = array_map("format_word", explode("\n", $form)); $ret["answer{$i}-tooltip"] = "Enter form"; $i++; if ($translate === FALSE or _in_ignore($path, $translate)) { return '<input>'; } else { $ret["answer{$i}-hidden"] = TRUE; } $ret["answer{$i}"] = ["correct" => [la_en($path, true)], "expr" => la_en($path, false)]; //error_log($path.json_encode($ret["answer$i"])); $ret["answer{$i}-tooltip"] = "Translate"; $i++; return '<input><br><input>'; }; do_table($w, $values0, $values1, $values2, $values3, $values4, $ignore, "format_value", $get_question, NULL, NULL, 0); $table = explode("<input>", ob_get_contents()); ob_clean(); $i = count($table) - 1; foreach ($table as $r) { $ret["sentence"][] = HTML($r); if ($i) { $ret["sentence"][] = $OP_USER_INPUT; } $i -= 1; } return $ret; }