Revision history for Template-Simple
+0.06 Tue May 8 01:53:46 EDT 2012
+ Added support for markup tokens to use a user supplied regex
+ Thanks to Rick Morse
+
+0.05 Sun Apr 24 00:27:10 EDT 2011
+ - Updated Changes file
+ - Added handling of undef templates
+ - Added new benchmark in extras/bench_all.pl
+0.05 Fri Jun 24 14:22:58 EDT 2011
+ Wrote new benchmark script in extras/
+ Added to distro modified Template::Teeny for benchmark
+
+0.04 Sun Apr 24 00:27:10 EDT 2011
+ - Fixed bugs in tests (introduced in 0.03)
+
+0.03 Sun Apr 3 04:11:04 EDT 2011
+ - Added support for compiled templates
+ - Added support to test regular and compiled templates
+ - Improved shared test driver t/common.pm
+ - include_paths constructor option now called template_paths
+ include_paths is still supported but deprecated
+ - Major edits and cleanup of pod
+ - Created extras/cookbook.pl with runnable T::S examples and pod
+ - Added extras/bench_all.pl which benchmarks several templaters
+
0.02 Tue Oct 17 02:08:28 EDT 2006
- Fixed bug with nested hashes being rendered. Added nested.t to
the tests.
0.01 Sun Aug 27 00:07:13 EDT 2006
First release
-
-
META.yml # Will be created by "make dist"
Makefile.PL
README
+TODO
lib/Template/Simple.pm
t/00-load.t
t/boilerplate.t
t/include.t
t/error.t
t/common.pm
+extras/cookbook.pl
+extras/bench_all.pl
+extras/lib/Template/Teeny.pm
+extras/lib/Template/Teeny/Stash.pm
# This Makefile is for the Template::Simple extension to perl.
#
# It was generated automatically by MakeMaker version
-# 6.17 (Revision: 1.133) from the contents of
+# 6.55_02 (Revision: 65502) from the contents of
# Makefile.PL. Don't edit this file, edit Makefile.PL instead.
#
# ANY CHANGES MADE HERE WILL BE LOST!
#
# MakeMaker ARGV: ()
#
+
# MakeMaker Parameters:
# ABSTRACT_FROM => q[lib/Template/Simple.pm]
# AUTHOR => q[Uri Guttman <uri@sysarch.com>]
+# BUILD_REQUIRES => { }
# NAME => q[Template::Simple]
# PL_FILES => { }
# PREREQ_PM => { Test::More=>q[0], File::Slurp=>q[0] }
# --- MakeMaker const_config section:
-# These definitions are from config.sh (via /usr/local/lib/perl5/5.8.6/sun4-solaris/Config.pm)
-
-# They may have been overridden via Makefile.PL or on the command line
+# These definitions are from config.sh (via /usr/lib/perl/5.10/Config.pm).
+# They may have been overridden via Makefile.PL or on the command line.
AR = ar
-CC = gcc
+CC = cc
CCCDLFLAGS = -fPIC
-CCDLFLAGS =
+CCDLFLAGS = -Wl,-E
DLEXT = so
DLSRC = dl_dlopen.xs
-LD = gcc
-LDDLFLAGS = -G -L/usr/local/lib
-LDFLAGS = -L/usr/local/lib
-LIBC = /lib/libc.so
+EXE_EXT =
+FULL_AR = /usr/bin/ar
+LD = cc
+LDDLFLAGS = -shared -O2 -g -L/usr/local/lib -fstack-protector
+LDFLAGS = -fstack-protector -L/usr/local/lib
+LIBC =
LIB_EXT = .a
OBJ_EXT = .o
-OSNAME = solaris
-OSVERS = 2.9
+OSNAME = linux
+OSVERS = 2.6.24-28-server
RANLIB = :
-SITELIBEXP = /usr/local/lib/perl5/site_perl/5.8.6
-SITEARCHEXP = /usr/local/lib/perl5/site_perl/5.8.6/sun4-solaris
+SITELIBEXP = /usr/local/share/perl/5.10.1
+SITEARCHEXP = /usr/local/lib/perl/5.10.1
SO = so
-EXE_EXT =
-FULL_AR = /usr/ccs/bin/ar
-VENDORARCHEXP =
-VENDORLIBEXP =
+VENDORARCHEXP = /usr/lib/perl5
+VENDORLIBEXP = /usr/share/perl5
# --- MakeMaker constants section:
AR_STATIC_ARGS = cr
DIRFILESEP = /
+DFSEP = $(DIRFILESEP)
NAME = Template::Simple
NAME_SYM = Template_Simple
-VERSION = 0.02
+VERSION = 0.06
VERSION_MACRO = VERSION
-VERSION_SYM = 0_02
+VERSION_SYM = 0_06
DEFINE_VERSION = -D$(VERSION_MACRO)=\"$(VERSION)\"
-XS_VERSION = 0.02
+XS_VERSION = 0.06
XS_VERSION_MACRO = XS_VERSION
XS_DEFINE_VERSION = -D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"
INST_ARCHLIB = blib/arch
INST_LIB = blib/lib
INST_MAN1DIR = blib/man1
INST_MAN3DIR = blib/man3
-MAN1EXT = 1
-MAN3EXT = 3
+MAN1EXT = 1p
+MAN3EXT = 3pm
INSTALLDIRS = site
DESTDIR =
-PREFIX =
-PERLPREFIX = /usr/local
-SITEPREFIX = /usr/local
-VENDORPREFIX =
-INSTALLPRIVLIB = $(PERLPREFIX)/lib/perl5/5.8.6
+PREFIX = /usr
+PERLPREFIX = $(PREFIX)
+SITEPREFIX = $(PREFIX)/local
+VENDORPREFIX = $(PREFIX)
+INSTALLPRIVLIB = $(PERLPREFIX)/share/perl/5.10
DESTINSTALLPRIVLIB = $(DESTDIR)$(INSTALLPRIVLIB)
-INSTALLSITELIB = $(SITEPREFIX)/lib/perl5/site_perl/5.8.6
+INSTALLSITELIB = $(SITEPREFIX)/share/perl/5.10.1
DESTINSTALLSITELIB = $(DESTDIR)$(INSTALLSITELIB)
-INSTALLVENDORLIB =
+INSTALLVENDORLIB = $(VENDORPREFIX)/share/perl5
DESTINSTALLVENDORLIB = $(DESTDIR)$(INSTALLVENDORLIB)
-INSTALLARCHLIB = $(PERLPREFIX)/lib/perl5/5.8.6/sun4-solaris
+INSTALLARCHLIB = $(PERLPREFIX)/lib/perl/5.10
DESTINSTALLARCHLIB = $(DESTDIR)$(INSTALLARCHLIB)
-INSTALLSITEARCH = $(SITEPREFIX)/lib/perl5/site_perl/5.8.6/sun4-solaris
+INSTALLSITEARCH = $(SITEPREFIX)/lib/perl/5.10.1
DESTINSTALLSITEARCH = $(DESTDIR)$(INSTALLSITEARCH)
-INSTALLVENDORARCH =
+INSTALLVENDORARCH = $(VENDORPREFIX)/lib/perl5
DESTINSTALLVENDORARCH = $(DESTDIR)$(INSTALLVENDORARCH)
INSTALLBIN = $(PERLPREFIX)/bin
DESTINSTALLBIN = $(DESTDIR)$(INSTALLBIN)
INSTALLSITEBIN = $(SITEPREFIX)/bin
DESTINSTALLSITEBIN = $(DESTDIR)$(INSTALLSITEBIN)
-INSTALLVENDORBIN =
+INSTALLVENDORBIN = $(VENDORPREFIX)/bin
DESTINSTALLVENDORBIN = $(DESTDIR)$(INSTALLVENDORBIN)
INSTALLSCRIPT = $(PERLPREFIX)/bin
DESTINSTALLSCRIPT = $(DESTDIR)$(INSTALLSCRIPT)
-INSTALLMAN1DIR = $(PERLPREFIX)/man/man1
+INSTALLSITESCRIPT = $(SITEPREFIX)/bin
+DESTINSTALLSITESCRIPT = $(DESTDIR)$(INSTALLSITESCRIPT)
+INSTALLVENDORSCRIPT = $(VENDORPREFIX)/bin
+DESTINSTALLVENDORSCRIPT = $(DESTDIR)$(INSTALLVENDORSCRIPT)
+INSTALLMAN1DIR = $(PERLPREFIX)/share/man/man1
DESTINSTALLMAN1DIR = $(DESTDIR)$(INSTALLMAN1DIR)
INSTALLSITEMAN1DIR = $(SITEPREFIX)/man/man1
DESTINSTALLSITEMAN1DIR = $(DESTDIR)$(INSTALLSITEMAN1DIR)
-INSTALLVENDORMAN1DIR =
+INSTALLVENDORMAN1DIR = $(VENDORPREFIX)/share/man/man1
DESTINSTALLVENDORMAN1DIR = $(DESTDIR)$(INSTALLVENDORMAN1DIR)
-INSTALLMAN3DIR = $(PERLPREFIX)/man/man3
+INSTALLMAN3DIR = $(PERLPREFIX)/share/man/man3
DESTINSTALLMAN3DIR = $(DESTDIR)$(INSTALLMAN3DIR)
INSTALLSITEMAN3DIR = $(SITEPREFIX)/man/man3
DESTINSTALLSITEMAN3DIR = $(DESTDIR)$(INSTALLSITEMAN3DIR)
-INSTALLVENDORMAN3DIR =
+INSTALLVENDORMAN3DIR = $(VENDORPREFIX)/share/man/man3
DESTINSTALLVENDORMAN3DIR = $(DESTDIR)$(INSTALLVENDORMAN3DIR)
-PERL_LIB = /usr/local/lib/perl5/5.8.6
-PERL_ARCHLIB = /usr/local/lib/perl5/5.8.6/sun4-solaris
+PERL_LIB = /usr/share/perl/5.10
+PERL_ARCHLIB = /usr/lib/perl/5.10
LIBPERL_A = libperl.a
FIRST_MAKEFILE = Makefile
-MAKEFILE_OLD = $(FIRST_MAKEFILE).old
-MAKE_APERL_FILE = $(FIRST_MAKEFILE).aperl
+MAKEFILE_OLD = Makefile.old
+MAKE_APERL_FILE = Makefile.aperl
PERLMAINCC = $(CC)
-PERL_INC = /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE
-PERL = /usr/local/bin/perl
-FULLPERL = /usr/local/bin/perl
+PERL_INC = /usr/lib/perl/5.10/CORE
+PERL = /usr/bin/perl
+FULLPERL = /usr/bin/perl
ABSPERL = $(PERL)
PERLRUN = $(PERL)
FULLPERLRUN = $(FULLPERL)
FULLPERLRUNINST = $(FULLPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
ABSPERLRUNINST = $(ABSPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
PERL_CORE = 0
+PERM_DIR = 755
PERM_RW = 644
PERM_RWX = 755
-MAKEMAKER = /usr/local/lib/perl5/5.8.6/ExtUtils/MakeMaker.pm
-MM_VERSION = 6.17
-MM_REVISION = 1.133
+MAKEMAKER = /usr/share/perl/5.10/ExtUtils/MakeMaker.pm
+MM_VERSION = 6.55_02
+MM_REVISION = 65502
# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
# DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
+MAKE = make
FULLEXT = Template/Simple
BASEEXT = Simple
PARENT_NAME = Template
OBJECT =
LDFROM = $(OBJECT)
LINKTYPE = dynamic
+BOOTDEP =
# Handy lists of source code files:
XS_FILES =
MAN3PODS = lib/Template/Simple.pm
# Where is the Config information that we are using/depend on
-CONFIGDEP = $(PERL_ARCHLIB)$(DIRFILESEP)Config.pm $(PERL_INC)$(DIRFILESEP)config.h
+CONFIGDEP = $(PERL_ARCHLIB)$(DFSEP)Config.pm $(PERL_INC)$(DFSEP)config.h
# Where to build things
INST_LIBDIR = $(INST_LIB)/Template
PERL_ARCHIVE_AFTER =
-TO_INST_PM = bug.pl \
- lib/Template/Simple.pm \
- lib/Template/Simple.pm.expnad
+TO_INST_PM = lib/14094525_16586370.gwqa \
+ lib/Template/14094525_16586370.gwqa \
+ lib/Template/Simple.pm
-PM_TO_BLIB = lib/Template/Simple.pm.expnad \
- blib/lib/Template/Simple.pm.expnad \
- bug.pl \
- $(INST_LIB)/Template/bug.pl \
+PM_TO_BLIB = lib/Template/14094525_16586370.gwqa \
+ blib/lib/Template/14094525_16586370.gwqa \
lib/Template/Simple.pm \
- blib/lib/Template/Simple.pm
+ blib/lib/Template/Simple.pm \
+ lib/14094525_16586370.gwqa \
+ blib/lib/14094525_16586370.gwqa
# --- MakeMaker platform_constants section:
-MM_Unix_VERSION = 1.42
+MM_Unix_VERSION = 6.55_02
PERL_MALLOC_DEF = -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc
# --- MakeMaker tool_autosplit section:
# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
-AUTOSPLITFILE = $(PERLRUN) -e 'use AutoSplit; autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)'
+AUTOSPLITFILE = $(ABSPERLRUN) -e 'use AutoSplit; autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)' --
CHMOD = chmod
CP = cp
MV = mv
-NOOP = $(SHELL) -c true
+NOOP = $(TRUE)
NOECHO = @
RM_F = rm -f
RM_RF = rm -rf
TOUCH = touch
UMASK_NULL = umask 0
DEV_NULL = > /dev/null 2>&1
-MKPATH = $(PERLRUN) "-MExtUtils::Command" -e mkpath
-EQUALIZE_TIMESTAMP = $(PERLRUN) "-MExtUtils::Command" -e eqtime
+MKPATH = $(ABSPERLRUN) -MExtUtils::Command -e 'mkpath' --
+EQUALIZE_TIMESTAMP = $(ABSPERLRUN) -MExtUtils::Command -e 'eqtime' --
+FALSE = false
+TRUE = true
ECHO = echo
ECHO_N = echo -n
UNINST = 0
VERBINST = 0
-MOD_INSTALL = $(PERLRUN) -MExtUtils::Install -e 'install({@ARGV}, '\''$(VERBINST)'\'', 0, '\''$(UNINST)'\'');'
-DOC_INSTALL = $(PERLRUN) "-MExtUtils::Command::MM" -e perllocal_install
-UNINSTALL = $(PERLRUN) "-MExtUtils::Command::MM" -e uninstall
-WARN_IF_OLD_PACKLIST = $(PERLRUN) "-MExtUtils::Command::MM" -e warn_if_old_packlist
+MOD_INSTALL = $(ABSPERLRUN) -MExtUtils::Install -e 'install([ from_to => {@ARGV}, verbose => '\''$(VERBINST)'\'', uninstall_shadows => '\''$(UNINST)'\'', dir_mode => '\''$(PERM_DIR)'\'' ]);' --
+DOC_INSTALL = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'perllocal_install' --
+UNINSTALL = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'uninstall' --
+WARN_IF_OLD_PACKLIST = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'warn_if_old_packlist' --
+MACROSTART =
+MACROEND =
+USEMAKEFILE = -f
+FIXIN = $(ABSPERLRUN) -MExtUtils::MY -e 'MY->fixin(shift)' --
# --- MakeMaker makemakerdflt section:
-makemakerdflt: all
+makemakerdflt : all
$(NOECHO) $(NOOP)
DIST_CP = best
DIST_DEFAULT = tardist
DISTNAME = Template-Simple
-DISTVNAME = Template-Simple-0.02
+DISTVNAME = Template-Simple-0.06
# --- MakeMaker macro section:
# --- MakeMaker pasthru section:
-PASTHRU = LIB="$(LIB)"\
- LIBPERL_A="$(LIBPERL_A)"\
+PASTHRU = LIBPERL_A="$(LIBPERL_A)"\
LINKTYPE="$(LINKTYPE)"\
- PREFIX="$(PREFIX)"\
- OPTIMIZE="$(OPTIMIZE)"\
- PASTHRU_DEFINE="$(PASTHRU_DEFINE)"\
- PASTHRU_INC="$(PASTHRU_INC)"
+ PREFIX="$(PREFIX)"
# --- MakeMaker special_targets section:
-.SUFFIXES: .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
+.SUFFIXES : .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
-.PHONY: all config static dynamic test linkext manifest
+.PHONY: all config static dynamic test linkext manifest blibdirs clean realclean disttest distdir
subdirs :: $(MYEXTLIB)
$(NOECHO) $(NOOP)
-config :: $(FIRST_MAKEFILE) $(INST_LIBDIR)$(DIRFILESEP).exists
+config :: $(FIRST_MAKEFILE) blibdirs
$(NOECHO) $(NOOP)
-config :: $(INST_ARCHAUTODIR)$(DIRFILESEP).exists
- $(NOECHO) $(NOOP)
+help :
+ perldoc ExtUtils::MakeMaker
-config :: $(INST_AUTODIR)$(DIRFILESEP).exists
- $(NOECHO) $(NOOP)
-$(INST_AUTODIR)/.exists :: /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE/perl.h
- $(NOECHO) $(MKPATH) $(INST_AUTODIR)
- $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE/perl.h $(INST_AUTODIR)/.exists
+# --- MakeMaker blibdirs section:
+blibdirs : $(INST_LIBDIR)$(DFSEP).exists $(INST_ARCHLIB)$(DFSEP).exists $(INST_AUTODIR)$(DFSEP).exists $(INST_ARCHAUTODIR)$(DFSEP).exists $(INST_BIN)$(DFSEP).exists $(INST_SCRIPT)$(DFSEP).exists $(INST_MAN1DIR)$(DFSEP).exists $(INST_MAN3DIR)$(DFSEP).exists
+ $(NOECHO) $(NOOP)
- -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_AUTODIR)
+# Backwards compat with 6.18 through 6.25
+blibdirs.ts : blibdirs
+ $(NOECHO) $(NOOP)
-$(INST_LIBDIR)/.exists :: /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE/perl.h
+$(INST_LIBDIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_LIBDIR)
- $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE/perl.h $(INST_LIBDIR)/.exists
+ $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_LIBDIR)
+ $(NOECHO) $(TOUCH) $(INST_LIBDIR)$(DFSEP).exists
+
+$(INST_ARCHLIB)$(DFSEP).exists :: Makefile.PL
+ $(NOECHO) $(MKPATH) $(INST_ARCHLIB)
+ $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_ARCHLIB)
+ $(NOECHO) $(TOUCH) $(INST_ARCHLIB)$(DFSEP).exists
- -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_LIBDIR)
+$(INST_AUTODIR)$(DFSEP).exists :: Makefile.PL
+ $(NOECHO) $(MKPATH) $(INST_AUTODIR)
+ $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_AUTODIR)
+ $(NOECHO) $(TOUCH) $(INST_AUTODIR)$(DFSEP).exists
-$(INST_ARCHAUTODIR)/.exists :: /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE/perl.h
+$(INST_ARCHAUTODIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
- $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE/perl.h $(INST_ARCHAUTODIR)/.exists
+ $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_ARCHAUTODIR)
+ $(NOECHO) $(TOUCH) $(INST_ARCHAUTODIR)$(DFSEP).exists
- -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_ARCHAUTODIR)
+$(INST_BIN)$(DFSEP).exists :: Makefile.PL
+ $(NOECHO) $(MKPATH) $(INST_BIN)
+ $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_BIN)
+ $(NOECHO) $(TOUCH) $(INST_BIN)$(DFSEP).exists
-config :: $(INST_MAN3DIR)$(DIRFILESEP).exists
- $(NOECHO) $(NOOP)
+$(INST_SCRIPT)$(DFSEP).exists :: Makefile.PL
+ $(NOECHO) $(MKPATH) $(INST_SCRIPT)
+ $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_SCRIPT)
+ $(NOECHO) $(TOUCH) $(INST_SCRIPT)$(DFSEP).exists
+$(INST_MAN1DIR)$(DFSEP).exists :: Makefile.PL
+ $(NOECHO) $(MKPATH) $(INST_MAN1DIR)
+ $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_MAN1DIR)
+ $(NOECHO) $(TOUCH) $(INST_MAN1DIR)$(DFSEP).exists
-$(INST_MAN3DIR)/.exists :: /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE/perl.h
+$(INST_MAN3DIR)$(DFSEP).exists :: Makefile.PL
$(NOECHO) $(MKPATH) $(INST_MAN3DIR)
- $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/local/lib/perl5/5.8.6/sun4-solaris/CORE/perl.h $(INST_MAN3DIR)/.exists
-
- -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_MAN3DIR)
+ $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_MAN3DIR)
+ $(NOECHO) $(TOUCH) $(INST_MAN3DIR)$(DFSEP).exists
-help:
- perldoc ExtUtils::MakeMaker
# --- MakeMaker linkext section:
manifypods : pure_all \
- lib/Template/Simple.pm \
lib/Template/Simple.pm
- $(NOECHO) $(POD2MAN) --section=3 --perm_rw=$(PERM_RW)\
+ $(NOECHO) $(POD2MAN) --section=$(MAN3EXT) --perm_rw=$(PERM_RW) \
lib/Template/Simple.pm $(INST_MAN3DIR)/Template::Simple.$(MAN3EXT)
# the Makefile here so a later make realclean still has a makefile to use.
clean :: clean_subdirs
- -$(RM_RF) Template-Simple-* ./blib $(MAKE_APERL_FILE) $(INST_ARCHAUTODIR)/extralibs.all $(INST_ARCHAUTODIR)/extralibs.ld perlmain.c tmon.out mon.out so_locations pm_to_blib *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT) $(BOOTSTRAP) $(BASEEXT).bso $(BASEEXT).def lib$(BASEEXT).def $(BASEEXT).exp $(BASEEXT).x core core.*perl.*.? *perl.core core.[0-9] core.[0-9][0-9] core.[0-9][0-9][0-9] core.[0-9][0-9][0-9][0-9] core.[0-9][0-9][0-9][0-9][0-9]
- -$(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL)
+ - $(RM_F) \
+ *$(LIB_EXT) core \
+ core.[0-9] $(INST_ARCHAUTODIR)/extralibs.all \
+ core.[0-9][0-9] $(BASEEXT).bso \
+ pm_to_blib.ts core.[0-9][0-9][0-9][0-9] \
+ $(BASEEXT).x $(BOOTSTRAP) \
+ perl$(EXE_EXT) tmon.out \
+ *$(OBJ_EXT) pm_to_blib \
+ $(INST_ARCHAUTODIR)/extralibs.ld blibdirs.ts \
+ core.[0-9][0-9][0-9][0-9][0-9] *perl.core \
+ core.*perl.*.? $(MAKE_APERL_FILE) \
+ perl $(BASEEXT).def \
+ core.[0-9][0-9][0-9] mon.out \
+ lib$(BASEEXT).def perlmain.c \
+ perl.exe so_locations \
+ $(BASEEXT).exp
+ - $(RM_RF) \
+ Template-Simple-* blib
+ - $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL)
# --- MakeMaker realclean_subdirs section:
# --- MakeMaker realclean section:
-
-# Delete temporary files (via clean) and also delete installed files
+# Delete temporary files (via clean) and also delete dist files
realclean purge :: clean realclean_subdirs
- $(RM_RF) $(INST_AUTODIR) $(INST_ARCHAUTODIR)
- $(RM_RF) $(DISTVNAME)
- $(RM_F) $(INST_LIB)/Template/bug.pl blib/lib/Template/Simple.pm.expnad blib/lib/Template/Simple.pm $(MAKEFILE_OLD) $(FIRST_MAKEFILE)
+ - $(RM_F) \
+ $(MAKEFILE_OLD) $(FIRST_MAKEFILE)
+ - $(RM_RF) \
+ $(DISTVNAME)
# --- MakeMaker metafile section:
-metafile :
- $(NOECHO) $(ECHO) '# http://module-build.sourceforge.net/META-spec.html' > META.yml
- $(NOECHO) $(ECHO) '#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX#' >> META.yml
- $(NOECHO) $(ECHO) 'name: Template-Simple' >> META.yml
- $(NOECHO) $(ECHO) 'version: 0.02' >> META.yml
- $(NOECHO) $(ECHO) 'version_from: lib/Template/Simple.pm' >> META.yml
- $(NOECHO) $(ECHO) 'installdirs: site' >> META.yml
- $(NOECHO) $(ECHO) 'requires:' >> META.yml
- $(NOECHO) $(ECHO) ' File::Slurp: 0' >> META.yml
- $(NOECHO) $(ECHO) ' Test::More: 0' >> META.yml
- $(NOECHO) $(ECHO) '' >> META.yml
- $(NOECHO) $(ECHO) 'distribution_type: module' >> META.yml
- $(NOECHO) $(ECHO) 'generated_by: ExtUtils::MakeMaker version 6.17' >> META.yml
-
-
-# --- MakeMaker metafile_addtomanifest section:
-metafile_addtomanifest:
- $(NOECHO) $(PERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) } ' \
- -e ' or print "Could not add META.yml to MANIFEST: $${'\''@'\''}\n"'
+metafile : create_distdir
+ $(NOECHO) $(ECHO) Generating META.yml
+ $(NOECHO) $(ECHO) '--- #YAML:1.0' > META_new.yml
+ $(NOECHO) $(ECHO) 'name: Template-Simple' >> META_new.yml
+ $(NOECHO) $(ECHO) 'version: 0.06' >> META_new.yml
+ $(NOECHO) $(ECHO) 'abstract: A simple and very fast template module' >> META_new.yml
+ $(NOECHO) $(ECHO) 'author:' >> META_new.yml
+ $(NOECHO) $(ECHO) ' - Uri Guttman <uri@sysarch.com>' >> META_new.yml
+ $(NOECHO) $(ECHO) 'license: unknown' >> META_new.yml
+ $(NOECHO) $(ECHO) 'distribution_type: module' >> META_new.yml
+ $(NOECHO) $(ECHO) 'configure_requires:' >> META_new.yml
+ $(NOECHO) $(ECHO) ' ExtUtils::MakeMaker: 0' >> META_new.yml
+ $(NOECHO) $(ECHO) 'build_requires:' >> META_new.yml
+ $(NOECHO) $(ECHO) ' ExtUtils::MakeMaker: 0' >> META_new.yml
+ $(NOECHO) $(ECHO) 'requires:' >> META_new.yml
+ $(NOECHO) $(ECHO) ' File::Slurp: 0' >> META_new.yml
+ $(NOECHO) $(ECHO) ' Test::More: 0' >> META_new.yml
+ $(NOECHO) $(ECHO) 'no_index:' >> META_new.yml
+ $(NOECHO) $(ECHO) ' directory:' >> META_new.yml
+ $(NOECHO) $(ECHO) ' - t' >> META_new.yml
+ $(NOECHO) $(ECHO) ' - inc' >> META_new.yml
+ $(NOECHO) $(ECHO) 'generated_by: ExtUtils::MakeMaker version 6.55_02' >> META_new.yml
+ $(NOECHO) $(ECHO) 'meta-spec:' >> META_new.yml
+ $(NOECHO) $(ECHO) ' url: http://module-build.sourceforge.net/META-spec-v1.4.html' >> META_new.yml
+ $(NOECHO) $(ECHO) ' version: 1.4' >> META_new.yml
+ -$(NOECHO) $(MV) META_new.yml $(DISTVNAME)/META.yml
+
+
+# --- MakeMaker signature section:
+signature :
+ cpansign -s
# --- MakeMaker dist_basics section:
$(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest
veryclean : realclean
- $(RM_F) *~ *.orig */*~ */*.orig
+ $(RM_F) *~ */*~ *.orig */*.orig *.bak */*.bak *.old */*.old
# --- MakeMaker dist_core section:
dist : $(DIST_DEFAULT) $(FIRST_MAKEFILE)
- $(NOECHO) $(PERLRUN) -l -e 'print '\''Warning: Makefile possibly out of date with $(VERSION_FROM)'\''' \
- -e ' if -e '\''$(VERSION_FROM)'\'' and -M '\''$(VERSION_FROM)'\'' < -M '\''$(FIRST_MAKEFILE)'\'';'
+ $(NOECHO) $(ABSPERLRUN) -l -e 'print '\''Warning: Makefile possibly out of date with $(VERSION_FROM)'\''' \
+ -e ' if -e '\''$(VERSION_FROM)'\'' and -M '\''$(VERSION_FROM)'\'' < -M '\''$(FIRST_MAKEFILE)'\'';' --
tardist : $(DISTVNAME).tar$(SUFFIX)
$(NOECHO) $(NOOP)
# --- MakeMaker distdir section:
-distdir : metafile metafile_addtomanifest
+create_distdir :
$(RM_RF) $(DISTVNAME)
$(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \
-e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');"
+distdir : create_distdir distmeta
+ $(NOECHO) $(NOOP)
-# --- MakeMaker dist_test section:
+# --- MakeMaker dist_test section:
disttest : distdir
- cd $(DISTVNAME) && $(ABSPERLRUN) Makefile.PL
+ cd $(DISTVNAME) && $(ABSPERLRUN) Makefile.PL
cd $(DISTVNAME) && $(MAKE) $(PASTHRU)
cd $(DISTVNAME) && $(MAKE) test $(PASTHRU)
+
# --- MakeMaker dist_ci section:
ci :
-e "print(qq{Executing $(RCS_LABEL) ...\n}); system(qq{$(RCS_LABEL) @all});"
+# --- MakeMaker distmeta section:
+distmeta : create_distdir metafile
+ $(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) } ' \
+ -e ' or print "Could not add META.yml to MANIFEST: $${'\''@'\''}\n"' --
+
+
+
+# --- MakeMaker distsignature section:
+distsignature : create_distdir
+ $(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{SIGNATURE} => q{Public-key signature (added by MakeMaker)}}) } ' \
+ -e ' or print "Could not add SIGNATURE to MANIFEST: $${'\''@'\''}\n"' --
+ $(NOECHO) cd $(DISTVNAME) && $(TOUCH) SIGNATURE
+ cd $(DISTVNAME) && cpansign -s
+
+
+
# --- MakeMaker install section:
-install :: all pure_install doc_install
+install :: pure_install doc_install
+ $(NOECHO) $(NOOP)
-install_perl :: all pure_perl_install doc_perl_install
+install_perl :: pure_perl_install doc_perl_install
+ $(NOECHO) $(NOOP)
-install_site :: all pure_site_install doc_site_install
+install_site :: pure_site_install doc_site_install
+ $(NOECHO) $(NOOP)
-install_vendor :: all pure_vendor_install doc_vendor_install
+install_vendor :: pure_vendor_install doc_vendor_install
+ $(NOECHO) $(NOOP)
pure_install :: pure_$(INSTALLDIRS)_install
+ $(NOECHO) $(NOOP)
doc_install :: doc_$(INSTALLDIRS)_install
+ $(NOECHO) $(NOOP)
pure__install : pure_site_install
$(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
doc__install : doc_site_install
$(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
-pure_perl_install ::
- $(NOECHO) $(MOD_INSTALL) \
- read $(PERL_ARCHLIB)/auto/$(FULLEXT)/.packlist \
- write $(DESTINSTALLARCHLIB)/auto/$(FULLEXT)/.packlist \
+pure_perl_install :: all
+ $(NOECHO) umask 022; $(MOD_INSTALL) \
$(INST_LIB) $(DESTINSTALLPRIVLIB) \
$(INST_ARCHLIB) $(DESTINSTALLARCHLIB) \
$(INST_BIN) $(DESTINSTALLBIN) \
$(SITEARCHEXP)/auto/$(FULLEXT)
-pure_site_install ::
- $(NOECHO) $(MOD_INSTALL) \
+pure_site_install :: all
+ $(NOECHO) umask 02; $(MOD_INSTALL) \
read $(SITEARCHEXP)/auto/$(FULLEXT)/.packlist \
write $(DESTINSTALLSITEARCH)/auto/$(FULLEXT)/.packlist \
$(INST_LIB) $(DESTINSTALLSITELIB) \
$(INST_ARCHLIB) $(DESTINSTALLSITEARCH) \
$(INST_BIN) $(DESTINSTALLSITEBIN) \
- $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
+ $(INST_SCRIPT) $(DESTINSTALLSITESCRIPT) \
$(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) \
$(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR)
$(NOECHO) $(WARN_IF_OLD_PACKLIST) \
$(PERL_ARCHLIB)/auto/$(FULLEXT)
-pure_vendor_install ::
- $(NOECHO) $(MOD_INSTALL) \
- read $(VENDORARCHEXP)/auto/$(FULLEXT)/.packlist \
- write $(DESTINSTALLVENDORARCH)/auto/$(FULLEXT)/.packlist \
+pure_vendor_install :: all
+ $(NOECHO) umask 022; $(MOD_INSTALL) \
$(INST_LIB) $(DESTINSTALLVENDORLIB) \
$(INST_ARCHLIB) $(DESTINSTALLVENDORARCH) \
$(INST_BIN) $(DESTINSTALLVENDORBIN) \
- $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
+ $(INST_SCRIPT) $(DESTINSTALLVENDORSCRIPT) \
$(INST_MAN1DIR) $(DESTINSTALLVENDORMAN1DIR) \
$(INST_MAN3DIR) $(DESTINSTALLVENDORMAN3DIR)
-doc_perl_install ::
- $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
- -$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
- -$(NOECHO) $(DOC_INSTALL) \
- "Module" "$(NAME)" \
- "installed into" "$(INSTALLPRIVLIB)" \
- LINKTYPE "$(LINKTYPE)" \
- VERSION "$(VERSION)" \
- EXE_FILES "$(EXE_FILES)" \
- >> $(DESTINSTALLARCHLIB)/perllocal.pod
+doc_perl_install :: all
-doc_site_install ::
- $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
- -$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
- -$(NOECHO) $(DOC_INSTALL) \
+doc_site_install :: all
+ $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLSITEARCH)/perllocal.pod
+ -$(NOECHO) umask 02; $(MKPATH) $(DESTINSTALLSITEARCH)
+ -$(NOECHO) umask 02; $(DOC_INSTALL) \
"Module" "$(NAME)" \
"installed into" "$(INSTALLSITELIB)" \
LINKTYPE "$(LINKTYPE)" \
VERSION "$(VERSION)" \
EXE_FILES "$(EXE_FILES)" \
- >> $(DESTINSTALLARCHLIB)/perllocal.pod
+ >> $(DESTINSTALLSITEARCH)/perllocal.pod
-doc_vendor_install ::
- $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
- -$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
- -$(NOECHO) $(DOC_INSTALL) \
- "Module" "$(NAME)" \
- "installed into" "$(INSTALLVENDORLIB)" \
- LINKTYPE "$(LINKTYPE)" \
- VERSION "$(VERSION)" \
- EXE_FILES "$(EXE_FILES)" \
- >> $(DESTINSTALLARCHLIB)/perllocal.pod
+doc_vendor_install :: all
uninstall :: uninstall_from_$(INSTALLDIRS)dirs
+ $(NOECHO) $(NOOP)
uninstall_from_perldirs ::
- $(NOECHO) $(UNINSTALL) $(PERL_ARCHLIB)/auto/$(FULLEXT)/.packlist
uninstall_from_sitedirs ::
$(NOECHO) $(UNINSTALL) $(SITEARCHEXP)/auto/$(FULLEXT)/.packlist
uninstall_from_vendordirs ::
- $(NOECHO) $(UNINSTALL) $(VENDORARCHEXP)/auto/$(FULLEXT)/.packlist
+
# --- MakeMaker force section:
# Phony target to force checking subdirectories.
-FORCE:
+FORCE :
$(NOECHO) $(NOOP)
# --- MakeMaker makefile section:
-
# We take a very conservative approach here, but it's worth it.
# We move Makefile to Makefile.old here to avoid gnu make looping.
$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP)
$(NOECHO) $(ECHO) "Makefile out-of-date with respect to $?"
$(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..."
- $(NOECHO) $(RM_F) $(MAKEFILE_OLD)
- $(NOECHO) $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD)
- -$(MAKE) -f $(MAKEFILE_OLD) clean $(DEV_NULL) || $(NOOP)
+ -$(NOECHO) $(RM_F) $(MAKEFILE_OLD)
+ -$(NOECHO) $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD)
+ - $(MAKE) $(USEMAKEFILE) $(MAKEFILE_OLD) clean $(DEV_NULL)
$(PERLRUN) Makefile.PL
$(NOECHO) $(ECHO) "==> Your Makefile has been rebuilt. <=="
- $(NOECHO) $(ECHO) "==> Please rerun the make command. <=="
- false
+ $(NOECHO) $(ECHO) "==> Please rerun the $(MAKE) command. <=="
+ $(FALSE)
# --- MakeMaker makeaperl section ---
MAP_TARGET = perl
-FULLPERL = /usr/local/bin/perl
+FULLPERL = /usr/bin/perl
$(MAP_TARGET) :: static $(MAKE_APERL_FILE)
- $(MAKE) -f $(MAKE_APERL_FILE) $@
+ $(MAKE) $(USEMAKEFILE) $(MAKE_APERL_FILE) $@
-$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
+$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE) pm_to_blib
$(NOECHO) $(ECHO) Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
$(NOECHO) $(PERLRUNINST) \
Makefile.PL DIR= \
testdb :: testdb_$(LINKTYPE)
-test :: $(TEST_TYPE)
+test :: $(TEST_TYPE) subdirs-test
+
+subdirs-test ::
+ $(NOECHO) $(NOOP)
+
test_dynamic :: pure_all
PERL_DL_NONLAZY=1 $(FULLPERLRUN) "-MExtUtils::Command::MM" "-e" "test_harness($(TEST_VERBOSE), '$(INST_LIB)', '$(INST_ARCHLIB)')" $(TEST_FILES)
# --- MakeMaker ppd section:
# Creates a PPD (Perl Package Description) for a binary distribution.
-ppd:
- $(NOECHO) $(ECHO) '<SOFTPKG NAME="$(DISTNAME)" VERSION="0,02,0,0">' > $(DISTNAME).ppd
- $(NOECHO) $(ECHO) ' <TITLE>$(DISTNAME)</TITLE>' >> $(DISTNAME).ppd
- $(NOECHO) $(ECHO) ' <ABSTRACT>A simple and fast template module</ABSTRACT>' >> $(DISTNAME).ppd
+ppd :
+ $(NOECHO) $(ECHO) '<SOFTPKG NAME="$(DISTNAME)" VERSION="0.06">' > $(DISTNAME).ppd
+ $(NOECHO) $(ECHO) ' <ABSTRACT>A simple and very fast template module</ABSTRACT>' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <AUTHOR>Uri Guttman <uri@sysarch.com></AUTHOR>' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <IMPLEMENTATION>' >> $(DISTNAME).ppd
- $(NOECHO) $(ECHO) ' <DEPENDENCY NAME="File-Slurp" VERSION="0,0,0,0" />' >> $(DISTNAME).ppd
- $(NOECHO) $(ECHO) ' <DEPENDENCY NAME="Test-More" VERSION="0,0,0,0" />' >> $(DISTNAME).ppd
- $(NOECHO) $(ECHO) ' <OS NAME="$(OSNAME)" />' >> $(DISTNAME).ppd
- $(NOECHO) $(ECHO) ' <ARCHITECTURE NAME="sun4-solaris" />' >> $(DISTNAME).ppd
+ $(NOECHO) $(ECHO) ' <REQUIRE NAME="File::Slurp" />' >> $(DISTNAME).ppd
+ $(NOECHO) $(ECHO) ' <REQUIRE NAME="Test::More" />' >> $(DISTNAME).ppd
+ $(NOECHO) $(ECHO) ' <ARCHITECTURE NAME="i686-linux-gnu-thread-multi-5.10" />' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' <CODEBASE HREF="" />' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) ' </IMPLEMENTATION>' >> $(DISTNAME).ppd
$(NOECHO) $(ECHO) '</SOFTPKG>' >> $(DISTNAME).ppd
# --- MakeMaker pm_to_blib section:
-pm_to_blib: $(TO_INST_PM)
- $(NOECHO) $(PERLRUN) -MExtUtils::Install -e 'pm_to_blib({@ARGV}, '\''$(INST_LIB)/auto'\'', '\''$(PM_FILTER)'\'')'\
- lib/Template/Simple.pm.expnad blib/lib/Template/Simple.pm.expnad \
- bug.pl $(INST_LIB)/Template/bug.pl \
- lib/Template/Simple.pm blib/lib/Template/Simple.pm
- $(NOECHO) $(TOUCH) $@
+pm_to_blib : $(FIRST_MAKEFILE) $(TO_INST_PM)
+ $(NOECHO) $(ABSPERLRUN) -MExtUtils::Install -e 'pm_to_blib({@ARGV}, '\''$(INST_LIB)/auto'\'', q[$(PM_FILTER)], '\''$(PERM_DIR)'\'')' -- \
+ lib/Template/14094525_16586370.gwqa blib/lib/Template/14094525_16586370.gwqa \
+ lib/Template/Simple.pm blib/lib/Template/Simple.pm \
+ lib/14094525_16586370.gwqa blib/lib/14094525_16586370.gwqa
+ $(NOECHO) $(TOUCH) pm_to_blib
+
# --- MakeMaker selfdocument section:
+++ /dev/null
-#!/usr/local/bin/perl
-
-use strict ;
-use warnings ;
-
-use Template::Simple ;
-use Benchmark qw( timethese cmpthese ) ;
-use Data::Dumper ;
-
-my @dims = @ARGV ? (shift, shift) : ( 3, 5 ) ;
-
-my $data = generate_data( @dims ) ;
-#print Dumper $data ;
-
-my $tmpl = Template::Simple->new() ;
-my $comp = Template::Simple->new() ;
-
-my $template = <<TMPL ;
-Header
-Val 1: [%val_1%]
-[%START nest%]
- Level: [%level%]
-[%END nest%]
-[%START opt%]
- Optional Level: [%level%]
-[%END opt%]
-Val 2: [%val_2%]
-Footer
-TMPL
-
-$tmpl->add_templates( { bench => $template } ) ;
-my $rendered = $tmpl->render( 'bench', $data ) ;
-
-$comp->add_templates( { bench => $template } ) ;
-$comp->compile( 'bench' ) ;
-my $comp_rendered = $comp->render( 'bench', $data ) ;
-#print $comp->get_source( 'bench' ) ;
-
-my $ok = $$rendered eq $$comp_rendered ;
-print "OK comp [$ok]\n" ;
-
-my $appended = append( $data ) ;
-$ok = $$rendered eq $$appended ;
-print "OK append [$ok]\n" ;
-
-#print $$rendered ;
-#my $joined = joined( $data ) ;
-# print $$rendered ;
-# print "----\n" ;
-# print $$joined ;
-# print $$comp_rendered ;
-
-cmpthese( shift || -2,
- {
- render => sub { my $x = $tmpl->render( 'bench', $data ) },
-# joined => sub { my $x = joined( $data ) },
-# concat => sub { my $x = concat( $data ) },
- append => sub { my $x = append( $data ) },
-# compiler => sub { my $x = $comp->compile( 'bench' ) },
- compiled => sub { my $x = $comp->render( 'bench', $data ) },
- }
-) ;
-
-exit ;
-
-no warnings ;
-
-sub joined {
-
-no warnings ;
-
- my( $data ) = @_ ;
-
- my $out = do {
- my $out ;
-
- my @data = $data ;
- while( defined( my $data = shift @data ) ) {
-
- if ( ref $data eq 'ARRAY' ) {
- push @data, @{$data} ;
- next ;
- }
-
- $out .= ref $data ne 'HASH' ? $data :
-
- join( '',
- "Header\nVal 1: "
- ,
- $data->{val_1}
- ,
- "\n"
- ,
- do {
- my $data = $data->{nest} ;
- my $out ;
-
- my @data = $data ;
- while( defined( my $data = shift @data ) ) {
-
- if ( ref $data eq 'ARRAY' ) {
- push @data, @{$data} ;
- next ;
- }
-
- $out .= ref $data ne 'HASH' ? $data :
- join( '',
- "\n\tLevel: "
- ,
- $data->{level}
- ,
- "\n" ) ;
- }
- $out ;
- }
- ,
- "\n"
- ,
- do {
- my $data = $data->{opt} ;
- my $out ;
-
- my @data = $data ;
- while( defined( my $data = shift @data ) ) {
-
- if ( ref $data eq 'ARRAY' ) {
- push @data, @{$data} ;
- next ;
- }
-
- $out .= ref $data ne 'HASH' ? $data :
- join( '',
- "\n\tOptional Level: "
- ,
- $data->{level}
- ,
- "\n" ) ;
- }
- $out ;
- }
- ,
- "\nVal 2: "
- ,
- $data->{val_2}
- ,
- "\nFooter\n" ) ;
- }
- $out ;
- } ;
-
- return \$out ;
-}
-
-
-sub concat {
-
-no warnings ;
-
- my( $data ) = @_ ;
-
- my $out = do {
- my $out ;
-
- my @data = $data ;
- while( defined( my $data = shift @data ) ) {
-
- if ( ref $data eq 'ARRAY' ) {
- push @data, @{$data} ;
- next ;
- }
-
- $out .= ref $data ne 'HASH' ? $data :
- "Header\nVal 1: "
- .
- $data->{val_1}
- .
- "\n"
- .
- do {
- my $data = $data->{nest} ;
- my $out ;
-
- my @data = $data ;
- while( defined( my $data = shift @data ) ) {
-
- if ( ref $data eq 'ARRAY' ) {
- push @data, @{$data} ;
- next ;
- }
-
- $out .= ref $data ne 'HASH' ? $data :
- "\n\tLevel: "
- .
- $data->{level}
- .
- "\n" ;
- }
- $out ;
- }
- .
- "\n"
- .
- do {
- my $data = $data->{opt} ;
- my $out ;
-
- my @data = $data ;
- while( defined( my $data = shift @data ) ) {
-
- if ( ref $data eq 'ARRAY' ) {
- push @data, @{$data} ;
- next ;
- }
-
- $out .= ref $data ne 'HASH' ? $data :
- "\n\tOptional Level: "
- .
- $data->{level}
- .
- "\n" ;
- }
- $out ;
- }
- .
- "\nVal 2: "
- .
- $data->{val_2}
- .
- "\nFooter\n" ;
- }
-
- $out ;
- } ;
-
- return \$out ;
-}
-
-sub append {
- my( $data ) = @_ ;
-
- my $out ;
-
- my @data = $data ;
- while( defined( my $data = shift @data ) ) {
-
- if ( ref $data eq 'ARRAY' ) {
- push @data, @{$data} ;
- next ;
- }
-
-
- $out .= ref $data ne 'HASH' ? $data :
- "Header\nVal 1: "
- .
- $data->{val_1}
- .
- "\n" ;
-
- my @data = $data->{nest} ;
- while( defined( my $data = shift @data ) ) {
-
- if ( ref $data eq 'ARRAY' ) {
- push @data, @{$data} ;
- next ;
- }
-
-
- $out .= ref $data ne 'HASH' ? $data :
- "\n\tLevel: "
- .
- $data->{level}
- .
- "\n" ;
-
- }
-
- $out .= ref $data ne 'HASH' ? $data :
- "\n" ;
-
- my @data = $data->{opt} ;
- while( defined( my $data = shift @data ) ) {
-
- if ( ref $data eq 'ARRAY' ) {
- push @data, @{$data} ;
- next ;
- }
-
-
- $out .= ref $data ne 'HASH' ? $data :
- "\n\tOptional Level: "
- .
- $data->{level}
- .
- "\n" ;
-
- }
-
- $out .= ref $data ne 'HASH' ? $data :
- "\nVal 2: "
- .
- $data->{val_2}
- .
- "\nFooter\n" ;
-
- }
-
- return \$out ;
-}
-
-sub generate_data {
-
- my( $outer_size, $inner_size ) = @_ ;
-
- my @outer_data ;
-
- for my $outer ( 1 .. $outer_size ) {
-
- my @inner_data ;
-
- for my $inner ( 1 .. $inner_size ) {
-
- push @inner_data, {
-
- val_1 => ($outer x 2),
- val_2 => ($inner x 3),
- nest => {
- level => "$outer-$inner",
- },
- $inner % 2 ? () : (
-
- opt => {
- level => "$outer-$inner",
- },
- ),
- } ;
- }
-
- push @outer_data, [@inner_data] ;
- }
-
- return \@outer_data ;
-}
+++ /dev/null
-#!/usr/bin/env perl
-
-use strict;
-use warnings;
-
-use Template::Teeny;
-use Template::Simple;
-use Template::Teeny::Stash;
-use Template;
-
-my $iter = shift || -2 ;
-
-use Benchmark qw(:hireswallclock cmpthese);
-basic: {
-
- my $ts = Template::Simple->new() ;
- $ts->add_templates( { bench => 'hehe [% name %]' } ) ;
-
- my $tsc = Template::Simple->new() ;
- $tsc->add_templates( { bench => 'hehe [% name %]' } ) ;
- $tsc->compile( 'bench' ) ;
-
- my $tt = Template::Teeny->new({ include_path => ['t/tpl'] });
- my $stash = Template::Teeny::Stash->new({ name => 'bob' });
-
- my $t = Template->new({ INCLUDE_PATH => 't/tpl', COMPILE_EXT => '.tc' });
- my $out;
- open my $fh, '>/dev/null';
-
- $tt->process('bench.tpl', $stash, $fh);
- $t->process('bench.tpl', { name => 'bob' }, $fh);
-
- sub teeny {
- $tt->process('bench.tpl', $stash, $fh);
- }
- sub plain {
- $t->process('bench.tpl', { name => 'bob' }, $fh);
- }
-
- sub simple {
- $ts->render('bench', { name => 'bob' } );
- }
-
- sub ts_compiled {
- $tsc->render('bench', { name => 'bob' } );
- }
-
- print "Very simple interpolation:\n";
- cmpthese( $iter, { teeny => \&teeny, template_toolkit => \&plain,
- simple => \&simple, ts_compiled => \&ts_compiled }) ;
-}
-
-some_looping_etc: {
-
-my $tmpl = <<TMPL ;
-<html>
- <head><title>[% title %]</title></head>
- <body>
- <ul>
- [% SECTION post %]
- <li>
- <h3>[% title %]</h3>
- <span>[% date %]</span>
- </li>
- [% END %]
- </ul>
- </body>
-</html>
-TMPL
-
- my $ts = Template::Simple->new() ;
- $ts->add_templates( { bench2 => $tmpl } ) ;
-
- my $tsc = Template::Simple->new() ;
- $tsc->add_templates( { bench2 => $tmpl } ) ;
- $tsc->compile( 'bench2' ) ;
-
- my $tt = Template::Teeny->new({ include_path => ['t/tpl'] });
- my $stash = Template::Teeny::Stash->new({ title => q{Bobs Blog} });
-
- my $post1 = Template::Teeny::Stash->new({ date => 'Today', title => 'hehe' });
- my $post2 = Template::Teeny::Stash->new({ date => '3 Days ago', title => 'Something new' });
- $stash->add_section('post', $post1);
- $stash->add_section('post', $post2);
-
- my $t = Template->new({ INCLUDE_PATH => 't/tpl', COMPILE_EXT => '.tc' });
- my $out;
- open my $fh, '>/dev/null';
-
- my $tt_vars = {
- title => 'Bobs Blog',
- posts => [
- { title => 'hehe', date => 'Today' },
- { date => '3 Days ago', title => 'Something new' },
- ],
- };
- teeny2();
- plain2();
-
- sub teeny2 {
- $tt->process('bench2-teeny.tpl', $stash, $fh);
- }
- sub plain2 {
- $t->process('bench2-tt.tpl', $tt_vars, $fh);
- }
-
- sub simple2 {
- $ts->render('bench2', $tt_vars );
- }
-
- sub ts_compiled2 {
- $tsc->render('bench2', $tt_vars );
- }
-
- print "\nLoop and interpolation:\n";
- cmpthese( $iter, { teeny => \&teeny2, template_toolkit => \&plain2,
- simple => \&simple2, ts_compiled => \&ts_compiled2 }) ;
-
-}
-
-
-
-
+++ /dev/null
-#!/usr/local/bin/perl
-
-use strict ;
-use warnings ;
-
-use Template::Simple ;
-
-my $tmpl = Template::Simple->new() ;
-
-$tmpl->add_templates( { ddd => <<DDD } ) ;
-text1
-[%START nest%]
- BAR is [%bar%]
-[%END nest%]
-DDD
-
-my %data = (
- ddd => [
- {
- nest => {
- bar => 'xxx',
- },
- },
- {
- nest => {
- bar => 'yyy',
- },
- },
- {
- nest => {
- bar => 'zzz',
- },
- },
- ],
-) ;
-
-$tmpl->compile('foo') ;
-#$tmpl->compile('fooz') ;
-
-#my $rendered = $tmpl->render('foo', { foo => 2, bar => 'xxx' } ) ;
-
-#print "REND [$$rendered]\n" ;
-
-$tmpl->compile('ddd') ;
-my $rendered = $tmpl->render( 'ddd', $data{ddd} ) ;
-
-print "REND [$$rendered]\n" ;
-
-print $tmpl->get_source( 'ddd' ) ;
-
-exit ;
simple => 'hehe [% name %]',
toolkit => 'hehe [% name %]',
teeny => 'hehe [% name %]',
+ tiny => 'hehe [% name %]',
},
{
name => 'nested',
<html>
<head><title>[% title %]</title></head>
<body>
- <ul>
- [% FOREACH post = posts %]
+ <ul>[% FOREACH post = posts %]
<li>
<h3>[% post.title %]</h3>
<span>[% post.date %]</span>
- </li>
- [% END %]
+ </li>[% END %]
</ul>
</body>
</html>
TOOLKIT
+ tiny => <<TINY,
+<html>
+ <head><title>[% title %]</title></head>
+ <body>
+ <ul>[% FOREACH post IN posts %]
+ <li>
+ <h3>[% post.title %]</h3>
+ <span>[% post.date %]</span>
+ </li>[% END %]
+ </ul>
+ </body>
+</html>
+TINY
+
teeny => <<TEENY,
<html>
<head><title>[% title %]</title></head>
my $name = $info->{name} ;
my $results ;
- open my $fh, '>', \$results or
- die "can't open string for output" ;
+# open my $fh, '>', \$results or
+# open my $fh, '>', '/dev/null' or
+# die "can't open string for output" ;
mkdir 'tpl' ;
write_file( "tpl/$name.tpl", $template ) ;
#print Dumper $stash ;
$bench->{render} =
- sub {
- $obj->process("$name.tpl", $stash, $fh );
- $bench->{result} = $results ;
- }
+ sub { $obj->process("$name.tpl", $stash ); }
},
verify => sub {
$bench->{result} = $bench->{render}->() ;
},
},
+ {
+ name => 'toolkit',
+ template_key => 'toolkit',
+ load => sub { return eval { require Template } ; },
+ setup => sub {
+ my( $bench, $info ) = @_ ;
+
+ my $template = $info->{$bench->{template_key}} ;
+ my $data = $info->{data} ;
+
+ my $obj = Template->new() ;
+
+ $bench->{render} = sub {
+ my $output ;
+ $obj->process(\$template, $data, \$output );
+ return $output ;
+ },
+
+ },
+ verify => sub {
+ my( $bench, $info ) = @_ ;
+ $bench->{result} = $bench->{render}->() ;
+ },
+ },
+ {
+ name => 'tiny',
+ template_key => 'tiny',
+ load => sub { return eval { require Template::Tiny } ; },
+ setup => sub {
+ my( $bench, $info ) = @_ ;
+
+ my $template = $info->{$bench->{template_key}} ;
+ my $data = $info->{data} ;
+
+ my $obj = Template::Tiny->new() ;
+
+ $bench->{render} = sub {
+ my $output ;
+ $obj->process( \$template, $data, \$output );
+ return $output ;
+ },
+ },
+ verify => sub {
+ my( $bench, $info ) = @_ ;
+ $bench->{result} = $bench->{render}->() ;
+ },
+ },
] ;
run_benchmarks() ;
=head1 DESCRIPTION
- --rid | -r <rids> Select the restaurant ID to be fetched.
- Can be a comma separated list of rids.
- 'ALL' will select all the valid
- ID's from a source. This is
- required (unless <source> is set
- to 'ALL'.
-
- [--file | -f] Load the XML from files. The file is
+ --verify | -v Verify rendered output is correct
+ --iterations | -i <iter> Iteration count passed to cmpthese
+ Default is -2 (seconds of cpu time)
+ --templaters | -t <templaters> Comma separated list of templaters
+ to run in this benchmark
[--help | ?] Print this help text
--- /dev/null
+#!/usr/bin/perl
+
+use strict ;
+use warnings ;
+use lib '../lib' ;
+
+use File::Slurp ;
+
+=head1 Template::Simple Cookbook
+
+This cookbook contains examples of idioms and best practices when
+using the Template::Simple module. It will illustrate all the the
+features of this module and show various combinations of code to get
+the job done. Send any requests for more examples to
+E<lt>template@stemsystems.comE<gt>. Read the source code to see the
+working examples or you can run this script to see all the
+output. Each example has its title printed and rendered templates are
+printed with a KEY: prefix and delimited with [].
+
+By combining these techniques you can create and built complex
+template applications that can do almost any task other templaters can
+do. You will be able to share more code logic and templates as they
+are totally isolated and independent from each other.
+
+=head2 Use Scalar References
+
+When passing text either as templates or in data tree elements, it is
+generally faster to use scalar references than plain scalars. T::S can
+accept text either way so you choose the style you like best. Most of
+the examples here will use scalar references. Note that passing a
+scalar reference to the new() constructor as the template will force
+that to be a template and not a template name so no lookup will
+occur. T::S always treats all text values as read only and never
+modifies incoming data.
+
+=cut
+
+use Template::Simple ;
+my $ts = Template::Simple->new() ;
+my $template ;
+
+
+=head1 Token Expansion
+
+The simplest use of templates is replacing single tokens with
+values. This is vry similar to interpolation of scalar variables in a
+double quoted string. The difference is that the template text can
+come from outside the program whereas double quoted strings must be in
+the code (eval STRING doesn't count).
+
+To replace tokens all you need is a template with token markups
+(e.g. C<[% foo %]>) and a hash with those tokens as keys and the
+values with which to replace them. Remember the top level template is
+treated as an unnamed chunk so you can pass a hash reference to
+render.
+
+=cut
+
+print "\n******************\nToken Expansion\n******************\n\n" ;
+
+$template = <<TMPL ;
+This [% token %] will be replaced as will [%foo%] and [% bar %]
+TMPL
+
+my $token_expansion = $ts->render( $template,
+ {
+ token => 'markup',
+ foo => 'this',
+ bar => 'so will this',
+ }
+) ;
+
+print "TOKEN EXPANSION: [${$token_expansion}]\n" ;
+
+=head1 Token Deletion
+
+Sometimes you want to delete a token and not replace it with text. All
+you need to do is use the null string for its data. Altenatively if
+you are rendering a chunk with a hash (see below for more examples)
+you can just not have any data for the token and it will also be
+deleted. Both styles are shown in this example.
+
+=cut
+
+print "\n******************\nToken Deletion\n******************\n\n" ;
+
+$template = <<TMPL ;
+This [% token %]will be deleted as will [%foo%]
+TMPL
+
+my $token_deletion = $ts->render( $template,
+ {
+ token => '',
+ }
+) ;
+
+print "TOKEN DELETION: [${$token_deletion}]\n" ;
+
+
+=head1 Named Templates
+
+You can pass a template directly to the C<render> method or pass in
+its name. A named template will be searched for in the object cache
+and then in the C<template_paths> directories. Templates can be loaded
+into the cache with in the new() call or added later with the
+C<add_templates> method.
+
+=cut
+
+print "\n******************\nNamed Templates\n******************\n\n" ;
+
+$ts = Template::Simple->new(
+ templates => {
+ foo => <<FOO,
+We have some foo text here with [% data %]
+FOO
+ }
+) ;
+
+my $foo_template = $ts->render( 'foo', { data => 'lots of foo' } ) ;
+
+$ts->add_templates( { bar => <<BAR } ) ;
+We have some bar text here with [% data %]
+BAR
+
+my $bar_template = $ts->render( 'bar', { data => 'some bar' } ) ;
+
+print "FOO TEMPLATE: [${$foo_template}]\n" ;
+print "BAR TEMPLATE: [${$bar_template}]\n" ;
+
+=head1 Include Expansion
+
+You can build up templates by including other templates. This allows a
+template to be reused and shared by other templates. What makes this
+even better, is that by passing different data to the included
+templates in different renderings, you can get different results. If
+the logic was embedded in the template you can't change the rendering
+as easily. You include a template by using the C<[%include name%]>
+markup. The name is used to locate a template by name and its text
+replaces the markup. This example shows a single include in the top
+level template.
+
+=cut
+
+print "\n******************\nInclude Expansion\n******************\n\n" ;
+
+$ts = Template::Simple->new(
+ templates => {
+ top => <<TOP,
+This top level template includes this <<[% include other %]>>text
+TOP
+ other => <<OTHER,
+This is the included text
+OTHER
+} ) ;
+
+my $include_template = $ts->render( 'top', {} ) ;
+
+print "INCLUDE TEMPLATE: [${$include_template}]\n" ;
+
+=head1 Template Paths
+
+You can search for templates in files with the C<search_dirs> option
+to the constructor. If a named template is not found in the object
+cache it will be searched for in the directories listed in the
+C<search_dirs> option. If it is found there, it will be loaded into
+the object cache so future uses of it by name will be faster. The
+default value of C<search_dirs> option is C<templates>. Templates must
+have a suffix of C<.tmpl>. This example makes a directory called
+'templates' and a template file named C<foo.tmpl>. The second example
+makes a directory called C<cookbook> and puts a template in there and
+sets. Note that the option value must be an array reference.
+
+=cut
+
+print "\n******************\nSearch Dirs\n******************\n\n" ;
+
+my $tmpl_dir = 'templates' ;
+mkdir $tmpl_dir ;
+write_file( "$tmpl_dir/foo.tmpl", <<FOO ) ;
+This template was loaded from the dir [%dir%]
+FOO
+
+$ts = Template::Simple->new() ;
+my $foo_file_template = $ts->render( 'foo', { dir => 'templates' } ) ;
+
+print "FOO FILE TEMPLATE: [${$foo_file_template}]\n" ;
+
+unlink "$tmpl_dir/foo.tmpl" ;
+rmdir $tmpl_dir ;
+
+######
+
+my $cook_dir = 'cookbook' ;
+mkdir $cook_dir ;
+write_file( "$cook_dir/bar.tmpl", <<BAR ) ;
+This template was loaded from the $cook_dir [%dir%]
+BAR
+
+$ts = Template::Simple->new( search_dirs => [$cook_dir] ) ;
+my $bar_file_template = $ts->render( 'bar', { dir => 'directory' } ) ;
+
+print "BAR FILE TEMPLATE: [${$bar_file_template}]\n" ;
+
+unlink "$cook_dir/bar.tmpl" ;
+rmdir $cook_dir ;
+
+=head1 Named Chunk Expansion
+
+The core markup in T::S is called a chunk. It is delimited by paired
+C<start> and C<end> markups and the text in between them is the
+chunk. Any chunk can have multiple chunks inside it and they are named
+for the name in the C<start> and C<end> markups. That name is used to
+match the chunk with the data passed to render. This example uses the
+top level template (which is always an unnamed chunk) which contains a
+nested chunk which has a name. The data passed in is a hash reference
+which has a key with the chunk name and its value is another hash
+reference. So the nested chunk match up to the nested hashes.
+
+=cut
+
+print "\n******************\nNested Chunk Expansion\n******************\n\n" ;
+
+$ts = Template::Simple->new(
+ templates => {
+ top => <<TOP,
+This top level template includes this <<[% include nested %]>> chunk
+TOP
+ nested => <<NESTED,
+[%START nested %]This included template just has a [% token %] and another [% one %][%END nested %]
+NESTED
+ }
+) ;
+
+my $nested_template = $ts->render( 'top',
+ {
+ nested => {
+ token => 'nested value',
+ one => 'value from the data',
+ }
+} ) ;
+
+print "NESTED TEMPLATE: [${$nested_template}]\n" ;
+
+=head2 Boolean Chunk
+
+The simplest template decision is when you want to show some text or
+nothing. This is done with an empty hash reference or a null string
+value in the data tree. The empty hash reference will cause the text
+to be kept as is with all markups removed (replaced by the null
+string). A null string (or a reference to one) will cause the text
+chunk to be deleted.
+
+=cut
+
+print "\n******************\nBoolean Text\n******************\n\n" ;
+
+$template = \<<TMPL ;
+[% START boolean %]This is text to be left or deleted[% END boolean %]
+TMPL
+
+my $boolean_kept = $ts->render( $template, { boolean => {} } ) ;
+my $deleted = $ts->render( $template, { default => \'' } ) ;
+
+print "KEPT: [${$boolean_kept}]\n" ;
+print "DELETED: [${$deleted}]\n" ;
+
+=head2 Default vs. Overwrite Text
+
+The next step up from boolean text is overwriting a default text with
+another when rendering. This is done with an empty hash reference or a
+scalar value for the chunk in the data tree. The empty hash reference
+will cause the default text to be kept as is with all markups removed
+(replaced by the null string). A scalar value (or a scalar reference)
+will cause the complete text chunk to be replaced by that value.
+
+=cut
+
+print "\n******************\nDefault vs. Overwrite Text\n******************\n\n" ;
+
+$template = \<<TMPL ;
+[% START default %]This is text to be left or replaced[% END default %]
+TMPL
+
+my $default_kept = $ts->render( $template, { default => {} } ) ;
+my $overwrite = $ts->render( $template, { default => \<<OVER } ) ;
+This text will overwrite the default text
+OVER
+
+print "DEFAULT: [${$default_kept}]\n" ;
+print "OVERWRITE: [${$overwrite}]\n" ;
+
+=head2 Conditional Text
+
+Instead of having the overwrite text in the data tree, it is useful to
+have it in the template itself. This is a conditional where one text
+or the other is rendered. This is done by wrapping each text in its
+own chunk with unique names. The data tree can show either one by
+passing an empty hash reference for that data and a null string for
+the other one. Also you can just not have a value for the text not to
+be rendered and that will also delete it. Both styles are shown here.
+
+=cut
+
+print "\n******************\nConditional Text\n******************\n\n" ;
+
+$template = \<<TMPL ;
+[% START yes_text %]This text shown when yes[% END yes_text %]
+[% START no_text %]This text shown when no[% END no_text %]
+TMPL
+
+my $yes_shown = $ts->render( $template, { yes_text => {} } ) ;
+my $no_shown = $ts->render( $template, {
+ yes_text => '',
+ no_text => {}
+} ) ;
+
+print "YES: [${$yes_shown}]\n" ;
+print "NO: [${$no_shown}]\n" ;
+
+=head1 List Chunk Expansion
+
+T::S has no list markup because of the unique way it handles data
+during rendering. When an array reference is matched to a chunk, the
+array is iterated and the chunk is then rendered with each element of
+the array. This list of rendered texts is concatenated and replaces
+the original chunk in the template. The data and the logic that
+creates the data controls when a template chunk is repeated. This
+example shows the top level (unnamed) template being rendered with an
+array of hashes. Each hash renders the chunk one time. Note that the
+different results you get based on the different hashes in the array.
+
+=cut
+
+print "\n******************\nList Chunk Expansion\n******************\n\n" ;
+
+$ts = Template::Simple->new(
+ templates => {
+ top_array => <<TOP_ARRAY,
+
+This is the [%count%] chunk.
+[%start maybe%]This line may be shown[%end maybe%]
+This is the end of the chunk line
+TOP_ARRAY
+} ) ;
+
+my $top_array = $ts->render( 'top_array', [
+ {
+ count => 'first',
+ maybe => {},
+ },
+ {
+ count => 'second',
+ },
+ {
+ count => 'third',
+ maybe => {},
+ },
+] ) ;
+
+print "TOP_ARRAY: [${$top_array}]\n" ;
+
+
+=head1 Separated List Expansion
+
+A majorly used variation of data lists are list with a separator but
+not one after the last element. This can be done easily with T::S and
+here are two techniques. The first one uses a token for the separator
+in the chunk and passes in a hash with the delimiter string set in all
+but the last element. This requires the code logic to know and set the
+delimiter. The other solution lets the template set the delimiter by
+enclosing it in a chunk of its own and passing an empty hash ref for
+the places to keep it and nothing for the last element. Both examples
+use the same sub to do this work for you and all you need to do is
+pass it the token for the main value and the seperator key and
+optionally its value. You can easily make a variation that puts the
+separator before the element and delete it from the first element. If
+your chunk has more tokens or nested chunks, this sub could be
+generalized to modify a list of hashes instead of generating one.
+
+=cut
+
+print "\n******************\nSeparated List Expansion\n******************\n\n" ;
+
+
+sub make_separated_data {
+ my( $token, $data, $delim_key, $delim ) = @_ ;
+
+# make the delim set from the template (in a chunk) if not passed in
+# an empty hash ref keeps the chunk text as is.
+
+ $delim ||= {} ;
+
+ my @list = map +{ $token => $_, $delim_key => $delim, }, @{$data} ;
+
+# remove the separator from the last element
+
+ delete $list[-1]{$delim_key} ;
+
+ return \@list ;
+}
+
+my @data = qw( one two three four ) ;
+
+$ts = Template::Simple->new(
+ templates => {
+ sep_tmpl => <<SEP_TMPL,
+Number [%count%][%sep%]
+SEP_TMPL
+ sep_data => <<SEP_DATA,
+Number [%count%][%start sep%],[%end sep%]
+SEP_DATA
+} ) ;
+
+my $sep_tmpl = $ts->render( 'sep_tmpl',
+ make_separated_data( 'count', \@data, 'sep', '--' ) ) ;
+
+my $sep_data = $ts->render( 'sep_data',
+ make_separated_data( 'count', \@data, 'sep', {} ) ) ;
+
+print "SEP_DATA: [${$sep_data}]\n" ;
+print "SEP_DATA: [${$sep_data}]\n" ;
+
+exit ;
use Test::More ;
use Template::Simple ;
+use Data::Dumper ;
+
sub template_tester {
my( $tests ) = @_ ;
# plan for one expected ok() call per test
- plan( tests => scalar @{$tests} ) ;
+ plan( tests => scalar @{$tests} * 2 ) ;
my( $obj, $tmpl ) ;
# loop over all the tests
- foreach my $test ( @{$tests} ) {
+ foreach my $compiled ( 0, 1 ) {
- if ( $test->{skip} ) {
- ok( 1, "SKIPPING $test->{name}" ) ;
- next ;
- }
+ foreach my $test ( @{$tests} ) {
- unless( $obj && $test->{keep_obj} ) {
+ $test->{name} .= ' - compiled' if $compiled ;
+
+ if ( $test->{skip} ) {
+ ok( 1, "SKIPPING $test->{name}" ) ;
+ next ;
+ }
+
+ if ( $test->{compile_skip} && $compiled ) {
+ ok( 1, "SKIPPING $test->{name}" ) ;
+ next ;
+ }
+
+ unless( $obj && $test->{keep_obj} ) {
# if there is no kept object, we will constuct one
- $obj = eval {
- Template::Simple->new(
- %{ $test->{opts} || {} }
- ) ;
- } ;
+ $obj = eval {
+ Template::Simple->new(
+ %{ $test->{opts} || {} }
+ ) ;
+ } ;
print $@ if $@ ;
# check for expected errors
# no errors in new() to catch (yet)
- }
+ }
- $test->{obj} = $obj ;
+ $test->{obj} = $obj ;
# see if we use the test's template or keep the previous one
- $tmpl = $test->{template} if defined $test->{template} ;
+ $tmpl = $test->{template} if defined $test->{template} ;
+#print "TMPL [$tmpl]\n" ;
# run any setup sub before this test. this can is used to modify the
# object for this test (e.g. delete templates from the cache).
- if( my $pretest = $test->{pretest} ) {
+ if( my $pretest = $test->{pretest} ) {
+ $pretest->($test) ;
+ }
- $pretest->($test) ;
- }
+#print Dumper $obj if $test->{dump} ;
-# get any existing template object
+ if ( $compiled ) {
-# render the template and catch any fatal errors
+ my $tmpl_name = 'test' ;
+ $obj->add_templates( {$tmpl_name => $tmpl} ) ;
+ eval { $obj->compile( $tmpl_name ) } ;
+#print "ERR $@\n" ;
+
+ next if check_error( $test ) ;
+ }
- my $rendered = eval {
- $obj->render( $tmpl, $test->{data} ) ;
- } ;
+# get any existing template object
+# render the template and catch any fatal errors
-#print "ERR $@\n" if $@;
+ my $rendered = eval {
+ $obj->render( $tmpl, $test->{data} ) ;
+ } ;
# if we had an error and expected it, we pass this test
- if ( $@ ) {
-
- if ( $test->{error} && $@ =~ /$test->{error}/ ) {
+ next if check_error( $test ) ;
- ok( 1, $test->{name} ) ;
+ if( my $posttest = $test->{posttest} ) {
+ $posttest->($test) ;
}
- else {
- print "unexpected error: $@\n" ;
- ok( 0, $test->{name} ) ;
- }
- next ;
- }
# see if the expansion was what we expected
- my $ok = ${$rendered} eq $test->{expected} ;
+ my $ok = ${$rendered} eq $test->{expected} ;
-# dump any bad expansions
+# dump any bad renderings
- print <<ERR unless $ok ;
+ print <<ERR unless $ok ;
RENDERED
[${$rendered}]
EXPECTED
# report success/failure for this test
- ok( $ok, $test->{name} ) ;
+ ok( $ok, $test->{name} ) ;
+ }
}
}
+sub check_error {
+
+ my( $test ) = @_ ;
+
+ if ( $@ ) {
+#print "ERR $@\n" ;
+ if ( $test->{error} && $@ =~ /$test->{error}/ ) {
+
+ ok( 1, $test->{name} ) ;
+ }
+ else {
+
+ print "unexpected error: $@\n" ;
+ ok( 0, $test->{name} ) ;
+ }
+
+ return 1 ;
+ }
+
+ return ;
+}
+
1 ;
use common ;
my $tests = [
-
{
- name => 'unknown data type',
+ name => 'unknown template data type',
+ compile_skip => 1,
opts => {},
data => qr//,
template => <<TMPL,
EXPECT
error => qr/unknown template data/,
},
-
{
name => 'missing include',
skip => 0,
data => {},
- template => '[%INCLUDE foo%]',
+ template => '[%INCLUDE foox%]',
error => qr/can't find/,
},
-
{
name => 'code data',
+ compile_skip => 1,
skip => 0,
data => sub { return '' },
template => 'bar',
error => qr/data callback/,
},
-
-
] ;
template_tester( $tests ) ;
) ;
my $tests = [
-
{
name => 'simple include',
skip => 0,
opts => {
-
templates => {
'foo' => 'bar',
}
template => '[%INCLUDE foo%] [%INCLUDE bar%] [%INCLUDE quux%]',
expected => 'foo is here bar is too quux is on the drums',
},
-
{
name => 'missing include',
skip => 0,
pretest => sub { $_[0]{obj}->delete_templates() },
error => qr/can't find/,
},
-
{
name => 'load include files',
skip => 0,
opts => {
- include_paths => [ qw(
+ search_dirs => [ qw(
templates
templates/deeper
templates/deeper/deepest
name => 'delete covering file',
skip => 0,
opts => {
- include_paths => [ qw(
+ search_dirs => [ qw(
templates
templates/deeper
templates/deeper/deepest
) ],
},
pretest => sub { unlink 'templates/deeper/BAR.tmpl' },
+ posttest => sub { write_tmpl_files() },
+
data => {},
expected => <<EXPECTED,
this loads bar <[this should be hidden then revealed]
sub remove_tmpl_files {
unlink keys %tmpl_files ;
-
rmdir $_ for reverse @tmpl_dirs ;
}
my $tests = [
{
- name => 'nested bug [- -]',
+ name => 'nested [- -]',
skip => 0,
opts => {
pre_delim => qr/\[\-/,
EXPECTED
},
{
- name => 'nested bug',
+ name => 'nested',
skip => 0,
data => {
widgets => [
EXPECTED
},
{
- name => 'nested bug ,',
+ name => 'nested ,',
skip => 0,
opts => {
},
EXPECTED
},
{
- name => 'nested bug short',
+ name => 'nested short',
skip => 0,
data => {
widgets => [
my $tests = [
{
- name => 'top level - scalar data',
+ name => 'scalar data',
data => 'bar',
template => <<TEMPLATE,
junk
expected => 'bar',
},
{
- name => 'top level - array data',
+ name => 'array data',
data => [
"foo\n",
"bar\n",
EXPECTED
},
{
- name => 'top level - blessed array data',
+ name => 'blessed array data',
data => bless( [
"foo\n",
"bar\n",
EXPECTED
},
{
- name => 'top level - code data',
+ name => 'code data',
+ compile_skip => 1,
data => sub { \uc ${$_[0]} },
template => <<TEMPLATE,
junk