-
Notifications
You must be signed in to change notification settings - Fork 0
/
haiku.js
150 lines (132 loc) · 3.69 KB
/
haiku.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
var fs = require('fs');
// returns contents of file as a string
function fileToString(file){
return fs.readFileSync(file).toString();
}
// takes a string, splits into an array by line break, then splits into sub-arrays by space.
function formatData(data){
var objOfArrs = {};
var lines = data.toString().split("\n");
//console.log(lines);
var lineSplit;
for (var x = 0; x < lines.length - 1; x++){
var thisLine = lines[x].split(' ');
var thisWord = thisLine[0];
if (thisWord.indexOf('\(') !== -1){
var thisIndex = thisWord.indexOf('\(');
thisWord = thisWord.slice(0, thisIndex);
}
var phonArr = thisLine[1].split(" ");
var syllCount = 0;
for (var i = 0; i < phonArr.length; i++){
if (phonArr[i].match(/\d/)){
syllCount++;
}
}
if (syllCount in objOfArrs){
objOfArrs[syllCount].push(thisWord);
} else {
objOfArrs[syllCount] = [];
objOfArrs[syllCount].push(thisWord);
}
}
return objOfArrs;
}
// generations random structure based on 5/7/5 rule
function randomStructure(){
var arr = [[],[],[]];
var linesArr = [5,7,5];
//returns random number between min and max inclusive
var randomNumber = function(min,max){
return Math.floor(Math.random() * (max - min + 1)) + min;
};
for (var i = 0; i < linesArr.length; i++){
while (linesArr[i] > 0){
var numSylls = randomNumber(1,linesArr[i]);
arr[i].push(numSylls);
linesArr[i] -= numSylls;
}
}
return arr;
}
// takes an array containing 3 arrays representing each line of the haiku
// each sub-array indicates how many syllables each word on that line should have
// returns the haiku
function createHaiku(structure, dataObj){
var haiku = "";
for (var i = 0; i < structure.length; i++){
if (i > 0){
haiku += "\n";
}
for (var j = 0; j < structure[i].length; j++){
var syllables = structure[i][j];
var choices = dataObj[syllables].length;
var randomIndex = Math.floor(Math.random() * choices);
var word = dataObj[syllables][randomIndex];
haiku += word + " ";
}
}
return haiku.trim();
}
// returns an object with each word as key and number of syllables it has as value
function createDict(data){
var obj = {};
var lines = data.toString().split("\n");
var lineSplit;
for (var x = 0; x < lines.length - 1; x++){
var thisLine = lines[x].split(' ');
var thisWord = thisLine[0];
if (thisWord.indexOf('\(') !== -1){
var thisIndex = thisWord.indexOf('\(');
thisWord = thisWord.slice(0, thisIndex);
}
var phonArr = thisLine[1].split(" ");
var syllCount = 0;
for (var i = 0; i < phonArr.length; i++){
if (phonArr[i].match(/\d/)){
syllCount++;
}
}
obj[thisWord] = syllCount;
}
return obj;
}
function haikuFromCorpus(fileString, dictObj){
var textArr = fileString.split(' ');
var randomStart = Math.floor(Math.random() * ((textArr.length - 1) + 1));
var haiku = "";
var syllCount = 0;
var currentLine = 1;
var totalSyll;
for (var i = randomStart; i < textArr.length; i++){
var thisWord = textArr[i].toUpperCase();
var thisCount = dictObj[thisWord];
if (currentLine === 1 || currentLine === 3){
totalSyll = 5;
} else if (currentLine === 2){
totalSyll = 7;
} else {
return haiku.trim();
}
if ((syllCount + thisCount) < totalSyll){
haiku += thisWord + " ";
syllCount += thisCount;
} else if ((syllCount + thisCount) === totalSyll){
haiku += thisWord + "\n";
currentLine += 1;
syllCount = 0;
} else if (((syllCount + thisCount) > totalSyll) || (thisCount === undefined)){
haiku = "";
syllCount = 0;
currentLine = 1;
}
}
}
module.exports = {
fileToString: fileToString,
formatData: formatData,
randomStructure: randomStructure,
createHaiku: createHaiku,
createDict: createDict,
haikuFromCorpus: haikuFromCorpus,
}