Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?

Ceci est une ancienne révision du document !



Strict Standards: Declaration of syntax_plugin_tag_topic::handle() should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /var/www/html/web/wiki/lib/plugins/tag/syntax/topic.php on line 123

Strict Standards: Declaration of syntax_plugin_tag_topic::render() should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /var/www/html/web/wiki/lib/plugins/tag/syntax/topic.php on line 123

Strict Standards: Declaration of syntax_plugin_tag_searchtags::handle() should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /var/www/html/web/wiki/lib/plugins/tag/syntax/searchtags.php on line 280

Strict Standards: Declaration of syntax_plugin_tag_searchtags::render() should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /var/www/html/web/wiki/lib/plugins/tag/syntax/searchtags.php on line 280

Strict Standards: Declaration of syntax_plugin_tag_tag::handle() should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /var/www/html/web/wiki/lib/plugins/tag/syntax/tag.php on line 118

Strict Standards: Declaration of syntax_plugin_tag_tag::render() should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /var/www/html/web/wiki/lib/plugins/tag/syntax/tag.php on line 118

Strict Standards: Declaration of syntax_plugin_tag_count::handle() should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /var/www/html/web/wiki/lib/plugins/tag/syntax/count.php on line 130

Strict Standards: Declaration of syntax_plugin_tag_count::render() should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /var/www/html/web/wiki/lib/plugins/tag/syntax/count.php on line 130

Strict Standards: Declaration of syntax_plugin_tag_tagpage::handle() should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /var/www/html/web/wiki/lib/plugins/tag/syntax/tagpage.php on line 96

Strict Standards: Declaration of syntax_plugin_tag_tagpage::render() should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /var/www/html/web/wiki/lib/plugins/tag/syntax/tagpage.php on line 96

Strict Standards: Declaration of syntax_plugin_clearfloat::handle() should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /var/www/html/web/wiki/lib/plugins/clearfloat/syntax.php on line 74

Strict Standards: Declaration of syntax_plugin_clearfloat::render() should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /var/www/html/web/wiki/lib/plugins/clearfloat/syntax.php on line 74

Strict Standards: Declaration of syntax_plugin_pageindex::handle() should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /var/www/html/web/wiki/lib/plugins/pageindex/syntax.php on line 187

Strict Standards: Declaration of syntax_plugin_pageindex::render() should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /var/www/html/web/wiki/lib/plugins/pageindex/syntax.php on line 187

Strict Standards: Declaration of syntax_plugin_googlemaps_googlemap::handle() should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /var/www/html/web/wiki/lib/plugins/googlemaps/syntax/googlemap.php on line 169

Strict Standards: Declaration of syntax_plugin_googlemaps_googlemap::render() should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /var/www/html/web/wiki/lib/plugins/googlemaps/syntax/googlemap.php on line 169

Strict Standards: Declaration of syntax_plugin_nextpage::handle() should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /var/www/html/web/wiki/lib/plugins/nextpage/syntax.php on line 69

Strict Standards: Declaration of syntax_plugin_nextpage::render() should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /var/www/html/web/wiki/lib/plugins/nextpage/syntax.php on line 69

Strict Standards: Declaration of syntax_plugin_include::handle() should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /var/www/html/web/wiki/lib/plugins/include/syntax.php on line 137

Strict Standards: Declaration of syntax_plugin_include::render() should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /var/www/html/web/wiki/lib/plugins/include/syntax.php on line 137
Plugin installed incorrectly. Rename plugin directory 'backlinks.old' to 'backlinks'.

La fenêtre MapBasic et l'utilisation avancée de MI sans MB

1 : La fenêtre MapBasic

La fenêtre MapBasic est présente dans MapInfo depuis la version 3 (la première version Windows). Elle est ouverte par un item du menu « Options » ou par l’icône ‘clé plate’ de la barre « Outils »; ces deux éléments opèrent en bascule et peuvent être utilisés pour fermer la FMB quand elle est ouverte.

