week5
This commit is contained in:
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);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user