Compare commits
No commits in common. "5a0037f11ac56285bd2aebce481fd0491e998a54" and "76ab05c8c7ee7e36aba2a3ec178e026cd95b91e7" have entirely different histories.
5a0037f11a
...
76ab05c8c7
5 changed files with 27 additions and 63 deletions
21
README.md
21
README.md
|
@ -5,24 +5,3 @@ 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/).
|
||||
|
|
|
@ -24,11 +24,12 @@ 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_button ?>">
|
||||
<input type="submit" id="cloud_create_submit" value="<?php echo L::create ?>">
|
||||
</form>
|
||||
</div>
|
||||
<?php
|
||||
} else {
|
||||
/*$token = bin2hex(random_bytes(DataBase::CLOUD_CODE_LENGTH));*/
|
||||
if (isset($_POST['fsize']) && is_numeric($_POST['fsize'])) {
|
||||
$size = $_POST['fsize'];
|
||||
} else {
|
||||
|
|
60
db.php
60
db.php
|
@ -14,7 +14,6 @@ class DataBase
|
|||
const DEFAULT_SIZE = 3;
|
||||
const MAX_SIZE = 9;
|
||||
const CLOUD_CODE_LENGTH = 6;
|
||||
const CLOUD_CODE_MAXTRY = 10;
|
||||
|
||||
private $db;
|
||||
private $cloud;
|
||||
|
@ -132,40 +131,16 @@ class DataBase
|
|||
$stmt->execute();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 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)
|
||||
public function getWordsList(string $id)
|
||||
{
|
||||
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 = :code;
|
||||
WHERE code = :id;
|
||||
");
|
||||
$stmt->bindValue(':code', $this->cloud['code']);
|
||||
$stmt->bindValue(':id', $id);
|
||||
$stmt->execute();
|
||||
$words = [];
|
||||
$values = [];
|
||||
|
@ -182,7 +157,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);
|
||||
|
@ -218,25 +193,34 @@ class DataBase
|
|||
$duration = self::DEFAULT_DURATION;
|
||||
}
|
||||
|
||||
for ($i = 0; $i < self::CLOUD_CODE_MAXTRY; $i++) {
|
||||
$cpt = 0;
|
||||
$codeIsUsed = true;
|
||||
while ($codeIsUsed && $cpt < 0) {
|
||||
$code = bin2hex(random_bytes(self::CLOUD_CODE_LENGTH));
|
||||
$code = '2ae606bfb6d2';
|
||||
if (!$this->loadCloudByCode($code)) {
|
||||
break;
|
||||
$stmt = $this->db->prepare("
|
||||
SELECT *
|
||||
FROM clouds
|
||||
WHERE code = :code;
|
||||
");
|
||||
$stmt->bindValue(':code', $code);
|
||||
$stmt->execute();
|
||||
if (!$data = $stmt->fetch()) {
|
||||
$codeIsUsed = false;
|
||||
}
|
||||
$cpt++;
|
||||
}
|
||||
if ($this->isCloudSet()) {
|
||||
if ($codeIsUsed) {
|
||||
return false;
|
||||
}
|
||||
$delete = date('Y-m-d H:i:s', strtotime(self::OPTIONS_DURATION[$duration]));
|
||||
$duration = 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, :delete);
|
||||
VALUES (:code, :text, :size, :duration);
|
||||
");
|
||||
$stmt->bindValue(':code', $code, PDO::PARAM_STR);
|
||||
$stmt->bindValue(':text', $text, PDO::PARAM_STR);
|
||||
$stmt->bindValue(':size', $size, PDO::PARAM_INT);
|
||||
$stmt->bindValue(':delete', $delete, PDO::PARAM_STR);
|
||||
$stmt->bindValue(':duration', $duration, PDO::PARAM_STR);
|
||||
try {
|
||||
$stmt->execute();
|
||||
} catch (PDOEXception $e) {
|
||||
|
@ -246,7 +230,7 @@ class DataBase
|
|||
'id' => $this->db->lastInsertId(),
|
||||
'code' => $code,
|
||||
'size' => $size,
|
||||
'delete_t' => $delete,
|
||||
'delete_t' => $duration,
|
||||
'text' => $text,
|
||||
);
|
||||
return $this->cloud;
|
||||
|
|
|
@ -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_button ?>">
|
||||
<input type="submit" value="<?php echo L::create ?>">
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
|
||||
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"
|
||||
|
@ -46,7 +47,6 @@ 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"
|
||||
|
|
Loading…
Reference in a new issue