/*----- * group: Data presentation * purpose: Generate an HTML GRSEG previewer with Thumbnails. Modification of SAS example other-webframe.html, which is similar to the Version 7 WEBFRAME device. * notes: Suitable for dynamic use since all pieces are named with a timestamp to prevent problematic caching. Sample */ /*******************************************************************\ | Copyright (C) 2000 by SAS Institute Inc., Cary, NC, USA. | | | | SAS (R) is a registered trademark of SAS Institute Inc. | | | | SAS Institute does not assume responsibility for the accuracy of | | any material presented in this file. | \*******************************************************************/ %* mod %* 4/11/00 RAD use SQL to get object descriptions for use as thumbnail %* labels. use object name as filename; %* 4/12/00 RAD work on caching issues, use datetime() to uniquely name %* frame pieces. %* Return in _START_ filename of main frame; %* 4/17/00 RAD allow GIF device driver as a named argument; /**********************************************************************/ /* This program creates HTML and GIF files in version 6.12 that mimic */ /* the format created by the WEBFRAME device first available in */ /* version 7 of the SAS system. It assumes you want to display all */ /* the graphs stored in the specified catalog. It will create a */ /* parent page, PFRAME.HTML, that displays two smaller frames. The */ /* left frame, THUMB.HTML, will contain a list of all the graphs, */ /* including a thumbnail image and a text link for each. Selecting */ /* one of these links will display the larger GIF image of the same */ /* graph in the right frame. Initially, the first graph in the */ /* catalog is displayed in the right frame. */ /* */ /* As with the WEBFRAME driver, the parent frame and index frame are */ /* named automatically. Unlike the WEBFRAME driver, the images and */ /* links on these pages are not automatically given the GRSEG names */ /* of the graphs. Use the NAME parameter when invoking the macro to */ /* name the links on the list page, the large GIF files, and the */ /* displayed HTML files. The directory you specify to store the */ /* files must already exist; SAS will not create the directory for */ /* you. */ /**********************************************************************/ /**********************************************************************/ /* Uncomment this statement to troubleshoot the macro. */ /**********************************************************************/ * options nomprint nomlogic nosymbolgen; /**********************************************************************/ /* Define the macro FRAME. */ /* UNQPRFX: Unique prefix, used to created web files and to delete */ /* web files before creating new ones */ /* TITLE: Text to show above thumbnails */ /* LIBRARY: The library where the graphs are stored. */ /* CATALOG: The catalog where the graphs are stored. */ /* PATH: The physical location (drive & directory) where you want */ /* to store the output files. */ /* HSIZE: The HSIZE to use to generate the large GIF files. */ /* VSIZE: The VSIZE to use to generate the large GIF files. */ /* _START_: Contains name of macro variable in caller scope that */ /* will contain name of pframe generated */ /* */ /* The macro does not contain parameters to name the parent frame or */ /* the list frame. These frames are named PFRAME.HTML and THUMB.HTML */ /* by default, but these names can be changed within the macro before */ /* compiling if desired. */ /**********************************************************************/ %macro webframe(unqprfx,title,library,catalog,path,hsize,vsize,_start_,dirsep=/,gifdevce=GIF); %local title library catalog path hsize vsize dirsep; %local badpath i numgraph; %local _device _target _gsfname _gsfmode _hsize _vsize; %let _device = %sysfunc (getoption (device)); %let _target = %sysfunc (getoption (targetdevice)); %let _gsfname = %sysfunc (getoption (gsfname)); %let _gsfmode = %sysfunc (getoption (gsfmode)); %let _hsize = %sysfunc (getoption (hsize)); %let _vsize = %sysfunc (getoption (vsize)); %let badpath = 1; data _null_; length fref $32; fref = ''; rc = filename (fref, "&PATH"); if rc = 0 then do; did = dopen (fref); if did then do; call symput ("badpath", '0'); did = dclose (did); end; rc = filename (fref, ''); end; run; %if &badpath %then %goto Bye; /**********************************************************************/ /* Delete files in path with same unique prefix */ /**********************************************************************/ data _null_; * will hold list of files that are to be deleted; * need to be stored since dread(i) can change after fdelete; array fname[500] $200 _temporary_; length dref fref $32; retain dref fref ''; * open the directory; dref = ''; rc = filename (dref, "&PATH"); if rc = 0 then do; did = dopen (dref); if did then do; * find each file matching the prefix; j = 0; do i = 1 to dnum (did); filename = dread (did, i); if trim(upcase(filename)) =: trim(upcase("&unqprfx")) then do; j++1; fname[j] = filename; end; end; did = dclose (did); do i = 1 to dim(fname) while (fname[i] ne ''); fref = ''; rc = filename (fref, "&PATH.&DIRSEP."||trim(fname[i])); if rc = 0 then do; rc = fdelete (fref); rc = filename (fref, ''); end; end; end; rc = filename (dref, ''); end; run; /**********************************************************************/ /* Find the number of graphs in the catalog. Save this count */ /* as NUMGRAPH. */ /**********************************************************************/ proc sql; create table gsegs as select * from DICTIONARY.CATALOGS where libname="%upcase(&library)" and memname="%upcase(&catalog)" and objtype='GRSEG'; quit; %let numgraph = &SQLOBS; options symbolgen; %do i = 1 %to &numgraph; %local gname&i gdesc&i; %end; data _null_; set gsegs; if objdesc =: 'PLOT OF ' then objdesc = substr(objdesc,9); p = index (objdesc, '*'); if p > 1 then objdesc = substr(objdesc,1,p-1); call symput ('gdesc'||trim(left(put(_n_,4.))), trim(objdesc)); call symput ('gname'||trim(left(put(_n_,4.))), trim(objname)); run; %*----------------------------------; %local localdbg; %let localdbg = 0; %if &localdbg %then %do; %out2htm(capture=on, window=output, runmode=b); proc print data=gsegs; run; %out2htm(htmlfref=_WEBOUT, capture=off, window=output, openmode=replace, runmode=b); %goto Bye; %end; %*----------------------------------; %let unqsufx = %sysfunc (datetime(), hex16.); /**********************************************************************/ /* Make the large GIFs, the thumbnails, and the html pages for the */ /* graphs. */ /**********************************************************************/ %put &numgraph; %do i=1 %to &numgraph; filename out "&path.&dirsep.&unqprfx.-&&gname&i..-&unqsufx..gif"; goptions dev=&gifdevce target=&gifdevce gsfname=out gsfmode=replace hsize=&hsize vsize=&vsize; proc greplay nofs igout=&library..&catalog ; replay &i; run;quit; %* for some reason, for some graphs, 0.5x0.5 cause GIF driver lockup; goptions hsize=.7 vsize=.7; filename out "&path.&dirsep.&unqprfx.-thumb&i.-&unqsufx..gif"; proc greplay nofs igout=&library..&catalog ; replay &i; run;quit; filename page "&path.&dirsep.&unqprfx.-&&gname&i..-&unqsufx..html"; data _null_; file page; put ''; put ''; /* put ''; put ''; put ''; */ put ''; put '

