Slideshow
Dette eksempelet bygger på noe av det samme resonnementet som i modulen Bildegalleri, men kan leses uavhengig av denne modulen. Vi antar at vi har en katalog med bilder, og vi ønsker å lage en vevside som viser disse bildene i tilfeldig rekkefølge.
Vi skal lage:
- En vevside, auto.html
- Et Javascript, auto.js
- Et Pythonscript som går på tjeneren, auto.py
- Et stilsett, auto.css
Vevsiden
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>Bilde sekvens</title>
<link href="auto.css" rel="STYLESHEET" />
<script type="text/javascript" src="auto.js"> </script>
</head>
<body onload="init()">
<h2 class="printhide">Slideshow</h2>
<div id="hilitedimg" style="height:560px;text-align:center">
<p>
<img src="wait.gif" alt="Starter straks"/>
</p>
</div>
<div class="printhide">
<p id="toggle" onclick="toggleShow()" class="mybutton">
Start
</p>
<hr/>
<p>
<a href="javascript:history.back()">Tilbake</a>
</p>
</div>
</body>
</html>
Javascriptet
Løsningen er basert på at vi laster inn en randomisert liste av bilder. Dette gjøres i JSON-format når siden lastes, funksjonen init. Hvordan JSON-formatet brukes går fram av funksjonen: processJSON nedenfor.
Denne løsningen innebærer at den tilfeldige rekkefølgen gjentar seg. Det er lett å modifisere Javascriptkoden slik at vi får en ny tilfeldig liste når den første er "oppbrukt".
Funksjonene toggleShow og Show tar seg av selve bildevisningen. De resterende funksjonene realiserer AJAX.
var imList=null; var currentNr=0; var stopped=true; var delay=4000; var scriptURL='<scriptadressen>'; var imageCatalog='<absolutt adresse på tjeneren>'; var imageURL='<absolutt url ti bildekatalogen>'; function establishRequest() { var theRequest=null; if (window.XMLHttpRequest) theRequest = new XMLHttpRequest(); else if (window.ActiveXObject) { try { theRequest = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { try { theRequest= new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { theRequest=null; } } } else theRequest=null; return theRequest; } function postRequest(theRequest,params,theURL) { theRequest.onreadystatechange = function( ) { processJSON(theRequest); }; theRequest.open("POST", theURL,true); theRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); theRequest.setRequestHeader("Content-length", params.length); theRequest.setRequestHeader("Connection", "close"); theRequest.send(params); } function processJSON( aRequest) { if (aRequest.readyState == 4) { if ((aRequest.status == 200) || (aRequest.status == 304)) { try{ p = eval("(" +aRequest.responseText+")"); imList=p.imList; toggleShow(); } catch(ex){ document.getElementById('hilitedimg').innerHTML= 'Finner ingen bilder'; } } else alert("Problems accessing data:\n" + aRequest.statusText); } } function doRequest(theURL,params) { var myRequest=establishRequest(); if (myRequest) { postRequest(myRequest,params,theURL); } else { alert('Nettleseren nekter å hente data'); } } function toggleShow() { if(stopped) { stopped=false; show() document.getElementById('toggle').innerHTML='Stopp'; } else { stopped=true; document.getElementById('toggle').innerHTML='Start'; } } function show() { if (!stopped) { currentNr+=1; if (currentNr >= imList.length) currentNr=0 imsrc=imageURL+imList[currentNr].adr; imalt=imList[currentNr].adr; imtag='<img src="'+imsrc+'" alt='+imalt+'"/>' document.getElementById('hilitedimg').innerHTML=imtag; setTimeout("show()",delay); } } function init() { params='catalog='+imageCatalog; doRequest(scriptURL,params) }
Pythonscriptet
#! /usr/bin/python2 """ Scans a directory and returns a randomized list of images use see: http://www.ia.hiof.no/~borres/ml/slideshow/p-slideshow.html """ import os,random import cgi import cgitb; cgitb.enable() import operator def buildImageList(catalog): imageList=[] for root, dirs, files in os.walk(catalog, topdown=False): for name in files: # only jpg-files if not name.endswith('.jpg'): continue # drop thumbs if name.startswith('t_'): continue imageList.append(name) if len(imageList)==0: return '{"imList":[{"adr":"Finner ingen bilder i katalogen"}]}' random.shuffle(imageList) T='' for im in imageList: T+='{"adr":"%s"},'%im return '{"imList":[%s]}'%T[:-1] form=cgi.FieldStorage() print 'Content-type: text/plain\n' #expect to find: catalog if form.has_key('catalog'): catalog=form['catalog'].value print buildImageList(catalog) else: print '{"imList":[{"adr":"Finner ingen bilder"}]}'
Stilsettet
Stilsettet inneholder mulighet for å skrive ut bildene i ren form, uten menyer og overskrifter.
@media screen
{
body{
color: black;
font-family:"Verdana","Geneva","Arial","Times",sans-serif;
font-size:13px;
margin:5px;
text-align:center;
padding:0px;
}
.text{font-size:14px}
.dato{color:gray}
.mybutton{cursor:pointer;color:black;
background-color:#EED9B0;
border-style:solid;
border-width:thin;
margin-right:2px}
h2{background-color:#EED9B0;}
}
@media print
{
.printhide{display:none;font-size:16px;text-align:center}
}