Monday, November 08, 2010 at 12:03 AM.
system.verbs.builtins.html.getImageData
on getImageData (imageSpec, pageTable=nil) {
<<Get image data: URL, path, address, file type, suffix, height, and width.
<<Writes the image file to disk.
<<Returns a table containing:
<<url
<<Relative URL.
<<path
<<Path to file on disk.
<<adrImage
<<The address of the image in the odb.
<<macFileType
<<Mac file type.
<<suffix
<<".gif" or ".jpg"
<<height
<<The actual height of the image.
<<width
<<The actual width of the image.
<<Changes:
<<Sunday, January 18, 1998 at 3:43:02 PM by PBS
<<10/3/98; 8:00:58 AM by DW
<<if there there's a pref "noImageExtensions", then we empty out the extension
<<we need this to support rendering from within mainResponder
<<PBS 1/11/99
<<The pref is changed from "noImageExtensions" to "imageExtensions" so
<<it can default to true.
<<If imageExtensions is false, then empty out the extension,
<<to support rendering from mainResponder.
<<06/01/00; 6:39:47 PM by PBS
<<Send the pageTable parameter to html.getPref when getting the imageFolderSubtables pref.
<<06/17/00; 7:40:10 PM by PBS
<<Don't write to disk if this is a dynamic page.
<<07/05/00; 5:45:35 PM by PBS
<<Get the JPEG height and width from the JPEG object in Frontier, not from the JPEG file on disk -- because this script may be running in a dynamic webserver context and there may not be a JPEG file on disk.
if pageTable == nil {
try {
pagetable = html.getPageTableAddress ()}
else {
pagetable = @websites.["#data"]}};
local (nomad = pageTable^.adrObject);
local (urlPrefix, extension = "");
local (folder = file.folderFromPath (pageTable^.f));
local (binType, adrImage);
local (pc = file.getPathChar ());
local (fname, f, macFileType);
local (dataTable, cachedImageData);
local (flcache = html.getPref ("useImageCache", pageTable));
local (height, width, hwlist = {0, 0}, url);
local (imageFolderName = html.getPref ("imageFolderName", pageTable));
local (lowerFolderName = string.lower (imageFolderName));
local (flSubFolders = html.getPref ("imageFolderSubtables", pageTable)); //PBS 06/01/00: send the pageTable parameter to html.getPref. Minor bug fix.
bundle { //build the path to the image
case (typeOf (imageSpec)) {
addressType {
adrImage = imageSpec};
stringType {
loop {
on checkTable (adrTable) {
if defined (adrTable^.[imageSpec]) and typeOf (adrTable^.[imageSpec]) != tableType {
adrImage = @adrTable^.[imageSpec];
return (true)};
if flSubFolders {
local (i);
for i = 1 to sizeOf (adrTable^) {
if typeOf (adrTable^ [i]) == tableType {
if checkTable (@adrTable^ [i]) {
return (true)}}}};
return (false)};
if nomad == pageTable^.adrSiteRootTable { //don't pop out past the root table
scriptError ("Can't locate an image object named \"" + imageSpec + "\".")};
nomad = parentOf (nomad^);
if nomad == nil { //PBS 12/24/98
scriptError ("Can't locate an image object named \"" + imageSpec + "\".")};
try {
if checkTable (@nomad^.["#" + imageFolderName]) {
break}};
if lowerFolderName == "images" {
try {
if checkTable (@nomad^.[imageFolderName]) {
break}}};
folder = file.folderFromPath (folder);
urlPrefix = "../" + urlPrefix};
folder = folder + imageFolderName + pc;
urlPrefix = urlPrefix + imageFolderName + "/";
if flSubFolders {
local (nomadList = string.parseAddress (nomad));
local (imageList = string.parseAddress (adrImage));
local (i);
for i = sizeOf (nomadList) + 2 to sizeOf (imageList) - 1 {
local (oneFolder = imageList [i]);
if oneFolder beginsWith "#" {
oneFolder = string.delete (oneFolder, 1, 1)};
folder = folder + oneFolder + pc;
urlPrefix = urlPrefix + oneFolder + "/"}}}}
else {
scriptError ("Imagespec param must be an address or a string.")}};
bundle { //add file extension to path
binType = getBinaryType (adrImage^);
binType = string.lower (string.popTrailing (binType, ' '));
case binType {
"gif";
"giff" {
extension = ".gif";
macFileType = 'GIFf'};
"jpg";
"jpeg" {
extension = ".jpg";
macFileType = 'JPEG'}};
<<We might be running in the website framework responder.
if html.inResponder (pageTable) {
extension = ".wsf"};
if not (html.getPref ("imageExtensions", pageTable)) { //10/3/98; 7:58:52 AM by DW, to support mainResponder images
extension = ""};
fname = nameOf (adrImage^) + extension;
f = folder + fname;
url = urlPrefix + fname};
bundle { //write file to disk
local (lowerWriter = string.lower (pageTable^.fileWriter));
if not (defined (pageTable^.requestHeaders) and macFileType == 'GIFf') {
if lowerWriter != "file" {
html.writeFile (f, adrImage, macFileType, html.getPref ("imgFileCreator", pageTable), clock.now (), pageTable)};
if (not flcache) or (not (file.exists (f))) { //if caching is off, or the file doesn't exist, write to disk.
<<We need to write to disk to get the size info.
if not defined (pageTable^.requestHeaders) { //PBS 06/17/00: don't write to disk if this is a dynamic page
file.sureFilePath (f);
file.writeWholeFile (f, adrImage^, macFileType, html.getPref ("imgFileCreator", pageTable), clock.now ())}}}};
bundle { //get height and width of image
local (flfound = false);
if flcache { // get height and width from the image cache
<<Thursday, January 15, 1998 at 3:55:21 PM by PBS
local (adrCache = @system.temp.htmlImageCache);
if not defined (adrCache^) {
new (tableType, adrCache)};
cachedImageData = @adrCache^.[adrImage];
if defined (cachedImageData^) {
height = cachedImageData^.height;
width = cachedImageData^.width;
flfound = true}};
if not flfound {
case macFileType {
'GIFf' {
hwList = html.getGifHeightWidth (adrImage)};
'JPEG' {
hwList = html.getJpegHeightWidth (adrImage)}}; //PBS 07/05/00: use the address of the JPEG object, not the file path, to get the height and width. Because this may be a dynamic page, the JPEG may not exist on disk.
height = hwList [1];
width = hwList [2];
if flcache {
new (tableType, cachedImageData);
cachedImageData^.height = height;
cachedImageData^.width = width}}};
bundle { //build returned data table
new (tableType, @dataTable);
dataTable.url = url;
dataTable.path = f;
dataTable.adrImage = adrImage;
dataTable.macFileType = macFileType;
dataTable.suffix = extension;
dataTable.height = height;
dataTable.width = width};
return (dataTable)}
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.