capture_page — process page and save output to file and/or scratch variable
| Attribute | Pos. | Req. | Default | Description |
|---|---|---|---|---|
| page | Yes | Yes | Name of the Interchange page to process (as if the user visited it with the browser). | |
| file | Yes | Yes | File to dump contents to. | |
| scratch | Store contents in this scratch variable. | |||
| scan | Specifies the search string and reproduces a search results page. | |||
| auto_create_dir | 0 | Create directory path to the dump file? | ||
| expiry | See if file Modification time is newer than expiry deadline. | |||
| touch | 0 | If the file is expired, touch it? | ||
| umask | File creation umask. | |||
| interpolate | 0 | interpolate output? | ||
| hide | 0 | Hide the tag return value? |
This tag processes the page (as if the user visited it with the browser), and writes contents to disk. This is usually called from jobs but of course, nothing enforces this.
The tag is able to reproduce both standard and search results pages.
This is similar to the output you could get from
lynx -source or w3m -dump_source
commands.
Example: Basic static page example
Create page named make-static.html with the following
content:
[capture-page page=index file=static/index.html umask=022 auto_create_dir=1]
This would create the static/
directory in your catalog root, and a snapshot of
index.html in it.
Create page named make-static2.html with the following
content:
[loop list="Levels,Rulers,Squares"]
[capture-page page="[loop-code]" file="static/cats/[loop-code].html"
scan="fi=products/st=db/co=yes/sf=category/se=[loop-code]"
auto_create_dir=1]
[/loop]
Interchange 5.9.0:
Source: code/UserTag/capture_page.tag
Lines: 86
# Copyright 2003-2008 Interchange Development Group and others
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. See the LICENSE file for details.
#
# $Id: capture_page.tag,v 1.12 2008-10-01 09:21:45 racke Exp $
UserTag capture_page Order page file
UserTag capture_page addAttr
UserTag capture_page Version $Revision: 1.12 $
UserTag capture_page Routine <<EOR
sub {
my ($page, $file, $opt) = @_;
# check if we are using a file
if ($file) {
# check if we are allowed to write the file
unless (Vend::File::allowed_file($file, 1)) {
Vend::File::log_file_violation($file, 'capture_page');
return 0;
}
if ($opt->{expiry}) {
my $stat = (stat($file))[9];
if ($stat > $opt->{expiry}) {
if ($opt->{touch}) {
my $now = time();
unless (utime ($now, $now, $file)) {
::logError ("Error on touching file $file: $!\n");
}
}
return;
}
}
}
if ($opt->{scan}) {
Vend::Page::do_scan($opt->{scan});
}
$::Scratch->{mv_no_count} = 1;
# save mapped output
my (@output, %outptr, %outfilter, %outextended, $multiout, $content, $retval);
@output = @Vend::Output;
%outptr = %Vend::OutPtr;
%outfilter = %Vend::OutFilter;
%outextended = %Vend::OutExtended;
$multiout = $Vend::MultiOutput;
# clear mapped output
@Vend::Output = %Vend::OutPtr = %Vend::OutFilter = %Vend::OutExtended = ();
$Vend::MultiOutput = 0;
Vend::Page::display_page($page, {return => 1});
for my $part (@Vend::Output) {
Vend::Interpolate::substitute_image($part);
$content .= $$part;
}
# restore mapped output
@Vend::Output = @output;
%Vend::OutPtr = %outptr;
%Vend::OutFilter = %outfilter;
%Vend::OutExtended = %outextended;
$Vend::MultiOutput = $multiout;
if ($opt->{scratch}) {
$::Scratch->{$opt->{scratch}} = $content;
$retval = 1;
}
if ($file) {
$retval = Vend::File::writefile (">$file", \$content,
{auto_create_dir => $opt->{auto_create_dir},
umask => $opt->{umask}});
}
return $retval;
}
EOR