Il ne peut y avoir qu’une FMB ouverte en même temps, tout comme il n’y a qu’une fenêtre message, légende, … (souvent nommées fenêtres système en opposition aux cartes,
tableaux, … qui sont des fenêtres document)) mais cette fenêtre peut servir pour entrer des données ce qui n’est pas le cas des fenêtres système.

La FMB fut documentée pour la première fois dans MI Pro MapFAQ’s (1996 après la sortie de la version 4) , et est toujours décrite dans le chapitre 24 « Using the MapBasic Window » dans le MI User’s Guide, chapitre 23 dans le Guide de l’Usager de MI. Dans la version anglaise, le chapitre 24 a été réduit de 50 pages (version 5.0, mode d’emploi et un bon nombre de fonctions détaillées et directement utilisables) à 18 (version 6.5, mode d’emploi seulement), l’idée étant que le « MapBasic Reference » en format PDF est inclus maintenant dans le CD d’installation de MI, sans aucune aide cependant pour convertir les constantes littérales en numériques. La version française n’a pas suivi une réduction aussi dramatique, mais elle ne contient que 5 des 25 fonctions avec arguments.

1.1 : La fonction affichage de la FMB

La mission initiale de la FMB est d’afficher les équivalents en MapBasic des commandes passées par le menu, mais avec certaines limitations et variations. Ainsi, pas toutes les
commandes sont « transcrites »

(CODE)

Connaître quelles sont les commandes qui sont ainsi affichées va permettre de savoir celles qui pourront être réutilisées par la suite. Une fois la FMB ouverte, l’affichage se fait de façon continue, même si la fenêtre est miniaturisée. La seule façon de l’interrompre est de fermer la fenêtre, ce qui la vide par la même occasion de tout son contenu.

1.2 : La FMB comme poste de commande.

Cette fenêtre est l’équivalent d’un très simple éditeur de texte combiné à un lanceur de commandes.

Les fonctions d’édition sont des plus simples : copier, coller (de la FMB ou d’une autre source), effacer, déplacer. Les flèches permettent de se déplacer dans l’espace défini par le texte présent. L’ajout d’une nouvelle ligne se fait par <CTRL>+<ENTRER>. Le lanceur de commande est la touche <ENTRER> qui peut lancer une seule ligne ou plusieurs.

  • Position du curseur (une ligne à la fois) n’importe où dans la ligne puis <entrer>
  • Sur-lignage d’un groupe de lignes puis <entrer>

Si une commande est écrite sur plusieurs lignes, il faut toutes les sélectionner. Si une partie seulement d’une ligne est sous-lignée, seulement la partie sous-lignée sera lancée, ce qui généralement va résulter en une erreur.

Si l’on veut répéter le lancement de la même commande, ou du même groupe de lignes, l’action à prendre dépend de la nature des commandes. Si la FMB perd le focus suite aux
commandes, il faut le lui redonner en cliquant dans la barre de titre;. La sélection n’est pas alors perdue et on tape <ENTRER>.
L’exemple type est une commande insertion dans une table. Si le focus n’est pas perdu, il suffit de retaper <ENTER> ; c’est le cas par exemple avec un print (qui affiche le résultat dans la fenêtre message).

Les commandes de menu principal ou de menu flottant (clic du bouton droit alors que sur la fenêtre) sont assez limitées.

1.3 : Le support existant pour l’utilisation de la FMB

En plus du chapitre du « Guide de l’utilisateur de MapInfo » mentionné pour les versions anglaise et française, il existe plusieurs fichiers MI et des documents complémentaires.

  • Le fichier d’aide de MapBasic qui est maintenant disponible comme fichier PDF sur le disque d’installation de MapInfo à compter de la v6.50, auparavant venait avec MapBasic

