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 config option is set in the dbconfig.php file,
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>
<input type="number" id="fsize" name="fsize" min="1" max="9" value=<?php echo DataBase::DEFAULT_SIZE ?>>
</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>
</div>
<?php
} else {
/*$token = bin2hex(random_bytes(DataBase::CLOUD_CODE_LENGTH));*/
if (isset($_POST['fsize']) && is_numeric($_POST['fsize'])) {
$size = $_POST['fsize'];
} else {
@ -45,7 +44,7 @@ if (empty($_POST)) {
} else {
$duration = DataBase::DEFAULT_DURATION;
}
if ($cloud = $db->createCloud($text, $size, $duration)) {
$viewUrl = 'result.php?id=' . $cloud['code'];
$viewName = 'https://' . $_SERVER['HTTP_HOST'] . '/' . $viewUrl;

60
db.php
View File

@ -14,6 +14,7 @@ class DataBase
const DEFAULT_SIZE = 3;
const MAX_SIZE = 9;
const CLOUD_CODE_LENGTH = 6;
const CLOUD_CODE_MAXTRY = 10;
private $db;
private $cloud;
@ -131,16 +132,40 @@ class DataBase
$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("
SELECT *
FROM words
JOIN clouds
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();
$words = [];
$values = [];
@ -157,7 +182,7 @@ class DataBase
}
foreach ($words as $key => $word) {
$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);
@ -193,34 +218,25 @@ class DataBase
$duration = self::DEFAULT_DURATION;
}
$cpt = 0;
$codeIsUsed = true;
while ($codeIsUsed && $cpt < 0) {
for ($i = 0; $i < self::CLOUD_CODE_MAXTRY; $i++) {
$code = bin2hex(random_bytes(self::CLOUD_CODE_LENGTH));
$stmt = $this->db->prepare("
SELECT *
FROM clouds
WHERE code = :code;
");
$stmt->bindValue(':code', $code);
$stmt->execute();
if (!$data = $stmt->fetch()) {
$codeIsUsed = false;
$code = '2ae606bfb6d2';
if (!$this->loadCloudByCode($code)) {
break;
}
$cpt++;
}
if ($codeIsUsed) {
if ($this->isCloudSet()) {
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("
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(':text', $text, PDO::PARAM_STR);
$stmt->bindValue(':size', $size, PDO::PARAM_INT);
$stmt->bindValue(':duration', $duration, PDO::PARAM_STR);
$stmt->bindValue(':delete', $delete, PDO::PARAM_STR);
try {
$stmt->execute();
} catch (PDOEXception $e) {
@ -230,7 +246,7 @@ class DataBase
'id' => $this->db->lastInsertId(),
'code' => $code,
'size' => $size,
'delete_t' => $duration,
'delete_t' => $delete,
'text' => $text,
);
return $this->cloud;

View File

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

View File

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