2010-03-23 18 views
5

Statik web sayfalarım, Şablon Araç Takımı'nın "içe aktarma" ve "dahil et" seçeneklerini kullanarak birbirine dahil olan çok sayıda şablondan oluşturulmuştur, bu yüzden page.html şuna benzer:Şablon Araç Takımı'nda şablon bağımlılıklarını nasıl kullanabilirim?

[% INCLUDE top %] 
[% IMPORT middle %] 

Daha sonra daha da fazla olabilir dosyalar dahil.

Bu dosyaların çoğuna sahibim ve çeşitli dillerdeki web sayfalarını (İngilizce, Fransızca, vb, bilgisayar dillerinde değil) oluşturmak için koşturulmaları gerekiyor. Bu çok karmaşık bir süreçtir ve bir dosya güncellendiğinde, bir makefile veya benzer bir şey kullanarak sadece gerekli dosyaları otomatik olarak yeniden yükleyebilmeyi isterim.

Şablon araçları şablonlarını ayrıştırabileceğiniz ve makefile kullanım için bir bağımlılık listesi oluşturabilen C dosyaları için makedepend gibi araçlar var mı?

Veya bu süreci otomatikleştirmek için daha iyi yollar var mı?

cevap

3

Template Toolkit, TT web siteleri ala make için ttree adlı kendi komut satırı komut dosyasına sahiptir. İşte

benim Mac burada TT web sitesi projelerinde sık kullandığınız kullandığım bir ttree.cfg dosyasıdır:

# directories 
src = ./src 
lib = ./lib 
lib = ./content 
dest = ./html 

# pre process these site file 
pre_process = site.tt 

# copy these files 
copy = \.(png|gif|jpg)$ 

# ignore following 
ignore = \b(CVS|RCS)\b 
ignore = ^# 
ignore = ^\.DS_Store$ 
ignore = ^._ 

# other options 
verbose 
recurse 

Sadece dest sadece (src olarak) kaynağında değiştirilmiştir neyin güncellenmesinde siteyi yeniden inşa edecek ttree -f ttree.cfg çalışan veya kütüphanelerimde (lib'da).

Daha ince taneli bağımlılıklar için Template Dependencies'a bakın.

{ 
    package MyProvider; 
    use base 'Template::Provider'; 

    # see _dump_cache in Template::Provider 
    sub _dump_deps { 
     my $self = shift; 

     if (my $node = $self->{ HEAD }) { 
      while ($node) { 
       my ($prev, $name, $data, $load, $next) = @$node; 

       say {*STDERR} "$name called from " . $data->{caller} 
        if exists $data->{caller}; 

       $node = $node->[ 4 ]; 
      } 
     } 
    } 
} 


use Template; 

my $provider = MyProvider->new; 

my $tt = Template->new({ 
    LOAD_TEMPLATES => $provider, 
}); 

$tt->process('root.tt', {}) or die $tt->error; 

$provider->_dump_deps; 

ve nerede (INSERT, SÜRECİNİ ve sarmalayıcısı içerir yoluyla) olarak adlandırılan tüm bağımlılıkları içinde çağrılabilir görüntüler Yukarıdaki kod: -

Güncelleme Ve burada Template::Provider sınıflara göre elde bağımlılık listesindeki benim bıçak olduğunu Bütün root.tt ağacı. Bundan dolayı ttree bağımlılık dosyası oluşturabilirsiniz.

/I3az/

+0

ı bulmak '' in depend' kesinti meydana ve bağımlılıkları uzun listeleri ile uygunsuz .ttreerc'. Bununla nasıl başa çıktıklarını görmek için ttree'ye bakmalıyım. –

+0

@Aaahh, bağımlılıkları ayrıştırmak için 'Text :: ParseWords' kullanır. Şimdi, bu çok şey açıklıyor ;-) Her durumda OP'nin, bu bağımlılık bilgisini şablon dosyalarındaki '[% - INCLUDE -%]' vb. Direktiflere göre otomatik olarak üretip üretemeyeceğini bilmek istediğini düşünüyorum. Ancak, .ttreerc 'i işaretlemek için +1. –

+0