uniquement.

  • Des fichiers auxiliaires de MI comme MapInfoW.MNU et de MapBasic (fichiers de définition comme mapbasic.def, menu.def et icons.def)
  • Des listes adhoc de conversion/équivalence comme :
    • les annexes du « Mini-Guide to the MBW »
    • les documents du « projet ABC » (Application Backwards Compatibility) de Jacques Paris

2 : MapBasic adapté à la FMB

Il faut d’abord bien comprendre que les commandes soumises par la FMB sont simplement interprétées sans compilation, ce qui implique l’usage de scripts linéaires (exécutés
séquentiellement une ligne à la fois, l’une après l’autre). Ce sont exactement les mêmes contraintes que pour les documents WOR générés directement par MI et ce qui peut être dit au sujet d’un « milieu » est valable en général pour l’autre. Ceci nous entraîne à parler plutôt des commandes interdites que des permises.

2.1 : Quelques interdits

Cette première contrainte élimine tous les éléments basés sur la notion de branchement dans la séquence des commandes (DO, IF, WHILE, FOR, GOTO …) ou le concept de routines ou
fonctions définies par l’utilisateur ou devant être définies (cas des fonctions API Windows).

D’autres éléments sont interdits par d’autres règles particulières pour des raisons parfois moins évidentes. Par exemple. « INCLURE xxx » implique d’ajouter au point indiqué des
commandes contenues dans un autre fichier au moment de la compilation. De même les boîtes de « DIALOG » ne sont remplies de façon dynamique qu’à la compilation.

Finalement, il ne peut y avoir aucune manipulation de fichiers, en opposition aux tables. On ne peut pas par exemple ouvrir un fichier et y écrire des résultats.

L’annexe A contient tous ces « interdits » et les raisons qui y sont attachées.

2.2 : Arguments des fonctions : une contrainte générale

Les arguments de fonctions qui en comportent (un peu plus de deux douzaines) doivent être passés comme des codes numériques car le fichier « mapbasic.def » n’est pas accessible de la fenêtre. Ces diverses valeurs seront précisées dans chacune des fonctions au fur et à mesure de leur présentation.

2.3 : Variables

Les variables sont définies comme dans MapBasic avec un énoncé DIM. Cependant dans la FMB, il ne peut y avoir qu’une seule variable par DIM.
Les variables dimensionnées (vecteurs) ne sont pas permises.
Tout variable reste définie pour la durée de la session de MapInfo. Afin d’éviter leur accumulation ou une mauvaise réutilisation, il faudrait lancer dès que l’utilisation d’une
variable est terminée un énoncé réservé à la FMB : UNDIM.

Ces variables FMB sont valables dans l’environnement MM/MI c’est-à-dire qu’elles ne sont pas contraintes par le cadre de la FMB. Elles peuvent être donc « passées » dans d’autres utilisations comme dans certains dialogues.

2.4 : Les commandes « Run »

Il y a plusieurs formes de la commande RUN que nous allons passer en revue.

  • RUN APPLICATION “<applicationr>.MBX “ : permet de lancer des applications MBX. Peut faire partie d’un script ou d’un WOR.
  • RUN APPLICATION “<fichier>.WOR“ : permet de lancer des documents classiques mais surtout des « scripts » qui seraient exécutables dans la fenêtre MB.
  • RUN COMMAND <cmd> : exécute la commande représentée par la chaîne de caractères <cmd>. Cette chaîne peut être spécifiée directement et doit alors être entre ““ ou comme une variable caractère. Run Command est une solution parfaite quand il s’agit de passer un élément d’un énoncé par une variable alors que MI s’attend à trouver le nom d’une table ou d’une colonne.
  • RUN MENU COMMAND xxx : lance des opérations similaires à celles du menu en utilisant un code numérique (défini dans MENU.DEF) mais pas tous les codes définis sont opérationnels. Il est bien entendu que seuls ceux pour des commandes ayant une trace dans la FMB peuvent être considérés dans une première analyse, mais ce n’est pas forcément

