First version of the WordsCloud site
This commit is contained in:
commit
8a6973fcb6
13 changed files with 1656 additions and 0 deletions
9
addWord.php
Normal file
9
addWord.php
Normal file
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
?>
|
||||
|
||||
<form method="post" action="index.php">
|
||||
<label for="fword" class="required">Mot</label>
|
||||
<input type="text" id="fword" name="fword" placeholder="Mot à entrer" required/>
|
||||
<input type="hidden" id="fcloud" name="fcloud" value="<?php echo $cloud ?>" >
|
||||
<input type="submit" value="Réserver"/>
|
||||
</form>
|
36
create.php
Normal file
36
create.php
Normal file
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
include('templates/header.php');
|
||||
include('db.php');
|
||||
$db = new DataBase();
|
||||
if (!$db->isInit()) {
|
||||
echo 'Error db init';
|
||||
return;
|
||||
}
|
||||
|
||||
$db->cleanCloud();
|
||||
|
||||
$length = 6;
|
||||
$token = bin2hex(random_bytes($length));
|
||||
|
||||
while (!$db->createCloud($token)) {
|
||||
$token = bin2hex(random_bytes($length));
|
||||
}
|
||||
?>
|
||||
|
||||
<div id="cloud_links">
|
||||
<div id="cloud_links_results" class="cloud_link">
|
||||
<span class="label">Voici le lien pour visualiser le nuage de mots</span>
|
||||
<span class="link">
|
||||
<a href="result.php?id=<?php echo $token ?>">id=<?php echo $token ?></a>
|
||||
</span>
|
||||
</div>
|
||||
<div id="cloud_links_vote" class="cloud_link">
|
||||
<span class="label">Voici le lien pour participer au nuage</span>
|
||||
<span class="link">
|
||||
<a href="index.php?id=<?php echo $token ?>">id=<?php echo $token ?></a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
include('templates/footer.php');
|
50
css/style.css
Normal file
50
css/style.css
Normal file
|
@ -0,0 +1,50 @@
|
|||
/******************* Constants *******************/
|
||||
:root {
|
||||
--font-color: #EFEFEF;
|
||||
--font-color-em: #8C8C8C;
|
||||
--background-color-main: #404040;
|
||||
--background-color-secondary: #505050;
|
||||
--avatar-background: #B6B6B6;
|
||||
--color01: #99CCFF;
|
||||
--color01_bright: #58af58;
|
||||
--color02: #ab7026;
|
||||
--color02_bright: #ea9a36;
|
||||
|
||||
--nav-maxwidth: 900px;
|
||||
--nav-height: 5em;
|
||||
--body-maxwidth: 900px;
|
||||
--footer-maxwidth: 900px;
|
||||
--footer-height: 9em;
|
||||
--padding-border: 1em;
|
||||
}
|
||||
|
||||
/******************* Page *******************/
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
html {
|
||||
background-color: var(--background-color-main);
|
||||
font-family: Lato, Helvetica, sans-serif;
|
||||
font-size: large;
|
||||
color: var(--font-color);
|
||||
min-height: 100vh
|
||||
}
|
||||
body {
|
||||
margin: 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--font-color);
|
||||
}
|
||||
|
||||
/******************* Header *******************/
|
||||
|
||||
#navbar {
|
||||
height: 2em;
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
#my_canvas {
|
||||
height: 400px;
|
||||
}
|
169
db.php
Normal file
169
db.php
Normal file
|
@ -0,0 +1,169 @@
|
|||
<?php
|
||||
class DataBase
|
||||
{
|
||||
private $db;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->init();
|
||||
}
|
||||
|
||||
public function init()
|
||||
{
|
||||
try {
|
||||
$this->db = new PDO('sqlite:test.db');
|
||||
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
} catch (PDOException $e) {
|
||||
echo $e->getMessage();
|
||||
return null;
|
||||
}
|
||||
$stmt = $this->db->prepare('PRAGMA foreign_keys = 1;');
|
||||
$stmt->execute();
|
||||
}
|
||||
|
||||
public function isInit()
|
||||
{
|
||||
return isset($this->db);
|
||||
}
|
||||
|
||||
public function buildTables()
|
||||
{
|
||||
$stmt = $this->db->prepare('CREATE TABLE IF NOT EXISTS clouds('
|
||||
. 'id_cloud INTEGER PRIMARY KEY, '
|
||||
. 'code TEXT NOT NULL UNIQUE, '
|
||||
. 'create_t TIMESTAMP DEFAULT CURRENT_TIMESTAMP);'
|
||||
);
|
||||
$stmt->execute();
|
||||
$stmt = $this->db->prepare('CREATE TABLE IF NOT EXISTS words('
|
||||
. 'id_word INTEGER PRIMARY KEY, '
|
||||
. 'word TEXT NOT NULL, '
|
||||
. 'count INT DEFAULT 1, '
|
||||
. 'cloud_id INT NOT NULL, '
|
||||
. 'FOREIGN KEY (cloud_id) '
|
||||
. 'REFERENCES clouds(id_cloud) ON UPDATE CASCADE '
|
||||
. 'ON DELETE CASCADE);'
|
||||
);
|
||||
$stmt->execute();
|
||||
}
|
||||
|
||||
public function addWord(string $cloud, string $word)
|
||||
{
|
||||
if (empty($word)) {
|
||||
return false;
|
||||
}
|
||||
$stmt = $this->db->prepare('SELECT * FROM clouds WHERE code = :id;');
|
||||
$stmt->bindValue(':id', $cloud, PDO::PARAM_STR);
|
||||
$stmt->execute();
|
||||
$cloudId = null;
|
||||
if ($data = $stmt->fetch()) {
|
||||
$cloudId = $data['id_cloud'];
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
$stmt = $this->db->prepare('SELECT * FROM words '
|
||||
. 'WHERE cloud_id = :cid AND word = :w;'
|
||||
);
|
||||
$stmt->bindValue(':cid', $cloudId, PDO::PARAM_INT);
|
||||
$stmt->bindValue(':w', $word, PDO::PARAM_STR);
|
||||
$stmt->execute();
|
||||
if ($data = $stmt->fetch()) {
|
||||
$wordId = $data['id_word'];
|
||||
$stmt = $this->db->prepare(
|
||||
'UPDATE words SET count = count + 1 WHERE id_word = :id;'
|
||||
);
|
||||
$stmt->bindValue(':id', $wordId, PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
} else {
|
||||
$stmt = $this->db->prepare(
|
||||
'INSERT INTO words(word, cloud_id) VALUES(:w, :cid);'
|
||||
);
|
||||
$stmt->bindValue(':w', $word, PDO::PARAM_STR);
|
||||
$stmt->bindValue(':cid', $cloudId, PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
}
|
||||
}
|
||||
public function getWords(string $id)
|
||||
{
|
||||
$stmt = $this->db->prepare('SELECT * FROM words '
|
||||
. 'JOIN clouds ON words.cloud_id = clouds.id_cloud '
|
||||
. 'WHERE code = :id;'
|
||||
);
|
||||
$stmt->bindValue(':id', $id);
|
||||
$stmt->execute();
|
||||
$words = [];
|
||||
$values = [];
|
||||
while ($data = $stmt->fetch()) {
|
||||
$words[] = array($data['word'], $data['count']);
|
||||
$values[] = $data['count'];
|
||||
$total += $data['count'];
|
||||
}
|
||||
|
||||
array_multisort($values, SORT_DESC, $words);
|
||||
return $words;
|
||||
}
|
||||
|
||||
public function getWordsPercentage(string $id)
|
||||
{
|
||||
$words = $this->getWords($id);
|
||||
//echo 'test';
|
||||
//var_dump($words);
|
||||
$total = 0;
|
||||
foreach ($words as $word) {
|
||||
$total += $word[1];
|
||||
}
|
||||
foreach ($words as $key => $word) {
|
||||
$words[$key] = array($word[0], $word[1] / $total);
|
||||
}
|
||||
|
||||
return $words;
|
||||
}
|
||||
|
||||
public function getWordsMax(string $id)
|
||||
{
|
||||
$words = $this->getWords($id);
|
||||
//echo 'test';
|
||||
//var_dump($words);
|
||||
$max = 0;
|
||||
foreach ($words as $word) {
|
||||
$max = max($max, $word[1]);
|
||||
}
|
||||
foreach ($words as $key => $word) {
|
||||
$words[$key] = array($word[0], $word[1] / $max);
|
||||
}
|
||||
|
||||
return $words;
|
||||
}
|
||||
|
||||
public function createCloud(string $ref)
|
||||
{
|
||||
$stmt = $this->db->prepare('INSERT INTO clouds(code) VALUES(:code);');
|
||||
$stmt->bindValue(':code', $ref);
|
||||
try {
|
||||
$stmt->execute();
|
||||
} catch (PDOEXception $e) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public function cleanCloud()
|
||||
{
|
||||
$stmt = $this->db->prepare('DELETE FROM clouds '
|
||||
. "WHERE create_t < (SELECT datetime('now', '-1 week'));"
|
||||
);
|
||||
$stmt->execute();
|
||||
return true;
|
||||
}
|
||||
|
||||
public function isCloud(string $id)
|
||||
{
|
||||
$stmt = $this->db->prepare('SELECT * FROM clouds WHERE code = :id;');
|
||||
$stmt->bindValue(':id', $id, PDO::PARAM_STR);
|
||||
$stmt->execute();
|
||||
if ($stmt->fetch()) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
19
get.php
Normal file
19
get.php
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
|
||||
include('db.php');
|
||||
$db = new DataBase();
|
||||
if (!$db->isInit()) {
|
||||
echo 'Error db init';
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isset($_GET['id'])) {
|
||||
echo json_encode(false);
|
||||
}
|
||||
$id = $_GET['id'];
|
||||
|
||||
if ($words = $db->getWordsMax($id)) {
|
||||
echo json_encode($words);
|
||||
} else {
|
||||
echo json_encode('No id');
|
||||
}
|
43
index.php
Normal file
43
index.php
Normal file
|
@ -0,0 +1,43 @@
|
|||
<?php
|
||||
|
||||
include('templates/header.php');
|
||||
include('db.php');
|
||||
|
||||
$db = new DataBase();
|
||||
if (!$db->isInit()) {
|
||||
echo 'Error db init';
|
||||
return;
|
||||
}
|
||||
$db->buildTables();
|
||||
if (isset($_GET['id'])) {
|
||||
$id = $_GET['id'];
|
||||
if (!$db->isCloud($id)) {
|
||||
echo 'NO CLOUD';
|
||||
return;
|
||||
}
|
||||
$nbWords = 3;
|
||||
?>
|
||||
<form method="post" action="save.php">
|
||||
<input type="hidden" id="fid" name="fid" value="<?php echo $id;?>">
|
||||
<?php
|
||||
for ($i=0;$i<$nbWords;$i++) {
|
||||
$name = 'fword' . $i;
|
||||
?>
|
||||
<label for="<?php echo $name;?>">test</label>
|
||||
<input type="text" id="<?php echo $name;?>" name="<?php echo $name;?>">
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
<input type="submit" value="Submit">
|
||||
</form>
|
||||
<?php
|
||||
} else {
|
||||
?>
|
||||
<p>Voulez-vous créer un nouveau nuage de mots?</p>
|
||||
<form method="post" action="create.php">
|
||||
<input type="submit" value="Créer">
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
include('templates/footer.php');
|
||||
?>
|
32
js/display.js
Normal file
32
js/display.js
Normal file
|
@ -0,0 +1,32 @@
|
|||
var list = [['foo', 12], ['bar', 6], ['asd', 2], ['bar', 6], ['gert', 10]];
|
||||
//document.getElementById('my_canvas').innerHTML = 'test';
|
||||
//WordCloud(document.getElementById('my_canvas'), { list: list } );
|
||||
console.log(list);
|
||||
var oReq = new XMLHttpRequest(); // New request object
|
||||
oReq.onload = function() {
|
||||
//var weightFactor = function()
|
||||
|
||||
// This is where you handle what to do with the response.
|
||||
// The actual data is found on this.responseText
|
||||
var list = JSON.parse(this.responseText); // Will alert: 42
|
||||
console.log(list);
|
||||
var options = {};
|
||||
options.list = list;
|
||||
//options.gridSize = 15;
|
||||
options.shuffle = true;
|
||||
options.rotateRatio = 0.5;
|
||||
options.weightFactor = 50;
|
||||
options.minSize = 4;
|
||||
options.drawOutOfBound = true;
|
||||
options.backgroundColor = 'rgba(255, 255, 255, 0)';
|
||||
options.color = 'random-light';
|
||||
//options.origin = [400, 100];
|
||||
//options.ellipticity = 5;
|
||||
WordCloud(document.getElementById('my_canvas'), options );
|
||||
};
|
||||
var urlParams = new URLSearchParams(window.location.search);
|
||||
var id = urlParams.get('id');
|
||||
|
||||
oReq.open("get", "get.php?id=" + id, true);
|
||||
|
||||
oReq.send();
|
1218
js/wordcloud2.js
Normal file
1218
js/wordcloud2.js
Normal file
File diff suppressed because it is too large
Load diff
15
result.php
Normal file
15
result.php
Normal file
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
|
||||
include('templates/header.php');
|
||||
|
||||
?>
|
||||
|
||||
<div id="my_canvas">
|
||||
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
|
||||
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
|
||||
</div>
|
||||
|
||||
|
||||
<?php
|
||||
$jsWordcloud = true;
|
||||
include('templates/footer.php');
|
36
save.php
Normal file
36
save.php
Normal file
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
include('db.php');
|
||||
$db = new DataBase();
|
||||
if (!$db->isInit()) {
|
||||
echo 'Error db init';
|
||||
return;
|
||||
}
|
||||
|
||||
if (empty($_POST)) {
|
||||
header('Location: index.php');
|
||||
die();
|
||||
}
|
||||
|
||||
echo '<pre>';
|
||||
var_dump($_POST);
|
||||
echo '</pre>';
|
||||
|
||||
$id = null;
|
||||
foreach ($_POST as $name => $value) {
|
||||
if ($name == 'fid') {
|
||||
$id = $value;
|
||||
continue;
|
||||
}
|
||||
if (isset($id)) {
|
||||
$value = trim(strtolower($value));
|
||||
$db->addWord($id, $value);
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($id)) {
|
||||
header('Location: index.php');
|
||||
die();
|
||||
}
|
||||
header('Location: result.php?id=' . $id);
|
||||
die();
|
11
templates/footer.php
Normal file
11
templates/footer.php
Normal file
|
@ -0,0 +1,11 @@
|
|||
</div>
|
||||
<div id="footer">
|
||||
WordsCloud -- Gregory Trolliet
|
||||
</div>
|
||||
<?php
|
||||
if (!empty($jsWordcloud)) {
|
||||
echo '<script type="text/javascript" src="js/display.js"></script>';
|
||||
}
|
||||
?>
|
||||
</body>
|
||||
</html>
|
18
templates/header.php
Normal file
18
templates/header.php
Normal file
|
@ -0,0 +1,18 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
|
||||
<head>
|
||||
<meta name="description" content="Webpage description goes here" />
|
||||
<meta charset="utf-8">
|
||||
<title>Change_me</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="author" content="">
|
||||
<link rel="stylesheet" href="css/style.css">
|
||||
<script src="wordcloud2.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="navbar">
|
||||
<a href="index.php">WordsCloud</a>
|
||||
</div>
|
||||
<div class="container">
|
BIN
test.db
Normal file
BIN
test.db
Normal file
Binary file not shown.
Loading…
Reference in a new issue