From 254e38c84c4d92fea40ee7a869e0ce87311333f0 Mon Sep 17 00:00:00 2001
From: "tcharlss@hotmail.fr" <>
Date: Fri, 7 Dec 2012 20:28:37 +0000
Subject: [PATCH] =?UTF-8?q?Ajout=20d'une=20v=C3=A9rification=20pour=20un?=
 =?UTF-8?q?=20num=C3=A9ro=20ISBN=20pas=20d'options,=20peut-=C3=AAtre=20un?=
 =?UTF-8?q?=20num=C3=A9ro=20=C3=A0=2010=20ou=20=C3=A0=2013=20chiffres.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitattributes       |   1 +
 lang/verifier_fr.php |   7 +++
 paquet.xml           |   2 +-
 plugin.xml           |   2 +-
 verifier/isbn.php    | 124 +++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 134 insertions(+), 2 deletions(-)
 create mode 100644 verifier/isbn.php

diff --git a/.gitattributes b/.gitattributes
index f85b3e6..9cdfce9 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -38,6 +38,7 @@ verifier/email.yaml -text
 verifier/entier.php -text
 verifier/entier.yaml -text
 verifier/id_document.php -text
+verifier/isbn.php -text
 verifier/regex.php -text
 verifier/regex.yaml -text
 verifier/siren_siret.php -text
diff --git a/lang/verifier_fr.php b/lang/verifier_fr.php
index 9910276..d5d59d5 100644
--- a/lang/verifier_fr.php
+++ b/lang/verifier_fr.php
@@ -26,6 +26,13 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 	'erreur_entier_min' => 'La valeur doit être supérieure à @min@.',
 	'erreur_id_document' => 'Cet identifiant de document n\'est pas valide.',
 	'erreur_inconnue_generique' => 'Le format n\'est pas correct.',
+	'erreur_isbn' => 'Le numéro ISBN n\'est pas valide (ex: 978-2-1234-5680-3 ou 2-1234-5680-X)',
+	'erreur_isbn_13_X' => 'Un numéro ISBN-13 ne peut pas se terminer par X.',
+	'erreur_isbn_nb_caracteres' => 'Le numéro ISBN doit comprendre 10 ou 13 caractères, sans compter les tirets (actuellement @nb@).',
+	'erreur_isbn_nb_segments' => 'Le numéro ISBN doit comprendre 4 ou 5 segments (actuellement @nb@).',
+	'erreur_isbn_G' => 'Le premier segment doit être égal à 978 ou 979.',
+	'erreur_isbn_segment' => 'Le segment "@segment@" comprend @nb@ chiffre(s) en trop.',
+	'erreur_isbn_segment_lettre' => 'Le segment "@segment@" ne doit pas contenir de lettre.',
 	'erreur_numerique' => 'Le format du nombre n\'est pas valide.',
 	'erreur_regex' => 'Le format de la chaîne n\'est pas valide.',
 	'erreur_siren' => 'Le numéro de SIREN n\'est pas valide.',
diff --git a/paquet.xml b/paquet.xml
index d2355dc..47e0646 100644
--- a/paquet.xml
+++ b/paquet.xml
@@ -1,7 +1,7 @@
 <paquet
 	prefix="verifier"
 	categorie="outil"
-	version="0.1.18"
+	version="0.1.19"
 	etat="test"
 	compatibilite="[2.0.10;3.0.*]"
 	logo="images/verifier-128.png"