toujours le cas, surtout quand la trace est composée de plusieurs commandes. Il y a donc dans certains cas des possibilités d’équivalences. L’annexe B donne une idée de ce à quoi on peut s’attendre.

  • RUN PROGRAM “<programme_spécification> “ : lance le programme spécifié avec les arguments de la ligne de commande voulus (fichier à ouvrir, redirection des résultats, … )

2.5 : Les commentaires

En MapBasic, le texte entre une apostrophe et la fin de la ligne est ignoré, ce qui permet d’insérer des commentaires dans le texte. Dans la FMB, la présence d’une apostrophe va
interrompre le traitement de l’information à cet endroit, alors que dans un document WOR ce n’est pas le cas, les commentaires n’ayant aucun effet sur la poursuite des opérations.

Il faudra se souvenir de cette différence de comportement quand il s’agira de construire des scripts pour réutilisation.

3 : Pourquoi et comment se servir de la FMB

3.1 : Les incontournables

Certaines opérations ne peuvent pas se faire sans avoir recours à la FMB. Nous allons prendre deux exemples classiques :

3.1.1 : Extraction de coordonnées

Il est très fréquent que l’on veuille extraire des coordonnées des objets pour les mettre sous une forme tabulaire. Cela se fait en deux étapes impliquant la création des colonnes nécessaires (type float) suivie de leur remplissage avec une fonction comme centroidX(), centroidY() si on veut prendre les centroïdes.

Le problème est que très souvent les données ainsi recueillies ne correspondent pas aux coordonnées de la table originale. Ceci est dû au fait que le système de coordonnées utilisé par MB/MI est par défaut en degrés, c’est à dire sans véritable projection. Si les coordonnées de la table sont dans un système autre que degrés, il faut alors imposer à MB/MI d’utiliser ce système.

Ceci se fait en exécutant dans la FMB la commande suivante :

SET COORDSYS TABLE <nom_de_la_table>

3.1.2 : Modification d’un objet

Si on veut modifier par des commandes MB un objet, il faut réinsérer l’objet modifié dans la table. Ceci se fait par la commande UPDATE. Cependant, la fenêtre UPDATE ne permet pas d’accéder à la colonne OBJ (elle n’existe pas dans la liste déroulante et elle ne peut pas y être ajoutée). Il faut alors exécuter la commande UPDATE dans la FMB.

L’angle du texte de l’objet sélectionné doit être augmenté de 25 degrés.

dim o as object
o=selection.obj
alter object o geography 7,objectgeography(o,7)+25
update selection set obj = o

3.2 : Utilisations immédiates

La FMB peut se révéler un outil de choix dans certaines utilisations immédiates, c’est-à-dire que l’on peut recycler de l’information contenue dans la fenêtre suite à des commandes préalables pour d’autres conditions d’application. Une telle utilisation peut impliquer un simple énoncé, une séquence d’opérations ou un une opération complexe. Les exemples de la section 4 mettent en valeur les dimensions les plus spécifiques de type d’utilisation dont voici les principaux :

  • identifier clairement les conditions pré-requises à l’opération. Par exemple : quelles sont la(es) table(s) ouverte(s) nécessaire(s), leur(s) statut(s) indispensable(s) (éditable, en particulier), quelles sont les opérations préalables pour atteindre cette étape.
  • dégager de la masse d’information enregistrée par la FMB les énoncés essentiels repérer les quelques énoncés qui forment l’essentiel de la procédure, les isoler pour

en former un bloc plus facilement manipulable.

  • rechercher s’il y a des éléments variables. les énoncés peuvent contenir des éléments propres à la dernière opération qu’il faudra modifier pour leur réutilisation, nom de table, de colonne, valeurs spécifiques pour une sélection,….
  • penser à remplacer des éléments répétés par une ou des variables dans le cas où la procédure comporte plusieurs énoncés faisant appel à un élément commun et qu’elle doit être répétée plusieurs fois, il est souvent plus efficace de remplacer cet élément par une variable; il n’y aura qu’à changer la définition de la variable une fois plutôt que de faire des remplacements multiples à chaque répétition.
  • envisager d’écrire certains énoncés pour créer les conditions préalables nécessaires ces énoncés ne sont pas nécessairement partie de ceux enregistrés par la FMB

