!

Dette materialet blir ikke lenger vedlikeholdt. Du vil finne oppdatert materiale på siden: http://borres.hiof.no/wep/

HTML5
code
Børre Stenseth
HTML >Code

Code

Hva
Formattert kode

Vi har ofte behov for å presentere programkode, xmlkode eller annen kode på en lettlest og grei måte.

HTML5 [1] introduserer elementet code med følgende forklaring:

The code element represents a fragment of computer code. This could be an XML element name, a filename, a computer program, or any other string that a computer would recognize. Although there is no formal way to indicate the language of computer code being marked up, authors who wish to mark code elements with the language used, e.g. so that syntax highlighting scripts can use the right rules, may do so by adding a class prefixed with "language-" to the element.

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.

_domdemo1.py

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

Referanser
  1. HTML5 w3.org dev.w3.org/html5/spec/Overview.html 14-03-2011
  1. Google Code Prettyfy Google code.google.com/p/google-code-prettify/ 14-10-2010
Vedlikehold
B Stenseth, april 2011
( Velkommen ) HTML >Code ( Skriv og husk )