Auteur: Olivier Auverlot
Version 3.1.0
Date: 2 décembre 2004Magic! est une extension au serveur HTTP Apache permettant de concevoir des pages web mélangeant du code HTML et du code Rebol. Les pages ayant le suffixe RHTML sont automatiquement redirigées vers Magic! qui exécute alors les sections de code Rebol rencontrées. Les instructions Rebol peuvent être placées au sein du code HTML mais également au début ou à la fin de la page. Les balises <rebol> et </rebol> permettent respectivement de marquer le début et la fin d'une section de code.
Magic! a été testé avec les versions 1.3.x et 2.0.x du serveur Apache sur les plateformes suivantes :
Les fonctions de Magic! débutant par la séquence "m-" ne doivent pas être utilisées ou modifiées par l'utilisateur. Elles sont réservées au fonctionnement interne de Magic!. Ces instructions sont susceptibles d'être modifiées dans le futur.
Copyright notice:
(C) 2004 Olivier Auverlot
This software is provided 'as-is', without any express or implied
warranty. In no event will the author be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Olivier Auverlot
olivier.auverlot@free.frLe fichier MAGIC.CGI doit être copié dans le répertoire CGI-BIN de votre serveur Apache. Sous Unix, les droits d'exécution doivent être correctement activés.
chmod 755 magic.cgi
La première ligne du code contient le chemin d'accès vers l'évaluateur Rebol utilisé sur votre serveur, vous devez obligatoirement le modifier.
Exemple pour un système Unix : #!/opt/command/rebol -cs
Exemple pour un système Microsoft Windows : #!c:/rebol/rebol -csLes variables M-LIBRARY-PATH et M-SESSIONS-PATH doivent être correctement renseignées selon la configuration de votre serveur :
AddHandler magic rhtml
Action magic /cgi-bin/magic.cgiSi une page rhml doit être une page de démarrage, vous devez modifier la directive DirectoryIndex afin qu'Apache considère ce type de document comme devant être exploité lors d'une entrée dans un répertoire :
DirectoryIndex index.rhtml index.html
Afin d'éviter l'occupation du temps processeur par des pages rhtml contenant des boucles infinies, il vous est recommander de fixer un temps d'exécution limite. Pour cela, utilisez la directive RLimitCPU suivante afin de limiter le temps d'exécution des pages RHTML à 30 secondes :
RLimitCPU 30
Une fois ces opérations réalisées, vous devez relancer le serveur afin qu'il prenne en compte les modifications.
Le code écrit en Rebol doit être placé entre des balises <REBOL> et </REBOL> au sein même de la page HTML. L'exemple suivant (SAMPLE1.R) affiche la date et l'heure courante :
<html>
<head><title>Sample1</title></head>
<body>
Bonjour, nous sommes le
<rebol>
print [ now/date "<br><br>" ]
</rebol>
Il est actuellement :
<rebol>
print [ "<b>" now/time "</b>" ]
</rebol>
</body>
</html> Vous pouvez déclarer des variables, des objets et même des fonctions. Magic! n'impose pas de limitations au programmeur. Il est également possible d'utiliser les fonctionnalités avancées de Rebol/Command. L'exemple suivant (SAMPLE2.R) accède à une base de données MySQL et affiche le résultat sous la forme d'un tableau.
<html>
<head></head>
<body>
<h1>Membre du personnel</h1>
<rebol>
con: open mysql://homer:marge@serveurmysql/base
p: first con
insert p join "select * from personnes"
rep: copy p
close p
close con
prin "<rebol border=1>"
foreach ligne rep [
prin "<tr>"
foreach ele ligne [
prin [ "<td>" ele "</td>" ]
]
print "</tr>"
]
prin "</table>"
</rebol>
</bpdy>
</html> A l'aide des balises <%= et %>, vous pouvez également afficher le résultat de l'évaluation d'une variable ou d'une expression Rebol.
<rebol>
variable: 10
nom: "Dupont"
prenom: "Pierre"
</rebol>
<html>
<head></head>
<body>
Variable vaut <%=variable%><br>
Vous êtes <%=join nom [ " " prenom ] %>
</body>
</html>Une page RHTML peut recevoir et exploiter les données provenant d'un formulaire HTML. L'attribut ACTION du formulaire doit indiquer le nom de la page RHTML. La méthode (attribut METHOD) peut avoir la valeur GET ou la valeur POST. Magic! détecte seul la méthode utilisée et sait les exploiter toutes les deux. Les données reçues dans une page RHTML sont accessibles à l'aide de l'objet VARS pour lequel chaque propriété correspond à un champ du formulaire émetteur. L'exemple suivant est composé deux pages. La première est une page HTML (SAMPLE3_1.HTML) demandant la saisie du nom de l'utilisateur :
<html>
<head><title>Sample3_1</title></head>
<body>
<form name="formulaire" method="GET" action="sample3_2.rhtml">
Quel est votre nom<BR>
<input type="field" name="nom" value="">
<input type="submit" value="Valider">
</form>
</body>
</html>Le formulaire est ensuite transmis à la page SAMPLE3_2.RHTML dont la fonction est d'afficher un sympathique "Bonjour !" suivi du nom de l'utilisateur :
<html>
<head><title>Sample3_2</title></head>
<body>
<rebol>
print [ "Bonjour!" vars/nom ]
</rebol>
</body>
</html>Si le formulaire est de type multipart/form-data, Magic! peut être utilisé afin de pratiquer le transfert de fichiers du poste client vers le serveur http. Les fichiers reçus par Magic! sont accessibles à l'aide de l'objet VARS. Chaque fichier est représenté par un objet possédant quatre propriétés qui sont :
Si vous voulez mettre un ensemble de fonctions à la disposition des utilisateurs, vous pouvez déclarer un répertoire dédié dont le chemin d'accès est contenu dans la variable M-LIBRARY-PATH, déclarée dans le fichier MAGIC.CGI. Pour utiliser une bibliothèque, l'utilisateur doit utiliser le mot LIBRARY suivi du nom de fichier. Ce mot returne une valeur booléenne selon la réussite ou l'échec du chargement. L'exemple qui suit, présente l'intégration de la librairie MySQL de Nenad Rakocevic au sein d'une page RHTML :
<html>
<head>Sample 5_1</head>
<body>
<rebol>
if library %mysql-protocol.r [
db: open mysql://olivier:homer@172.29.143.1/musiquedb
insert db [ "select distinct artiste from disques order by artiste" ]
while [ not empty? (nom: first db) ] [
print join nom "<BR>"
]
close db
]
</rebol>
</body>
</html>Si une librairie est spécifique à un projet et que son stockage dans le répertoire M-LIBRARY-PATH ne présente aucun intérêt pour les autres utilisateurs, il vous est possible de la placer dans le répertoire de votre application web. Dans ce cas, il vous faut utiliser le raffinement /private.
Exemple:
<hthml>
<head></head>
<body>
<rebol>
if library/private %malibamoi.r [
print "Librairie chargée"
]
</rebol>
</body>
</html>Le répertoire courant est le chemin d'accès à la page RHTML en court d'éxecution. Ce chemin peut être obtenu à l'aide de la variable CURDIR.
<html>
<head>Sample 6_1</head>
<body>
<rebol>
print [ "le répertoire courant est : " curdir ]
</rebol>
</body>
</html>Les pages rhtml d'un projet peuvent être regroupée sous la forme d'une application. Chaque application porte un nom afin de la distinguer des autres et est représentée "physiquement" par un objet stocké dans le répertoire M-SESSIONS-PATH de Magic!. Cette objet comporte des propriétés et méthodes communes aux différents utilisateurs de l'application. La modification de la valeur d'une propriété de l'application par un utilisateur peut alors être prise en compte par l'ensemble des utilisateurs. Cette persistence et ce partage de données permet ainsi de mettre en place rapidement des outils tels qu'un compteur d'accès ou encore un cache, destiné au stockage d'informations provenant d'une base de données (évitant ainsi d'incessantes requêtes SQL). Les méthodes d'application sont généralement des fonctions spécifiques à l'application et n'ont donc pas leur place dans le répertoire m-library-path. Les propriétés et méthodes sont accessibles à l'aide de l'objet APPLICATION. Le nom de l'application active peut être connu à l'aide de la variable MAGICAPPID. Le concept d'application prend tout son intérêt s'il est utilisé conjointement aux sessions. Malgré tout Magic! vous laisse le choix et offre au programmeur une architecture très souple.

Pour créer une application, vous devez utiliser le mot APPLICATION-CREATE suivi du nom de l'application et d'un bloc contenant les propriétés et méthodes. Certaines propriétés sont définies automatiquement à la création de l'application:
Exemple:
application-create "TEST" [
score: make integer! 0
ajoute: func [] [
score: score + 1
]
]A l'aide du raffinement /owner, il vous est possible de spécifier un propriétaire pour l'application. Sur un serveur hébergeant différents utilisateurs, cet identifiant permet de sécuriser la création et la destruction d'une application.
Exemple:
application-create/owner "TEST" [
score: make integer! 0
ajoute: func [] [
score: score + 1
]
] "monidentifiantsecret"La création d'une application ne doit être réalisée qu'une seule fois à l'initialisation de l'application web. Le mot APPLICATION-EXISTS? vous permet de contrôler l'existence de l'application et ainsi d'éviter l'écrasement de l'objet d'application.
Exemple:
either not application-exists? "TEST" [
application-create "TEST" [
score: make integer! 0
ajoute: func [] [
score: score + 1
]
]
print "L'application est démarrée"
] [ print "L'application existe déjà" ]Une fois l'objet généré, les pages rhtml n'ont plus qu'à se connecter à l'application.
Créer une application ne suffit pas pour pouvoir l'utiliser, le mot APPLICATION-BIND suivi du nom de l'application, permet à l'utilisateur de se connecter à l'application. La transmission du MAGICAPPID entre les pages peut se faire de deux façons différentes. Si le raffinement /cookie est utilisé, Magic! génère un cookie MAGICAPPID et gère automatiquement sa réception. Dans le cas contraire, c'est au programmeur de transférer le MAGICAPPID à l'aide des fonctions de réécriture d'url intégrées dans Magic!.
Exemple:
application-bind/cookie "TEST"
Il est souvent très pratique de savoir si une application est active avant de vouloir l'utiliser. Pour cela, vous disposez du mot APPLICATION? qui retourne une valeur booléenne.
Exemple:
either not application? [
application-bind "TEST"
print [ "Utilisation de l'application " MAGICAPPID ]
] [ print [ MAGICAPPID " est déjà en cours d'utilisation pour ce client" ] ]Pour utiliser l'objet application, il vous suffit d'utiliser l'objet APPLICATION.
Exemple:
print application/score
application/ajouteLa fonction insert-MAGICAPPID insère un champ caché dans un formulaire. La fonction rewrite-url permet également de générer une url contenant le MAGICAPPID.
Le mot APPLICATION-DESTROY détruit l'objet d'application MAGICAPPID.
Exemple:
either application? [
print "tente destruction"
application-destroy
print "Application détruite"
] [
print "Pas d'application active"
]Si l'application a un propriétaire, l'identifiant /owner lui permet de s'identifier pour autoriser la destruction de la session.
Exemple:
either application? [
print "tente destruction"
application-destroy/owner "monidentifiantsecret"
print "Application détruite"
] [
print "Pas d'application active"
]Magic! autorise la création et la manipulation de sessions. Une session identifie un utilisateur et permet de conserver sur le serveur, des variables de session stockées dans un objet nommé SESSION. Le principal problème de l'utilisation des sessions réside dans le fait que HTTP est un protocole ignorant la notion de connexion persistante. Il est malheureusement impossible de savoir si l'utilisateur est toujours connecté et donc de déterminer si l'objet de session qui lui a été attribué, doit toujours être conservé.
Une session est identifiée par un marqueur unique nommé MAGICSESSID. Vous avez accès au contenu de ce mot mais vous devez surtout pas modifier sa valeur lorsqu'un session est ouverte. Si aucune session n'est active, MAGICSESSID contient la valeur NONE.
Le mot SESSION-START permet de créer une session. Magic! génère alors un identifiant et l'attribut au mot MAGICSESSID. Le temps de vie maximum d'une session est fixé par défaut à 30 minutes mais vous pouvez le modifier à l'aide du raffinement /EXPIRE suivi du délai exprimé selon le format hh:mm:ss.
Le transport du MAGICSESSID peut être réalisé de deux manières différentes :
session-start/cookie/expire 0:0:30
Avec le mot SESSION-VARS, vous définissez les variables appartenant à la session. SESSION-VARS peut être utilisé à plusieurs reprises durant l'exécution de votre application : les nouvelles variables de session créées seront ajoutées à celles déjà existantes. Les variables de sessions sont définies à l'aide d'une série de blocs. Chaque bloc contient le nom de la variable et sa valeur d'initialisation.
session-vars [ [ login: "" ] [ id: none ] ]
Une variable de session est accessible à l'aide de l'objet SESSION :
print session/login
print session/idLe mot SESSION-DESTROY permet de forcer la destruction d'une session. Lorsqu'il est exécuté, ce mot efface l'objet de session et en avertit le daemon MSMD. Toutes les variables de session sont définitivement perdues.
Le mot SESSION? retourne une valeur booléenne selon qu'une session est active ou n'existe pas.
L'exemple suivant est un simple compteur. A chaque chargement de la page RHTML, la valeur de la variable de session VALEUR est incrémenté d'une unité. A son exécution, la page vérifie si la session est déjà initialisée. Si la session n'est pas active, elle est créée avec un temps de vie de 5 minutes et la variable de session VALEUR est initialisée.
<html>
<head></head>
<body>
<rebol>
if not session? [
session-start/cookie/expire 0:5:0
session-vars [ [ valeur: 0 ] ]
]
print join "<h1>" [ session/valeur "</h1>" ]
session/valeur: session/valeur + 1
</rebol>
</body>
</html>La fonction insert-MAGICSESSID insère un champ caché (hidden) dans un formulaire afin de transmettre le marqueur de session au serveur.
La fonction link permet la génération d'un lien hypertexte dans la page html. Elle reçoit deux arguments qui sont le texte du lien et l'url de destination. Le raffinement /rewrite permet d'activer la réécriture de l'url afin d'insérer l'identifiant de l'application (MAGICAPPID) et le MAGICSESSID de la session active.
link/rewrite "Page suivante" "mapage.rhtml"
Le raffinement /image indique que le texte passé en paramètre est le nom d'un fichier image (gif,png ou jpeg).
link/image/rewrite %suite.png "mapage.rhtml"
Le raffinement /target détermine le mode d'ouverture de la page appellée ('blank, 'top ou 'self).
link/target "Retour" "mapage.rhml" 'top
La technologie wand présente dans Magic! autorise la création de composants autonomes distribués sur le réseau. A l'aide de la balise <object>, ces composants peuvent être intégrés dans une page RHTML. Il est ainsi possible de fournir des composants RHTML exploitables directement par un concepteur de page HTML et ceci, à l'aide d'un éditeur de pages web tel que Macromedia Dreamweaver ou Microsoft Frontpage.
Pour être intégré dans une page rhtml, un composant wand utilise la balise <object> et a pour identificateur "clsid:magic-wand". Les différentes propriétés disponibles sont :
Si le comportement d'un composant doit être paramètré, la balise <object> dispose des options <param>.
Exemple:
<object classid="clsid:magic-wand" id="testpanel"
width="300"
height="100"
border="2"
bgcolor="#CC00CC"
codebase="http://localhost/magic/testpanel-wand.r">
<param name="caption" value="Panel de test">
<param name="valdeb" value="1">
<param name="valfin" value="5">
</object>Un composant wand est un objet Rebol stocké sur un serveur web. Le composant wand le plus simple a la forme suivante :
context [
start: func [] []
]Lorsque Magic! exploite un composant wand, le processus charge l'objet et appelle sa méthode start. L'objet a accès à l'ensemble des données de configuration du processus Magic! et à l'intégralité des données manipulées dans la page rhtml.

