This commit is contained in:
BuildTools 2021-03-09 18:59:52 +00:00
commit 451832d0bf
13 changed files with 6569 additions and 395 deletions

76
CODE_OF_CONDUCT.md Normal file
View file

@ -0,0 +1,76 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at bartnikjack@gmail.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq

View file

@ -9,11 +9,11 @@
<img align="left" alt="CSS3" width="26px" src="https://raw.githubusercontent.com/github/explore/80688e429a7d4ef2fca1e82350fe8e3517d3494d/topics/sass/sass.png" />
<br />
# about
# About
Monkeytype is a minimalistic, customisable typing test, featuring many test modes, an account system to save your typing speed history and user-configurable features like themes, sounds, a smooth caret and more.
# features
# Features
- minimalistic design with no ads
- look at what you are typing
@ -27,15 +27,15 @@ Monkeytype is a minimalistic, customisable typing test, featuring many test mode
- command line
- and much more
# discord bot
# Discord bot
Recently, a Discord bot was added to autoassign roles on our server. You can find the code for it over at https://github.com/Miodec/monkey-bot
# bug report or feature request
# Bug report or Feature request
If you encounter a bug, or have a feature request - send me a message on Reddit, create an issue, or join the [Discord server](https://discord.com/invite/yENzqcB).
# credits
# Credits
Montydrei for the name suggestion
@ -43,10 +43,10 @@ Everyone who provided valuable feedback on the original reddit post for the prot
Contributors that have helped with implementing various features, adding themes and more
# support
# Support
If you wish to support further development and feel extra awesome, you can do so [here](https://www.paypal.me/jackbartnik).
# how to contribute
# Contribute
Refer to [CONTRIBUTING.md](https://github.com/Miodec/monkeytype/blob/master/CONTRIBUTING.md)

View file

@ -828,18 +828,18 @@ function validateResult(result) {
);
return false;
}
if (result.allChars != undefined) {
let raw = roundTo2((result.allChars * (60 / result.testDuration)) / 5);
if (
raw < result.rawWpm - result.rawWpm * 0.01 ||
raw > result.rawWpm + result.rawWpm * 0.01
) {
console.error(
`Could not validate result for ${result.uid}. raw ${raw} != ${result.rawWpm}`
);
return false;
}
}
// if (result.allChars != undefined) {
// let raw = roundTo2((result.allChars * (60 / result.testDuration)) / 5);
// if (
// raw < result.rawWpm - result.rawWpm * 0.01 ||
// raw > result.rawWpm + result.rawWpm * 0.01
// ) {
// console.error(
// `Could not validate result for ${result.uid}. raw ${raw} != ${result.rawWpm}`
// );
// return false;
// }
// }
if (result.mode === "time" && (result.mode2 === 15 || result.mode2 === 60)) {
let keyPressTimeSum =
result.keySpacing.reduce((total, val) => {
@ -866,6 +866,12 @@ function validateResult(result) {
}
}
if (result.chartData.wpm !== undefined) {
if (result.chartData.wpm.filter((w) => w > 400).length > 0) return false;
}
if (result.wpm > 100 && result.consistency < 10) return false;
return true;
}
@ -2037,6 +2043,9 @@ class Leaderboard {
wpm: parseFloat(entry.wpm),
raw: parseFloat(entry.raw),
acc: parseFloat(entry.acc),
consistency: isNaN(parseInt(entry.consistency))
? "-"
: parseInt(entry.consistency),
mode: entry.mode,
mode2: parseInt(entry.mode2),
timestamp: entry.timestamp,
@ -2113,6 +2122,9 @@ class Leaderboard {
wpm: parseFloat(a.wpm),
raw: parseFloat(a.rawWpm),
acc: parseFloat(a.acc),
consistency: isNaN(parseInt(a.consistency))
? "-"
: parseInt(a.consistency),
mode: a.mode,
mode2: parseInt(a.mode2),
timestamp: a.timestamp,
@ -2128,6 +2140,9 @@ class Leaderboard {
wpm: parseFloat(a.wpm),
raw: parseFloat(a.rawWpm),
acc: parseFloat(a.acc),
consistency: isNaN(parseInt(a.consistency))
? "-"
: parseInt(a.consistency),
mode: a.mode,
mode2: parseInt(a.mode2),
timestamp: a.timestamp,
@ -2144,6 +2159,9 @@ class Leaderboard {
wpm: parseFloat(a.wpm),
raw: parseFloat(a.rawWpm),
acc: parseFloat(a.acc),
consistency: isNaN(parseInt(a.consistency))
? "-"
: parseInt(a.consistency),
mode: a.mode,
mode2: parseInt(a.mode2),
timestamp: a.timestamp,
@ -2160,6 +2178,9 @@ class Leaderboard {
wpm: parseFloat(a.wpm),
raw: parseFloat(a.rawWpm),
acc: parseFloat(a.acc),
consistency: isNaN(parseInt(a.consistency))
? "-"
: parseInt(a.consistency),
mode: a.mode,
mode2: parseInt(a.mode2),
timestamp: a.timestamp,

View file

@ -974,6 +974,14 @@ let commandsCaretStyle = {
setCaretStyle("underline");
},
},
{
id: "setCaretStyleCarrot",
display: "carrot",
visible: false,
exec: () => {
setCaretStyle("carrot");
},
},
],
};

View file

@ -95,7 +95,7 @@ function updateLeaderboards() {
$("#leaderboardsWrapper table.daily tfoot").html(`
<tr>
<td><br><br></td>
<td colspan="5" style="text-align:center;">Not qualified</>
<td colspan="4" style="text-align:center;">Not qualified</>
<td><br><br></td>
</tr>
`);
@ -112,11 +112,24 @@ function updateLeaderboards() {
<tr>
<td>${dindex + 1}</td>
<td>You</td>
<td>${entry.wpm.toFixed(2)}</td>
<td>${entry.raw.toFixed(2)}</td>
<td>${entry.acc.toFixed(2)}%</td>
<td>${entry.mode} ${entry.mode2}</td>
<td>${moment(entry.timestamp).format("DD MMM YYYY<br>HH:mm")}</td>
<td class="alignRight">${entry.wpm.toFixed(
2
)}<br><div class="sub">${entry.acc.toFixed(2)}%</div></td>
<td class="alignRight">${entry.raw.toFixed(
2
)}<br><div class="sub">${
entry.consistency === "-"
? "-"
: entry.consistency.toFixed(2) + "%"
}</div></td>
<td class="alignRight">${entry.mode}<br><div class="sub">${
entry.mode2
}</div></td>
<td class="alignRight">${moment(entry.timestamp).format(
"DD MMM YYYY"
)}<br><div class='sub'>${moment(entry.timestamp).format(
"HH:mm"
)}</div></td>
</tr>
`);
}
@ -126,11 +139,20 @@ function updateLeaderboards() {
dindex === 0 ? '<i class="fas fa-fw fa-crown"></i>' : dindex + 1
}</td>
<td ${meClassString}>${entry.name}</td>
<td>${entry.wpm.toFixed(2)}</td>
<td>${entry.raw.toFixed(2)}</td>
<td>${entry.acc.toFixed(2)}%</td>
<td>${entry.mode} ${entry.mode2}</td>
<td>${moment(entry.timestamp).format("DD MMM YYYY<br>HH:mm")}</td>
<td class="alignRight">${entry.wpm.toFixed(
2
)}<br><div class="sub">${entry.acc.toFixed(2)}%</div></td>
<td class="alignRight">${entry.raw.toFixed(2)}<br><div class="sub">${
entry.consistency === "-" ? "-" : entry.consistency.toFixed(2) + "%"
}</div></td>
<td class="alignRight">${entry.mode}<br><div class="sub">${
entry.mode2
}</div></td>
<td class="alignRight">${moment(entry.timestamp).format(
"DD MMM YYYY"
)}<br><div class='sub'>${moment(entry.timestamp).format(
"HH:mm"
)}</div></td>
</tr>
`);
dindex++;
@ -144,11 +166,10 @@ function updateLeaderboards() {
<tr>
<td>${i + 1}</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-<br>-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-<br>-</td>
</tr>
`);
}
@ -157,7 +178,7 @@ function updateLeaderboards() {
$("#leaderboardsWrapper table.global tfoot").html(`
<tr>
<td><br><br></td>
<td colspan="5" style="text-align:center;">Not qualified</>
<td colspan="4" style="text-align:center;">Not qualified</>
<td><br><br></td>
</tr>
`);
@ -174,11 +195,24 @@ function updateLeaderboards() {
<tr>
<td>${index + 1}</td>
<td>You</td>
<td>${entry.wpm.toFixed(2)}</td>
<td>${entry.raw.toFixed(2)}</td>
<td>${entry.acc.toFixed(2)}%</td>
<td>${entry.mode} ${entry.mode2}</td>
<td>${moment(entry.timestamp).format("DD MMM YYYY<br>HH:mm")}</td>
<td class="alignRight">${entry.wpm.toFixed(
2
)}<br><div class="sub">${entry.acc.toFixed(2)}%</div></td>
<td class="alignRight">${entry.raw.toFixed(
2
)}<br><div class="sub">${
entry.consistency === "-"
? "-"
: entry.consistency.toFixed(2) + "%"
}</div></td>
<td class="alignRight">${entry.mode}<br><div class="sub">${
entry.mode2
}</div></td>
<td class="alignRight">${moment(entry.timestamp).format(
"DD MMM YYYY"
)}<br><div class='sub'>${moment(entry.timestamp).format(
"HH:mm"
)}</div></td>
</tr>
`);
}
@ -188,11 +222,20 @@ function updateLeaderboards() {
index === 0 ? '<i class="fas fa-fw fa-crown"></i>' : index + 1
}</td>
<td ${meClassString}>${entry.name}</td>
<td>${entry.wpm.toFixed(2)}</td>
<td>${entry.raw.toFixed(2)}</td>
<td>${entry.acc.toFixed(2)}%</td>
<td>${entry.mode} ${entry.mode2}</td>
<td>${moment(entry.timestamp).format("DD MMM YYYY<br>HH:mm")}</td>
<td class="alignRight">${entry.wpm.toFixed(
2
)}<br><div class="sub">${entry.acc.toFixed(2)}%</td>
<td class="alignRight">${entry.raw.toFixed(2)}<br><div class="sub">${
entry.consistency === "-" ? "-" : entry.consistency.toFixed(2) + "%"
}</div></td>
<td class="alignRight">${entry.mode}<br><div class="sub">${
entry.mode2
}</div></td>
<td class="alignRight">${moment(entry.timestamp).format(
"DD MMM YYYY"
)}<br><div class='sub'>${moment(entry.timestamp).format(
"HH:mm"
)}</div></td>
</tr>
`);
index++;
@ -206,11 +249,10 @@ function updateLeaderboards() {
<tr>
<td>${i + 1}</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-<br>-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-<br>-</td>
</tr>
`);
}

View file

@ -102,6 +102,61 @@ export async function getFunboxList() {
}
}
let quotes = null;
export async function getQuotes(language) {
if (quotes === null || quotes.language !== language.replace(/_\d*k$/g, "")) {
showBackgroundLoader();
try {
let data = await $.getJSON(`quotes/${language}.json`);
hideBackgroundLoader();
if (data.quotes === undefined || data.quotes.length === 0) {
quotes = {
quotes: [],
length: 0,
};
return quotes;
}
quotes = data;
quotes.length = data.quotes.length;
quotes.groups.forEach((qg, i) => {
let lower = qg[0];
let upper = qg[1];
quotes.groups[i] = quotes.quotes.filter((q) => {
if (q.length >= lower && q.length <= upper) {
q.group = i;
return true;
} else {
return false;
}
});
});
quotes.quotes = [];
return quotes;
} catch {
hideBackgroundLoader();
quotes = {
quotes: [],
length: 0,
};
return quotes;
}
// error: (e) => {
// Notifications.add(
// `Error while loading ${language.replace(
// /_\d*k$/g,
// ""
// )} quotes: ${e}`,
// -1
// );
// quotes = [];
// return quotes;
// },
} else {
return quotes;
}
}
let fontsList = null;
export async function getFontsList() {
if (fontsList == null) {

View file

@ -34,7 +34,6 @@ let activeWordTopBeforeJump = 0;
let activeWordTop = 0;
let activeWordJumped = false;
let sameWordset = false;
let quotes = null;
let selectedQuoteId = 1;
let focusState = false;
let activeFunBox = "none";
@ -246,7 +245,8 @@ function copyResultToClipboard() {
var sourceY = src.position().top; /*Y position from div#target*/
var sourceWidth = src.width(); /*clientWidth/offsetWidth from div#target*/
var sourceHeight = src.height(); /*clientHeight/offsetHeight from div#target*/
$(".notification").addClass("hidden");
$("#notificationCenter").addClass("hidden");
$("#commandLineMobileButton").addClass("hidden");
$(".pageTest .loginTip").addClass("hidden");
try {
html2canvas(document.body, {
@ -258,38 +258,31 @@ function copyResultToClipboard() {
}).then(function (canvas) {
canvas.toBlob(function (blob) {
try {
navigator.clipboard
.write([
new ClipboardItem(
Object.defineProperty({}, blob.type, {
value: blob,
enumerable: true,
})
),
])
.then((f) => {
$(".notification").removeClass("hidden");
Notifications.add("Copied to clipboard", 1, 2);
$(".pageTest .ssWatermark").addClass("hidden");
$(".pageTest .buttons").removeClass("hidden");
if (firebase.auth().currentUser == null)
$(".pageTest .loginTip").removeClass("hidden");
})
.catch((f) => {
open(URL.createObjectURL(blob));
$(".notification").removeClass("hidden");
Notifications.add(
"Error saving image to clipboard: " + f.message,
-1
);
$(".pageTest .ssWatermark").addClass("hidden");
$(".pageTest .buttons").removeClass("hidden");
if (firebase.auth().currentUser == null)
$(".pageTest .loginTip").removeClass("hidden");
});
if (navigator.userAgent.toLowerCase().indexOf("firefox") > -1) {
open(URL.createObjectURL(blob));
} else {
navigator.clipboard
.write([
new ClipboardItem(
Object.defineProperty({}, blob.type, {
value: blob,
enumerable: true,
})
),
])
.then((f) => {
$("#notificationCenter").removeClass("hidden");
$("#commandLineMobileButton").removeClass("hidden");
Notifications.add("Copied to clipboard", 1, 2);
$(".pageTest .ssWatermark").addClass("hidden");
$(".pageTest .buttons").removeClass("hidden");
if (firebase.auth().currentUser == null)
$(".pageTest .loginTip").removeClass("hidden");
});
}
} catch (e) {
open(URL.createObjectURL(blob));
$(".notification").removeClass("hidden");
$("#notificationCenter").removeClass("hidden");
$("#commandLineMobileButton").removeClass("hidden");
Notifications.add(
"Error saving image to clipboard: " + e.message,
-1
@ -302,7 +295,8 @@ function copyResultToClipboard() {
});
});
} catch (e) {
$(".notification").removeClass("hidden");
$("#notificationCenter").removeClass("hidden");
$("#commandLineMobileButton").removeClass("hidden");
Notifications.add("Error creating image: " + e.message, -1);
$(".pageTest .ssWatermark").addClass("hidden");
$(".pageTest .buttons").removeClass("hidden");
@ -462,61 +456,6 @@ async function initWords() {
config.language = "english";
}
if (
config.mode === "quote" &&
(quotes === null ||
quotes.language !== config.language.replace(/_\d*k$/g, ""))
) {
// if (config.language.split("_")[0] !== "code") {
setLanguage(config.language.replace(/_\d*k$/g, ""), true);
// }
showBackgroundLoader();
$.ajax({
url: `quotes/${config.language}.json`,
async: false,
success: function (data) {
hideBackgroundLoader();
try {
if (data.quotes.length === 0) {
throw new Error("No quotes");
}
quotes = data;
quotes.groups.forEach((qg, i) => {
let lower = qg[0];
let upper = qg[1];
quotes.groups[i] = quotes.quotes.filter((q) => {
if (q.length >= lower && q.length <= upper) {
q.group = i;
return true;
} else {
return false;
}
});
});
quotes.quotes = [];
} catch (e) {
console.error(e);
Notifications.add(
`No ${config.language.replace(/_\d*k$/g, "")} quotes found`,
0
);
testRestarting = false;
return;
}
},
error: (e) => {
Notifications.add(
`Error while loading ${config.language.replace(
/_\d*k$/g,
""
)} quotes: ${e}`,
-1
);
return;
},
});
}
if (!language) {
config.language = "english";
language = words[config.language];
@ -649,6 +588,17 @@ async function initWords() {
wordsList.push(randomWord);
}
} else if (config.mode == "quote") {
setLanguage(config.language.replace(/_\d*k$/g, ""), true);
let quotes = await Misc.getQuotes(config.language);
if (quotes.length === 0) {
Notifications.add(`No ${config.language} quotes found`, 0);
testRestarting = false;
setMode("words");
restartTest();
return;
}
let rq;
if(config.quoteLength != -2){
let group = config.quoteLength;

View file

@ -607,6 +607,7 @@ function setCaretStyle(caretStyle, nosave) {
$("#caret").removeClass("underline");
$("#caret").removeClass("outline");
$("#caret").removeClass("block");
$("#caret").removeClass("carrot");
if (caretStyle == "off") {
$("#caret").addClass("off");
@ -618,6 +619,8 @@ function setCaretStyle(caretStyle, nosave) {
$("#caret").addClass("outline");
} else if (caretStyle == "underline") {
$("#caret").addClass("underline");
} else if (caretStyle == "carrot") {
$("#caret").addClass("carrot");
}
if (!nosave) saveConfigToCookie();
}

View file

@ -254,6 +254,14 @@ a:hover {
margin-bottom: 2rem;
font-size: 0.8rem;
.sub {
opacity: 0.5;
}
.alignRight {
text-align: right;
}
.titleAndTable {
display: grid;
@ -287,7 +295,7 @@ a:hover {
}
td {
padding: 0.25rem 0.5rem;
padding: 0.5rem 0.5rem;
&.me {
color: var(--main-color);
@ -305,6 +313,7 @@ a:hover {
position: -webkit-sticky;
position: sticky;
top: 0;
z-index: 99;
}
}
@ -327,6 +336,15 @@ a:hover {
z-index: 4;
}
}
tr {
td:first-child {
padding-left: 1rem;
}
td:last-child {
padding-right: 1rem;
}
}
}
}
@ -1159,6 +1177,21 @@ a:hover {
width: 2px;
}
&.carrot {
background-color: transparent;
background-image: url("../carrot.png");
background-size: contain;
background-position: center;
background-repeat: no-repeat;
width: 0.25rem;
&.size2 {
margin-left: -0.1rem;
}
&.size3 {
margin-left: -0.2rem;
}
}
&.block {
width: 0.7em;
margin-left: 0.25em;

BIN
static/carrot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

View file

@ -189,24 +189,30 @@
<table class="global">
<thead>
<tr>
<td>#</td>
<td width="1%">#</td>
<td>name</td>
<td>wpm</td>
<td>raw</td>
<td>acc</td>
<td>test</td>
<td>date</td>
<td class="alignRight" width="15%">
wpm
<br />
<div class="sub">accuracy</div>
</td>
<td class="alignRight" width="15%">
raw
<br />
<div class="sub">consistency</div>
</td>
<td class="alignRight" width="13%">test</td>
<td class="alignRight" width="22%">date</td>
</tr>
</thead>
<tbody>
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -215,11 +221,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -228,11 +233,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -241,11 +245,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -254,11 +257,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -267,11 +269,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -280,11 +281,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -293,11 +293,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -306,11 +305,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -319,11 +317,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -332,11 +329,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -345,11 +341,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -358,11 +353,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -371,11 +365,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -384,11 +377,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -397,11 +389,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -410,11 +401,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -423,11 +413,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -436,11 +425,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -449,11 +437,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -485,24 +472,30 @@
<table class="daily">
<thead>
<tr>
<td>#</td>
<td width="1%">#</td>
<td>name</td>
<td>wpm</td>
<td>raw</td>
<td>acc</td>
<td>test</td>
<td>date</td>
<td class="alignRight" width="15%">
wpm
<br />
<div class="sub">accuracy</div>
</td>
<td class="alignRight" width="15%">
raw
<br />
<div class="sub">consistency</div>
</td>
<td class="alignRight" width="13%">test</td>
<td class="alignRight" width="22%">date</td>
</tr>
</thead>
<tbody>
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -511,11 +504,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -524,11 +516,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -537,11 +528,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -550,11 +540,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -563,11 +552,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -576,11 +564,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -589,11 +576,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -602,11 +588,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -615,11 +600,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -628,11 +612,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -641,11 +624,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -654,11 +636,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -667,11 +648,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -680,11 +660,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -693,11 +672,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -706,11 +684,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -719,11 +696,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -732,11 +708,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-
@ -745,11 +720,10 @@
<tr>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">-</td>
<td class="alignRight">
-
<br />
-

View file

@ -1334,7 +1334,7 @@
"length": 93
},
{
"text": "In the casino, the cardinal rule is to keep them playing and to keep them coming back. The longer they play, the more they lose, and in the end, we get it all. Running a casino is like robbing a bank with no cops around. ",
"text": "In the casino, the cardinal rule is to keep them playing and to keep them coming back. The longer they play, the more they lose, and in the end, we get it all. Running a casino is like robbing a bank with no cops around.",
"source": "Casino",
"id": 224,
"length": 221
@ -3608,7 +3608,7 @@
"length": 248
},
{
"text": "Now I want you to think and stop being a smart aleck. A man's attitude goes some ways - the way his life will be. Is that something you agree with? So since you agree, you must be someone who does not care about the good life. ",
"text": "Now I want you to think and stop being a smart aleck. A man's attitude goes some ways - the way his life will be. Is that something you agree with? So since you agree, you must be someone who does not care about the good life.",
"source": "Mulholland Drive",
"id": 604,
"length": 227
@ -4334,7 +4334,7 @@
"length": 207
},
{
"text": "There is something about yourself that you don't know. Something that you will deny even exists, until it's too late to do anything about it. It's the only reason you get up in the morning. We share an addiction. We're approval junkies. We're all in it for the slap on the back and the gold watch. ",
"text": "There is something about yourself that you don't know. Something that you will deny even exists, until it's too late to do anything about it. It's the only reason you get up in the morning. We share an addiction. We're approval junkies. We're all in it for the slap on the back and the gold watch.",
"source": "Revolver",
"id": 725,
"length": 298
@ -5414,7 +5414,7 @@
"length": 139
},
{
"text": "I had a dream. There was our world, and the world was dark because there weren't any robins, and the robins represented love. And for the longest time, there was this darkness. Then all of a sudden, thousands of robins were set free and they flew down and brought this blinding light of love. I guess it means that there is trouble until the robins come. ",
"text": "I had a dream. There was our world, and the world was dark because there weren't any robins, and the robins represented love. And for the longest time, there was this darkness. Then all of a sudden, thousands of robins were set free and they flew down and brought this blinding light of love. I guess it means that there is trouble until the robins come.",
"source": "Blue Velvet",
"id": 907,
"length": 355
@ -5450,7 +5450,7 @@
"length": 507
},
{
"text": "One thing I've learned in the last seven years: in every game and con there's always an opponent, and there's always a victim. The trick is to know when you're the latter, so you can become the former. ",
"text": "One thing I've learned in the last seven years: in every game and con there's always an opponent, and there's always a victim. The trick is to know when you're the latter, so you can become the former.",
"source": "Revolver",
"id": 913,
"length": 202
@ -6014,7 +6014,7 @@
"length": 192
},
{
"text": "The terminator wouldn't stop, it would never leave him. It would never hurt him or shout at him or get drunk and hit him or say it was too busy to spend time with him. And it would die to protect him. Of all the would-be fathers that came over the years, this thing, this machine, was the only thing that measured up. In an insane world, it was the sanest choice. ",
"text": "The terminator wouldn't stop, it would never leave him. It would never hurt him or shout at him or get drunk and hit him or say it was too busy to spend time with him. And it would die to protect him. Of all the would-be fathers that came over the years, this thing, this machine, was the only thing that measured up. In an insane world, it was the sanest choice.",
"source": "Terminator 2: Judgment Day",
"id": 1009,
"length": 364
@ -7934,7 +7934,7 @@
"length": 310
},
{
"text": "Let's face it: there are tons of things in your home and life that you don't use, need, or even particularly want. Whether you realize it or not, this clutter creates indecision and distractions, consuming attention and making unfettered happiness a real chore. ",
"text": "Let's face it: there are tons of things in your home and life that you don't use, need, or even particularly want. Whether you realize it or not, this clutter creates indecision and distractions, consuming attention and making unfettered happiness a real chore.",
"source": "The 4-Hour Workweek",
"id": 1335,
"length": 262
@ -9788,7 +9788,7 @@
"length": 170
},
{
"text": "Has it been five years? Six? It seems like a lifetime, the kind of peak that never comes again. San Francisco in the middle sixties was a very special time and place to be a part of. But no explanation, no mix of words or music or memories can touch that sense of knowing that you were there and alive in that corner of time and the world. Whatever it meant. ",
"text": "Has it been five years? Six? It seems like a lifetime, the kind of peak that never comes again. San Francisco in the middle sixties was a very special time and place to be a part of. But no explanation, no mix of words or music or memories can touch that sense of knowing that you were there and alive in that corner of time and the world. Whatever it meant.",
"source": "Fear and Loathing in Las Vegas",
"id": 1649,
"length": 359
@ -11180,7 +11180,7 @@
"length": 94
},
{
"text": "I will need my spectacles and a clear head. Today I broke my rules and I drank vodka. Tomorrow I will translate it, and then I will bring what I've done to your home. ",
"text": "I will need my spectacles and a clear head. Today I broke my rules and I drank vodka. Tomorrow I will translate it, and then I will bring what I've done to your home.",
"source": "Eastern Promises",
"id": 1882,
"length": 167
@ -13520,7 +13520,7 @@
"length": 323
},
{
"text": "My name is Turkish. Funny name for an Englishman, I know. My parents to be were on the same plane when it crashed. That's how they met. They named me after the name of the plane. Not many people are named after a plane crash. ",
"text": "My name is Turkish. Funny name for an Englishman, I know. My parents to be were on the same plane when it crashed. That's how they met. They named me after the name of the plane. Not many people are named after a plane crash.",
"source": "Snatch",
"id": 2277,
"length": 226
@ -13790,7 +13790,7 @@
"length": 317
},
{
"text": "I said that I would see you because I had heard that you were a serious man. A man to be treated with respect but I must say no to you and I will give you my reasons. It's true, I have a lot of friends in politics. But they wouldn't be so friendly if they knew my business was drugs instead of gambling which they consider a harmless vice, but drugs, that's a dirty business. ",
"text": "I said that I would see you because I had heard that you were a serious man. A man to be treated with respect but I must say no to you and I will give you my reasons. It's true, I have a lot of friends in politics. But they wouldn't be so friendly if they knew my business was drugs instead of gambling which they consider a harmless vice, but drugs, that's a dirty business.",
"source": "The Godfather",
"id": 2322,
"length": 376
@ -14234,7 +14234,7 @@
"length": 231
},
{
"text": "Music finds a comfortable parallel with that of human language. Much as language has words, sentences, and stories, music has tones, melodies, and songs. ",
"text": "Music finds a comfortable parallel with that of human language. Much as language has words, sentences, and stories, music has tones, melodies, and songs.",
"source": "Civilization IV",
"id": 2397,
"length": 154
@ -14522,7 +14522,7 @@
"length": 203
},
{
"text": "If there is one thing the history of evolution has taught us it's that life will not be contained. Life breaks free, expands to new territory, and crashes through barriers, painfully, maybe even dangerously. ",
"text": "If there is one thing the history of evolution has taught us it's that life will not be contained. Life breaks free, expands to new territory, and crashes through barriers, painfully, maybe even dangerously.",
"source": "Jurassic Park",
"id": 2445,
"length": 208
@ -16610,7 +16610,7 @@
"length": 176
},
{
"text": "The chemistry of an element is determined by the manner in which its electrons are arranged in the atom. Such arrangements are the basis of the modern periodic classification of the elements: the Periodic Table. ",
"text": "The chemistry of an element is determined by the manner in which its electrons are arranged in the atom. Such arrangements are the basis of the modern periodic classification of the elements: the Periodic Table.",
"source": "Structure and Bonding (Basic Concepts in Chemistry)",
"id": 2802,
"length": 212
@ -17438,7 +17438,7 @@
"length": 336
},
{
"text": "A little boy went out to play. When he opened his door, he saw the world. As he passed through the doorway, he caused a reflection. Evil was born, and followed the boy. ",
"text": "A little boy went out to play. When he opened his door, he saw the world. As he passed through the doorway, he caused a reflection. Evil was born, and followed the boy.",
"source": "Inland Empire",
"id": 2940,
"length": 169
@ -18110,7 +18110,7 @@
"length": 72
},
{
"text": "I still see things that are not here. I just choose not to acknowledge them. Like a diet of the mind, I just choose not to indulge certain appetites; like my appetite for patterns; perhaps my appetite to imagine and to dream. ",
"text": "I still see things that are not here. I just choose not to acknowledge them. Like a diet of the mind, I just choose not to indulge certain appetites; like my appetite for patterns; perhaps my appetite to imagine and to dream.",
"source": "A Beautiful Mind",
"id": 3055,
"length": 226
@ -18404,7 +18404,7 @@
"length": 375
},
{
"text": "But suddenly, I viddied that thinking was for the gloopy ones, and that the oomny ones use like, inspiration and what Bog sends. Now it was lovely music that came into my aid. There was a window open with the stereo on, and I viddied right at once what to do. ",
"text": "But suddenly, I viddied that thinking was for the gloopy ones, and that the oomny ones use like, inspiration and what Bog sends. Now it was lovely music that came into my aid. There was a window open with the stereo on, and I viddied right at once what to do.",
"source": "A Clockwork Orange",
"id": 3105,
"length": 260
@ -19352,7 +19352,7 @@
"length": 91
},
{
"text": "What should have been swift revenge turned into an all out war. The City of God was divided. You couldn't go from one section to the other, not even to visit a relative. The cops considered anyone living in the slum a hoodlum. People got used to living in Vietnam, and more and more volunteers signed up to die. ",
"text": "What should have been swift revenge turned into an all out war. The City of God was divided. You couldn't go from one section to the other, not even to visit a relative. The cops considered anyone living in the slum a hoodlum. People got used to living in Vietnam, and more and more volunteers signed up to die.",
"source": "City of God (Cidade de Deus, Brazil)",
"id": 3263,
"length": 312
@ -21164,7 +21164,7 @@
"length": 220
},
{
"text": "That's Tommy. He tells people he was named after a gun, but I know he was really named after a famous 19th century ballet dancer. ",
"text": "That's Tommy. He tells people he was named after a gun, but I know he was really named after a famous 19th century ballet dancer.",
"source": "Snatch",
"id": 3569,
"length": 130
@ -23048,7 +23048,7 @@
"length": 152
},
{
"text": "The beginner writes just twenty pieces. The professional writes three times what's needed, rewrites, discards, rewrites some more, then finally settles on the twenty which work best for that specific audience. ",
"text": "The beginner writes just twenty pieces. The professional writes three times what's needed, rewrites, discards, rewrites some more, then finally settles on the twenty which work best for that specific audience.",
"source": "Comedy Writing Secrets",
"id": 3884,
"length": 210
@ -23444,7 +23444,7 @@
"length": 176
},
{
"text": "You found paradise in America. You had a good trade, made a good living, the police protected you and there were courts of law and you didn't need a friend like me. But, now you come to me and you say, \"Don Corleone, give me justice.\" But you don't ask with respect. You don't offer friendship. You don't even think to call me Godfather. ",
"text": "You found paradise in America. You had a good trade, made a good living, the police protected you and there were courts of law and you didn't need a friend like me. But, now you come to me and you say, \"Don Corleone, give me justice.\" But you don't ask with respect. You don't offer friendship. You don't even think to call me Godfather.",
"source": "The Godfather",
"id": 3950,
"length": 338
@ -23798,7 +23798,7 @@
"length": 133
},
{
"text": "Facts can be thought of as objective or subjective. Things and events are objective facts. A subjective fact is one that is limited to the subject experiencing it. Establishing the reality of subjective facts depends entirely on the trustworthiness of those who claim to be experiencing them. ",
"text": "Facts can be thought of as objective or subjective. Things and events are objective facts. A subjective fact is one that is limited to the subject experiencing it. Establishing the reality of subjective facts depends entirely on the trustworthiness of those who claim to be experiencing them.",
"source": "Being Logical: A Guide to Good Thinking",
"id": 4009,
"length": 293
@ -26678,7 +26678,7 @@
"length": 275
},
{
"text": "You have to wonder: how do the machines know what Tasty Wheat tasted like? Maybe they got it wrong. Maybe what I think Tasty Wheat tasted like actually tasted like oatmeal, or tuna fish. That makes you wonder about a lot of things. You take chicken, for example: maybe they couldn't figure out what to make chicken taste like, which is why chicken tastes like everything. ",
"text": "You have to wonder: how do the machines know what Tasty Wheat tasted like? Maybe they got it wrong. Maybe what I think Tasty Wheat tasted like actually tasted like oatmeal, or tuna fish. That makes you wonder about a lot of things. You take chicken, for example: maybe they couldn't figure out what to make chicken taste like, which is why chicken tastes like everything.",
"source": "The Matrix",
"id": 4492,
"length": 372
@ -28460,7 +28460,7 @@
"length": 688
},
{
"text": "The beginner writes just twenty pieces. The professional writes three times what's needed, as many as sixty different bits, keeps trying them out on small groups (but never your own family), rewrites discards, rewrites some more, then finally settles on the twenty which work best for that specific audience. ",
"text": "The beginner writes just twenty pieces. The professional writes three times what's needed, as many as sixty different bits, keeps trying them out on small groups (but never your own family), rewrites discards, rewrites some more, then finally settles on the twenty which work best for that specific audience.",
"source": "Comedy Writing Secrets",
"id": 4793,
"length": 309
@ -30386,7 +30386,7 @@
"id": 5115
},
{
"text": "The first letters I picked out did not interest me. They were from men I meet once once in a while and for whom I feel no great interest. But all at once an envelop attracted my eyes. It bore my name written in a broad, firm hand; tears filled my eyes. Here was a letter from my dearest friend, the one in whom I used to confide in my youth and who knew my hopes; he arose before me so clearly with his outstretched hand and good-natured smile that a shudder ran through my frame. Yes, the dead come back, for I saw him! Our memory is a world far more perfect than the real universe, for it brings to life those who have gone forever.",
"text": "The first letters I picked out did not interest me. They were from men I meet once in a while and for whom I feel no great interest. But all at once an envelope attracted my eyes. It bore my name written in a broad, firm hand; tears filled my eyes. Here was a letter from my dearest friend, the one in whom I used to confide in my youth and who knew my hopes; he arose before me so clearly with his outstretched hand and good-natured smile that a shudder ran through my frame. Yes, the dead come back, for I saw him! Our memory is a world far more perfect than the real universe, for it brings to life those who have gone forever.",
"source": "Guy De Maupassant, Suicides",
"length": 634,
"id": 5116

File diff suppressed because one or more lines are too long