diff --git a/plugin.xml b/plugin.xml
index 5cced23..1d10d1b 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -9,7 +9,7 @@
 	<auteur>[Les Développements Durables->http://www.ldd.fr]</auteur>
 	<icon>images/verifier-128.png</icon>
 	<licence>GPL v3</licence>
-	<version>0.1.18</version>
+	<version>0.1.19</version>
 	<etat>test</etat>
 	<description>
 		<multi>
diff --git a/verifier/isbn.php b/verifier/isbn.php
new file mode 100644
index 0000000..aae7dcd
--- /dev/null
+++ b/verifier/isbn.php
@@ -0,0 +1,124 @@
+<?php
+
+// Sécurité
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/**
+ * Validation d'un numero ISBN 
+ *
+ * d apres https://fr.wikipedia.org/wiki/Numéro_ISBN
+ * ISBN-13 : longeur totale 13 caracteres divises en 5 segments de la forme G - A - B - C - K
+ *           G:  3 caracteres (978 ou 979)
+ *           A:  de 1 a 5 caracteres (code de la zone geographique)
+ *           B:  de 1 a 7 caracteres (code de l editeur)
+ *           C:  de 1 a 6 caracteres, completes eventuellement par des 0 afin que le total-G soit egal a 10 caracteres (code du livre)
+ *           K:  1 caractere entre 0 et 9 (cle de controle calculee d apres les autres chiffres)
+ *           ex: 978-2-1234-5680-3
+ * ISBN-10 : longeur totale 10 caracteres divises en 4 segments de la forme A -B -C -K
+ *           A, B, C : idem ISBN-13
+ *           K:  1 caractere entre 0 et 9, ou X (cle de controle calculee d apres les autres chiffres)
+ *           ex: 2-1234-5680-X
+ * 
+ * Avec un numero ISBN comportant des tirets, on pourrait utiliser une regex
+ * pour verifier que chaque segment comporte le nombre adequat de caracteres.
+ * Cependant ca ne permet pas d indiquer precisement la nature de l erreur.
+ * La regex au cas ou : "/^(97[89][- ]){0,1}[0-9]{1,5}[- ][0-9]{1,7}[- ][0-9]{1,6}[- ][0-9X]$/"
+ * 
+ *
+ * @param string $valeur
+ *   La valeur à vérifier.
+ * @return string
+ *   Retourne une chaine vide si c'est valide, sinon une chaine expliquant l'erreur.
+ */
+ 
+function verifier_isbn_dist($valeur, $options=array()){
+
+	// dans tous les cas, on doit avoir 10 ou 13 caracteres (en enlevant les tirets)
+	$val['nb'] = $nb = strlen(preg_replace('/-/', '', $valeur));
+	if (!preg_match("/10|13/", $nb)) {
+		return _T('verifier:erreur_isbn_nb_caracteres', $val);
+	}
+
+	// un numero ISBN-13 ne peut pas se terminer par X
+	else if (preg_match("/^97[89].*X$/", $valeur)) {
+		return _T('verifier:erreur_isbn_13_X'); 
+	}
+
+	// s il y a le bon nombre de caracteres, on verifie qu il soient bien agences
+	else {
+
+		// si le numero ISBN est decompose en segments par des tirets, verifier chaque segment
+		if (preg_match("/-/", $valeur)){
+
+			// d'abord on recupere les valeurs de chaque segment
+			$segments = explode("-", $valeur);
+			$val['nb'] = count($segments);
+			// ISBN-13
+			if ($val['nb'] == 5) {
+				$isbn = 13;
+				$G = $segments[0];
+				$A = $segments[1];
+				$B = $segments[2];
+				$C = $segments[3];
+				$K = $segments[4];
+			}
+			// ISBN-10
+			else if ($val['nb'] == 4) {
+				$isbn = 10;
+				$A = $segments[0];
+				$B = $segments[1];
+				$C = $segments[2];
+				$K = $segments[3];
+			}
+			// on ne sait jamais
+			else {
+				return _T('verifier:erreur_isbn_nb_segments', $val);
+			}
+
+			// puis ensuite, on verifie leur conformite
+			// G
+			if ($G AND !preg_match("/97[89]/", $G)) {
+				return _T('verifier:erreur_isbn_G');
+			}
+			// pas de lettres pour A, B et C
+			foreach (array($A,$B,$C) as $segment){
+				$val['segment'] = $segment;
+				if (!is_numeric($segment))
+					return _T('verifier:erreur_isbn_segment_lettre', $val);
+			}
+			// A (code zone geographique)
+			if ($nbA = strlen($A) AND $nbA > 5) {
+				$val['nb'] = $nbA - 5;
+				$val['segment'] = $A;
+				return _T('verifier:erreur_isbn_segment', $val);
+			}
+			// B (code editeur)
+			if ($nbB = strlen($B) AND $nbB > 7) {
+				$val['nb'] = $nbB - 7;
+				$val['segment'] = $B;
+				return _T('verifier:erreur_isbn_segment', $val);
+			}
+			// C (code livre)
+			if ($nbC = strlen($C) AND $nbC > 6) {
+				$val['nb'] = $nbC - 6;
+				$val['segment'] = $C;
+				return _T('verifier:erreur_isbn_segment', $val);
+			}
+			// K (cle de controle)
+			if ($nbK = strlen($K) AND $nbK > 1) {
+				$val['nb'] = $nbK - 1;
+				$val['segment'] = $K;
+				return _T('verifier:erreur_isbn_segment', $val);
+			}
+		}
+
+		// si le numero ISBN n a pas de tiret, on verifie au moyen d une regex
+		else {
+			// verification generique [978 ou 979] [9 chiffres] [1 chiffre ou lettre X]
+			if (!preg_match("/^(97[89]){0,1}[0-9]{1,9}[0-9X]$/", $valeur))
+				return _T('verifier:erreur_isbn');
+		}
+	}
+
+	return '';
+}
-- 
GitLab