Up to [Local Repository] / interchange / lib / Vend
Request diff between arbitrary revisions
Keyword substitution: kv
Default branch: MAIN
New universal "hide" attribute. You can now set the hide=1 attrbute for any tag to supress its output. In order to preserve backwards compatibility with existing individual tags' hide attributes tag output is not reparsed if this is set regardless of the setting of interpolate or reparse attributes. The reasoning behind this is existing hide=1 attributes clear the output of the tag before the output is reparsed so setting hide=1 on those tags which used to support it had the effect of not reparsing output (because there was no output left to reparse). This can be tested with the following line of ITL: [tmp bar]bar[/tmp][calcn hide=1]'foo[tmp bar][area foo][/tmp]'[/calcn]::[scratchd bar] In my testing the above line of html outputs: ::bar Without the hide=1 attribute to calcn it outputs something like (url changed to protect the guilty): foo::http://www.example.com/foo.html So hide=1 is effectively preventing reparsing as well as hiding the output.
* Minor edit for asthetics only: Lower-cased an opening <a> tag so
that it matches with its </a> end-tag marker.
* UserTag aliases now allow names tags to be specified using hyphens
or underscores. Previously, only underscores were allowed.
This fixes a problem with the [shipping-description] alias, and will
help to avoid similar problems in the future.
* A bit of a cleanup. Moved some of the tag/filter aliases out of
Vend::Parse and into the appropriate file under the "code" directory.
* Updated copyright headers to 2007 (closes bug #102) * Added GPL and copyright headers to a few files that were missing them.
Fixed error where the wrong tag name can sometimes appear in [calc] error messages (#7).
New Free Software Foundation Address in headers of various files
New Free Software Foundation Address in headers of various files
Big copyright and version number update to prepare for 5.3.2 release.
Add new pragma: no_default_reparse. It makes the default Reparse setting false, which can be (as always) overridden by the tag's Reparse setting, and finally by the reparse=X tag attribute. I almost never use reparse in any form, and thus prefer, for speed and expectation purposes, to have it not be the default. If it's still wanted, it can be turned on for that particular use only.
Remove duplicate AdminSub check. The exact same check is done right before this one, but with more specific error messages.
* How did this survive so long? Was from my first UserTag stuff in Minivend 3....
* Implement new AccumulateCode and TagRepository directives. The rationale
is:
-- There is a huge base of Interchange code, much of which is not
needed in even the standard catalog with full UI. This causes a
larger memory profile than necessary.
-- It is difficult to determine from the page code what code is
needed, especially when a [tag] can call a $Tag can call
a filter can call some sort of Action.
-- A feature is needed to allow building catalogs with a more
nearly optimal set of code than just "everything".
If AccumulateCode is no, operation is exactly as before. There have
been some code initialization changes and routine calling changes,
but the data structures are identical and no difference in operation
should be seen.
If you set AccumulateCode to "Yes" and specify a TagRepository that
contains all known UserTag, ActionMap, Filter, Widget, etc. etc.
code, Interchange starts accumulating and compiling these as
needed.
The code is sent to the master process for compilation and
incorporation, so that the next iteration of a page after HouseKeeping
seconds will find the code already compiled and ready to go.
It also copies the code file to the "code" (actually $Global::TagDir)
directory in the "Accumulated" subdirectory tree. When you restart
Interchange, these tags/filters/widgets/checks are read normally
and need not be recompiled on the fly.
Over time, as you access pages and routines, a full set of tags
will be developed and you can turn AccumulateCode to "No".
* There can be failures due to calling a $Tag from within embedded
Perl for the first time, particularly when it uses a MapRoutine or
calls another $Tag within. This is due to Safe, and there is probably
not much to be done about it. The good news is that the error should
go away after HouseKeeping seconds when the tag gets compiled by the
master.
This could be avoided in the case of an AllowGlobal catalog, and it
might be possible to make a directive that turns on AllowGlobal only
when in AccumulateCode mode.
The area, tmp, tmpn, and image tags are known to fail in this
way in the standard catalog. Tags that are frequently called
in this fashion should probably be placed in a "code/Vital"
directory and not be accumulated.
* This is only recommended for development -- it might
be possible to remove a tag/filter/etc. from the master
and recompile these on the fly, but I haven't looked at that
yet.
Another nice feature is that you can easily add a tag simply
by adding its code to the TagRepository and having it
compiled.
* WARNING: Nice features are often dangerous! Don't run this in
production -- you have been warned!
* WARNING: OrderCheck is not yet implemented, and a full audit has
not been done on all compiled code directives.
* WARNING: Not fully tested in Prefork mode, and really not intended for
that mode.
* WARNING: Including multiple tags in a file may have unpredictable
behavior. You should try to keep related Alias and tag things in
the same file.
* This feature only applies to Global code -- Catalog-based code
shows no change.
* Passes the regression tests 100% when called with an empty "code"
directory, compiling every tested tag and executing without error.
* We had been running without warnings so long, we had gotten a bit sloppy
in our code in some places.
Because we do lots of uninitialized hash member stuff with arrays
of fields and $opt, it is basically unreasonable for us to run with
the "use of uninitialized variable" warnings. Because we do a fair
amount of numerical comparisons on empty string values, it seemed
unreasonable to run with "string value in numeric gt" enabled.
Also, because Safe, HTML::Entities, and some other modules have
these checks enabled, page code is bound to have warnings issued
no matter what you do.
It seems better to run with some warnings enabled so that we can
catch bad code practice.
So I have made the code run without warnings prior to and after
interpolate_html(), and turned off warnings by default in the
page code.
If it is desirable to turn on warnings for pages, you can use
[pragma perl_warnings_in_page] and see warnings for that page
(or by default if you put in catalog.cfg).
* In general these changes are:
no warnings qw(uninitialized numeric);
in most pages.
* Add $::Pragma->{perl_warnings_in_page}.
* Remove defined checks when simple set tests will do.
* Streamline some code.
* Various variable initializations and tests to avoid warnings.
* Turn off warnings in strategic places so that we don't get inundated with uninitialized variable warnings
Add new UserTag option "attrDefault", which allows default attributes to be set globally or catalog-wide for a given usertag. Two examples: UserTag area attrDefault href index UserTag calc attrDefault filter entities Any user-specified attributes will take precedence, even if 0 or blank. This is designed to allow changing the default behavior of a tag without changing its code, especially for built-in tags one would rather not customize. Note that when using this directive on global usertags, it must be done in interchange.cfg, and for catalog usertags in catalog.cfg.
* Make [bounce ...] more reliable with respect to terminating output and future parsing.
The great copyright, email address, URL, and version update.
removal of InvalidateCache attribute
this patch allows the usage of full-fledged UserTag aliases any aspect of the actual usertag like endtag and interpolate should be reflected in the alias as well, needed for alias L => loc and makes sense IMHO anyway special aliases like process_search should still be working I didn't tried the weird thingy 'buzzard' though
updated LINUXIA branch to 4.9 sources in order to use it as testbed again
* Major changes to the Interchange output model and UI.
* There will be more commits for menu data.
UI
-------
* Zeald's redesign of the UI layout is almost fully implemented. There
are but a few pages that don't incorporate the new layout.
* Each page can have an entry in mv_metadata, which allows setting
of page titles, display types, menus, and more via database setting.
An editor is provided.
* Virtual UI pages are fully supported. This will allow catalog-specific
UI settings to be transmitted to a catalog with simple database updates.
Each page is simply an entry in mv_metadata.
* The second-level menu can be set either with the page class, as before,
or in the page metadata with $Scratch->{second_menu}.
* There is a third-level menu callable via $Scratch->{third_menu}. There
are few situations where the old "next_line" menu setting causes the
third-level menu -- old menu files should be compatible but where possible
the third-level menu is explicitly specified.
* [table-editor] and [tabbed-display] can now do tabs to the third-level
menus. This provides a very seamless tabbed display that does not
require a page access to change.
* Many changes made to pages to map output to the new template.
* New GPG encryption wizard to make setting up of encryption as close
to painless as I can make it.
* Change to menu editor to incorporate better menu loading.
* New merge_metadata function allows management of new metadata when
updating the UI.
* Many, many minor changes and visual improvements.
* A good deal of documentation about the metadata and table editor
has been written, and those items should be committed soon. Many
of the features are covered.
Core
-----
* Output of the parser is now sent to @Vend::Output, which allows remapping
of the parser output before output by the Server module.
There should be no difference in behavior by default.
Each piece of output is pushed onto an array, and pointers
are maintained as to the name of the output. The default if
the output is not remapped is to go to the $Vend::OutputMap{''} space.
When output is done in non-mapped mode, @Vend::Output is simply
joined and sent.
The behavior diffence comes if you use the Vend::Page::output_cat
routine. It will output the value of a named space.
You can map output with the ITL tag:
[output-to name=foo]
To return to the default space, you use:
[output-to name=""]
To return to the *previous* named space, use:
[output-to]
That is not normally what is wanted, though.
All of the above allows you to map pieces of a page to different named
spaces and unpack them with the [unpack] tag.
This is all perhaps easier illustrated than described -- the illustration
is in the changes to the UI, which map output from the page code to the
template.
Sweeping update of Akopia/Red Hat references, to prepare for 4.8 release with current Interchange URLs and contact information.
* Modified [bounce] to accept a 'status' parameter. This allows redirections to optionally use a status other than '302 moved'.
* Add new [deliver ....] tag that allows you to deliver some content
without worrying about [tag op=header] and page spacing issues.
Adds new global variable $Vend::Sent which is authoritative notification
that all content is sent and that all further parsing of ITL
should stop.
Allows this:
[perl]
if($CGI->{foo}) {
# Oh, we need to send foo as text
$Tag->deliver( { type => 'text/plain', body => $Scratch->{foo} });
return;
}
else {
# Go about parsing ITL
}
[/perl]
Also will work with
[deliver type=text/plain][scratch foo][/deliver]
* Fix apparent long-standing bug where NoReparse was not being passed from UserTag defines.
* Fix problems with [goto LABEL].
-- Remove old HTML-style tag recognition.
-- No longer use old $Initialized->{_buf}.
* Allow bounce targets. Apply patch supplied by Mark Johnson quite a long time ago.
* Allow bounce targets. Apply patch supplied by Mark Johnson quite a long time ago.
Update Andrew Wilcox's email address at his request.
Update Andrew Wilcox's email address at his request.
Big copyright date update. This will be the last time that Red Hat copyright notices get updated en masse, since the bulk of new code will very likely come from non-Red Hat employees.
Restore addAttr setting to [order] tag, so that options work (such as 'base' and 'cart'). Change what looked like a bug (and in any case was undocumented): 'area' option is now a boolean which makes [order] act like [area] instead of [page], and the 'page' option applies in either case.
Allow output of '0' from [if]...[else]0[/else][/if]. Thanks to Murahashi <murahashi@ayayu.com> for finding this bug. Should go into stable branch if nobody has concerns with the patch.
* Disable reparse for restrict tag to prevent infinite loops. (The NoReparse setting got lost in the Great Tag Breakout.) * Add new log option to restrict tag. Possible values are 'all', 'once', and 'none'. Default remains 'all'. * Remove space after occurrences of 'variable=' in logfile output to simplify parsing of $Vend::restricted string.
new usertag parse_locale added
* Add noRearrange to tagCanon, also remove hard-coded attr_list noRearrange (relocated to the tag).
As this will be a 5.0 release, we are no longer supporting deprecated MV3 features. Here is the first removal: * Remove HTML-embedded syntax, which has been deprecated since late MV3. * This reduces documentation and code complexity, and should provide at least a small speedup in parsing. * Added "noRearrange" parameter to avoid $Tag->attr_list and $Tag->uneval rearranging params when a hash is encountered as the first argument.
* With so many tags moved out of the core, we needed a way to identify better than "(eval 541)". This should do it.
* Honor XML-style empty container tags. [set name="foo"/] is equivalent to [set name="foo"][/set] If you are going to use this, you MUST name the parameters, and you SHOULD quote them. [set foo /] ---> Never works [set name=foo/] ---> Does not work [set name=foo /] ---> Works but not recommended [set name="foo" /] ---> Recommended [set name="foo"/] ---> OK Benefits of this are removing a call to parse empty buffers, and it should not add significant overhead. * Fix a couple of default setting problems in Form.pm.
* Fix problem with $Tag->display() called with null table, affecting "wizard" mode. * Re-introduce "restrict" tag into Interchange, unintentionally omitted when the great tag move was made. * Clean up of [sql ...] tag, which now becomes useful as a way of doing [query list=1 ...]. * Give proper encoding behavior to [display type=value ...] * Fix bad status code on PGP failure.
* The great tag breakout!
* Almost all tags are now UserTag definitions. The only exceptions
are:
and bounce goto if label or unless
* New TagDir directive (default is VENDROOT/code) sets the
directory (or directories) which are searched for code definitions
set by UserTag and CodeDef.
* New TagGroup directive establishes groups of ITL tags which can
be included.
TagGroup :crufty "banner default ecml html_table onfly sql"
The default groups include :core, which contains all of the
ITL tags defined in 4.8/early 4.9. The groups are defined
in $Vend::Cfg::StdTags and can be undefined if desired
with "TagGroup :group".
* New TagInclude directive allows inclusion of tags (or groups
of tags). If a tag is defined as a core tag (with a .coretag
or .tag or .ct extension) and is not included, it will not
be compiled and placed in the tag map. This is for all catalogs,
so if *any* catalog uses a tag it must be included.
Examples:
# Include the base tags
TagInclude :core
# Not the commerce tags
TagInclude !:commerce
# But make sure item-list is included even though
# it is in :commerce
TagInclude item-list
## Double negatives are honored
TagGroup :foo "bar !baz buz"
## With the group above, the below is equivalent
## to TagInclude !bar baz !buz
TagInclude !:foo
* New CodeDef directive allows the setting of filters,
order checks, FormAction, ActionMap, ItemAction,
and LocaleChange.
## filters
CodeDef mixedcase Filter
CodeDef mixedcase Routine <<EOR
sub {
my $val = shift;
## [filter mixedcase]mixed case[/filter]
## outputs "MiXeD CaSe"
$val =~ s/(.)(.)/\u$1\l$2/g;
return $val;
}
EOR
## order checks
CodeDef mixedcase OrderCheck
CodeDef foo Routine <<EOR
sub {
my ($ref, $var, $val) = @_;
return (1,$var) if $val eq 'bar';
return (0,$var, "foo must be bar");
}
EOR
All work in catalog.cfg; LocaleChange and ItemAction are not
global. FormAction, ActionMap, and ItemAction directives
are equivalent to their CodeDef equivalents.
Update version number and copyright year, to prepare for the eventual day when we release version 4.8.4.
Add note about implicit tag attributes.
[process-order] is exactly the same as [process] because attribute "order=1" is not respected anymore. Make them exact aliases in Parse.pm to reflect this fact more obviously.
Remove duplicate 'set' tag entry in hasEndTag.
While working on the docs I found that addAttr had been disabled for [order], and consequently parameters like cart, page, etc were being ignored. Restored it and added the line in Interpolate to handle an optional cartname.
* More changes to close cross-site scripting vulnerability.
* Fairly sweeping changes to fix cross-site scripting vulnerablility.
* Don't allow < output from [value ...] or [cgi ....]. Provide
option to enable it explicitly if desired.
* Default foundation to "CookieLogin No".
* Check value of CookieLogin before presenting checkbox asking about
auto-login.
* Filter values when moved from CGI, but allow the setting of a
$Session->{restrict_html} which will filter tags to only certain
ones (can prevent <SCRIPT> but not <A HREF="javascript:....">.
Don't filter for Vend::admin.
* Add "Promiscuous" directive so that sites that are broken can
get back up quickly, albeit still with the vulnerability.
* Update version to 4.8.3 prior to release.
* Fix broken [cgi namedparm=""].
* Allow [dump] of portion of session, for example [dump scratch].
* Allow [dump] of portion of session space, i.e. [dump scratch]. * Can go into stable branch.
Remove extra [ from log message.
Remove extra [ from log message.
Upping major version number after trunk/branch switch.
Move DEV_4_7_0 development branch to repository trunk.
* Change fly-page and fly-list so variables don't get parsed twice, but still get parsed before flypage substitutions. Add opt variable to call for control; could be used in future for other purposes. * Fix [fly-list] tag so that the options work; previously they never would have.
Added new core [msg] tag based on Stefan and Mike's ideas for doing
parse-time locale substitutions. Some examples follow.
Using message string key if available, and multiple-value printf replacement:
[msg
key=540
arg.0="[data session username]"
arg.1="[scratch wahnsinn]"
raw=0
]
User %s is approximately %s%% crazy.
[/msg]
Using [LC]-style inline translations with a single printf replacement:
[msg
arg="[scratch wahnsinn]"
inline=1 # can also use attribute 'lc' as an alias for inline
]
This user has earned %s crazy points.
[de_DE]Dieser Benutzer hat %s Wahnsinnspunkte verdient.[/de_DE]
[/msg]
Using a forced locale setting with no printf replacement:
[msg
locale=de_DE
raw=1
]
Thi%s will be tran%slated to German without any printf-ing.
[/msg]
(Note that forcing locale=something currently doesn't make any sense
in the admin UI, since usertag [mm-locale] erases $Vend::Cfg->{Locale_
repository} before it loads in the global locale, so there isn't any
other locale to switch to. Maybe it shouldn't do this?)
And probably just for fun, using a hash-based arglist, with printf string
substitutions ordered by sorted hash keys:
[msg
arg.a=10
arg.b=20
]
A slightly nuttier example (with values %s and %s).
[/msg]
Commentary, corrections, and enhancements are of course welcome.
If everyone's ok with this and it tests out ok, I'll add it to the SDF
documentation.
(Was going to commit all of these changes together for coherency, but
repository too unstable for that at the moment. Will try to keep comments
the same throughout.)
* Add matrix option widget and handling so that you can
select the variants based on individual widgets instead
of one. Uses the methodology of taking multiple settins
of mv_skuN, where N is the cart line. Each is joined with
a - character, and $::Variable->{MV_VARIANT_FILLER}|| 0
is inserted if it is blank.
* Method to tell if the individual widget method is used
is to have both o_matrix and o_modular set. This is less
than ideal, and a better method is needed. Will not document
this until the method is set.
* Add new "warnings" tag to eliminate the problem with overwriting
and fragmentation of [data session failure], [data session error],
[data session ui_failure], [data session ui_error], etc. Will add
separate namespaces in next iteration so that we can use different
ones for UI.
* Early preparation to formalize support for Windows only under Cygwin
(another Red Hat SW product, yeah!!). Will only be supported
for testing purposes.
* Change handling of option updates so that if an illegal variant
is selected from the database the code and mv_ib refuse to change.
Update copyright notices and email addresses. Standardize module headers and remove a few shebang lines.
* Change default of [catch] to NOT interpolate. Impossible to
conditionally execute code if that is the case.
* Fix [catch] to work with only the proper body, not with both
THEN and ELSE.
* Add get=1 to setlocale tag. That is sort of counter-intuitive, so I
added a [getlocale] alias for [setlocale get=1].
* Change name of policy=accept to "allow".
* Add ability to restrict tag execution in a region. If a restricted tag
is encountered, it is simply output. Based on an idea from Jon Jensen.
[restrict policy=deny*|accept enable="tag1 tag2" disable="tag1 tag2"]
restricted area
[/restrict]
options:
policy "accept" or "deny". Default is deny.
enable space or comma-separated list of tag names, including
UserTag names.
disable space or comma-separated list of tag names, including
UserTag names.
For instance, this:
[restrict enable=page]
[area something]
[page aboutus]A link[/page]
[/restrict]
will output:
[area something]
<a href="http://sam.heins.net/cgi-bin/mfound/aboutus.html">A link</a>
Defaults are important:
interpolate=0
reparse=0
It would defeat the purpose to set interpolate or reparse, but it
can be done.
* Allow parameters for comment tag -- not parsed, but at least
tolerated.
* Place $Tags_added in Vend:: package so it will be reset upon
entry to a page/catalog. This should make it thread-safe.
Symptom was catalog UserTag not being added at times.
1. Set [catch] tag to interpolate by default 2. Reverted change to dist/foundation/etc/log_error since catch tag now works properly by default
* Add [unless] [/unless]....
Add new tag "assign". It allows you to assign to four things, subtotal preempts the cart subtotal derived from prices. NOT ROUNDED. shipping if any non-zero mv_shipmode is present at all, sets the total value of shipping. Rounded to fractional digits. handling if any non-zero mv_handling is present at all, sets the total value of shipping. Rounded to fractional digits. salestax preempts the salestax normally derived from the salestax. NOT ROUNDED. You cannot assign to total_cost -- it will always be the sum of the four above. If there is no assignment to one of the four, it will use the normal method. To make salestax zero, you must use [assign salestax=0]. Called with [assign salestax=N.NN], etc. If the value has a length of zero, will delete the assigned value from the assignment hash and the normal method of calculation will kick back in. If you call [assign clear=1] it will clear all, and the normal method of calculation will kick back in. If a non-real-number value is passed, it logs an error and clears the assignment. It is persistent in the user's session and effects only that user, and should be used only when you know exactly what you are doing. Ha.
* Extensively rework Payment routines.
* Add Payment.pm module to contain the base routines, and be a
target for the routines added via the different Payment
modules.
* A pretty convenient mechanism to bring in modules:
Require module Vend::Payment::Authorize
Prevents errors and memory bloat(er) when Net::SSLeay or other
needed companion modules are present/not present, and should
give reasonable errors when the module is not working.
* Support old CyberCash stuff for now, will probably replace with
Payment/CyberCash.pm and some stubs.
* Initially have Authorize.net (Payment/Authorize.pm), rest will
follow shortly. These will be documented with in-module POD.
* There will be a Vend::Payment::Skeleton to show adding your own
payment module.
* GlobalSub method still supported, current GlobalSub things
should work fine (tested with Authorize.net and "custom
authorizenet" mode).
* Beginnings of PayPal support will be there shortly, but
thinking of how to generalize that
send-offsite-then-return-post paradigm.
* Should be completely backward compatible.
* All payment stuff taken out of Vend::Order except _charge
profile interface routine, a couple of stubs left for backward
compatiblity.
* Parameters can be completely Route resident, no MV_PAYMENT_*
variables needed.
* Changed mv_credit_card_info to delete all but
mv_credit_card_reference digits when not encrypted. This is
overdue....
* Added "cascade" route capability, that allows you to specify
one master order route that calls the rest of the routes.
Perhaps an interface in payment mode to add some logging....??
* New payment routines. Decided to keep something like current
framework, but you now can do:
&charge=route
or
$Tag->charge($route, $opt);
or
[charge route=THE_ROUTE gateway=ccvs id=milton secret=pass]
* All options are pulled from the option call first, the Route
matching the name second, then finally the global MV_PAYMENT_*
variables.
* All routes should be transparent if the mode exists. For instance,
you can define a route called "purchase_order" which will handle
POs, "internet_check" which handles checks, etc.
* Add CCVS support via globalsub. Will do auth, sale at this
point. Will soon add AVS support. Has extended information
support.
* Remove for good unsightly extra attributes qw/true false undef/
* Allow set-cookie tag to set domain and path.
Add minor attrAlias, don't bother with WHATSNEW.
Add attribute alias for query.
* Change resolve_args routine so that it will accept any
reference type including a blessed reference. Marginal loss is
that an array reference cannot be part of a multi-parameter
call in future implementations (none have that attribute now,
none are anticipated).
Major, major changes to Server.pm module to support SOAP RPC calls.
* Spawns multiple SOAP servers (controlled by SOAP_StartServers)
* Each SOAP server serves SOAP_MaxRequests calls before
terminating and causing a respawn of a new SOAP server process
* Uses internal HTTP (not SOAP::Transport::HTTP) so that multiple
servers can monitor the same port
* Does a dispatch_to of Vend/SOAP, entry point for any interface
routines.
* Determines catalog name from proxy URI
* Initial benchmarking indicates that over 100 RPCs per second
may be served by a single 800MHz Athlon, obviously call-dependent
Next up: Multiple page servers
Remove duplicated VERSION variable.
merged changes 1.12 vs 1.13
* Fixed problem with fly-list not accepting base parameter as per
docs. Found by Victor Nolton -- though he supplied a patch it
was in Mac binhex and I don't have the technology. Tested.
* Removed alias of a --> href, which was screwing with javascript
variables like [a]. Never really used by anybody that I know
of.
NOTE: Add to WHATSNEW as minor incompatiblity for upgrade.
* Add control-set tag to quickly set a series of [control ...]
settings, more underpinnings for new content stuff.
Remove dup CVS ID.
* Add control tag.
* Remove gratuitous '' around some hash keys (no longer required
to work around Perl 5.004 problems).
Whitespace changes (diff -b -B will report nothing except below): Removed duplicate CVS $Id Removed duplicate set entry in %hasEndTag Uncuddled 3 cuddled else statements 38 additional lines of diff (whitespace not caught by -b -B)
Add [mail ...] tag as standard. Does good header handling, supports raw mode in case of future MIME support. Added a routine to support the auto-generated email copies of form submissions from ::update_data. More fixes to tag_accessories -- that thing has to be completely rewritten.... Fix text2html to work with \r only. Add pedantic=1 option to tag_tree to generate errors if an endless tree is detected; otherwise it will tolerate (possibly logging) the error and ignore the brance. Fixed endless tree handling so that it will not error out unless the branch can actually be followed.
* Added [tree] tag to walk tree-based lists. It produces
hash-based rows which are iterated ala item-list (the
hash-based list iterator). Sets some information in the row.
See:
http://bill.minivend.com/jottings/tree.txt
for more info.
* Added support for modular options in the item list. Allows
listing of only master items.
* Made [if-PREFIX-(data|field|modifier|param|pos) ...] nestable
by checking for nesting conditions in the run list and then
generating integer additions to the tags.
* Added get_joiner routine to standardize getting of joiner
strings in tags.
* Added "links" widget to tag_accessories, will build a series of
clickable links based on an option list. Accepts the "form" and
"href" parameters to allow setting of the initial form,
otherwise just generates a link to the current page with the
attribute passed as a CGI argument.
* Fixed problems with textarea widget being recognized in
tag_accessories.
* Added "password" field widget.
* Added a new Safe object, $safe_safe, which doesn't inherit the
the $Values, $Tag, etc. Useful for building reference hashes
from database data that cannot be trusted.
* Made tag_calc routine indirectly callable from within embedded
Perl code by doing straight eval when already in Safe compartment.
* Added attr_list tag which allows tagging of attribute lists in
hash-based templates. Allows you to generate complex templating
without needing to have a complete search. Example of use is in
tag_address_list.
* Added new [PREFIX-tag ...] which allows extending the tags
that are interpreted as a part of a PREFIX-list. Example in
tag_address, called with [PREFIX-tag-address]. Full attribute
support and nesting.
Add hooks for new "options" and "profile" tags.
merged changes 1.11 vs 1.12
merge 1.11 vs. 1.12
Add locale=1 to [include ....] so that [L] [/L] will be interpreted if desired.