Un composant wand peut disposer de propriétés et de méthodes. Lorsqu'un paramètre est invoqué dans la balise <object>, celui ci correspond en fait à une propriété publique du composant.
Exemple:
context [
caption: make string! ""
valdeb: make integer! 0
valfin: make integer! 0
prt: does [ print "Un sondage...<br>" ]
start: func [ /local i ] [
print caption
br
prt
radio-group/selected "sexe" [ "Masculin" "Féminin" ] "Masculin"
button "Valider" "Valider"
]
]Lorsqu'un composant wand a été exécuté par Magic!, le code rhtml présent dans page peut toujours accéder aux valeurs de ses propriétés et aux valeurs de retour des méthodes à l'aide du nom porté par le composant (id). Ainsi, si le composant wand se nomme testpanel et que celui comporte une propriété retour, il vous est possible de l'exploiter par la syntaxe testpanel/retour. De même, une méthode peut être utilisée ou réutilisée durant l'intégralité du temps de traitement par Magic! de la page rhtml contenant le composant.
Magic! 2.0 dispose d'un mécanisme de cache permettant de réduire considérable la charge du serveur http et le temps d'attente pour l'obtention d'une page rhtml par le client. Le principe du cache consiste à définir un temps de validité pour une page rhtml: la page n'est reconstruite par Magic! que lorsque ce temps de validité est dépassé. Magic! laisse la possibilité aux concepteurs de choisir si leurs pages doivent ou ne doivent pas être pris en compte par le cache si celui ci est activé.
Pour utiliser le cache, vous devez éditer le fichier magic.cgi et modifier la valeur de la variable m-cache-delay. Si cette variable contient la valeur none, le cache n'est pas actif (le page rhtml appelée est systèmatiquement reconstruite à chaque requête d'un client). Si la variable contient une valeur temporelle telle que 0:5:0, le cache est activé et les pages rhtml disposent ici d'un temps de validité fixé à 5 minutes. Vous devez également créer un sous répertoire nommé cache dans le répertoire contenant vos pages rhtml. Si ce cache n'est pas trouvé, Magic! ignore la valeur de la variable m-cache-delay et reconstruit systèmatiquement les documents rhtml. Ce mode de fonctionnement permet d'avoir sur un même serveur des sites utilisant le cache et d'autres ne l'utilisant pas. Au niveau sécurité, il vous est recommandé d'attribuer le moins de droits possibles sur le ou les répertoires cache (généralement, ils appartiennent à l'utilisateur/groupe groupe apache et ne disposent que du droit 700 afin de limiter la lecture et l'écriture pour cet utilisateur).
Si un site utilise un cache mais contient des pages devant être systèmatiquement reconstruites, vous pouvez insérer dans votre page rhtml la directive <!-- #nocache -->. Si Magic! rencontre cette directive, il ignore le paramètrage du cache et reconstruit systèmatiquement la page.
Configuration du serveur :
Configuration de l'injecteur:

Par défaut, l'ensemble des utilisateurs partage le même environnement. Les librairies sont stockées dans le M-LIBRARY-PATH, les sessions et les applications dans le M-SESSIONS-PATH. Dans certain cas, l'administration du serveur peut nécessiter la création d'environnements particuliers. Ces opérations sont réalisables à l'aide de deux fichiers qui sont:
Ce fichier est créé par l'utilisateur à la racine de son site. Le dialecte d'administration ne contient qu'une seule commande lui permettant de fixer la durée de validité du cache de Magic!.
Exemple:
[
cache-delay: 2:0:0
]Ce fichier est créé par l'administrateur du serveur à la racine du site de l'utilisateur. Pour éviter que l'utilisateur ne le modifie, il vous est recommandé de fixer les droits en lecture seule. Le dialecte d'administration dispose de deux commandes qui sont:
Exemple:
[
library-path: %/var/www/apl/utilisateur1/lib/
session-path: %/var/www/apl/utilisateur1/sessions/
]Magic! tient en compte des problèmes de sécurité posés par l'utilisation de pages RHTML, contenant du code exécuté par le serveur HTTP. La politique de sécurité fixe donc des limites à la liberté de l'utilisateur :
La stratégie de sécurité est donc :
file [ throw all ]
(curdir) allow
(m-library-path) [ allow read ]
(m-sessions-path) allow
(m-cache-path) allowVous avez la possibilité de la modifier en éditant le code du fichier MAGIC.CGI.
Magic! met à la disposition du programmeur deux fonctions dédiées à l'exploitation des cookies :
La fonction SETCOOKIE reçoit au minimum deux paramètres qui sont le nom du cookie et la valeur de ce dernier.
setcookie "moncookie" "valeur du cookie"
Quatre raffinements permettent d'affiner le comportement du cookie :
Le champs EXPIRES permet de définir la durée de vie d'un cookie. Si cette information est absente, le cookie a une existence limitée à la session du client : lorsque le client quitte le navigateur, le cookie est effacé. Il est possible de spécifier une "date limite de consommation".
Le PATH permet de spécifier un chemin du domaine d'appartenance du cookie (champ optionnel DOMAIN) pour lequel le cookie est envoyé au serveur. Avant de retourner un cookie à un serveur, votre navigateur vérifie que votre requête concerne bien le domaine et le chemin pour lesquels le cookie est autorisé à voyager. Le rôle de cette fonctionnalité est d'éviter que les cookies puissent être lus par un autre serveur que celui qui les a créés. Si le PATH est fixé à la valeur /, l'envoi d'un cookie par un poste client est autorisé pour l'ensemble des URL du serveur d'origine.
Si un cookie est marqué SECURE, il n'est transmis à un serveur que si celui-ci est sécurisé par une méthode de chiffrement de type SSL.
La fonction GETCOOKIE permet de récupérer la valeur d'un cookie. Si celui-ci n'existe pas, la fonction retourne la valeur NONE.
valeur: getcookie "moncookie"
L'exemple suivant est composé de deux pages RHTML. La première (SAMPLE4_1.RHTML) envoie un cookie nommé "sample41" et contenant la valeur "test".
<html>
<head><title>Sample4_1</title></head>
<body>
<rebol>
setcookie "sample41" "test"
</rebol>
Le cookie "sample41" a été envoyé, <a href="sample4_2.rhtml">cliquez ici</a> pour lire sa valeur
</body>
</html>Une fois que l'utilisateur a cliqué sur le lien, la page SAMPLE4_2.RHTML est exécutée. La valeur du cookie est récupérée et affichée dans le navigateur :
<html>
<head><title>Sample4_2</title></head>
<body>
<rebol>
print [ "le cookie 'sample41' a la valeur : " (getcookie "sample41") ]
</rebol>
</body>
</html>La fonction template suivi du nom d'un fichier permet d'inclure un modèle de document dans votre page rhtml. Ce fichier est une page rhtml pouvant contenant des balises <rebol> et </rebol>. Des variables peuvent être directement incluses dans ce fichier: elles sont entourés par les balises <%= et =>.
<rebol>
print now/time
</rebol>
<form>
<input type="field" value=<%=nom%>>
<input type="field" value=<%=prenom%>>
<input type="hidden" name="MAGICSESSID" value=<%=MAGICSESSID%>>
<rebol>
print now/date
</rebol>
</form>Généralement, les modèles de document sont spécifiques à un projet et résident donc dans l'arborescence de l'application web qui les utilise. Si des templates doivent être partagés entre différentes applications, il vous est possible de les stocker dans le répertoire M-LIBRARY-PATH et de les utiliser à l'aide du raffinement /shared.
Exemple:
<html>
<head></head>
<body>
<rebol>
template/shared %entete.rhtml
</rebol>
</body>
</html>Magic! dispose d'un mode de deboggage qui provoque la division de l'écran en deux zones. Sur la droite, la page html est affichée. Sur la gauche, les traces générées par le programmeur et le temps d'exécution de la page dynamique sont consultables. L'envoi de données sur la zone de deboggage est réalisé à l'aide de la fonction debug. L'activation du mode deboggage est déclenché automatiquement lorsque Magic! exécute la première instruction debug rencontrée.
Exemple:
<html>
<head></head>
<body>
print "Démontration du mode de deboggage"
<rebol>
repeat i 10 [
debug [ "valeur de i = " i ]
]
</rebol>
</body>
</html>La fonction HEADER permet la construction d'un entête HTTP personnalisé. La valeur par défaut ("Content-type: text/html") peut ainsi être modifiée afin d'utiliser les différentes directives du protocole HTTP.
L'exemple suivant modifie le type MIME du document généré par la page SAMPLE5_1.RHTML en le fixant sur text/plain :
<rebol>
header "Content-type: text/plain"
print "Cette page est une simple page de texte"
</rebol> A l'aide de la fonction REDIRECT, une page RHTML peut générer une redirection vers un autre document. L'argument de cette fonction est une url ou une chaine de caractères.
<rebol>
redirect http://monserveur/monautrepage.rhtml
</rebol>
<html>
<head></head>
<body>
Ce texte n'apparaît pas sur l'écran
</body>
</html>A l'aide la fonction ON-ERROR, il est possible de rediriger l'exécution d'une application vers une page html ou rhtml. L'argument de cette fonction est une url ou une chaine de caractères.
<rebol>
on-error "mapagerreur.html"
</rebol>
<html>
<head></head>
<body>
<%=2 / 0%>
</body>
</html>La fonction TO-HTMLCOLOR suivi d'une couleur exprimée en RGB retourne le code de la couleur dans le format HTML.
to-htmlcolor 255.255.0
>> "#FFFF00"La fonction MAGIC-ENV génére un tableau affichant les variables d'environnement CGI.
La fonction rewrite-url reçoit en paramètre une url ou une chaine de caractères. Elle retourne une url contenant le MAGICAPPID et le MAGICSESSID.
La fonction MAGIC-VERSION retourne le numéro de version de Magic!.
A partir de la version 2.0, Magic! est livré avec un ensemble de composants HTML de haut niveau. Ces composants sont stockés dans le fichier html.r qu'il vous faut copier dans le répertoire contenant les librairies partagées de Magic!. L'apparence de ces composants est paramètrable à l'aide de la feuille de style magic.css.
body - fond de la page html
a:hover - lien hypertexte survolé
a:active - lien hypertexte
a:visited - lien hypertexte visité
a.calendar - lien hypertexte dans le composant calendar
a.article - lien hypertexte sur l'annonce d'un article
a.news - lien hypertexte sur une news
span.news - texte décrivant les news
span.resultsselected - numéro d'un résultat de recherche sélectionné
th.magic - entête des tableaux générés par Magic!
th.menulist - entête d'un menu de navigation
th.news - Entête d'une zone de news
th.calendar - entête du composant calendar
th.rss - entête d'un tableau pour le composant rss-channel
td.magic - cellule des tableaux générés par Magic!
td.magicalt - couleur alternative pour les cellules des tableaux
td.calendar - cellule du tableau pour le composant calendar
td.selected - cellule sélectionnée dans le composant calendar
td.highlight - date courante dans le composant calendar
p.small - paragraphe de texte avec une petite fonte
p.normal - paragraphe de texte avec une fonte normale
p.medium - paragraphe de texte (taille moyenne et caractères gras)
p.title - paragraphe de texte (taille maximum et caractères gras)
div.css - calqueCertain composants html dispose d'un raffinement link qui autorise la génération d'url à la volée. La valeur courante (la date pour le composant calendar, la valeur d'une colonne pour le datagrid, etc.) est stockée dans la propriété html/value. Pour chaque donnée traitée, le bloc de code Rebol est évalué et sa valeur de retour est utilisée pour constituer un lien hypertexte.
datagrid/columns/link data [ "Nom" "Prenom" ] [
join "http://serveur/page?cle=" html/value
] Si vous désirez utiliser différentes langues, la librairie html.r dispose de l'objet MAGIC-LOCALE qui recense les différents textes utilisés par les composants html fournis.
login - Compte utilisateur
password - Mot de passe
validate - Opération de validation USAGE:
BR /count nbr
DESCRIPTION:
Insère un ou plusieurs retours à la ligne
BR is a function value.
REFINEMENTS:
/count
nbr -- Nombre de retours à la ligne (Type: any)Exemple:
br/count 2
USAGE:
HR
DESCRIPTION:
Insère une ligne de séparation
HR is a function value. USAGE:
CENTER code
DESCRIPTION:
aligne au centre de l'écran
CENTER is a function value.
ARGUMENTS:
code -- (Type: block)Exemple:
center [
print now/time
] USAGE:
CODE cde
DESCRIPTION:
Affichage avec une police à pas fixe (avec retours à la ligne)
CODE is a function value.
ARGUMENTS:
cde -- Code Rebol évalué (Type: block)
USAGE:
GRID code
DESCRIPTION:
Affiche des éléments dans un tableau
GRID is a function value.
ARGUMENTS:
code -- Code Rebol évalué (Type: block)Chaque ligne est définie par trois éléments qui sont l'alignement horizontal('left, 'center ou 'right), l'alignement vertical ('top, 'middle, 'bottom,'baseline) et l'élément devant être affiché. Si l'élément est une valeur, elle est affichée. Si l'élément est un bloc, le code contenu est évalué.
Exemple:
grid [
[
[ 'right 'middle "Votre nom:" ]
[ 'left 'middle [ field "nom" "Auverlot" ] ]
]
[
[ 'right 'middle "Votre prénom:" ]
[ 'left 'middle [ field "prenom" "Olivier" ] ]
]
[
[ 'right 'top "Votre sexe:" ]
[ 'left 'top [
radio-group/selected "sexe" [ "Masculin" "Féminin" ] "Masculin" ]
]
]
]
USAGE:
FIELDSET name code
DESCRIPTION:
Affiche un groupe de champs de saisie
FIELDSET is a function value.
ARGUMENTS:
name -- Nom du groupe (Type: string)
code -- Code Rebol évalué (Type: block)Exemple:
fieldset "Langages utilisés" [
checkbox-group "langages" [
"Rebol"
"Lisp"
"Java"
"Logo"
]
] USAGE:
CSS url
DESCRIPTION:
Insère une feuille de style dans la page html
CSS is a function value.
ARGUMENTS:
url -- Feuille de style (Type: string url)Exemples:
css "magic.css"
css http://monserveur.domaine.org/proj/magic.css USAGE:
BOX name xy wh code /noborder /zindex zidx /backcolor bcol
DESCRIPTION:
Définition d'un calque
BOX is a function value.
ARGUMENTS:
name -- Nom du calque (Type: string)
xy -- Coordonnées de départ (Type: pair block)
wh -- Dimensions (Type: pair block)
code -- Composants présents dans le cadre (Type: block)
REFINEMENTS:
/noborder -- Pas de bordure
/zindex
zidx -- Position verticale (Type: integer)
/backcolor
bcol -- Couleur de fond (Type: tuple)Exemples:
box "calque1" 1x1 100x100 [ text "calque1" ]
box "calque2" 100x1 [ "100%" 100 ] [ text "calque2" ]
box/noborder "calque3" 100x100 [ "100%" "auto" ] [ text "calque3" ]
box/zindex "calque4" 200x200 100x100 [ text "au dessus" ] 10 USAGE:
WEBFORM name action method code /enctype ct /rewrite
DESCRIPTION:
Insertion d'un formulaire
WEBFORM is a function value.
ARGUMENTS:
name -- Nom du formulaire (Type: string)
action -- page rhtml ou script CGI recevant les données du formulaire (Type: string url)
method -- méthode utilisée pour l'envoi ('get ou 'post) (Type: word)
code -- Description du formulaire (Type: block)
REFINEMENTS:
/enctype
ct -- Type du contenu (Type: string)
/rewrite -- Insertion automatique du MAGICAPPID et du MAGICSESSIDExemple:
webform/rewrite "Utilisateur" "enregistre.rhtml" 'post [
grid [
[
[ 'right 'middle "Votre nom:" ]
[ 'left 'middle [ field "nom" "" ] ]
]
[
[ 'right 'middle "Votre prénom:" ]
[ 'left 'middle [ field "prenom" "" ] ]
]
[
[ 'right 'top "Votre sexe:" ]
[ 'left 'top [ radio-group/selected "sexe" [ "Masculin" "Féminin" ] "Masculin" ] ]
]
[
[]
[ 'right 'middle [ submit "Valider" ] ]
]
]
] USAGE:
SUBMIT txt
DESCRIPTION:
Insère un bouton de soumission
SUBMIT is a function value.
ARGUMENTS:
txt -- Intitulé du bouton (Type: string) USAGE:
RESET txt
DESCRIPTION:
Insère un bouton de réinitialisation
RESET is a function value.
ARGUMENTS:
txt -- Intitulé du bouton (Type: string) USAGE:
FIELD name value /width size /length maxlength /label txt /password
DESCRIPTION:
Insertion d'un champ de saisie
FIELD is a function value.
ARGUMENTS:
name -- Nom du champ (Type: string)
value -- Valeur du champ (Type: any-type)
REFINEMENTS:
/width
size -- Largeur de la zone de texte (Type: integer string)
/length
maxlength -- Nombre maximal de caractères (Type: integer)
/label
txt -- Intitulé du champ (Type: string)
/password -- Saisie cachée USAGE:
TEXTAREA name data /label txt /width w /height h /wrap mode /readonly
DESCRIPTION:
Affichage d'une zone de saisie à plusieurs lignes
TEXTAREA is a function value.
ARGUMENTS:
name -- Nom du champ (Type: string)
data -- Valeur d'initialisation du champ (Type: any-type)
REFINEMENTS:
/label
txt -- Intitulé du champ (Type: string)
/width
w -- Largeur du champ en caractères (Type: integer)
/height
h -- Nombre de lignes (Type: integer)
/wrap
mode -- Active le retour à la ligne ('virtual ou 'physical) (Type: word)
/readonly -- Champ en lecture seuleExemple:
textarea/label/width/height/wrap "zone" "texte d'initialisation"
"Zone de saisie:" 20 4 'physical
USAGE:
TEXT-LIST objectname data /selected key /size siz /multiple
DESCRIPTION:
Affichage d'une liste de valeur
TEXT-LIST is a function value.
ARGUMENTS:
objectname -- Nom de la liste (Type: string)
data -- Données affichées (Type: block)
REFINEMENTS:
/selected
key -- Valeur d'initialisation (Type: integer string)
/size
siz -- Nombre d'éléments visibles (5 par défaut) (Type: integer)
/multiple -- Plusieurs choix sont autorisésExemples:
text-list/size/selected "lignes" [ "ligne1" "ligne 2" "ligne 3" ] 10 "ligne 3"
text-list/size/selected/multiple "lignes" [
[ 1 "ligne1" ] [ 2 "ligne 2" ] [ 3 "ligne 3" ]
] 10 2 USAGE:
RADIO name value /checked
DESCRIPTION:
Insère un bouton radio
RADIO is a function value.
ARGUMENTS:
name -- Nom du bouton (Type: string)
value -- Valeur du bouton (Type: string block)
REFINEMENTS:
/checked -- Sélection du bouton radioExemples:
radio "rad1" "Choix 1"
radio/checked "rad1" [ 100 "Choix 2" ] USAGE:
CHECKBOX name value /checked
DESCRIPTION:
Insère une case à cocher
CHECKBOX is a function value.
ARGUMENTS:
name -- Nom du checkbox (Type: string)
value -- Valeur du checkbox (Type: string block)
REFINEMENTS:
/checked -- Sélection du checkboxExemples:
checkbox/checked "ch1" "Choix 1"
checkbox "ch2" [ 100 "Choix 2" ]
USAGE:
RADIO-GROUP objectname data /selected key /across
DESCRIPTION:
Affichage d'un groupe de bouton radio
RADIO-GROUP is a function value.
ARGUMENTS:
objectname -- Nom du groupe (Type: string)
data -- Intitulés des boutons (Type: block)
REFINEMENTS:
/selected -- Sélection d'un bouton radio du groupe
key -- Valeur d'initialisation (Type: integer string)
/across -- Placement horizontal des boutonsExemple:
radio-group/selected "test3" [
[ 1 "Premier radio" ]
[ 2 "Second radio" ]
[ 3 "Troisième radio" ]
] 3
USAGE:
CHECKBOX-GROUP objectname data /selected key /across
DESCRIPTION:
Affichage d'un groupe de cases à cocher
CHECKBOX-GROUP is a function value.
ARGUMENTS:
objectname -- Nom du groupe (Type: string)
data -- Intitulé des cases (Type: block)
REFINEMENTS:
/selected -- Sélection d'une case à cocher du groupe
key -- Valeur(s) d'initialisation (Type: integer string block)
/across -- Placement horizontal des cases à cocherExemple:
checkbox-group/selected "ch" [
"premier check"
"second check"
] "second check"
checkbox-group/selected "ch" [
[ 1 "premier check" ]
[ 2 "second check" ]
] [ 1 2 ] USAGE:
FILE name /accept filter
DESCRIPTION:
Envoi d'un fichier vers le serveur
FILE is a function value.
ARGUMENTS:
name -- Nom du champ (Type: string)
REFINEMENTS:
/accept
filter -- Filtre sur les types de fichier acceptés (Type: string)Exemple:
webform/enctype "envoidata" "mapage.rhtml" 'post [
prin "Choisissez un fichier:"
br
file/accept "envoifichier" "*.r,*.txt"
br/count 2
submit "Valider"
] "multipart/form-data" USAGE:
HIDDEN name value
DESCRIPTION:
Insère un champ caché
HIDDEN is a function value.
ARGUMENTS:
name -- Nom du champ (Type: string)
value -- Valeur du champ (Type: string)
USAGE:
LIST data /toc /link code
DESCRIPTION:
Affiche une liste de valeurs précédées chacune d'une puce
LIST is a function value.
ARGUMENTS:
data -- (Type: block)
REFINEMENTS:
/toc -- Utilisation du mode plan
/link
code -- Code exécuté pour chaque élément (Type: block)Exemple:
list [
"Element 1" "Element 2" [
"Sous élément A" "Sous élément B"
]
"Element 3"
]
USAGE:
TOC data /link code
DESCRIPTION:
Affiche une liste sous la forme d'un plan
TOC is a function value.
ARGUMENTS:
data -- (Type: block)
REFINEMENTS:
/link
code -- Code exécuté pour chaque élément (Type: block)Exemple:
toc/link [
"Introduction"
"Chapitre 1"
[ "Partie 1" "Partie 2" ]
"Chapitre 2"
[ "Partie 1" "Partie 2" ]
"Conclusion"
] [ join "http://monserveur/mapage.rhtml?rubrique=" html/value ]
USAGE:
DATAGRID data /noborder /columns col /link code /checkbox namecheckbox vccolumn /radio nameradio vrcolumn /image url /nospacing /alt /width w
DESCRIPTION:
Affiche un tableau construit dynamiquement à partir de données
DATAGRID is a function value.
ARGUMENTS:
data -- (Type: block)
REFINEMENTS:
/noborder -- Pas de bordure
/columns -- Affichage du nom des colonnes
col -- Noms des colonnes (Type: block)
/link
code -- Code généré pour chaque élément (Type: block)
/checkbox -- Affichage de cases à cocher
namecheckbox -- Nom des checkbox (Type: string)
vccolumn -- Numéro de la colonne contenant la valeur du checkbox (Type: integer)
/radio -- Affichage de boutons radio
nameradio -- Nom des boutons radio (Type: string)
vrcolumn -- Numéro de la colonne contenant la valeur du bouton radio (Type: integer)
/image -- Affichage d'une image
url -- Chemin d'accès (Type: string url)
/nospacing -- Pas d'espace entre les colonnes
/alt -- Utilise une seconde couleur pour l'affichage des lignes
/width
w -- Largeur du tableau (Type: integer string)Exemple:
datagrid/columns/radio/noborder/nospacing/link buffer
[ "Nom" "Prenom" ]
"rad" 1
[ join "http://lazarus/page.rhtml?cle=" html/value ] datagrid/columns/alt data [ "Nom" "Prenom" ]
datagrid/nospacing/noborder/columns/image/alt data [ "Nom" "Prenom" ] "ico1.gif"
USAGE:
TEXT str /small /normal /medium /title
DESCRIPTION:
Affiche un texte
TEXT is a function value.
ARGUMENTS:
str -- chaîne de caractères (Type: string block)
REFINEMENTS:
/small -- Petits caractères
/normal -- Texte standard
/medium -- Taille intermédiaire
/title -- Gros caractèresExemples:
text "hello"
text/small "Petit"
text/normal "Normal"
text/medium "Medium"
text/title "Titre"
USAGE:
DROP-DOWN objectname data /action destination /selected key /label txt /rewrite
DESCRIPTION:
Affichage d'une liste déroulante
DROP-DOWN is a function value.
ARGUMENTS:
objectname -- Nom de la liste (Type: string)
data -- Données affichées dans la liste (Type: block)
REFINEMENTS:
/action -- Appel d'une page suite à la sélection d'une valeur
destination -- Page de destination (Type: string url)
/selected -- Sélection d'une ligne de la liste
key -- Valeur d'initialisation (Type: integer string)
/label -- Affichage d'un label
txt -- Intitulé du label (Type: string)
/rewrite -- Insertion automatique du MAGICAPPID et du MAGICSESSIDExemple:
drop-down/action/selected/label "lettre" [
"A" "B" "C" "D" "E" "F" "G"
] "db.rhtml" lettre "Choisissez la première lettre:"![]()
USAGE:
ICON-GROUP data /across /pad lg /link code
DESCRIPTION:
Affichage d'un menu d'icones
ICON-GROUP is a function value.
ARGUMENTS:
data -- image, intitulé et page de destination pour chaque icone (Type: block)
REFINEMENTS:
/across -- Placement horizontal des icones
/pad -- Ecart entre les icones
lg -- Nombre de pixels (Type: integer)
/link -- Génération d'une url pour chaque journée
code -- Code Rebol (Type: block)Exemple:
icon-group/across/pad/link [
[ "ico1.gif" "Valider" "page.rhtml" ]
[ "ico2.gif" "Abandonner" "page.rhtml" ]
[ "ico3.gif" "Fichier" "page.rhtml" ]
] 10 [ join html/value ".rhtml" ]
USAGE:
CALENDAR /set-date dt /selected selection-dates /link code
DESCRIPTION:
Affichage d'un calendrier
CALENDAR is a function value.
REFINEMENTS:
/set-date -- Fixe la date de référence
dt -- Date de référence (Type: date)
/selected -- Sélection d'une plage de temps
selection-dates -- Dates de début et de fin de la plage (Type: block)
/link -- Génération d'une url pour chaque journée
code -- Code Rebol (Type: block)Exemple:
calendar/link/selected [
join "http://localhost/script.cgi?cle=" (html/value)
] [ 10/2/2004 15/2/2004 ]
USAGE:
LOGIN title url /rewrite
DESCRIPTION:
Affiche une boite d'identification
LOGIN is a function value.
ARGUMENTS:
title -- Titre (Type: string)
url -- Script CGI ou page rhtml de destination (Type: string url)
REFINEMENTS:
/rewrite -- Insertion automatique du MAGICAPPID et du MAGICSESSIDExemples:
login "Identification" "mapage.rhtml"
login "Identification" http://monserveur/mapage.rhtml USAGE:
BUTTON caption script
DESCRIPTION:
Insère un bouton
BUTTON is a function value.
ARGUMENTS:
caption -- Intitulé du bouton (Type: string)
script -- Script Javascript ou VBScript (Type: string)Exemple:
button "Clickez moi !" "alert('hello, un suis un script Javascript')" USAGE:
BTN-HELP url
DESCRIPTION:
Insère un bouton d'aide
BTN-HELP is a function value.
ARGUMENTS:
url -- Document web contenant l'aide (Type: string url)
USAGE:
MENU-BAR data /link code
DESCRIPTION:
Affiche une barre de menu horizontale
MENU-BAR is a function value.
ARGUMENTS:
data -- Contenu de la barre de menu (Type: block)
REFINEMENTS:
/link
code -- Code généré pour chaque élément du menu (Type: block)Exemple:
menu-bar/link [
[ "Accueil" "index.rhml" ]
"Recherche" [ "News" "" ]
"Articles"
] [
join html/value ".html"
]
USAGE:
MENU-LIST data /link code /width lg
DESCRIPTION:
Affiche un menu vertical
MENU-LIST is a function value.
ARGUMENTS:
data -- Rubriques et sous rubriques (Type: block)
REFINEMENTS:
/link
code -- Code généré pour chaque sous rubrique (Type: block)
/width
lg -- Largeur du tableau en pixels ou en pourcentages (Type: any)Exemple:
menu-list/link [
"Administration" [
[ "Edition" "edition.rhtml" ]
[ "Suppression" "" ]
]
"Articles" [
"Programmer en Rebol"
"Rebol et MySQL"
"Débuter en Rebol"
"VID et GCS"
"Rebol contre Java"
]
"Contacts" [
"Courrier"
"Forum"
"Autres sites"
]
] [ join html/value ".rhtml" ] USAGE:
IMAGE name data /width w /height h /label txt /usemap map
DESCRIPTION:
Affichage d'une image
IMAGE is a function value.
ARGUMENTS:
name -- Nom de l'image (Type: string)
data -- Fichier contenant l'image (Type: string url)
REFINEMENTS:
/width
w -- Largeur de l'image en pixels (Type: integer)
/height
h -- Hauteur de l'image en pixels (Type: integer)
/label
txt -- Texte affiché si l'image n'est pas trouvée (Type: string)
/usemap
map -- Définition de zones cliquables (Type: block)Exemple:
image/width/height/label "monimage" "ico.gif" 100 50 "Une image"
image/usemap "carte" "france.jpg" [
[ rect [ 10x10 20x20 ] http://www.geo.org/doc1.html ]
[ circle [ 30x30 10 ] "dossier2.html" ]
[ polygon [ 40x40 50x40 90x90 ] "data.rhtml?carte=3" ]
]
USAGE:
BANNER data /target dest
DESCRIPTION:
Affichage d'une ou plusieurs bannières publicitaires
BANNER is a function value.
ARGUMENTS:
data -- Images et liens (Type: block)
REFINEMENTS:
/target -- Mode d'ouverture de la page
dest -- 'self, 'top ou 'blank (Type: any)Exemple:
banner/target [ %banniere1.gif http://www.rebolfrance.org ] 'blank

USAGE:
ARTICLE title url text /subtitle subtext
DESCRIPTION:
Affichage de l'annonce d'un article
ARTICLE is a function value.
ARGUMENTS:
title -- Titre de l'article (Type: string)
url -- url vers l'article (Type: url string)
text -- Contenu de l'article (Type: string)
REFINEMENTS:
/subtitle -- Sous titre (compléments, date, etc.)
subtext -- (Type: any-type)Exemple:
article/subtitle "Annonce d'un plugin Rebol" "index.rhtml" {Rebol technologies vient d'annoncer la disponibilité d'un plugin de Rebol/View 1.3 pour Internet Explorer 6.0. Ce produit ouvre de nombreuses perspectives dans le développement d'applications web interactives et place Rebol en concurrent direct des technologies Flash MX et Java.} now/date
USAGE:
NEWS data /width lg /noborder /title titre
DESCRIPTION:
Affichage d'une liste de news
NEWS is a function value.
ARGUMENTS:
data -- news et url (Type: block)
REFINEMENTS:
/width
lg -- Largeur de la zone de news (Type: integer)
/noborder -- Pas de bordure
/title
titre -- Titre (Type: string)Exemple:
news/width/noborder [
[ "Mise à jour de Magic! 2.0.2" http://rwst.no-ip.com/magic20 ]
[ {Retrouvez Rebol dans le magazine Login} http://www.loginmag.com ]
[ "dernières infos" "index.rhtml" ]
] 150
USAGE:
RESULTS num1 num2 /selected num /link code
DESCRIPTION:
Accés aux pages affichant le résultat d'une recherche
RESULTS is a function value.
ARGUMENTS:
num1 -- Numéro de la première page (Type: integer)
num2 -- Numéro de la seconde page (Type: integer)
REFINEMENTS:
/selected -- Mise en évidence de la page sélectionnée
num -- Numéro de la page sélectionnée (Type: integer)
/link -- Evaluation du code Rebol pour chaque numéro de page
code -- Bloc de code Rebol évalué (Type: block)Exemple:
results/link/selected 5 15 [ join "index.rhtml?page=" html/value ] 8

USAGE:
RSS-CHANNEL url /description /no-border /title titre /width w /length long
DESCRIPTION:
Lecture d'un canal RSS
RSS-CHANNEL is a function value.
ARGUMENTS:
url -- url du canal RSS (Type: url)
REFINEMENTS:
/description -- Utilisation du champ <description>
/no-border -- Pas de bordure
/title
titre -- Affichage d'un titre (Type: string)
/width
w -- Largeur en pixels (Type: integer)
/length
long -- Nombre d'éléments affichés (Type: integer)Exemple:
rss-channel/width/title/length/no-border
http://www.apachefrance.com/News/Rss/news-apachefrance.rss
150 "ApacheFrance" 5
USAGE:
PATH pages /rewrite
DESCRIPTION:
Affiche un chemin d'accès vers un document
PATH is a function value.
ARGUMENTS:
pages -- Liste de blocs contenant le nom et l'url du document (Type: block)
REFINEMENTS:
/rewrite -- Insertion automatique du MAGICAPPID et du MAGICSESSIDExemple:
path/rewrite [
[ "Accueil" "index.rhtml" ]
[ "Rubrique" "rubrique.rhtml" ]
[ "Sous-rubrique" "sousrubrique.rhtml" ]
] USAGE:
POPUP url name size /at pos /resizable
DESCRIPTION:
Affiche une fenêtre flottante
POPUP is a function value.
ARGUMENTS:
url -- url de la page (Type: url string)
name -- Nom de la fenêtre (Type: string)
size -- Dimensions de la fenêtre (Type: pair)
REFINEMENTS:
/at
pos -- Position à l'écran (Type: any)
/resizable -- Fenêtre redimensionnable USAGE:
ALERT msg
DESCRIPTION:
Affiche une boite d'alerte au chargement de la page
ALERT is a function value.
ARGUMENTS:
msg -- Message (Type: any-type) USAGE:
BTN-PRINT caption /redirect url /close
DESCRIPTION:
Insère un bouton déclenchant l'impression de la page
BTN-PRINT is a function value.
ARGUMENTS:
caption -- Intitulé du bouton (Type: string)
REFINEMENTS:
/redirect
url -- Redirection suite à l'impression (Type: string url)
/close -- Fermeture de la fenêtre active suite à l'impression USAGE:
SEND-TO-PRINTER /redirect url /close
DESCRIPTION:
Impression du contenu d'une page
SEND-TO-PRINTER is a function value.
REFINEMENTS:
/redirect
url -- Redirection suite à l'impression (Type: string url)
/close -- Fermeture de la fenêtre active suite à l'impressionExemple:
<html>
<head><title>Utilisation de send-to-printer</title></head>
<body>
<h1>Titre</h1>
Cette page est envoyée à l'imprimante
<rebol>
send-to-printer
</rebol>
</body>
</html>Document formatter copyright Robert M. Münch. All Rights Reserved.
XHTML 1.0 Transitional formatted with Make-Doc-Pro Version:1.0.9 on 3-Dec-2004 at 9:35:07