Compare commits

...

4 commits

5 changed files with 63 additions and 27 deletions

View file

@ -5,3 +5,24 @@ There is nothing stored on the server except the words.
## Database ## Database
Database config option is set in the dbconfig.php file, Database config option is set in the dbconfig.php file,
example is in dbconfig_empty.php. example is in dbconfig_empty.php.
This software is developped with PostgreSQL,
I don't know if it is working with others DB management systems.
## Libraries
### php-i18n
The internationalization is made possible by
[Philipp Schröer (php-i18n project)](https://github.com/Philipp15b/php-i18n).
For now it's only in french but the traduction should be easy.
### Wordcloud2
The display of the words cloud is done by the Wordcloud2 javascript
code, made by
[Timothy Guan-tin Chien](http://timdream.org/wordcloud2.js/).
### Soundex_fr
The words comparison is made with PHP tools and the work of
Florent Bruneau on [the french translation of soundex](http://blog.mymind.fr/blog/2007/03/15/soundex-francais/).

View file

@ -24,12 +24,11 @@ if (empty($_POST)) {
<label for="fsize"><?php echo L::cloud_size ?></label> <label for="fsize"><?php echo L::cloud_size ?></label>
<input type="number" id="fsize" name="fsize" min="1" max="9" value=<?php echo DataBase::DEFAULT_SIZE ?>> <input type="number" id="fsize" name="fsize" min="1" max="9" value=<?php echo DataBase::DEFAULT_SIZE ?>>
</div> </div>
<input type="submit" id="cloud_create_submit" value="<?php echo L::create ?>"> <input type="submit" id="cloud_create_submit" value="<?php echo L::create_button ?>">
</form> </form>
</div> </div>
<?php <?php
} else { } else {
/*$token = bin2hex(random_bytes(DataBase::CLOUD_CODE_LENGTH));*/
if (isset($_POST['fsize']) && is_numeric($_POST['fsize'])) { if (isset($_POST['fsize']) && is_numeric($_POST['fsize'])) {
$size = $_POST['fsize']; $size = $_POST['fsize'];
} else { } else {
@ -45,7 +44,7 @@ if (empty($_POST)) {
} else { } else {
$duration = DataBase::DEFAULT_DURATION; $duration = DataBase::DEFAULT_DURATION;
} }
if ($cloud = $db->createCloud($text, $size, $duration)) { if ($cloud = $db->createCloud($text, $size, $duration)) {
$viewUrl = 'result.php?id=' . $cloud['code']; $viewUrl = 'result.php?id=' . $cloud['code'];
$viewName = 'https://' . $_SERVER['HTTP_HOST'] . '/' . $viewUrl; $viewName = 'https://' . $_SERVER['HTTP_HOST'] . '/' . $viewUrl;

60
db.php
View file

@ -14,6 +14,7 @@ class DataBase
const DEFAULT_SIZE = 3; const DEFAULT_SIZE = 3;
const MAX_SIZE = 9; const MAX_SIZE = 9;
const CLOUD_CODE_LENGTH = 6; const CLOUD_CODE_LENGTH = 6;
const CLOUD_CODE_MAXTRY = 10;
private $db; private $db;
private $cloud; private $cloud;
@ -131,16 +132,40 @@ class DataBase
$stmt->execute(); $stmt->execute();
} }
} }
public function getWordsList(string $id) /**
* Get the list of the words inside the cloud
*
* If there is no $code parameter and the cloud isn't already loaded,
* return null.
*
* Return a list of words, orderer from the most used to the least,
* with the following fields:
* - word => the word
* - count => the number of occurences of the word
* - relative => the relative number of occurences,
* relative to the occurence max
* - percent => the percent of word in the cloud,
* relative to the total number of words
* @param string $code Code of the cloud
* @return array|null The words list
*/
public function getWordsList(string $code = null)
{ {
if (isset($code)) {
$this->loadCloudByCode($code);
}
if (!isset($code) && !$this->isCloudSet()) {
return null;
}
$stmt = $this->db->prepare(" $stmt = $this->db->prepare("
SELECT * SELECT *
FROM words FROM words
JOIN clouds JOIN clouds
ON words.cloud_id = clouds.id_cloud ON words.cloud_id = clouds.id_cloud
WHERE code = :id; WHERE code = :code;
"); ");
$stmt->bindValue(':id', $id); $stmt->bindValue(':code', $this->cloud['code']);
$stmt->execute(); $stmt->execute();
$words = []; $words = [];
$values = []; $values = [];
@ -157,7 +182,7 @@ class DataBase
} }
foreach ($words as $key => $word) { foreach ($words as $key => $word) {
$words[$key]['relative'] = $word['count'] / $max; $words[$key]['relative'] = $word['count'] / $max;
$words[$key]['percent'] = $word['count'] / $total * 100; $words[$key]['percent'] = $word['count'] / $total * 100;
} }
array_multisort($values, SORT_DESC, $words); array_multisort($values, SORT_DESC, $words);
@ -193,34 +218,25 @@ class DataBase
$duration = self::DEFAULT_DURATION; $duration = self::DEFAULT_DURATION;
} }
$cpt = 0; for ($i = 0; $i < self::CLOUD_CODE_MAXTRY; $i++) {
$codeIsUsed = true;
while ($codeIsUsed && $cpt < 0) {
$code = bin2hex(random_bytes(self::CLOUD_CODE_LENGTH)); $code = bin2hex(random_bytes(self::CLOUD_CODE_LENGTH));
$stmt = $this->db->prepare(" $code = '2ae606bfb6d2';
SELECT * if (!$this->loadCloudByCode($code)) {
FROM clouds break;
WHERE code = :code;
");
$stmt->bindValue(':code', $code);
$stmt->execute();
if (!$data = $stmt->fetch()) {
$codeIsUsed = false;
} }
$cpt++;
} }
if ($codeIsUsed) { if ($this->isCloudSet()) {
return false; return false;
} }
$duration = date('Y-m-d H:i:s', strtotime(self::OPTIONS_DURATION[$duration])); $delete = date('Y-m-d H:i:s', strtotime(self::OPTIONS_DURATION[$duration]));
$stmt = $this->db->prepare(" $stmt = $this->db->prepare("
INSERT INTO clouds(code, text, size, delete_t) INSERT INTO clouds(code, text, size, delete_t)
VALUES (:code, :text, :size, :duration); VALUES (:code, :text, :size, :delete);
"); ");
$stmt->bindValue(':code', $code, PDO::PARAM_STR); $stmt->bindValue(':code', $code, PDO::PARAM_STR);
$stmt->bindValue(':text', $text, PDO::PARAM_STR); $stmt->bindValue(':text', $text, PDO::PARAM_STR);
$stmt->bindValue(':size', $size, PDO::PARAM_INT); $stmt->bindValue(':size', $size, PDO::PARAM_INT);
$stmt->bindValue(':duration', $duration, PDO::PARAM_STR); $stmt->bindValue(':delete', $delete, PDO::PARAM_STR);
try { try {
$stmt->execute(); $stmt->execute();
} catch (PDOEXception $e) { } catch (PDOEXception $e) {
@ -230,7 +246,7 @@ class DataBase
'id' => $this->db->lastInsertId(), 'id' => $this->db->lastInsertId(),
'code' => $code, 'code' => $code,
'size' => $size, 'size' => $size,
'delete_t' => $duration, 'delete_t' => $delete,
'text' => $text, 'text' => $text,
); );
return $this->cloud; return $this->cloud;

View file

@ -29,7 +29,7 @@ if (isset($_GET['id'])) {
?> ?>
<p><?php echo L::cloud_create_message ?></p> <p><?php echo L::cloud_create_message ?></p>
<form method="post" action="create.php"> <form method="post" action="create.php">
<input type="submit" value="<?php echo L::create ?>"> <input type="submit" value="<?php echo L::create_button ?>">
</form> </form>
<?php <?php
} }

View file

@ -18,7 +18,6 @@
title = "SimpleWordsCloud" title = "SimpleWordsCloud"
description = "Création de nuage de mots, simple, sans inscriptions et respectant la vie privée" description = "Création de nuage de mots, simple, sans inscriptions et respectant la vie privée"
create = "Créer"
[cloud] [cloud]
description = "Description du nuage" description = "Description du nuage"
@ -47,6 +46,7 @@ cloudNotFound = "Le nuage <em>%s</em> n'a pas été trouvé, veuillez vérifier
[create] [create]
errorCode = "Erreur lors de la création du nuage, désolé du dérangement." errorCode = "Erreur lors de la création du nuage, désolé du dérangement."
button = "Créer"
[duration] [duration]
day = "un jour" day = "un jour"