@Sinan: Bağımlılık konusunda bir 2-3 fikrim vardı ama somut bir şey olana kadar en iyi şekilde bıraktım. Güncellemeye bakın. – draegtun

1

Eğer vb INCLUDE, PROCESS, WRAPPER gibi bir bağımlılıkları oluşturmak için komut satırından sed veya perl kullanarak hayal bile direktifleri belirtilen dosya adları buluyorlar umrumda olan. kurnazca bağımlılıkları (varsa

Ancak örneğin, boyutu en Image plugin kullanılarak hesaplanır HTML belgesinde <img> kullanarak bir görüntünün yerini belirtmek, sorun çok daha az uysal hale gelebilir.

Gerçekten test etmedim o ancak aşağıdaki gibi bir şey işe yarayabilecek.

#!/usr/bin/perl 

use strict; use warnings; 

use File::Find; 
use File::Slurp; 
use Regex::PreSuf; 

my ($top) = @ARGV; 

my $directive_re = presuf qw(INCLUDE IMPORT PROCESS); 

my $re = qr{ 
    \[%-? \s+ $directive_re \s+ (\S.+) \s+ -?%\] 
}x; 

find(\&wanted => $top); 

sub wanted { 
    return unless /\.html\z/i; 

    my $doc = read_file $File::Find::name; 
    printf "%s : %s\n", $_, join(" \\\n", $doc =~ /$re/g); 
} 
+0

Belirtilen bir 'gibi çok fazla bağımlılık var, ancak en azından bunları dosyadan çıkarmaya başlamak istiyorum. Bağımlılıkları makefileğimden koruyorum ve sonra şablonlar düzenlendiğinde değişiklikler yansıtmıyor. –

0

ttree belgeleri okuduktan sonra kendimi o ortaya çıkınca sonraki kişiye yararlıdır durumunda buradan post ediyorum şey yaratmak için karar ancak bu. genel bir çözüm değil, sadece birkaç tanesi için geçerli olan sınırlı durumlar.Tüm dosyalar aynı dizinde bulunduğundan ve yinelenen içeriğin bulunmadığından bu proje için çalıştı. Eksiklikleri, her bir rutinden önce yorum olarak belgeledim.

Bunu özlediğim ttree ile yapmanın basit bir yolu varsa, lütfen bana bildirin.

my @dependencies = make_depend ("first_file.html.tmpl"); 

# Bugs: 
# Insists files end with .tmpl (mine all do) 
# Does not check the final list for duplicates. 

sub make_depend 
{ 
    my ($start_file) = @_; 
    die unless $start_file && $start_file =~ /\.tmpl/ && -f $start_file; 
    my $dir = $start_file; 
    $dir =~ s:/[^/]*$::; 
    $start_file =~ s:\Q$dir/::; 
    my @found_files; 
    find_files ([$start_file], \@found_files, $dir); 
    return @found_files; 
} 

# Bugs: 
# Doesn't check for including the same file twice. 
# Doesn't allow for a list of directories or subdirectories to find the files. 
# Warning about files which aren't found switched off, due to 
# [% INCLUDE $file %] 

sub find_files 
{ 
    my ($files_ref, $foundfiles_ref, $dir) = @_; 
    for my $file (@$files_ref) { 
     my $full_name = "$dir/$file"; 
     if (-f $full_name) { 
      push @$foundfiles_ref, $full_name; 
      my @includes = get_includes ($full_name); 
      if (@includes) { 
       find_files (\@includes, $foundfiles_ref, $dir); 
      } 
     } else { 
#   warn "$full_name not found"; 
     } 
    } 
} 

# Only recognizes two includes, [% INCLUDE abc.tmpl %] and [% INCLUDE "abc.tmpl" %] 

sub get_includes 
{ 
    my ($start_file) = @_; 
    my @includes; 
    open my $input, "<", $start_file or die "Can't open $start_file: $!"; 
    while (<$input>) { 
     while (/\[\%-?\s+INCLUDE\s+(?:"([^"]+)"|(.*))\s+-?\%\]/g) { 
      my $filename = $1 ? $1 : $2; 
      push @includes, $filename; 
     } 
    } 
    close $input or die $!; 
    return @includes; 
} 
İlgili konular