Perl - 如何生成锦标赛支架HTML表格

时间:2014-07-28 21:33:26

标签: perl template-toolkit dancer

好的我正在创建一个锦标赛支架生成器,到目前为止,我有以下内容生成一个按种子排序的特定重量括号中的竞争对手数组。

我遇到的问题是我无法以括号格式输出到HTML。

好的,在下面的代码之前我搜索数据库并选择特定权重类别中的竞争对手并将它们存储在@result数组中。然后:

#place the competitors into the @sortBySeed array highest seed to lowest.
my @sortBySeed = sort { $b->[5] <=> $a->[5] } @$result;

# this is an array which contains the arrays of the individual bouts 
i.e competitors/2 bouts, each array holding the names of the two competitors.

    my $numberStartingBouts = scalar(@sortBySeed) / 2;

    # if there are an even amount of competitors then a bye isn't needed
    if ( isint $numberStartingBouts) {
        for ( my $i = 0 ; $i < scalar(@sortBySeed) ; $i++ ) 
        {
           #remove the top seed from the array and return, remove the bottom seed and            return
           my $competitor1 = pop(@sortBySeed);
            my $competitor2 = shift(@sortBySeed);
            # place them into the knockout array in a bout
            push(@knockoutArray, $competitor1);
            push(@knockoutArray, $competitor2);


        }

    }
    else 
    {
        # remove the top seed and give them a bye
        my $competitor1 = shift(@sortBySeed);
        my $competitor2 = 'Bye';

        push(@knockoutArray, $competitor1);
        push(@knockoutArray, $competitor2);

        # process the rest as above
         for (my $i = 0 ; $i < scalar(@sortBySeed) ; $i++ ) 
        {
           my  $competitor1 = shift(@sortBySeed);
            my $competitor2 = pop(@sortBySeed);

            push(@knockoutArray, $competitor1);
            push(@knockoutArray, $competitor2);

        }

    }

    # flatten the first part of the array so that it's a scalar and not an array within the array
    map{$_=join(" ",@$_[1..3]) if(ref $_ eq 'ARRAY');} @knockoutArray;

好的,现在我有一个数组@knockoutArray,其中包含以下内容(使用data :: dumper显示):

$VAR1 = 'Seed 1';
$VAR2 = 'Bye';
$VAR3 = 'Seed 2';
$VAR4 = 'Seed 7';
$VAR5 = 'Seed 3';
$VAR6 = 'Seed 6';
$VAR7 = 'Seed 4';
$VAR8 = 'Seed 5';

我有上面数组的以下静态HTML页面,可以在其中加入详细信息

<!--
table {
  border-collapse: collapse;
  border: none;
  font: small arial, helvetica, sans-serif;
}
td {
  vertical-align: middle;
  width: 10em;
  margin: 0;
  padding: 0;
}
td p {
  border-bottom: solid 1px black;
  margin: 0;
  padding: 5px 5px 2px 5px;
}
-->
</style>
</head>
<body>
<table summary="Tournament Bracket">
 <tr>
  <td><p><% data.0 %></p></td>
  <td rowspan="2"><p></p></td>
  <td rowspan="4"><p></p></td>
  <td rowspan="8"><p></p></td>
 </tr>
 <tr>
  <td><p><%data.1%></p></td>
 </tr>
 <tr>
  <td><p><% data.2 %></p></td>
  <td rowspan="2"><p></p></td>
 </tr>
 <tr>
  <td><p><% data.3 %></p></td>
 </tr>
 <tr>
  <td><p><% data.4 %></p></td>
  <td rowspan="2"><p></p></td>
  <td rowspan="4"><p></p></td>
 </tr>
    <tr>
    <td><p><% data.5 %></p></td>
    </tr>
    <tr>
    <td><p><% data.6 %></p></td>
    <td rowspan="2"><p></p></td>
    </tr>
    <tr>
    <td><p><% data.7 %></p></td>
    </tr>

    </table>
    </body>
    </html>

如何根据我传递给它的数组大小,动态增长或缩小表格,使用HTML输出?我正在使用Perl Dancer和Template Toolkit,所以任何涉及这些的东西都会有用!

任何方法都涉及将数组存储在锦标赛括号中,以便稍后调用的文件将非常有用。

我希望括号看起来像这样:

http://www.jimyi.com/content/brackets/tournament4.html

谢谢!

1 个答案:

答案 0 :(得分:3)

如果竞争对手的数量发生变化,那么显然列数会发生变化,这些列的行数对于每一列向右移动将加倍,直到达到向上舍入的竞争对手数量。因此,必须动态声明遍历页面的<td>单元格。 HTML表格就是这样,我建议创建锦标赛的垂直演示会使这个逻辑更简单很多

如果我遇到这个问题,我将从HTML::TableBracket开始,这似乎可以帮助你完成大部分工作。尽管输出并不完全符合您的需求(似乎假设您正在跟踪结果),HTML表输出的逻辑就在那里,它应该足够简单,可以为您调整as_html()方法目的。我要向它添加一堆调试代码,直到我充分理解循环的逻辑。

作为奖励,似乎可以避免计算对手的需要 - 条目传递到new()的顺序决定了他们如何分配。

如果你真的想要自己动手,我还可以设想一个你有一个arrayrefs的arrayref的场景。第0行包含所有竞争对手,例如@knockoutArray。第一行有一半,第二行有一半......直到你有一个带有1个项目的数组。

my $data = [
  [ 'Seed 1','Bye','Seed 2','Seed 7','Seed 3','Seed 6','Seed 4','Seed 5' ],
  [ 'Seed 1', '2 vs 7', '3 vs 6', '4 vs 5' ],
  [ '1 vs 2/7', '3/6 vs 4/5' ],
  [ '1/2/7 vs 3/6/4/5' ]
];

我不知道你打算如何在比赛中进一步表现这些比赛,所以构建这个阵列是留给读者的练习。

您的模板代码可能如下所示:

[%-
    USE Perl;
    SET rows = data.0.size;
    SET cols = data.size;
    SET elem = [];
    FOREACH row IN data;
        elem.push(0); # [ 0,0,0,0 ]
    END;
    '<table>';
    SET row = 0;
    WHILE row < rows;
        '<tr>';
        SET col = 0;
        WHILE col < cols;
            SET rowspan = Perl.pow(2, col);
            IF row % rowspan == 0;
                '<td rowspan='; rowspan; '>'; data.$col.item(elem.$col); '</td>';
                SET elem.$col = elem.$col + 1;
            END;
            SET col = col + 1;
        END;
        '</tr>';
        SET row = row + 1;
    END;
    '</table>';

-%]

我必须使用Template::Plugin::Perl来代码,因为开箱即用的TT不支持数学指数。

(顺便说一下,如果你有6个参赛者,我认为你的'偶数条目'逻辑不起作用。如果保留原始代码,我认为你需要添加Bye记录直到你达到2的因子。)