This commit is contained in:
gauthiier
2016-11-30 12:37:33 +01:00
parent d3d46bbfd2
commit 90c9d8b20a
19 changed files with 3168 additions and 0 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,101 @@
<html>
<head>
<title>TENDER BUTTONS -- RENDER MUTTONS</title>
<style>
/* CSS Styling */
.frame {
width: 30em;
display: inline-block;
}
textarea {
width: 100%;
border: 1px solid #888;
padding: 3px;
}
</style>
</head>
<body>
<!-- HTML -->
<div class="frame">
<label>TENDER BUTTONS</label>
<!-- text area where the conversation is displayed -->
<textarea id="tender_buttons" text="..." rows="65" cols="65">...</textarea>
<!-- inputs from human to send to server -->
<div>
<input type="button" value="Markov Generate" onclick="generate_text();"/>
<label>nbr. verses </label>
<input id="tender_buttons_verses" type="number" min="1" max="25" value="10"/>
<label>verses width</label>
<input id="tender_buttons_verses_width" type="number" min="20" max="100" value="70"/>
<label>min. score </label>
<input id="tender_buttons_score" type="number" min="5" max="100" value="50"/>
</div>
</div>
<div class="frame">
<label>RENDER MUTTONS</label>
<!-- text area where the conversation is displayed -->
<textarea id="render_muttons" text="..." rows="65" cols="65">...</textarea>
<!-- inputs from human to send to server -->
<div>
<input type="button" value="Clear" onclick="clear_text();"/>
</div>
</div>
<!-- SCRIPTS -->
<!-- import socket.io -->
<script src="/socket.io/socket.io.js"></script>
<script>
// connect to localhost on its port (see server.js -- 8088)
var socket = io().connect('http://localhost:8088');
// throbber timer
var timer = null;
// when connecting
socket.on('connect', function (data) {
socket.emit('request bare text', 'n/a');
});
socket.on('bare text', function(msg) {
document.getElementById('tender_buttons').value = msg;
});
socket.on('render muttons', function(msg) {
if(timer) {
clearInterval(timer);
timer = null;
}
document.getElementById('render_muttons').value = msg;
});
function clear_text() {
document.getElementById('render_muttons').value = '';
}
function generate_text() {
clear_text();
var text = document.getElementById('tender_buttons').value;
var verses = document.getElementById('tender_buttons_verses').value;
var width = document.getElementById('tender_buttons_verses_width').value;
var score = document.getElementById('tender_buttons_score').value;
socket.emit('request render muttons', {input: text, nbr_verse: verses, min_score: score, width_verses: width });
timer = setInterval(function() {
document.getElementById('render_muttons').value = document.getElementById('render_muttons').value + '.';
}, 1000);
}
</script>
</body>
</html>
@@ -0,0 +1,18 @@
{
"name": "render_muttons",
"version": "1.0.0",
"description": "markov chain text generation based on Gertrude Steiner's Tender Buttons",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "gauthier",
"license": "ISC",
"dependencies": {
"chance": "^1.0.4",
"express": "^4.14.0",
"markov-strings": "^1.3.2",
"socket.io": "^1.7.1",
"word-wrap": "^1.1.0"
}
}
@@ -0,0 +1,62 @@
var chance = require('chance').Chance();
var wrap = require('word-wrap');
const Markov = require('markov-strings');
function generate_text(text, nbr_verses, min_score, width_verses) {
text = text.replace(/(\r\n|\n|\r)/gm," ")
text = text.match( /[^\.!\?]+[\.!\?]+/g );
const options = {
stateSize: 2,
checker: sentence => {
return sentence.endsWith('.');
}
};
var markov = new Markov(text, options);
markov.buildCorpusSync();
var result = '';
titles = [];
for(var i = 0; i < nbr_verses; i++) {
let option_title = {
minWords: 2,
maxWords: 4,
minScore: min_score
};
let title = markov.generateSentenceSync(option_title).string;
if(title in titles) continue;
titles.push(title);
let option_verse = {
minWords: 2,
maxWords: chance.natural({min: 7, max: 25}),
minScore: min_score,
checker: sentence => {
return sentence.endsWith('.');
}
};
let verse = '';
for(var j = 0; j < chance.natural({min: 3, max: 20}); j++) {
verse += markov.generateSentenceSync(option_verse).string + ' ';
}
result += title.toUpperCase() + '\n\n';
result += wrap(verse + '\n\n', {width: width_verses});
}
return result;
}
exports.generate_text = generate_text;
@@ -0,0 +1,84 @@
// server.js
// import express ()
var express = require('express'); // npm install --save express
var app = express();
// import node.js http
var server = require('http').Server(app);
// import socket.io
var io = require('socket.io')(server); // npm install --save socket.io
// import file system (aka fs)
var fs = require('fs');
// import custom script
var fender_cottons = require('./render_muttons.js');
var text_file = "./TENDER_BUTTONS.txt";
var text = fs.readFileSync(text_file, "utf8");
/* ----------------------------------
Server and Socket Configuration
--------------------------------------*/
// tell express to server our index.html file
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});
// configure socket.io
// (1) when there is a connection
io.on('connection', function(socket) {
console.log('got a connection');
// (2) configure the connected socket to receive custom messages
socket.on('request bare text', function(msg) {
// read the file from memory
var text_file = "./TENDER_BUTTONS.txt";
var text = fs.readFileSync(text_file, "utf8");
// send back its content
io.emit('bare text', text);
});
socket.on('request render muttons', function(msg) {
console.log('rendering a mutton');
try {
// generate new text using custom script 'fender_cottons.js'
var generated_text = fender_cottons.generate_text(msg.input, msg.nbr_verse, msg.min_score, msg.width_verses);
// send back its content
io.emit('render muttons', generated_text);
} catch (e) {
io.emit('render muttons', e.toString());
}
});
socket.on('disconnet', function() {
console.log('got a disconnection');
});
});
/* -------------------
Start the server
----------------------*/
// listen to connection on port 8088 --> http://localhost:8088
server.listen(8088, function () {
console.log('listening on port: ' + 8088);
});