Установить цвет фона ячейки таблицы HTML в соответствии с содержанием текста - PullRequest
0 голосов
/ 26 июня 2018

Я написал программу на Perl для создания веб-страницы с таблицей HTML, полученной из текстового файла textfile.txt.

Я хотел бы изменить ее так, чтобы ячейки таблицы были окрашены в соответствии с текстомсодержание.Например, если текст Reject, то фон ячейки должен быть красным.

Вот два метода, которые я попробовал.Ни один из них не работал

Метод 1

if ( $_ eq "REJECT" ) {
    print map { "<td style=width:705 bgcolor=#FF0000 >REJECT</td>" } @$d;
}

Метод 2

foreach my $d ( @data ) {

    $d //= '';    # Convert undefined values to empty strings

    my $class;

    if ( $d eq 'REJECT' ) {
        $class = 'hilite';
    }

    $html .= '<td';
    $html .= " class='$class'" if $class;
    $html .= ">$d</td>";
}

Perl-программа

#!/usr/bin/perl

print "Content-type: text/html\n\n";

use strict;
use warnings;

my $output = `cat textfile.txt`;
my @lines = split /\n/, $output;

my @data;

foreach my $line ( @lines ) {
    chomp $line;
    my @d = split /\s+/, $line;
    push @data, \@d;
}

my $color1 = "black";
my $color2 = "darkgreen";
my $color3 = "black";
my $color4 = "red";
my $color5 = "lime";

my $num    = 6;
my $title  = "This is the heading";
my $fstyle = "Helvetica";

print "<body bgcolor = $color3>";
print "<font color = $color5  face = $fstyle  size = $num>$title</font><br />";

foreach my $d ( @data ) {

    print "<html>";
    print "<body>";
    print "<table style=table-layout= fixed width= 705 height=110 text = $color4 border = 2 bordercolor = $color1 bgcolor = $color2>";
    print "<tr>";
    print map {"<th style=width:705 >Column1</th>"}
            print map {"<th style=width:705 >Column2</th>"}
            print "</tr>";
    print "<tr>";
    print map {"<td style=width:705 >$_</td>"} @$d;

    if ( $d eq 'REJECT' ) {
        print map {"<td style=width:705 bgcolor=#FF0000 >Reject</td>"} @$d;
    }

    print "</tr>";
    print "</table>";
    print "</body>";
    print "</html>";
}

Входной текстовый файл:

Column1 Column2
Accept   Reject
Accept   Reject
Accept   Reject

Эта строка

print map { "<td style=width:705 bgcolor=#FF0000 >Reject</td>"

добавляет в ячейку цвет фона КРАСНЫЙ, но не соответствует условию Reject.

Вывод

enter image description here

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Вот решение, которое работает правильно, но это не более чем исправление вашего собственного кода.Проблемы, которые я изложил, были исправлены, и это все

#!/usr/bin/perl

use strict;
use warnings 'all';

my $color1 = 'black';
my $color2 = 'darkgreen';
my $color3 = 'black';
my $color4 = 'red';
my $color5 = 'lime';

my $size   = 6;
my $title  = 'This is the heading';
my $fstyle = 'Helvetica';

print "Content-type: text/html\n\n";

print "<body bgcolor = $color3>\n";
print "<font color = $color5 face=$fstyle size=$size>$title</font><br />\n";

{
    print "<html>\n";
    print "<body>\n";

    print qq{<table
            style="table-layout:fixed; width=705; height=110; text=$color4"
            border=2
            bordercolor="$color1"
            bgcolor="$color2">\n};

    print "<tr>\n";
    print qq{<th style="width:705" >Column1</th>};
    print qq{<th style="width:705" >Column2</th>};
    print "</tr>\n";

    open my $fh, '<', 'textfile.txt' or die $!;

    while ( <$fh> ) {

        my @line = split;

        print "<tr>\n";

        for ( @line ) {

            if ( /reject/i ) {
                print qq{<td style=width:705 bgcolor=red>$_</td>};
            }
            else {
                print "<td style=width:705>$_</td>"
            }
        }

        print "</tr>\n";
    }

    print "</table>\n";
    print "</body>\n";
    print "</html>\n";
}

output

Content-type: text/html

<body bgcolor = black>
<font color = lime face=Helvetica size=6>This is the heading</font><br />
<html>
<body>
<table
        style="table-layout:fixed; width=705; height=110; text=red"
        border=2
        bordercolor="black"
        bgcolor="darkgreen">
<tr>
<th style="width:705" >Column1</th><th style="width:705" >Column2</th></tr>
<tr>
<td style=width:705>Column1</td><td style=width:705>Column2</td></tr>
<tr>
<td style=width:705>Accept</td><td style=width:705 bgcolor=red>Reject</td></tr>
<tr>
<td style=width:705>Accept</td><td style=width:705 bgcolor=red>Reject</td></tr>
<tr>
<td style=width:705>Accept</td><td style=width:705 bgcolor=red>Reject</td></tr>
</table>
</body>
</html>

Внешний вид

This is the result

Iвсе еще есть опасения по поводу вашего подхода.Взломать программу из кусочков чужой работы, которую вы не понимаете, - это рецепт неудачи.Если у вас нет склонности исследовать и изучать детали, достаточные для того, чтобы выжить самостоятельно, тогда вы выбрали неправильную работу

  • Я думаю, вам следует использовать систему шаблонов, такую ​​как Template::Toolkit вместо печати HTML из вашей программы Perl

  • Цвета должны быть изменены с использованием CSS и соответствующих class, а не печать атрибутов HTML в строке

Вы, кажется, думаете, что случайный и приблизительный подход - это хорошо, или, по крайней мере, вы не хотите предлагать больше, но хотя это может быть верным для других профессий, разработка программного обеспечения требует многобольше заботы и точности

0 голосов
/ 26 июня 2018

Вот некоторые ошибки в вашем Perl-коде

  • Как я уже сказал, вы неправильно используете map

  • Вы создаетеновый HTML-документ для каждого элемента @data.Что вы ожидаете от браузера с несколькими элементами <html>?Он не может отобразить их все

  • Вы ожидаете, что строка REJECT будет соответствовать Reject

  • Вы используете смесьCSS style строки и атрибуты элемента.Например,

    print "<table style=table-layout= fixed width= 705 height=110 text = $color4 border = 2 bordercolor = $color1 bgcolor = $color2>"
    

    должно быть

    print qq{<table
            style="table-layout:fixed; width=705; height=110; text=$color4"
            border=2
            bordercolor="$color1"
            bgcolor="$color2">\n}
    

    , потому что table-layout, width, height и text являются свойствами CSS, а border, bordercolor и bgcolor являются атрибутами элементов HTML

    Я думаю, что вы должны писать CSS, чтобы решить эту проблему, но это другой вопрос

Это также поможет ваммного, если вы напечатали новую строку "\n" после каждого элемента HTML.Таким образом, результат будет намного более читабельным, и вы сможете лучше видеть то, что вы создали

Пожалуйста, не стойте с этим «попробуйте что-нибудь, пока он не заработает» .Вы всегда приходите сюда за помощью, чтобы вытащить вас из беспорядка, который вы создали, и вы не задаете разумных вопросов.Если вы так долго пользуетесь map, это значит, что вы совсем не учитесь, и вы обязаны самим себе и своему работодателю правильно выучить язык

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...