|
Un interpréteur de scripts est intégré à GeoLicia.
Les scripts permettent d'automatiser des constructions (macros) ou de
faire des tests sur la figure (parallélisme, orthogonalité, ...)
La syntaxe est sensible à la casse. Les commandes sont en minuscules.
Voici quelques exemples.
Crée le milieu de deux points |
Construit le cercle passant par trois points |
Teste si un point est sur une droite |
import GPoint
import GPoint
milieu de [#1#2]
export LAST
|
import GPoint|un point du cercle
import GPoint|un deuxième point du cercle
import GPoint|un troisième point du cercle
ifexists Point #1 & Point #2 & Point #3
{invisible} @10000= mediatrice de [#1#2]
{invisible} @10001= mediatrice de [#2#3]
@10002=intersection(0) de @10000 et de @10001
@10003= cercle de centre @10002 passant par #1
export @10000 @10001 @10002 @10003
endif
return
|
import GPoint
import GDroite
projection de #1 sur #2
iflikepoint LAST=#1
return true
endif
return false
|
Commandes :
1. Imports, exports d'objets.
return
[chaine]
Termine le script en renvoyant l'argument optionnel chaine.
export obj1 obj2 obj3 ...
Exporte des objets créés et termine le script.
Les objets créés dans le scripts sont détruits à la fin de son exécution.
Pour que les objets subsistent, il faut les exporter.
Il faut bien prendre garde lorsqu'on exporte un objet d'exporter aussi les
objets qui le définissent (et dans le bon ordre).
Le nom des objets à exporter doit commencer par le caractère spécial
@.
import <type>[|message]
Attend que l'utilisateur clique sur un objet du type souhaité. L'objet est
alors nommé #1, #2, #3, ... selon l'ordre
d'apparition de la commande import dans le script.
On peut éventuellement définir un message qui renseigne l'utilisateur sur la nature de l'objet à sélectionner
<type> peut être :
- GPoint : pour un point
- GDroite : pour une droite
- GDemidroite : pour une demi-droite
- GSegment : pour un segment
- GCercle : pour un cercle
2. Les tests
Toutes les instructions de test suivent la syntaxe suivante :
if<instr> <condition>
(instruction si la condition est vérifiée)
endif
ifexists <type> nomobj
<instr>
endif
<instr> ne sera executé qui si des objets de type donné
<type> portant les noms nomobj existent.
Cela permet d'éviter d'utiliser des objets qui n'ont pas été définis ou
qui ont été détruits.
Les types pour <type> sont :
On peut utiliser les opérateurs logiques & (et), |
(ou) et ! (non) et des parenthèses.
Exemple :
ifexists Point A & Point B &
Point C
if exists (Segment [AB] | Droite (AB))
& Point C & !(Point D)
iflikepoint p1=p2
<instr>
endif
Teste si les deux points p1 et p2 sont identiques, même s'ils ont été
définis différemment.
Comme pour ifexists, on peut utiliser des opérateurs logiques.
iflike obj
<instr>
endif
Teste s'il existe un objet identique à obj qui doit être un
point, une droite, un segment ou un cercle.
Comme pour ifexists, on peut utiliser des opérateurs logiques.
3. Création d'objets
Les objets sont créés temporairement, le temps de l'exécution du script.
Il ne sont pas affichés à l'écran. Pour créer définitivement un objet, il
faut utiliser la commande export.
Pour ne pas interférer avec des objets déjà créés, les objets nouvellement
créés doivent avoir pour nom @10000, @10001,
@10002, ... tous commençant par le caractère spécial @.
On peut aussi omettre le nom des objets dans leur définition. On y fait alors référence par l'indicateur spécial LAST pour le dernier objet créé ou LAST(1) pour l'avant dernier, LAST(2) pour l'antépénultième (avant-avant-dernier), etc...
Objets de base
Point nom(x,y) [sur obj]
Crée un point, éventuellement lié à un objet (droite, segment, cercle).
Lorsque le point est lié à une droite, obj est le nom de la droite.
Lorsque le point est lié à un segment, obj est du type
[p1p2]. Dans le cas d'un cercle, cercle nom_du_cercle.
Les coordonnées peuvent être ajustées pour être sur l'objet.
Exemple :
Point A(50,100)
Point B(10,10) sur d
Point C(50,60) sur [AB]
Point D(60,70) sur cercle @10
nom=droite (p1p2)
Crée la droite passant par les points p1 et p2. La
droite est nommée nom.
Exemple :
Point A(50,100)
Point B(10,10)
d= droite (AB)
nom=segment [p1p2]
Crée le segment d'extrémités les points p1 et p2.
Exemple :
Point A(50,100)
Point B(10,10)
@10000= segment[AB]
nom=demi-droite [p1p2)
Crée la demi-droite d'origine p1 et qui passe par p2.
Exemple :
Point A(50,100)
Point B(10,10)
@10000= demi-droite [AB)
nom= cercle de centre <c> passant
par <p>
Crée un cercle.
Exemple :
@10000= cercle de centre A passant par B
nom= cercle de diametre
[p1p2]
Crée un cercle de diamètre donné
Exemple :
@10000= cercle de diametre [AB]
Objets construits
nom= droite perpendiculaire a <d>
passant par <p>
Exemple :
@10000= droite perpendiculaire a d passant par A
nom= droite parallele a <d> passant
par <p>
Exemple :
@10000= droite parallele a d passant par A
nom= mediatrice de [p1p2]
Exemple :
@10000= mediatrice de [AB]
nom= bissectrice de p1p2p3
Exemple :
@10000= bissectrice de ABC
nom= milieu de [p1p2]
Exemple :
I= milieu de [AB]
nom= homothetie de <p> de centre
<c> et de facteur <f>
Exemple :
@10000= homothetie de A de centre O et de facteur -0.25
nom= symetrie(<obj>) de
<p>
Symétrie centrale ou axiale selon que obj est une droite ou un point.
Exemple :
@10000= symetrie(O) de A
@10001= symetrie(d) de A
nom= projection de <p> sur
<d>
Projection orthogonale sur une droite. <d> peut être une droite, un
segment ou une demi-droite. Dans tous les cas, on considère la projection sur
la droite.
Exemple :
@10000= projection de A sur d
nom= translation de <p> de vecteur
<p1p2>
Exemple :
C= translation de D de vecteur AB
nom= intersection(0|1) de obj1 et de
obj2
Intersection entre deux objets. Lorsque plusieurs intersections sont
possibles (avec des cercles), on les distingue en précisant 0 ou 1 entre les
parenthèses.
Les objets peuvent être : droite, segment, demi-droite, cercle.
Exemple :
@10000= intersection(0) de d et de d'
@10001= cercle de centre A passant par B
@10002= intersection(0) de d et de @10001
@10003= intersection(1) de d et de @10002
Attributs
On peut faire précéder la définition d'un objet par des attributs, notés
entre accolades.
- {invisible}
- {epais}
- {plein}
- {tiretlong}
- {pointille}
- {tiretpointille}
- {tiretcourt}
// -------------------------------------- //
// Kietu? Statistiques de fréquentations. //
// -------------------------------------- //
// Version : 3.2 //
// Auteur : Fabien Regost //
// Web : http://www.kietu.net //
// -------------------------------------- //
/*
Copyright (C) 2002-2003 Fabien Regost
Distribué sous licence GNU GPL
Nom du fichier : hit.php
Modification : 26/02/04 18:37
*/
// Récupération des variables
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) & $_SERVER['HTTP_X_FORWARDED_FOR']!='')
{
$kietu['remote_addr']=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$kietu['remote_addr']=$_SERVER['REMOTE_ADDR'];
}
$kietu['http_user_agent']=$_SERVER['HTTP_USER_AGENT'];
if (!isset($_GET['website'])||$_GET['website']=='')
{
$kietu['website']=$website;
}
else
{
$kietu['website']=mysql_real_escape_string($_GET['website']);
}
$kietu['appel']=$_GET['appel'];
//$kietu['http_referer']=mysql_real_escape_string($_SERVER['HTTP_REFERER']);
//$kietu['referimg']=mysql_real_escape_string($_GET['referimg']);
//$kietu['php_self']=mysql_real_escape_string($_SERVER['PHP_SELF']);
if (isset($url_hit)&$url_hit!='') {$kietu['url_hit']=$url_hit;} else {$kietu['url_hit']=mysql_real_escape_string($_GET['url_hit']);}
$kietu['cookie']=$_COOKIE['kie_coo_'.kie_CheckValidName($kietu['website'])];
// Definition fonction
function kie_CheckValidName($str1)
{
$invalide = array('.','é','è','\\','/',':','*','?','"','<','>','|');
$i=0;
while ($invalide[$i])
{
$str1 = strtr($str1, $invalide[$i], '_');
$i++;
}
return $str1;
}
// Configuration
//Modification 03/02/2010 : faille depuis $_GET['url_hit']
/*
if (file_exists($kietu['url_hit'].'config.php'))
{
require ($kietu['url_hit'].'config.php');
}
if (file_exists($kietu['url_hit'].'define/moteur.php'))
{
require ($kietu['url_hit'].'define/moteur.php');
}
*/
require("./kietu/config.php");
require("./kietu/define/moteur.php");
//Fin modif 03/02/2010
// Verification cookie
if ($kietu['cookie']!=1)
{
// Fonctions (Telechargées sur www.phpapps.org / Créées pas samsauce@lycos.fr / Modifiées)
function kie_systeme($agent)
{
if (eregi('(win|windows) ?(9x ?4\.90|Me)', $agent)) return 14;
if (eregi('(win|windows) ?(98)', $agent)) return 19;
if (eregi('(win|windows) ?(2000)', $agent)) return 17;
if (eregi('(win|windows) ?(95)', $agent)) return 18;
if (eregi('(win|windows) ?(NT)', $agent))
{
if (eregi('(win|windows) ?NT ?(5\.1|6(\.0)?)', $agent)) return 15;
if (eregi('(win|windows) ?NT ?(5(\.0)?)', $agent)) return 17; return 16;
}
if (eregi('(win|windows) ?XP', $agent)) return 15;
if (eregi('(win|windows)', $agent)) return 13;
if (eregi('(linux)', $agent)) return 12;
if (eregi('SunOs', $agent)) return 10;
if (eregi('(freebsd|openbsd|netbsd)', $agent)) return 9;
if (eregi('(AIX)', $agent)) return 8;
if (eregi('(QNX)', $agent)) return 21;
if (eregi('(HP-UX)', $agent)) return 7;
if (eregi('(IRIX)', $agent)) return 6;
if (eregi('(unix|x11)', $agent)) return 5;
if (eregi('(mac|ppc)', $agent)) return 4;
if (eregi('beos', $agent)) return 3;
if (eregi('os/2', $agent)) return 2;
if (eregi('(bot|google|slurp|scooter|spider|infoseek|arachnoidea|altavista)', $agent)) return '01';
if (eregi('tv', $agent)) return 20;
return 0;
}
function kie_navigateur($agent)
{
$kie_liste_navigateurs=array('5'=>'Amaya','6'=>'AOL','7'=>'AvantGo','8'=>'Bluefish','9'=>'Dillo','10'=>'Galeon','11'=>'iCab','12'=>'ICEBrowser','13'=>'Konqueror','14'=>'Lynx','15'=>'Opera','16'=>'Oregano','17'=>'WebTv','18'=>'Wget','19'=>'Safari','20'=>'Kanari');
for ($kie_i=5, $kie_type_navigateur='';$kie_i<=19;$kie_i++) if (eregi($kie_liste_navigateurs[$kie_i] . '[ \/]([0-9\.]+)', $agent, $kie_version)) return $kie_i.'**'.$kie_version[1];
if (eregi('MSIE[ \/]([0-9\.]+)', $agent, $kie_version)) return '4**'.$kie_version[1];
if (eregi('Mozilla/([0-9.]+)', $agent, $kie_version) && !eregi('compatible', $agent)) {
if (eregi('netscape[[:alnum:]]*[/\ ]([0-9.]+)', $agent, $kie_version)) return '2**'.$kie_version[1];
if (eregi('rv:([0-9.]+)', $agent, $kie_version) || eregi('[^[]]m([0-9.]+)',$agent, $kie_version)) return '3**'.$kie_version[1];
return '2**'.$kie_version[1];
}
if (eregi('(bot|google|slurp|scooter|spider|infoseek|arachnoidea|altavista)', $agent)) return '1**0';
return '0**0';
}
// Initialisation de mySQL
mysql_connect($kietu_mysql_address,$kietu_mysql_user,$kietu_mysql_pass) or die('Connexion impossible.');
mysql_select_db($kietu_mysql_database) or die('Erreur connexion à la BDD');
$kietu['http_referer']=mysql_real_escape_string($_SERVER['HTTP_REFERER']);
$kietu['referimg']=mysql_real_escape_string($_GET['referimg']);
$kietu['php_self']=mysql_real_escape_string($_SERVER['PHP_SELF']);
$kie_heure=date('Y-m-d', mktime(date('H') + $kie_decalage));
$kie_heure2=date('H', mktime(date('H') + $kie_decalage));
// Navigateur
$kie_browser=kie_navigateur($kietu['http_user_agent']);
$kie_browser=explode('**',$kie_browser);
$kie_browser_type=mysql_real_escape_string($kie_browser[0]);
$kie_browser_ver=mysql_real_escape_string(strtr($kie_browser[1],'.',''));
// OS
$kie_os=mysql_real_escape_string(kie_systeme($kietu['http_user_agent']));
// Requete de verification
$kietu['website']=substr($kietu['website'], 0, 10);
$kie_temp=$kietu['remote_addr'];
$kie_temp2=mysql_real_escape_string($kietu['website']);
$kie_query='SELECT id FROM kietu_visit WHERE site=\''.$kie_temp2.'\' AND nav=\''.$kie_browser_type.'\' AND navver=\''.$kie_browser_ver.'\' AND sys=\''.$kie_os.'\' AND date=\''.$kie_heure.'\' AND LEFT(ip,9)=\''.substr($kie_temp,0,9).'\' LIMIT 1';
$kie_result=mysql_query($kie_query) or die('Erreur controle visiteur deja passé');
$kie_nbr_enr=mysql_num_rows($kie_result);
// Envoi dans les BDD selon le résultat
if ($kie_nbr_enr==0)
{
// Référant
if ($kietu['appel']=='img')
{
$kietu_temp=str_replace('**','?',$kietu['referimg']);
$kie_refer=str_replace('*','&',$kietu_temp);
if ($kie_refer=='')
{
$kie_refer='Inaccessible (appel du script par une image)';
}
}
else
{
$kie_refer=$kietu['http_referer'];
}
$kietu_temp=parse_url($kie_refer);
$kie_from=$kietu_temp['host'].$kietu_temp['path'];
$kie_from=mysql_real_escape_string(substr($kie_from,0,strrpos($kie_from,'/')));
if($kie_from=='')
{
$kie_from='Lien direct';
}
if (is_array($kietu_ref_a_ignorer))
{
while(list($kie_key, $kie_value)=each($kietu_ref_a_ignorer))
{
$kie_temp2=parse_url($kie_value);
if ($kietu_temp['host']==$kie_temp2['host'])
{
$kie_from='Ignoré';
}
}
}
else
{
$kie_temp2=parse_url($kie_ref_a_ignorer);
if ($kietu_temp['host']==$kie_temp2['host']&$kietu_temp!='')
{
$kie_from='Ignoré';
}
}
// Insertion BDD n°1 (kietu_visit)
$kie_temp=mysql_real_escape_string($kietu['remote_addr']);
$kie_temp2=mysql_real_escape_string($kietu['website']);
$kie_query='INSERT INTO kietu_visit (site, ip, nav, navver, refer, sys, date) VALUES (\''.$kie_temp2.'\', \''.$kie_temp.'\',\''.$kie_browser_type.'\', \''.$kie_browser_ver.'\', \''.$kie_from.'\', \''.$kie_os.'\', \''.$kie_heure.'\')';
$kie_result=mysql_query($kie_query) or die('Erreur insertion dans la BDD');
$kie_id=mysql_insert_id();
// Recherche du domaine
$kie_temp=@gethostbyaddr($kietu['remote_addr']);
$kie_domaine=mysql_real_escape_string(strtolower(strrchr ($kie_temp, '.')));
if ($kie_temp==$kietu['remote_addr'])
{
$kie_domaine='IP';
}
// Insertion BDD n°2 (kietu_domai)
$kie_temp2=mysql_real_escape_string($kietu['website']);
mysql_query('UPDATE kietu_domai SET nombre=nombre + 1 WHERE site=\''.$kie_temp2.'\' AND domaine=\''.$kie_domaine.'\' AND date=\''.$kie_heure.'\' LIMIT 1');
if(mysql_affected_rows()==0)
{
mysql_query('INSERT INTO kietu_domai (site, domaine, nombre, date) values (\''.$kie_temp2.'\', \''.$kie_domaine.'\', 1,\''.$kie_heure.'\')') or die('Erreur insertion domaines');
}
}
// Page demandée + Insertion BDD n°3 (kietu_pages)
if ($kietu['appel']=='img')
{
$kie_dem=parse_url($kietu['http_referer']);
}
else
{
$kie_dem=parse_url($kietu['php_self']);
}
$kie_request=$kie_dem['path'].$kie_dem['query'];
$masque='^([[:alnum:]/_\.-]*)index.([[:alpha:]])+$';
if (ereg($masque,$kie_request,$recup)==true)
{
if ($recup[1]=='')
{
$kie_request='/';
}
else
{
$kie_request=$recup[1];
}
}
if (isset($kietu['psefra']) & $kietu['psefra']!='')
{
$kie_request .=' '.htmlspecialchars($kietu['psefra']);
}
$kie_request=substr($kie_request,0,50).mysql_real_escape_string($_GET['page']);
$kie_temp2=$kietu['website'];
mysql_query('UPDATE kietu_pages SET nombre=nombre+1 WHERE site=\''.$kie_temp2.'\' AND pages=\''.$kie_request.'\' AND date=\''.$kie_heure.'\' LIMIT 1');
if(mysql_affected_rows()==0)
{
mysql_query('INSERT INTO kietu_pages (site, pages, nombre, date) values (\''.$kie_temp2.'\', \''.$kie_request.'\', 1,\''.$kie_heure.'\')') or die('Erreur insertion pages');
}
// Page par heure + Insertion BDD n°4 (kietu_heure)
$kie_temp2=mysql_real_escape_string($kietu['website']);
mysql_query('UPDATE kietu_heure SET '.$kie_heure2.'_h='.$kie_heure2.'_h + 1 WHERE site=\''.$kie_temp2.'\' AND date=\''.$kie_heure.'\' LIMIT 1');
if(mysql_affected_rows()==0)
{
mysql_query('INSERT INTO kietu_heure (site, date, '.$kie_heure2.'_h) values (\''.$kie_temp2.'\', \''.$kie_heure.'\', 1)') or die('Erreur insertion heure');
}
// Mots-clés + Insertion BDD n°5 (kietu_motcl)
function kie_trouver_motcle($chaine,$cle)
{
parse_str($chaine);
if (isset($$cle))
{
return $$cle;
}
}
$kie_temp=parse_url($kie_refer);
while(list($key,$value)=each($kie_moteur))
{
if(eregi($key,$kie_temp['host']))
{
if (is_array($value[1]))
{
while (list($key2,$value2)=each($value[1]))
{
$kie_motcl.=kie_trouver_motcle($kie_temp['query'],$value2);
}
}
else
{
$kie_motcl.=kie_trouver_motcle($kie_temp['query'],$value[1]);
}
$kie_motcl=rawurldecode($kie_motcl);
if ($kie_motcl<>'')
{
mysql_query('INSERT INTO kietu_motcl (id, keywords) values ('.$kie_id.',\''.mysql_real_escape_string($kie_motcl).'\')') or die ('Erreur insertion mots clés');
break;
}
}
}
// Archivage automatique
if($kietu['archivageauto']==1) {
$mois=date("n");
$annee=date("Y");
if($mois=="1") {
$mois="12";
$annee--;
} else {
$mois--;
}
$sit=$kie_temp2;
$result=mysql_query('DELECT ID FROM kietu_archive WHERE mois='.$mois.' AND annee='.$annee.' AND site=\''.$sit.'\'');
if (mysql_num_rows($result)==0) {
include("modules/fonction_archive.php");
archivage($mois,$annee,$sit);
}
}
mysql_close();
}
// Affichage logo/texte
if ($kietu['appel']=='img')
{
header ('Location: media/kietu.gif');
}
elseif ($kietu_aff_logo==1)
{
echo '';
}
elseif ($kietu_aff_text==1)
{
echo ''.$kie_text.'';
}
else
{
echo '';
}
?>
|