mais peuvent être essentiels à la procédure

  • identifier les parties uniques (énoncés initiaux) et répétitives (procédure même) les énoncés initiaux sont souvent exécutés une seule fois alors que ceux formant le

cœur de la procédure peuvent être exécutés plusieurs fois. Bien les séparer facilitera la tâche de sélectionner des blocs pour leur soumission.

3.3 : Utilisations différées

Il s’agit d’enregistrer des procédures qui pourraient être reprises dans le futur. Pour cela il s’agit d’enregistrer, de conserver et de récupérer les énoncés de la façon le plus sécuritaire et efficace que possible. À la solution classique d’un fichier texte qui peut être réutilisé en tout ou en partie dans la FMB, il faut envisager d’ajouter l’emploi d’un fichier document WOR dont les particularités sont discutées à la fin de cette section.

3.3.1 : Enregistrement

La FMB permet d’enregistrer tout son contenu dans un fichier TXT. Si d’autres énoncés non essentiels à la procédure sont dans la fenêtre, il faudra donc éditer ce fichier pour éliminer l’inutile. Si on veut seulement une partie du contenu de la FMB, il suffit d’ouvrir un fichier texte et de faire un simple Copier/Coller.

3.3.2 : Conservation

Conservation veut aussi dire organisation et documentation. Comme la réutilisation est prévue pour le futur, il est plus qu’indispensable de rajouter aux énoncés MB quelques lignes expliquant leur fonction, les conditions d’utilisation, bref, le minimum nécessaire pour s’y retrouver. Il est préférable que tous les commentaires soient mis en début de procédure car des commentaires dispersés nécessiteront On peut choisir de stocker toutes les procédures dans des fichiers indépendants ou de les rassembler dans quelques fichiers en les regroupant par famille. Cette dernière solution requiert l’utilisation d’un bon repérage visuel pour retrouver la bonne procédure rapidement.

3.3.3 : Réutilisation

La FMB ne permet que de faire un Copier/Coller à partir d’un fichier texte ouvert en dehors de MI. On peut à ce moment là ne pas transférer les lignes de commentaire. S’il y en reste dans le corps du bloc transféré, il faudra les ignorer lors de la définition des énoncés à exécuter pour que la procédure ne bloque pas (voir 2.5)

3.3.4 : Document WOR

Un WOR se distingue d’un fichier TXT sous 2 aspects structurels et un de syntaxe. Un WOR est essentiel un TXT avec une extension différente et un entête (les premières lignes de texte spécifique). On peut donc créer un WOR à partir d’un TXT dans un simple éditeur de texte; il suffit de rajouter au début les lignes voulues et de l’enregistrer avec la bonne extension.

L’en-tête est le suivant :

!Workspace
!Version 600
!Charset WindowsLatin1

Le numéro de version devrait être celui correspondant à la version du MI utilisé. Il pourrait toujours être inférieur à cela mais la présence de certains énoncés peut être
incompatible avec ce numéro, quoique cela n’empêchera pas son exécution. Ce n’est que s’il lui est supérieur que MI refusera d’exécuter le WOR.

L’aspect de la syntaxe qui soit différent est que des commentaires peuvent se trouver dans le corps de la procédure sans avoir d’effet sur le déroulement des opérations.
Si nous avons choisi d’avoir un WOR c’est que nous allons le réutiliser de façon différente; au lieu d’en extraire des énoncés qui seront exécutés dans la FMB, c’est le WOR qui sera exécuté en bloc par un « RUN APPLICATION “<fichier>.WOR“ ».

