Code
Hva betyr dette ? En kunne tenke seg at dette introduserte støtte for "prettyprint" av kode, men slik er det ikke. code er ved nærmere øyensyn bare et markør-element på linje med f.eks. "blockquote". Nå er imidlertid en mer avansert løsning veldig nærliggende: Googles Prettyfy [2] . Google Prettyfy implementerer en elegant javascriptbasert parsing av de vanligste codetypene, basert på regulæruttrykk. Det er denne løsningen som er brukt på disse sidene. Vi kunne tenke oss å style opp code-elementet som et pre-element og merke det med den classen som Google bruker for å trigge en "prettyprint". Default stil for pre elementet er slik:
{display: block;
unicode-bidi:embed;
font-family:monospace;
white-space: pre}
Vi kan da gjøre følgende:
- gi code-elementet stil som angitt over
- inkludere referanser til Google's javascript
- inkludere referanse til et stilsett for code, f.eks. Googles eget forslag
- merke det code-elementet vi vil prettyprinte med class="prettyprint lang-js skiptranslate" (lang-js for javascript)
- starte javaskriptet prettyprint(), enten ved pageload eller ved et scriptelement nederst på siden
demo.html http://www.it.hiof.no/~borres/dw/ht5/code/demo.html
De sidene du leser nå er bygget med WXT. WXT bruker et litt mer avansert stilsett enn standardforslaget fra Google. WXT tar også høyde for at prettyprinting også må kunne lages uten å involvere en nettleser, f.eks. ved forberedelse av PDF. Dette er en opsjon som kan settes når WXT kjøres.
Eksempel på pythoncode, expandable.
Eksempel på Javascript, fast på siden.
/*
A pawn is described by an image. The alt-attribute describes the pawn
A square is a td. The square id is the td's id (a1..h8)
A move is a click and a new click
*/
// moving pawn
var selectedImage=null;
var moves=new Array();
// add an evenhandler (to a pawn)
function addEventSimple(obj,evt,fn)
{
if (obj.addEventListener)
obj.addEventListener(evt,fn,false);
else if (obj.attachEvent)
obj.attachEvent('on'+evt,fn);
//true:capture / false:bubble
}
function removeEventSimple(obj,evt,fn)
{
if (obj.removeEventListener)
obj.removeEventListener(evt,fn,false);
else if (obj.detachEvent)
obj.detachEvent('on'+evt,fn);
//true:capture / false:bubble
}
// idenitify all pawns (className="movable")
// and give them a click-event handler
function init()
{
var taglist=document.getElementsByTagName('*');
for(ix=0;ix<taglist.length;ix++)
{
if(taglist[ix].className=='movable')
{
addEventSimple(taglist[ix],'click',identify);
}
}
//addEventSimple(document,'click',release);
}
// identify the pawn(image) we have clicked
function identify(e)
{
// an event
if (!e)
var e = window.event;
// what
var what=e.type;
// where
if (e.target) targ = e.target;
else if (e.srcElement) targ = e.srcElement;
if (targ.nodeType == 3) // defeat Safari bug
targ = targ.parentNode;
if(selectedImage==null && targ.alt!='no')
{
selectedImage=targ;
// will set homemade cursor
document.getElementById('board').className="boardmove";
// mark the pawn(image) selected
selectedImage.className="moving";
}
else if(selectedImage!=null)
{
// this is a second click, place the pawn
document.getElementById('board').className="normal";
// unmark it
selectedImage.className="movable";
// move if it is legal, construct to be same as loaded moves
// mover,pawn,from,to
var theMove=new move(selectedImage.alt.charAt(0),
selectedImage.alt.substring(1),
selectedImage.parentNode.id,
targ.parentNode.id);
if(canMove(theMove))
{
// note the move
moves[moves.length]= theMove;
// perform the move
doMove(theMove);
// dump last move
document.getElementById('show').innerHTML=theMove.dumpLine();
// write moves as a list
writeMoves(moves,document.getElementById('moves'))
}
selectedImage=null;
}
// dont pass this click on
e.cancelBubble = true;
if (e.stopPropagation)
e.stopPropagation();
}
// perform an actual move
function doMove(theMove)
{
fromImage=theMove.fromIm;
toImage=theMove.toIm;
toHolder=toImage.parentNode;
fromHolder=fromImage.parentNode;
toHolder.removeChild(toImage);
fromHolder.removeChild(fromImage);
toHolder.appendChild(fromImage);
//always leave an empty clickable square
// must be clickable so we can catch a second (place it here) click
fromHolder.innerHTML='<img class="movable" src="no_piece.gif" alt="no">';
addEventSimple(fromHolder.firstChild,'click',identify);
// take off board if something was there
if(toImage.alt.charAt(0)!='n')
document.getElementById('removed').appendChild(toImage);
}
Vi kan styre stilsettet slik at print displayer hele koden, prøv Print preview