'; put ''; run; %end; /**********************************************************************/ /* Create the parent frame, PFRAME.HTML. The left frame will be 15% */ /* of the initial browser window size. */ /**********************************************************************/ %let &_start_ = &unqprfx.-pframe-&unqsufx..html; filename parent "&path.&dirsep.&&&_start_"; data _null_; file parent; put ''; put ''; put 'SAS/Graph'; /* put ''; put ''; put ''; */ put ''; put ''; put ''; put 'Sorry, this frame output can only be viewed with a' @@; put ' frame capable browser like Netscape 2.0 and above.'; put ''; put ''; put ''; put ''; put ''; run; /**********************************************************************/ /* Create the thumbnail page, THUMB.HTML. */ /**********************************************************************/ filename list "&path.&dirsep.&unqprfx.-thumb-&unqsufx..html"; data _null_; file list; put ''; put ''; /* put ''; put ''; put ''; */ put ''; put ''; put "

&TITLE

"; %do i=1 %to &numgraph; put '

'; put '
'; put "&&gdesc&i" @@; put '

'; %end; put ''; run; %Bye: goptions device = &_device targetdevice = &_target gsfname = &_gsfname gsfmode = &_gsfmode hsize = &_hsize vsize = &_vsize ; %mend webframe; /**********************************************************************/