Возможно мой вопрос не подходит под формат Тостера. Но попробую спросить.
Есть код на php, который генерирует схему гитарного ритма для поста в вордпрессе . Схема состоит из таблицы и картинок.
Вот так это выглядит:
Пример страницы.
Раньше схема ритма выводилась в одну строку, но потом я попросил программиста сделать разбиение на две строки и он сделал доработку, как я понимаю ввёл дополнительную функцию. Я немного знаю php и подозреваю что это в функции "codeToPics", но что конкретно не знаю.
Прошло время, и под новый дизайн нам надо снова сделать вывод в одну строку. Тот программист сейчас к сожалению недоступен.
Вопрос: что надо исправить, чтобы сделать вывод на одну строку?
Весь код сюда вставить не получается.
Вот основная часть кода и скорее всего нужное здесь.
<?php
public static function parse($str)
{
preg_match_all("|\[([A-Za-z0-9\.\/#b\+\(\)]*)@?b([0-9]+)@?([^@\[]+)?\]|", $str, $matches);
$tm = new FilkDb(self::TBL_RHYTHM);
if ( !empty($matches[2]) ) {
foreach ($matches[2] as $idx => $id) {
$chords = !empty($matches[1][$idx]) ? $matches[1][$idx] : "";
$count = !empty($matches[3][$idx]) ? $matches[3][$idx] : "";
/*echo "<pre>";
var_dump($matches);
die;*/
$item = $tm->getById($id);
$video = !empty($item["video"]) ? "<div style='text-align: center;'>" . $item["video"] . "</div>": "";
$ins = "<div>" . $item["name"] . "<table style='border: 0;'><tr><td style='border: 0'>" . self::codeToPics($item["body"], $chords, $count) . "</td></tr></table>" . $video . "</div>";
$str = str_replace($matches[0][$idx], $ins, $str);
}
}
return $str;
}
public static function splitCounts($str)
{
$len = strlen($str);
$ret = [];
$cnt = 0;
for($i=0; $i < $len; $i++) {
if ($str[$i] == "-") {
$cnt++;
continue;
}
$ret[$cnt][] = $str[$i];
if ($str[$i] == "." || ($i < $len - 1 && $str[$i+1] == ".")) {
$cnt++;
}
}
return $ret;
}
public static function splitChords($str)
{
$len = strlen($str);
$ret = [];
$cnt = 0;
for($i=0; $i < $len; $i++) {
// echo $str[$i] . ":" . (preg_match("|[A-Z\.]|", $str[$i]) ? "Y" : "N") . "\n";
$ret[$cnt][] = $str[$i];
if ($i < $len - 1 && ($str[$i+1] == "." || ($str[$i] !== '/' && preg_match("|[A-Z]|", $str[$i+1])))) {
$cnt++;
}
}
return $ret;
}
public static function codeToPicsLine($code, $chordsArr, $countArr, $metre, $idxFrom, $idxTo)
{
$ret = "<tr>";
for ($i=$idxFrom; $i < $idxTo; $i++) {
$curChord = (!empty($chordsArr[$i]) && $chordsArr[$i] ? implode("", $chordsArr[$i]) : "");
$ret .= "<td nowrap class='txt'>" . ($curChord == "." ? "" : $curChord) . "</td>";
if (($i+1) % $metre == 0) {
$ret .= "<td class='empty'><img src='" . get_template_directory_uri() . "/tabpics/empty.png' /></td>";
}
}
$ret .= "</tr>";
$ret .= "<tr>";
for ($i=$idxFrom; $i < $idxTo; $i++) {
$pic = self::mapTabPic($code[$i]);
$ret .= "<td class='pic'><img src='" . get_template_directory_uri() . "/tabpics/" . $pic . ".png' /></td>";
if (($i+1) % $metre == 0) {
$ret .= "<td class='empty'><img src='" . get_template_directory_uri() . "/tabpics/empty.png' /></td>";
}
}
$ret .= "</tr>";
$ret .= "<tr>";
for ($i=$idxFrom; $i < $idxTo; $i++) {
$ret .= "<td class='bottom'><img src='" . get_template_directory_uri() . "/tabpics/bottom.png' /></td>";
if (($i+1) % $metre == 0) {
$ret .= "<td class='empty'><img src='" . get_template_directory_uri() . "/tabpics/empty.png' /></td>";
}
}
$ret .= "</tr>";
$ret .= "<tr>";
$metreCount = 0;
for ($i=$idxFrom; $i < $idxTo; $i++) {
$metreCount++;
$metreCountLabel = !empty($countArr[$i])
&& !empty($countArr[$i][0])
&& $countArr[$i][0] !== "."
? implode("", $countArr[$i])
: $metreCount;
$ret .= "<td class='txt'>" . $metreCountLabel . "</td>";
if (($i+1) % $metre == 0) {
//$metreCount = 0;
$ret .= "<td class='empty'><img src='" . get_template_directory_uri() . "/tabpics/empty.png' /></td>";
}
}
$ret .= "</tr>";
return $ret;
}
public static function codeToPics($code, $chords, $metreCount)
{
$code = preg_replace("|\s+|", "", trim($code));
$len = strlen($code);
$metre = $len % 3 == 0 ? 3 : 4;
$ret = "<table class='rhythm-table'>";
$chordsArr = $chords ? self::splitChords($chords) : [];
$countArr = $metreCount ? self::splitCounts($metreCount) : [];
if ($len > 2*$metre) {
$ret .= self::codeToPicsLine($code, $chordsArr, $countArr, $metre, 0, 2*$metre);
$ret .= self::codeToPicsLine($code, $chordsArr, $countArr, $metre, 2*$metre, $len);
} else {
$ret .= self::codeToPicsLine($code, $chordsArr, $countArr, $metre, 0, $len);
}
$ret .= "</table>";
return $ret;
}
public static function mapTabPic($chr)
{
$defaultPic = "dot";
$map = [
"v" => "down",
"^" => "up",
"x" => "x",
"a" => "a",
"p" => "p",
"i" => "i",
"m" => "m"
];
$chrLower = strtolower($chr);
return isset($map[$chrLower]) ? $map[$chrLower] : $defaultPic;
}
Полный код тут:
https://yadi.sk/d/zsx5hRUwofjHx