Comme WOR et FMB appartiennent au même univers, ils peuvent communiquer sans difficulté. Ceci veut dire que les variables définies dans l’un sont disponibles dans l’autre. Ceci peut être un avantage mais offrir aussi quelques inconvénients.

Voici un WOR :

!Workspace
!Version 600
!Charset WindowsLatin1
dim b as string
print a
b=right$(a,len(a)/2)+left$(a,len(a)/2)

Dans la FMB :

dim a as string
a="Test 1"
run application "c:/test_wor.wor"
print b
“Test 1” est imprimé par le WOR et “t 1Tes” par la FMB

3.3.5 : TXT ou WOR

Le choix ne devrait pas être difficile car deux conditions sont bien claires. D’abord, un WOR implique une exécution en bloc de toute la procédure et ne devrait donc pas être choisi si tous les énoncés ne sont pas réutilisés de la même façon.
Ensuite, un WOR ne devrait pas comprendre de variables dont les valeurs doivent être fixées avant exécution; il faudrait alors ouvrir le WOR, faire les corrections, l’enregistrer et l’exécuter, Il pourrait y avoir cependant moyen d’éviter ces complications en utilisant la communication possible entre FMB et WOR comme dans l’exemple ci-dessus pour définir (DIM + contenu) les variables utilisées dans le WOR (sans DIM alors pour ces variables).

4 : Quelques exemples de mise en oeuvre

4.1 : Construction d’une procédure simple

La table Mont_rue contient les rues définies par des segments limités aux intersections. L’objectif est de créer une carte de rues principales et « complètes » (une seule polyligne par « nom »)

  • Ouverture de la carte

Open Table “C:donneesmont_rue.TAB” Interactive

  • Création d’une carte finale “princip” ne comportant qu’une colonne « nom »

Select nom from mont_rue where rowid=0 into Princip

commit table Princip as "Princip"
close table Princip
open table "Princip"
* Définition d’une variable objet et d’une variable chaîne
dim obj_nou as object
dim nom_rue as string
* Sélection des segments ayant le nom spécifié « nom_rue » au début de la colonne « nom »
de Mont_rue et fusion en un seul objet
Nom_rue=”Pie ix”
Select nom from mont_rue where nom like nom_rue+”%” into Selrue
Objects Combine Data nom=nom
obj_nou=selection.obj
* Insertion de l’objet et de son nom
insert into Princip (obj,nom) values (obj_nou, nom_rue)
* Visualisation des résultats
browse * from Princip
map from Princip

Set Map Window frontwindow() Zoom Entire

  • Une remarque s’impose: la sélection avec « like nom_rue+”%” » risque de ramasser tous les fragments commençant de la bonne façon mais finissant avec des BLD, RUE ou PLA ce qui peut créer des objets bizarres.

4.2 : Un document WOR succinct

Il s’agit de contrôler la position et la taille de la FMB ainsi que la police d’affichage :

!Workspace
!Version 600
!Charset WindowsLatin1
set window 1002 position (.01,3.9) width 8 height 2 font
("Arial",1,10,0)

Ce document pourra être exécuté de la FMB chaque fois voulue.

4.3 : Un document WOR pour lancement d’un « splash screen »

La table « splash » est le « splash screen » voulu. Une fois affichée avec les paramètres voulus (obtenus de la FMB), la fenêtre carte est maximizée et l’application « splash_timer » est lancée. Cette application « compte » simplement l’écoulement de quelques secondes; comme l’application est active durant ce temps, toute autre opération est gelée, y compris la possibilité de fermer la fenêtre. À la fin du délai, tout est fermé, et MI redevient disponible.

 
main/logiciels/mapinfo/documents/fmb.1242929333.txt.gz · Dernière modification: 2009/05/21 20:08 par Robin
Recent changes RSS feed Creative Commons License Valid XHTML 1.0 Valid CSS Driven by DokuWiki