首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CL--类似于世界卫生组织的其他语言的HTML模板?

CL--类似于世界卫生组织的其他语言的HTML模板?
EN

Stack Overflow用户
提问于 2009-03-22 20:31:08
回答 11查看 1.7K关注 0票数 11

一般的Lisp人员都有自己的CL-WHO,这使得HTML模板与“主”语言集成在一起,从而使任务变得更容易。对于那些不了解CL-WHO的人来说,它看起来像这样(来自CL- who网页的示例):

代码语言:javascript
复制
(with-html-output (*http-stream*)
(:table :border 0 :cellpadding 4
  (loop for i below 25 by 5
     do (htm
         (:tr :align "right"
          (loop for j from i below (+ i 5)
                do (htm
                    (:td :bgcolor (if (oddp j)
                                    "pink"
                                    "green")
                         (fmt "~@R" (1+ j))))))))))

你知道其他语言的类似库吗?我所知道的(模仿CL-WHO的)是Python的Brevé。我对Perl风格特别感兴趣,但其他语言如何将HTML集成到它们的语法中也很有趣。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-03-23 09:21:03

有关CPAN产品,请查看以下内容(按字母顺序)...

  • Builder
  • HTML::AsSubs
  • HTML::Tiny
  • Markapl
  • Template::Declare
  • XML::Generator

使用提供的CL-WHO示例的表格部分(减去罗马数字和s/background-color/color/将代码压缩到屏幕宽度中!)...

构建器

代码语言:javascript
复制
use Builder;
my $builder = Builder->new;
my $h = $builder->block( 'Builder::XML' );

$h->table( { border => 0, cellpadding => 4 }, sub {
   for ( my $i = 1; $i < 25; $i += 5 ) {
       $h->tr( { align => 'right' }, sub {
           for my $j (0..4) {
               $h->td( { color => $j % 2 ? 'pink' : 'green' }, $i + $j );
           }
       });
   } 
});

say $builder->render;

HTML::AsSubs

代码语言:javascript
复制
use HTML::AsSubs;

my $td = sub {
    my $i = shift;
    return map { 
        td( { color => $_ % 2 ? 'pink' : 'green' }, $i + $_ )
    } 0..4;
};

say table( { border => 0, cellpadding => 4 },
    map { 
        &tr( { align => 'right' }, $td->( $_ ) ) 
    } loop( below => 25, by => 5 )
)->as_HTML;

HTML::Tiny

代码语言:javascript
复制
use HTML::Tiny;
my $h = HTML::Tiny->new;

my $td = sub {
    my $i = shift;
    return map { 
        $h->td( { 'color' => $_ % 2 ? 'pink' : 'green' }, $i + $_ )
    } 0..4;
};

say $h->table(
    { border => 0, cellpadding => 4 },
    [
        map { 
            $h->tr( { align => 'right' }, [ $td->( $_ ) ] )  
        } loop( below => 25, by => 5 )    
    ]
);

标记

代码语言:javascript
复制
use Markapl;

template 'MyTable' => sub {
    table ( border => 0, cellpadding => 4 ) {
       for ( my $i = 1; $i < 25; $i += 5 ) {
           row ( align => 'right' ) {
               for my $j ( 0.. 4 ) {
                   td ( color => $j % 2 ? 'pink' : 'green' ) { $i + $j }
               }
           }
       } 
    }
};

print main->render( 'MyTable' );

模板::声明

代码语言:javascript
复制
package MyTemplates;
use Template::Declare::Tags;
use base 'Template::Declare';

template 'MyTable' => sub {
    table {
        attr { border => 0, cellpadding => 4 };
        for ( my $i = 1; $i < 25; $i += 5 ) {
            row  {
                attr { align => 'right' };
                    for my $j ( 0..4 ) {
                        cell {
                            attr { color => $j % 2 ? 'pink' : 'green' } 
                            outs $i + $j;
                        }
                    }
            }
        } 
    }
};

package main;
use Template::Declare;
Template::Declare->init( roots => ['MyTemplates'] );
print Template::Declare->show( 'MyTable' );

XML::生成器

代码语言:javascript
复制
use XML::Generator;
my $x = XML::Generator->new( pretty => 2 );

my $td = sub {
    my $i = shift;
    return map { 
        $x->td( { 'color' => $_ % 2 ? 'pink' : 'green' }, $i + $_ )
    } 0..4;
};

say $x->table(
    { border => 0, cellpadding => 4 },
    map { 
        $x->tr( { align => 'right' }, $td->( $_ ) )  
    } loop( below => 25, by => 5 )    
);

下面的代码可以用来生成HTML::AsSubs / HTML::Tiny / XML::Generator示例中的“循环”。

代码语言:javascript
复制
sub loop {
    my ( %p ) = @_;
    my @list;

    for ( my $i = $p{start} || 1; $i < $p{below}; $i += $p{by} ) {
        push @list, $i;
    }

    return @list;
}
票数 12
EN

Stack Overflow用户

发布于 2009-03-23 02:28:39

The Perl Foundation目前资助的一个项目(一个lightweight web framework for Perl 6)有一个可以工作的Perl6代码,即provides a similar interface

代码语言:javascript
复制
use Tags;
say show {
    html {
        head { title { 'Tags Demo' } }
        body {
            outs "hi";
            ul :id<numberlist> {
                outs "A list from one to ten:";
                for 1..10 {
                    li :class<number>, { $_ }
                }
            }
        }
    }
}

浏览或克隆github上的当前代码。

票数 6
EN

Stack Overflow用户

发布于 2009-03-22 20:51:03

Perl的CGI模块支持这样的功能。

代码语言:javascript
复制
use CGI ':standard';
use Lisp::Fmt 

print header();

print table( { -border => 1, -cellpading => 4},
    loop({ below => 25, by=> 5}, sub {
        my $i = shift;
        tr( {-align => 'right'} ,
            loop({ from => $i, below $i + 5}, sub {
                my $j = shift;
                td({-bgcolor => ($oddp eq $j ? 'pink' : 'green')}
                    fmt("~@R", 1+$j);
            })
        )
    });

我尽量让它保持lispy,所以您必须自己实现一个lispy loop函数。我并不是真正的编程通用列表,所以我希望我正确理解了你的代码。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/671572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档