Index

Output voor de gebruiker

Pagina aanmaken in powerbasic zelf

We hebben reeds een voorbeeld gezien van het maken van een HTML output bestand in de inleiding.
Bij het versturen van het bestand over het internet moeten er ook headers bijgeplaatst worden (HTTP 1.1 enz). De webserver zelf kan deze headers aanmaken, maar in sommige gevallen kan het nuttig zijn de headers zelf te schijven, bijvoorbeeld als je een non-standard bestand wenst te versturen, of als je gecomprimeerde bestanden (gzip) verstuurt. Aan dit laatste onderwerp wordt een apart hoofdstuk gewijd.
Normaal worden de headers door Xitami zelf aangemaakt, en dit is gemakkelijk, want bij het aanmaken van de outputfile weten we nog niet hoe lang die zal zijn.

Een HTML pagina in powerbasic genereren is enkel aangeraden voor korte pagina's of pagina's met repeterende inhoud (tabellen) omdat de tekst niet aangepast kan worden (de source zou iedere keer opnieuw gecompileerd moeten worden als je de tekst zou willen wijzigen). HTML gebruikt enkel het ASCII character set, zodat het gebruik van Unicode zinloos is (Visual basic gebruikt standaard Unicode).


Werken met een template

FUNCTION PBMAIN()
   ...
   OPEN $path + "template1.htm" FOR BINARY ACCESS READ SHARED AS #1
   GET$ #1, LOF(1), a$: CLOSE #1
   REPLACE "<*customer*>" WITH customer$ IN a$ 
   REPLACE "<*address*>" WITH address$ IN a$
   OPEN ENVIRON$("CGI_STDOUT") FOR OUTPUT AS #1
   PRINT #1, a$
   CLOSE
   ...
END FUNCTION

Een template lijkt een beetje op een PHP-bestand, waarbij tags door variabelen in het programma gewijzigd worden. Een extreem voorbeeld zou zijn dat je je eigen PHP interpreter zou schrijven.
Het voordeel van een template is dat je de output volledig kan wijzigen enkel door de template aan te passen.


Text omzetten naar html
Gewone tekst kan bijvoorbeeld een recensie zijn, een brief, een bericht dat in een forum gepost is. Een textbestand bestaat eigenlijk in meerdere formaten: DOS TEXT, WINDOWS TEXT, UNICODE TEXT,... . Indien je een WINDOWS TEXT naar de browser stuurt, dan zal die in de meeste gevallen de tekst kunnen weergeven, zelfs al zijn de speciale tekens ( æ å ß …) geen deel van het HTML formaat.

Met de header in de kop van je HTML file >meta charset='ISO-8859-1'< geef je aan de browser aan dat je dezelfde encoding zal gebruiken in je HTML bestanden als de standaard windows TEXT encoding.

Er bestaan zo'n 70-tal tekens die omgezet moeten worden in HTML entities. In deze zipfile kan je de conversiebestanden vinden voor dostext en wintext. Dostext kan je lezen met EDIT (een oude dos programma), wintext met NOTEPAD.

Dit is de kode voor het lezen van n van de vertalingsfiles. Om de vertaling te versnellen is het aangeraden het configuratiebestand te trimmen zodat het enkel de tekens bevat die effektief gebruikt worden. Het configuratiebestand wordt dan text2html.txt genoemd. Als je de bovenvermelde mata charset gebruikt in de header van je HTML file, dan moet je de meeste letters met accenten zoals ,... niet meer converteren.

Het HTML kan meer tekens weergeven dan de 256 tekens van het ASCII tekenset, daarom zal je nog steeds HTML entities moeten gebruiken, bijvoorbeeld voor het €-symbool, die niet gedefinieerd is in ASCII.


GLOBAL htm
GLOBAL zi$()
GLOBAL zp$()
FUNCTION PBMAIN()
    ...
    OPEN $path + "text2html.txt" FOR INPUT ACCESS READ SHARED AS #1
    FILESCAN #1, RECORDS TO htm
    SEEK #1, 1
    DIM zi(1 TO htm) AS GLOBAL STRING * 1, zp(1 TO htm) AS GLOBAL STRING
    FOR i = 1 TO htm
        LINE INPUT #1, a$
        zi$(i) = LEFT$(a$, 1)
        zp$(i) = MID$(a$, 2) + ";"
    NEXT i
    CLOSE #1
   ...
END FUNCTION

Hier vindt de conversie plaats:


FUNCTION html$ (c$) STATIC
    d$ = ""
    FOR i = 1 TO LEN(c$)
        b$ = MID$(c$, i, 1): j = ASC(b$)
        IF j > 31 THEN                               ' ASCII kodes lager dan 32 worden verwijderd
            IF j = 60 THEN                                
                b$ = "<"                      ' Dit zijn de standaard HTML entities
            ELSEIF j = 62 THEN                       ' die altijd aanwezig zijn
                b$ = ">"
            ELSEIF OR j = 38 THEN
                b$ = "&"
            ELSEIF j > 122 THEN                      ' We bekijken enkel de ASCII-waarden die buiten
                FOR k = 1 TO htm                     ' het alfanumeriek en symbolic gebied liggen.
                    IF zi$(k) = b$ THEN
                        b$ = zp$(k)
                        EXIT FOR                     ' Er kan hier geen optimalisatie (gebruik van
                   END IF                            ' pointers) omdat de resulterende string groter
                NEXT k                               ' is dan het origineel
            END IF                                   
            d$ = d$ + b$ 
        END IF
    NEXT i
    html$ = d$
END FUNCTION

Ondanks alles is de kode redelijk snel omdat de binnenste lussen enkel uitgevoerd worden als er een teken omgezet moet worden. De kode is in ieder geval veel sneller dan deze eenvoudige loop:

    FOR k = 1 TO htm
        REPLACE zi$(k) WITH zp$(k) IN c$
    NEXT k

Index

Individuele landingspage bezoekers: