diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 7c6d4dda1..3c512607d 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -86,7 +86,7 @@ The installation process of NodeJS is fairly simple, navigate to the NodeJS [web
Once you have completed the above steps, you are ready to build and run Monkeytype.
1. Run `npm install` in the project root directory to install dependencies.
-1. Run `npm run start:dev` to start a local dev server on [port 5000](http://localhost:5000). It will watch for changes and rebuild when you edit files in `src/` or `public/` directories. Use Ctrl+ C to abort it.
+1. Run `npm run start:dev` to start a local dev server on [port 5000](http://localhost:5000). It will watch for changes and rebuild when you edit files in `src/` or `public/` directories. Use Ctrl+C to abort it.
- Run `firebase use {your-project-id}` if you run into any errors for this.
### Standards and Guidelines
diff --git a/src/js/account.js b/src/js/account.js
index 3fa6a5c14..93edb17eb 100644
--- a/src/js/account.js
+++ b/src/js/account.js
@@ -19,6 +19,15 @@ import * as AllTimeStats from "./all-time-stats";
import * as PbTables from "./pb-tables";
import axiosInstance from "./axios-instance";
+let filterDebug = false;
+//toggle filterdebug
+export function toggleFilterDebug() {
+ filterDebug = !filterDebug;
+ if (filterDebug) {
+ console.log("filterDebug is on");
+ }
+}
+
export async function getDataAndInit() {
try {
await DB.initSnapshot();
@@ -370,20 +379,37 @@ export function update() {
if (resdiff == undefined) {
resdiff = "normal";
}
- if (!ResultFilters.getFilter("difficulty", resdiff)) return;
- if (!ResultFilters.getFilter("mode", result.mode)) return;
+ if (!ResultFilters.getFilter("difficulty", resdiff)) {
+ if (filterDebug)
+ console.log(`skipping result due to difficulty filter`, result);
+ return;
+ }
+ if (!ResultFilters.getFilter("mode", result.mode)) {
+ if (filterDebug)
+ console.log(`skipping result due to mode filter`, result);
+ return;
+ }
+
if (result.mode == "time") {
let timefilter = "custom";
if ([15, 30, 60, 120].includes(parseInt(result.mode2))) {
timefilter = result.mode2;
}
- if (!ResultFilters.getFilter("time", timefilter)) return;
+ if (!ResultFilters.getFilter("time", timefilter)) {
+ if (filterDebug)
+ console.log(`skipping result due to time filter`, result);
+ return;
+ }
} else if (result.mode == "words") {
let wordfilter = "custom";
if ([10, 25, 50, 100, 200].includes(parseInt(result.mode2))) {
wordfilter = result.mode2;
}
- if (!ResultFilters.getFilter("words", wordfilter)) return;
+ if (!ResultFilters.getFilter("words", wordfilter)) {
+ if (filterDebug)
+ console.log(`skipping result due to word filter`, result);
+ return;
+ }
}
if (result.quoteLength != null) {
@@ -400,10 +426,17 @@ export function update() {
if (
filter !== null &&
!ResultFilters.getFilter("quoteLength", filter)
- )
+ ) {
+ if (filterDebug)
+ console.log(`skipping result due to quoteLength filter`, result);
return;
+ }
}
- let langFilter = ResultFilters.getFilter("language", result.language);
+
+ let langFilter = ResultFilters.getFilter(
+ "language",
+ result.language ?? "english"
+ );
if (
result.language === "english_expanded" &&
@@ -411,22 +444,44 @@ export function update() {
) {
langFilter = true;
}
- if (!langFilter) return;
+ if (!langFilter) {
+ if (filterDebug)
+ console.log(`skipping result due to language filter`, result);
+ return;
+ }
+
let puncfilter = "off";
if (result.punctuation) {
puncfilter = "on";
}
- if (!ResultFilters.getFilter("punctuation", puncfilter)) return;
+ if (!ResultFilters.getFilter("punctuation", puncfilter)) {
+ if (filterDebug)
+ console.log(`skipping result due to punctuation filter`, result);
+ return;
+ }
+
let numfilter = "off";
if (result.numbers) {
numfilter = "on";
}
- if (!ResultFilters.getFilter("numbers", numfilter)) return;
+ if (!ResultFilters.getFilter("numbers", numfilter)) {
+ if (filterDebug)
+ console.log(`skipping result due to numbers filter`, result);
+ return;
+ }
if (result.funbox === "none" || result.funbox === undefined) {
- if (!ResultFilters.getFilter("funbox", "none")) return;
+ if (!ResultFilters.getFilter("funbox", "none")) {
+ if (filterDebug)
+ console.log(`skipping result due to funbox filter`, result);
+ return;
+ }
} else {
- if (!ResultFilters.getFilter("funbox", result.funbox)) return;
+ if (!ResultFilters.getFilter("funbox", result.funbox)) {
+ if (filterDebug)
+ console.log(`skipping result due to funbox filter`, result);
+ return;
+ }
}
let tagHide = true;
@@ -454,7 +509,11 @@ export function update() {
});
}
- if (tagHide) return;
+ if (tagHide) {
+ if (filterDebug)
+ console.log(`skipping result due to tag filter`, result);
+ return;
+ }
let timeSinceTest = Math.abs(result.timestamp - Date.now()) / 1000;
@@ -472,7 +531,11 @@ export function update() {
datehide = false;
}
- if (datehide) return;
+ if (datehide) {
+ if (filterDebug)
+ console.log(`skipping result due to date filter`, result);
+ return;
+ }
filteredResults.push(result);
} catch (e) {
@@ -498,12 +561,17 @@ export function update() {
if (Object.keys(activityChartData).includes(String(resultDate))) {
activityChartData[resultDate].amount++;
activityChartData[resultDate].time +=
- result.testDuration + result.incompleteTestSeconds;
+ result.testDuration +
+ result.incompleteTestSeconds -
+ (result.afkDuration ?? 0);
activityChartData[resultDate].totalWpm += result.wpm;
} else {
activityChartData[resultDate] = {
amount: 1,
- time: result.testDuration + result.incompleteTestSeconds,
+ time:
+ result.testDuration +
+ result.incompleteTestSeconds -
+ (result.afkDuration ?? 0),
totalWpm: result.wpm,
};
}
@@ -517,13 +585,16 @@ export function update() {
tt = (parseFloat(result.mode2) / parseFloat(result.wpm)) * 60;
}
} else {
- tt = parseFloat(result.testDuration);
- }
- if (result.incompleteTestSeconds != undefined) {
- tt += result.incompleteTestSeconds;
- } else if (result.restartCount != undefined && result.restartCount > 0) {
- tt += (tt / 4) * result.restartCount;
+ tt = result.testDuration;
}
+
+ tt += (result.incompleteTestSeconds ?? 0) - (result.afkDuration ?? 0);
+
+ // if (result.incompleteTestSeconds != undefined) {
+ // tt += result.incompleteTestSeconds;
+ // } else if (result.restartCount != undefined && result.restartCount > 0) {
+ // tt += (tt / 4) * result.restartCount;
+ // }
totalSecondsFiltered += tt;
if (last10 < 10) {
@@ -684,24 +755,9 @@ export function update() {
$(".pageAccount .triplegroup.stats").removeClass("hidden");
}
- let th = Math.floor(totalSeconds / 3600);
- let tm = Math.floor((totalSeconds % 3600) / 60);
- let ts = Math.floor((totalSeconds % 3600) % 60);
- $(".pageAccount .timeTotal .val").text(`
-
- ${th < 10 ? "0" + th : th}:${tm < 10 ? "0" + tm : tm}:${
- ts < 10 ? "0" + ts : ts
- }
- `);
- let tfh = Math.floor(totalSecondsFiltered / 3600);
- let tfm = Math.floor((totalSecondsFiltered % 3600) / 60);
- let tfs = Math.floor((totalSecondsFiltered % 3600) % 60);
- $(".pageAccount .timeTotalFiltered .val").text(`
-
- ${tfh < 10 ? "0" + tfh : tfh}:${tfm < 10 ? "0" + tfm : tfm}:${
- tfs < 10 ? "0" + tfs : tfs
- }
- `);
+ $(".pageAccount .timeTotalFiltered .val").text(
+ Misc.secondsToString(Math.round(totalSecondsFiltered), true)
+ );
$(".pageAccount .highestWpm .val").text(topWpm);
$(".pageAccount .averageWpm .val").text(Math.round(totalWpm / testCount));
@@ -745,9 +801,9 @@ export function update() {
)}%)`
);
- $(".pageAccount .avgRestart .val").text(
- (testRestarts / testCount).toFixed(1)
- );
+ $(".pageAccount .testsCompleted .avgres").text(`
+ ${(testRestarts / testCount).toFixed(1)} restarts per completed test
+ `);
if (ChartController.accountHistory.data.datasets[0].data.length > 0) {
ChartController.accountHistory.options.plugins.trendlineLinear = true;
diff --git a/src/js/account/all-time-stats.js b/src/js/account/all-time-stats.js
index 4983f35b9..636d5c266 100644
--- a/src/js/account/all-time-stats.js
+++ b/src/js/account/all-time-stats.js
@@ -1,4 +1,5 @@
import * as DB from "./db";
+import * as Misc from "./misc";
export function clear() {
$(".pageAccount .globalTimeTyping .val").text(`-`);
@@ -8,15 +9,12 @@ export function clear() {
export function update() {
if (DB.getSnapshot().globalStats.time != undefined) {
- let th = Math.floor(DB.getSnapshot().globalStats.time / 3600);
- let tm = Math.floor((DB.getSnapshot().globalStats.time % 3600) / 60);
- let ts = Math.floor((DB.getSnapshot().globalStats.time % 3600) % 60);
- $(".pageAccount .globalTimeTyping .val").text(`
-
- ${th < 10 ? "0" + th : th}:${tm < 10 ? "0" + tm : tm}:${
- ts < 10 ? "0" + ts : ts
- }
- `);
+ // let th = Math.floor(DB.getSnapshot().globalStats.time / 3600);
+ // let tm = Math.floor((DB.getSnapshot().globalStats.time % 3600) / 60);
+ // let ts = Math.floor((DB.getSnapshot().globalStats.time % 3600) % 60);
+ $(".pageAccount .globalTimeTyping .val").text(
+ Misc.secondsToString(Math.round(DB.getSnapshot().globalStats.time), true)
+ );
}
if (DB.getSnapshot().globalStats.started != undefined) {
$(".pageAccount .globalTestsStarted .val").text(
diff --git a/src/js/chart-controller.js b/src/js/chart-controller.js
index aab13592d..81535c0de 100644
--- a/src/js/chart-controller.js
+++ b/src/js/chart-controller.js
@@ -364,7 +364,8 @@ export let accountActivity = new Chart(
data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
if (tooltipItem.datasetIndex === 0) {
return `Time Typing: ${Misc.secondsToString(
- resultData.y
+ Math.round(resultData.y),
+ true
)}\nTests Completed: ${resultData.amount}`;
} else if (tooltipItem.datasetIndex === 1) {
return `Average Wpm: ${Misc.roundTo2(resultData.y)}`;
diff --git a/src/js/commandline-lists.js b/src/js/commandline-lists.js
index 7c0992f0c..22d3fb641 100644
--- a/src/js/commandline-lists.js
+++ b/src/js/commandline-lists.js
@@ -201,7 +201,7 @@ let commandsTags = {
};
export function updateTagCommands() {
- if (DB.getSnapshot().tags.length > 0) {
+ if (DB.getSnapshot()?.tags?.length > 0) {
commandsTags.list = [];
commandsTags.list.push({
@@ -266,7 +266,7 @@ let commandsPresets = {
};
export function updatePresetCommands() {
- if (DB.getSnapshot().presets.length > 0) {
+ if (DB.getSnapshot()?.presets?.length > 0) {
commandsPresets.list = [];
DB.getSnapshot().presets.forEach((preset) => {
diff --git a/src/js/config.js b/src/js/config.js
index 8b62b5592..db479dcbf 100644
--- a/src/js/config.js
+++ b/src/js/config.js
@@ -1652,180 +1652,101 @@ export function apply(configObj) {
try {
setEnableAds(configObj.enableAds, true);
- let addemo = false;
- if (
- firebase.app().options.projectId === "monkey-type-dev-67af4" ||
- window.location.hostname === "localhost"
- ) {
- addemo = true;
- }
+ // let addemo = false;
+ // if (
+ // firebase.app().options.projectId === "monkey-type-dev-67af4" ||
+ // window.location.hostname === "localhost"
+ // ) {
+ // addemo = true;
+ // }
if (config.enableAds === "max" || config.enableAds === "on") {
if (config.enableAds === "max") {
- window["nitroAds"].createAd("nitropay_ad_left", {
- refreshLimit: 10,
- refreshTime: 30,
- renderVisibleOnly: false,
- refreshVisibleOnly: true,
- sizes: [["160", "600"]],
- report: {
- enabled: true,
- wording: "Report Ad",
- position: "bottom-right",
- },
- mediaQuery: "(min-width: 1330px)",
- demo: addemo,
- });
- $("#nitropay_ad_left").removeClass("hidden");
+ //
- window["nitroAds"].createAd("nitropay_ad_right", {
- refreshLimit: 10,
- refreshTime: 30,
- renderVisibleOnly: false,
- refreshVisibleOnly: true,
- sizes: [["160", "600"]],
- report: {
- enabled: true,
- wording: "Report Ad",
- position: "bottom-right",
- },
- mediaQuery: "(min-width: 1330px)",
- demo: addemo,
- });
- $("#nitropay_ad_right").removeClass("hidden");
+ $("#ad_rich_media").removeClass("hidden");
+ $("#ad_rich_media").html(
+ `
`
+ );
} else {
- $("#nitropay_ad_left").remove();
- $("#nitropay_ad_right").remove();
+ $("#ad_rich_media").remove();
}
- window["nitroAds"].createAd("nitropay_ad_footer", {
- refreshLimit: 10,
- refreshTime: 30,
- renderVisibleOnly: false,
- refreshVisibleOnly: true,
- sizes: [["970", "90"]],
- report: {
- enabled: true,
- wording: "Report Ad",
- position: "bottom-right",
- },
- mediaQuery: "(min-width: 1025px)",
- demo: addemo,
- });
- $("#nitropay_ad_footer").removeClass("hidden");
+ //
- window["nitroAds"].createAd("nitropay_ad_footer2", {
- refreshLimit: 10,
- refreshTime: 30,
- renderVisibleOnly: false,
- refreshVisibleOnly: true,
- sizes: [["728", "90"]],
- report: {
- enabled: true,
- wording: "Report Ad",
- position: "bottom-right",
- },
- mediaQuery: "(min-width: 730px) and (max-width: 1024px)",
- demo: addemo,
- });
- $("#nitropay_ad_footer2").removeClass("hidden");
+ $("#ad_footer").html(
+ ``
+ );
+ $("#ad_footer").removeClass("hidden");
- window["nitroAds"].createAd("nitropay_ad_footer3", {
- refreshLimit: 10,
- refreshTime: 30,
- renderVisibleOnly: false,
- refreshVisibleOnly: true,
- sizes: [["320", "50"]],
- report: {
- enabled: true,
- wording: "Report Ad",
- position: "bottom-right",
- },
- mediaQuery: "(max-width: 730px)",
- demo: addemo,
- });
- $("#nitropay_ad_footer3").removeClass("hidden");
+ // $("#ad_footer2").html(``);
+ // $("#ad_footer2").removeClass("hidden");
- window["nitroAds"].createAd("nitropay_ad_about", {
- refreshLimit: 10,
- refreshTime: 30,
- renderVisibleOnly: false,
- refreshVisibleOnly: true,
- report: {
- enabled: true,
- wording: "Report Ad",
- position: "bottom-right",
- },
- demo: addemo,
- });
- $("#nitropay_ad_about").removeClass("hidden");
+ $("#ad_about1").html(
+ ``
+ );
+ $("#ad_about1").removeClass("hidden");
- window["nitroAds"].createAd("nitropay_ad_settings1", {
- refreshLimit: 10,
- refreshTime: 30,
- renderVisibleOnly: false,
- refreshVisibleOnly: true,
- report: {
- enabled: true,
- wording: "Report Ad",
- position: "bottom-right",
- },
- demo: addemo,
- });
- $("#nitropay_ad_settings1").removeClass("hidden");
+ $("#ad_about2").html(
+ ``
+ );
+ $("#ad_about2").removeClass("hidden");
- window["nitroAds"].createAd("nitropay_ad_settings2", {
- refreshLimit: 10,
- refreshTime: 30,
- renderVisibleOnly: false,
- refreshVisibleOnly: true,
- report: {
- enabled: true,
- wording: "Report Ad",
- position: "bottom-right",
- },
- demo: addemo,
- });
- $("#nitropay_ad_settings2").removeClass("hidden");
+ $("#ad_settings0").html(
+ ``
+ );
+ $("#ad_settings0").removeClass("hidden");
- window["nitroAds"].createAd("nitropay_ad_account", {
- refreshLimit: 10,
- refreshTime: 30,
- renderVisibleOnly: false,
- refreshVisibleOnly: true,
- report: {
- enabled: true,
- wording: "Report Ad",
- position: "bottom-right",
- },
- demo: addemo,
- });
- $("#nitropay_ad_account").removeClass("hidden");
+ $("#ad_settings1").html(
+ ``
+ );
+ $("#ad_settings1").removeClass("hidden");
+
+ $("#ad_settings2").html(
+ ``
+ );
+ $("#ad_settings2").removeClass("hidden");
+
+ $("#ad_settings3").html(
+ ``
+ );
+ $("#ad_settings3").removeClass("hidden");
+
+ $("#ad_account").html(
+ ``
+ );
+ $("#ad_account").removeClass("hidden");
} else {
$(".footerads").remove();
- $("#nitropay_ad_left").remove();
- $("#nitropay_ad_right").remove();
- $("#nitropay_ad_footer").remove();
- $("#nitropay_ad_footer2").remove();
- $("#nitropay_ad_footer3").remove();
- $("#nitropay_ad_settings1").remove();
- $("#nitropay_ad_settings2").remove();
- $("#nitropay_ad_account").remove();
- $("#nitropay_ad_about").remove();
+ $("#ad_left").remove();
+ $("#ad_right").remove();
+ $("#ad_footer").remove();
+ $("#ad_footer2").remove();
+ $("#ad_footer3").remove();
+ $("#ad_settings0").remove();
+ $("#ad_settings1").remove();
+ $("#ad_settings2").remove();
+ $("#ad_settings3").remove();
+ $("#ad_account").remove();
+ $("#ad_about1").remove();
+ $("#ad_about2").remove();
}
} catch (e) {
Notifications.add("Error initialising ads: " + e.message);
console.log("error initialising ads " + e.message);
$(".footerads").remove();
- $("#nitropay_ad_left").remove();
- $("#nitropay_ad_right").remove();
- $("#nitropay_ad_footer").remove();
- $("#nitropay_ad_footer2").remove();
- $("#nitropay_ad_footer3").remove();
- $("#nitropay_ad_settings1").remove();
- $("#nitropay_ad_settings2").remove();
- $("#nitropay_ad_account").remove();
- $("#nitropay_ad_about").remove();
+ $("#ad_left").remove();
+ $("#ad_right").remove();
+ $("#ad_footer").remove();
+ $("#ad_footer2").remove();
+ $("#ad_footer3").remove();
+ $("#ad_settings0").remove();
+ $("#ad_settings1").remove();
+ $("#ad_settings2").remove();
+ $("#ad_settings3").remove();
+ $("#ad_account").remove();
+ $("#ad_about1").remove();
+ $("#ad_about2").remove();
}
}
TestUI.updateModesNotice();
diff --git a/src/js/exports.js b/src/js/exports.js
index 4540c50d6..2230798c4 100644
--- a/src/js/exports.js
+++ b/src/js/exports.js
@@ -25,3 +25,5 @@ global.crownTest = async () => {
await DB.getUserHighestWpm("time", 60, false, "english", "normal")
);
};
+
+global.filterDebug = Account.toggleFilterDebug;
diff --git a/src/js/global-dependencies.js b/src/js/global-dependencies.js
index 90c49d6b3..10fc9822c 100644
--- a/src/js/global-dependencies.js
+++ b/src/js/global-dependencies.js
@@ -13,7 +13,7 @@ import * as ResultFilters from "./result-filters";
import Config from "./config";
import * as SimplePopups from "./simple-popups";
import * as AccountController from "./account-controller";
-import {toggleGlarses} from "./test-logic";
+import { toggleGlarses } from "./test-logic";
import "./caps-warning";
import "./support-popup";
import "./version-popup";
@@ -22,3 +22,4 @@ import "./import-settings-popup";
import "./input-controller";
import "./ready";
import "./about-page";
+import * as Account from "./account";
diff --git a/src/js/input-controller.js b/src/js/input-controller.js
index b7a5639fa..c1fed28ff 100644
--- a/src/js/input-controller.js
+++ b/src/js/input-controller.js
@@ -167,7 +167,7 @@ function handleBackspace(event) {
// }
if (
- /^[ £§`~!@#$%^&*()_+\-=[\]{};':"|,./<>?]*$/g.test(
+ /^[ £§`~!@#$%^&*()_+\\\-=[\]{};':"|,./<>?]*$/g.test(
TestLogic.input.getCurrent()
)
) {
@@ -186,24 +186,29 @@ function handleBackspace(event) {
TestLogic.input.popHistory();
TestLogic.corrected.popHistory();
} else {
- const regex = new RegExp(/[ £§`~!@#$%^&*()_+\-=[\]{};':"|,./<>?]/, "g");
+ const regex = new RegExp(
+ /[ £§`~!@#$%^&*()_+\\\-=[\]{};':"|,./<>?]/,
+ "g"
+ );
let input = TestLogic.input.getCurrent();
regex.test(input);
// let puncIndex = regex.lastIndex;
let puncIndex = input.lastIndexOfRegex(
- /[ £§`~!@#$%^&*()_+\-=[\]{};':"|,./<>?]/g
+ /[ £§`~!@#$%^&*()_+\\\-=[\]{};':"|,./<>?]/g
);
while (
- /[ £§`~!@#$%^&*()_+\-=[\]{};':"|,./<>?]/g.test(input.slice(-1))
+ /[ £§`~!@#$%^&*()_+\\\-=[\]{};':"|,./<>?]/g.test(input.slice(-1))
) {
input = input.substring(0, input.length - 1);
}
puncIndex = input.lastIndexOfRegex(
- /[ £§`~!@#$%^&*()_+\-=[\]{};':"|,./<>?]/g
+ /[ £§`~!@#$%^&*()_+\\\-=[\]{};':"|,./<>?]/g
+ );
+ TestLogic.input.setCurrent(
+ input.substring(0, puncIndex == 0 ? 0 : puncIndex + 1)
);
- TestLogic.input.setCurrent(input.substring(0, puncIndex + 1));
}
} else {
TestLogic.input.setCurrent(
diff --git a/src/js/layouts.js b/src/js/layouts.js
index c28bbdc03..113c2c6a2 100644
--- a/src/js/layouts.js
+++ b/src/js/layouts.js
@@ -365,5 +365,25 @@ const layouts = {
" "
],
},
+ APT: {
+ keymapShowTopRow: false,
+ keys: [
+ "`~", "1!", "2@", "3#", "4$", "5%", "6^", "7&", "8*", "9(", "0)", "-_", "=+",
+ "wW", "cC", "dD", "lL", "'\"", "/?", "yY", "oO", "uU", "qQ", "[{", "]}", "\\|",
+ "rR", "sS", "tT", "hH", "kK", "pP", "nN", "eE", "iI", "aA", ";:",
+ "\\|", "vV", "bB", "gG", "mM", ",<", ".>", "fF", "jJ", "xX", "zZ",
+ " "
+ ]
+ },
+ Thai_Kedmanee: {
+ keymapShowTopRow: true,
+ keys: [
+ "-%", "ๅ+", "/๑", "_๒", "ภ๓", "ถ๔", "ุู", "ึ฿", "ค๕", "ต๖", "จ๗", "ข๘", "ช๙",
+ "ๆ๐", "ไ\"", "ำฎ", "พฑ", "ะธ", "ัํ", "ี๊", "รณ", "นฯ", "ยญ", "บฐ", "ล,", "ฃฅ",
+ "ฟฤ", "หฆ", "กฏ", "ดโ", "เฌ", "้็", "่๋", "าษ", "สศ", "วซ", "ง.",
+ "ฃฅ", "ผ(", "ป)", "แฉ", "อฮ", "ิฺ", "ื์", "ท?", "มฒ", "ใฬ", "ฝฦ",
+ " "
+ ]
+ },
}
export default layouts;
diff --git a/src/js/popups/custom-background-filter.js b/src/js/popups/custom-background-filter.js
index 3f3ddf0a4..aa4b99c02 100644
--- a/src/js/popups/custom-background-filter.js
+++ b/src/js/popups/custom-background-filter.js
@@ -34,9 +34,15 @@ export function getCSS() {
export function apply() {
let filterCSS = getCSS();
- $(".customBackground").css({
+ let css = {
filter: filterCSS,
- });
+ width: `calc(100% + ${filters.blur.value * 4}rem)`,
+ height: `calc(100% + ${filters.blur.value * 4}rem)`,
+ left: `-${filters.blur.value * 2}rem`,
+ top: `-${filters.blur.value * 2}rem`,
+ position: "absolute",
+ };
+ $(".customBackground img").css(css);
}
function syncSliders() {
diff --git a/src/js/test/test-logic.js b/src/js/test/test-logic.js
index 899d80f3d..f20944a8a 100644
--- a/src/js/test/test-logic.js
+++ b/src/js/test/test-logic.js
@@ -1251,13 +1251,15 @@ export function finish(difficultyFailed = false) {
if (afkSecondsPercent > 0) {
$("#result .stats .time .bottom .afk").text(afkSecondsPercent + "% afk");
}
- TodayTracker.addSeconds(
- testtime +
- (TestStats.incompleteSeconds < 0
- ? 0
- : Misc.roundTo2(TestStats.incompleteSeconds)) -
- afkseconds
- );
+ if (!difficultyFailed) {
+ TodayTracker.addSeconds(
+ testtime +
+ (TestStats.incompleteSeconds < 0
+ ? 0
+ : Misc.roundTo2(TestStats.incompleteSeconds)) -
+ afkseconds
+ );
+ }
$("#result .stats .time .bottom .timeToday").text(TodayTracker.getString());
$("#result .stats .key .bottom").text(testtime + "s");
$("#words").removeClass("blurred");
diff --git a/src/js/theme-controller.js b/src/js/theme-controller.js
index 2f9d31047..f330d34b1 100644
--- a/src/js/theme-controller.js
+++ b/src/js/theme-controller.js
@@ -165,25 +165,29 @@ export function clearRandom() {
}
export function applyCustomBackground() {
- $(".customBackground").css({
- backgroundImage: `url(${Config.customBackground})`,
- backgroundAttachment: "fixed",
- });
+ // $(".customBackground").css({
+ // backgroundImage: `url(${Config.customBackground})`,
+ // backgroundAttachment: "fixed",
+ // });
if (Config.customBackground === "") {
$("#words").removeClass("noErrorBorder");
+ $(".customBackground img").remove();
} else {
$("#words").addClass("noErrorBorder");
+ $(".customBackground").html(`
`);
}
}
export function applyCustomBackgroundSize() {
if (Config.customBackgroundSize == "max") {
- $(".customBackground").css({
- backgroundSize: "100% 100%",
+ $(".customBackground img").css({
+ // width: "calc(100%)",
+ // height: "calc(100%)",
+ objectFit: "",
});
} else if (Config.customBackgroundSize != "") {
- $(".customBackground").css({
- backgroundSize: Config.customBackgroundSize,
+ $(".customBackground img").css({
+ objectFit: Config.customBackgroundSize,
});
}
}
diff --git a/src/sass/style.scss b/src/sass/style.scss
index 049462ae0..db6891392 100644
--- a/src/sass/style.scss
+++ b/src/sass/style.scss
@@ -141,6 +141,9 @@ body {
background-position: center center;
background-repeat: no-repeat;
z-index: -999;
+ justify-content: center;
+ align-items: center;
+ display: flex;
}
html {
@@ -2091,7 +2094,7 @@ key {
}
.source {
- width: 25vw;
+ max-width: 30rem;
}
.tags .bottom .fas {
@@ -3365,7 +3368,7 @@ key {
.val {
font-size: 3rem;
- line-height: 3rem;
+ line-height: 3.5rem;
}
&.chart {
diff --git a/static/index.html b/static/index.html
index 43bcc1b84..30bb3fe5c 100644
--- a/static/index.html
+++ b/static/index.html
@@ -70,18 +70,26 @@
-
-
+ -->
+
+
+
-
@@ -1609,7 +1616,7 @@
raw wpm and mapped onto a scale from 0 to 100.
-
+
results screen
@@ -1743,6 +1750,7 @@
adding themes and more
+
+
-
+
sound
@@ -3385,7 +3394,7 @@
-
+
theme
@@ -4109,7 +4118,7 @@
-
+
-
diff --git a/static/languages/_groups.json b/static/languages/_groups.json
index 714795172..dec39b5e6 100644
--- a/static/languages/_groups.json
+++ b/static/languages/_groups.json
@@ -216,6 +216,10 @@
"name": "urdu",
"languages": ["urdu", "urdu_1k"]
},
+ {
+ "name": "albanian",
+ "languanges": ["albanian", "albanian_1k"]
+ },
{
"name": "code",
"languages": [
diff --git a/static/languages/_list.json b/static/languages/_list.json
index 766c75ff3..289530e41 100644
--- a/static/languages/_list.json
+++ b/static/languages/_list.json
@@ -115,6 +115,8 @@
,"esperanto_h_sistemo_36k"
,"urdu"
,"urdu_1k"
+ ,"albanian"
+ ,"albanian_1k"
,"twitch_emotes"
,"pig_latin"
,"code_python"
diff --git a/static/languages/albanian.json b/static/languages/albanian.json
new file mode 100644
index 000000000..8de623774
--- /dev/null
+++ b/static/languages/albanian.json
@@ -0,0 +1,206 @@
+{
+ "name": "albanian",
+ "leftToRight": true,
+ "words": [
+ "të",
+ "e",
+ "në",
+ "do",
+ "nuk",
+ "është",
+ "më",
+ "po",
+ "që",
+ "dhe",
+ "për",
+ "një",
+ "me",
+ "se",
+ "ta",
+ "unë",
+ "ka",
+ "ti",
+ "jo",
+ "te",
+ "mirë",
+ "mund",
+ "ju",
+ "çfarë",
+ "nga",
+ "si",
+ "duhet",
+ "ne",
+ "kjo",
+ "kam",
+ "këtë",
+ "ai",
+ "por",
+ "shumë",
+ "jam",
+ "di",
+ "këtu",
+ "je",
+ "ke",
+ "a",
+ "mos",
+ "atë",
+ "tani",
+ "ajo",
+ "ishte",
+ "u",
+ "ku",
+ "vetëm",
+ "nëse",
+ "dua",
+ "kur",
+ "janë",
+ "edhe",
+ "mua",
+ "ata",
+ "rregull",
+ "kemi",
+ "sa",
+ "na",
+ "ty",
+ "gjithë",
+ "pse",
+ "duke",
+ "eshte",
+ "oh",
+ "apo",
+ "ky",
+ "tij",
+ "gjë",
+ "pak",
+ "jemi",
+ "parë",
+ "diçka",
+ "bëj",
+ "kush",
+ "keq",
+ "nje",
+ "im",
+ "faleminderit",
+ "qe",
+ "per",
+ "jeni",
+ "keni",
+ "vjen",
+ "dy",
+ "mendoj",
+ "lutem",
+ "jetë",
+ "para",
+ "tjetër",
+ "bërë",
+ "kështu",
+ "atje",
+ "kanë",
+ "së",
+ "hej",
+ "pra",
+ "sepse",
+ "them",
+ "ja",
+ "time",
+ "tek",
+ "bën",
+ "pa",
+ "ime",
+ "duket",
+ "asgjë",
+ "ndonjë",
+ "vërtetë",
+ "shkojmë",
+ "eja",
+ "bukur",
+ "ndoshta",
+ "shiko",
+ "gjitha",
+ "çka",
+ "pas",
+ "disa",
+ "kohë",
+ "tim",
+ "zot",
+ "qenë",
+ "këto",
+ "zotëri",
+ "ma",
+ "ashtu",
+ "njeri",
+ "çdo",
+ "prit",
+ "mendon",
+ "une",
+ "tënde",
+ "kurrë",
+ "ato",
+ "atëherë",
+ "kishte",
+ "tuaj",
+ "shkoj",
+ "hajde",
+ "dreqin",
+ "ose",
+ "aty",
+ "saj",
+ "deri",
+ "kaq",
+ "ia",
+ "tyre",
+ "jashtë",
+ "shtëpi",
+ "thotë",
+ "prej",
+ "marrë",
+ "vdekur",
+ "mire",
+ "sikur",
+ "punë",
+ "isha",
+ "tha",
+ "as",
+ "dreq",
+ "gati",
+ "bëjmë",
+ "aq",
+ "brenda",
+ "ditë",
+ "yt",
+ "gjithçka",
+ "fundit",
+ "herë",
+ "shoh",
+ "pastaj",
+ "vend",
+ "dikush",
+ "kisha",
+ "shko",
+ "vërtet",
+ "le",
+ "thjesht",
+ "bësh",
+ "jote",
+ "tënd",
+ "dashur",
+ "zoti",
+ "besoj",
+ "marr",
+ "akoma",
+ "juaj",
+ "fal",
+ "kete",
+ "ndodh",
+ "sigurisht",
+ "sot",
+ "përse",
+ "jep",
+ "poshtë",
+ "mjaft",
+ "epo",
+ "njerëz",
+ "shpejt",
+ "asnjë"
+ ]
+}
diff --git a/static/languages/albanian_1k.json b/static/languages/albanian_1k.json
new file mode 100644
index 000000000..3caf836d8
--- /dev/null
+++ b/static/languages/albanian_1k.json
@@ -0,0 +1,1006 @@
+{
+ "name": "albanian",
+ "leftToRight": true,
+ "words": [
+ "si",
+ "I",
+ "e tij",
+ "që",
+ "ai",
+ "ishte",
+ "për",
+ "në",
+ "janë",
+ "me",
+ "ata",
+ "jetë",
+ "në",
+ "një",
+ "kam",
+ "kjo",
+ "nga",
+ "nga",
+ "hot",
+ "fjalë",
+ "por",
+ "çfarë",
+ "disa",
+ "është",
+ "ajo",
+ "ju",
+ "ose",
+ "kishte",
+ "thonë",
+ "i",
+ "në",
+ "dhe",
+ "një",
+ "në",
+ "ne",
+ "mund",
+ "jashtë",
+ "tjetër",
+ "ishin",
+ "e cila",
+ "bëj",
+ "tyre",
+ "koha",
+ "nëse",
+ "do",
+ "si",
+ "tha",
+ "një",
+ "çdo",
+ "them",
+ "bën",
+ "i vendosur",
+ "tre",
+ "dua",
+ "ajrit",
+ "mirë",
+ "edhe",
+ "luajnë",
+ "vogël",
+ "fund",
+ "vendos",
+ "shtëpi",
+ "lexoj",
+ "dorë",
+ "port",
+ "i madh",
+ "magji",
+ "të shtoni",
+ "edhe",
+ "tokë",
+ "këtu",
+ "duhet",
+ "i madh",
+ "i lartë",
+ "i tillë",
+ "ndjek",
+ "akt",
+ "pse",
+ "kërkoj",
+ "burra",
+ "ndryshim",
+ "shkoi",
+ "dritë",
+ "lloj",
+ "nga",
+ "duhet",
+ "shtëpi",
+ "foto",
+ "përpiqem",
+ "na",
+ "përsëri",
+ "kafshëve",
+ "pikë",
+ "nënë",
+ "botëror",
+ "afër",
+ "ndërtuar",
+ "vetë",
+ "toka",
+ "baba",
+ "ndonjë",
+ "të reja",
+ "punë",
+ "pjesë",
+ "marrë",
+ "marrë",
+ "vendi",
+ "bërë",
+ "jetojnë",
+ "ku",
+ "pas",
+ "mbrapa",
+ "pak",
+ "vetëm",
+ "rreth",
+ "njeri",
+ "vit",
+ "erdhi",
+ "show",
+ "çdo",
+ "mirë",
+ "mua",
+ "jap",
+ "tonë",
+ "nën",
+ "Emri",
+ "shumë",
+ "me anë të",
+ "vetëm",
+ "formë",
+ "fjali",
+ "i madh",
+ "mendoj",
+ "thonë",
+ "të ndihmojë",
+ "ulët",
+ "linjë",
+ "ndryshoj",
+ "kthesë",
+ "shkaku",
+ "shumë",
+ "mesatare",
+ "para",
+ "veprim",
+ "drejtë",
+ "djalë",
+ "vjetër",
+ "shumë",
+ "i njëjtë",
+ "ajo",
+ "të gjithë",
+ "atje",
+ "kur",
+ "up",
+ "përdorimi",
+ "tuaj",
+ "mënyrë",
+ "për",
+ "shumë",
+ "pastaj",
+ "ata",
+ "shkruaj",
+ "do",
+ "si",
+ "kështu",
+ "këto",
+ "e saj",
+ "gjatë",
+ "bëj",
+ "gjë",
+ "shih",
+ "atë",
+ "dy",
+ "ka",
+ "shikoni",
+ "më shumë",
+ "ditë",
+ "mund",
+ "shkoj",
+ "eja",
+ "bëri",
+ "numri",
+ "zë",
+ "asnjë",
+ "më",
+ "njerëz",
+ "tim",
+ "mbi",
+ "di",
+ "ujë",
+ "se",
+ "thirrje",
+ "parë",
+ "që",
+ "mund",
+ "poshtë",
+ "anë",
+ "qenë",
+ "tani",
+ "gjeni",
+ "kreu",
+ "qëndrim",
+ "vet",
+ "faqe",
+ "duhet",
+ "vendi",
+ "gjetur",
+ "përgjigje",
+ "shkollë",
+ "rritet",
+ "Studimi",
+ "ende",
+ "mësoj",
+ "bimë",
+ "mbuluar",
+ "ushqim",
+ "dielli",
+ "katër",
+ "në mes të",
+ "shtet",
+ "mbaj",
+ "sy",
+ "kurrë",
+ "fundit",
+ "le të",
+ "mendimi",
+ "qytet",
+ "pemë",
+ "kalojnë",
+ "fermë",
+ "vështirë",
+ "fillimi",
+ "mund",
+ "histori",
+ "pa",
+ "tani",
+ "deti",
+ "barazim",
+ "la",
+ "vonë",
+ "drejtuar",
+ "nuk",
+ "ndërsa",
+ "shtypi",
+ "afër",
+ "natën",
+ "real",
+ "jetë",
+ "pak",
+ "veri",
+ "libri",
+ "kryer",
+ "mori",
+ "shkenca",
+ "hani",
+ "dhomë",
+ "mik",
+ "filloi",
+ "Ideja",
+ "peshk",
+ "mal",
+ "stop",
+ "dikur",
+ "bazë",
+ "dëgjojë",
+ "kalë",
+ "prerë",
+ "i sigurt",
+ "shikojnë",
+ "ngjyra",
+ "fytyrë",
+ "dru",
+ "kryesore",
+ "hapur",
+ "duket",
+ "së bashku",
+ "tjetër",
+ "e bardhë",
+ "fëmijë",
+ "të fillojë",
+ "mori",
+ "eci",
+ "shembull",
+ "lehtësuar",
+ "letër",
+ "grup",
+ "gjithmonë",
+ "muzikë",
+ "ato",
+ "të dy",
+ "mark",
+ "shpesh",
+ "letër",
+ "deri",
+ "milje",
+ "lumi",
+ "makinë",
+ "këmbët",
+ "kujdes",
+ "i dytë",
+ "mjaft",
+ "plain",
+ "vajzë",
+ "zakonshme",
+ "i ri",
+ "gati",
+ "sipër",
+ "kurrë",
+ "i kuq",
+ "lista",
+ "ndonëse",
+ "të ndjehen të",
+ "flasim",
+ "zog",
+ "shpejt",
+ "trupi",
+ "qen",
+ "familja",
+ "drejtpërdrejtë",
+ "paraqesin",
+ "largohen",
+ "song",
+ "të matur",
+ "dyer",
+ "produkt",
+ "e zezë",
+ "i shkurtër",
+ "numëror",
+ "klasë",
+ "era",
+ "pyetje",
+ "ndodhë",
+ "i plotë",
+ "anije",
+ "zonë",
+ "gjysmë",
+ "shkëmb",
+ "mënyrë",
+ "zjarri",
+ "jug",
+ "problemi",
+ "pjesë",
+ "tha",
+ "dinte",
+ "kaloj",
+ "që prej",
+ "top",
+ "tërë",
+ "mbreti",
+ "rrugë",
+ "inç",
+ "shumohen",
+ "asgjë",
+ "Sigurisht",
+ "qëndrojnë",
+ "rrotë",
+ "plotë",
+ "forca",
+ "blu",
+ "objekt",
+ "vendosë",
+ "sipërfaqe",
+ "thellë",
+ "moon",
+ "ishull",
+ "këmbë",
+ "sistemi",
+ "i zënë",
+ "provë",
+ "rekord",
+ "varkë",
+ "përbashkët",
+ "ari",
+ "të jetë e mundur",
+ "aeroplan",
+ "Në vend",
+ "thatë",
+ "pyes veten",
+ "qesh",
+ "mijë",
+ "më parë",
+ "vrapoi",
+ "kontrolloj",
+ "lojë",
+ "formë",
+ "barazojnë",
+ "hot",
+ "Miss",
+ "solli",
+ "ngrohjes",
+ "borë",
+ "gomë",
+ "sjellë",
+ "po",
+ "i largët",
+ "mbushur",
+ "lindje",
+ "bojë",
+ "gjuha",
+ "në mesin e",
+ "njësi",
+ "fuqia",
+ "qytet",
+ "gjobë",
+ "sigurt",
+ "fluturojnë",
+ "bien",
+ "të çojë",
+ "qaj",
+ "errët",
+ "makinë",
+ "shënim",
+ "pres",
+ "Plani",
+ "shifër",
+ "yll",
+ "kuti",
+ "emër",
+ "fushë",
+ "tjetër",
+ "saktë",
+ "gjendje",
+ "kile",
+ "e bërë",
+ "bukuri",
+ "makinë",
+ "qëndroi",
+ "përmbaj",
+ "para",
+ "mësojnë",
+ "javë",
+ "përfundimtar",
+ "dha",
+ "e gjelbër",
+ "oh",
+ "shpejtë",
+ "zhvilloj",
+ "oqean",
+ "ngrohtë",
+ "pa pagesë",
+ "minutë",
+ "fortë",
+ "të veçantë",
+ "mendja",
+ "prapa",
+ "qartë",
+ "bisht",
+ "prodhojnë",
+ "fakti",
+ "hapësirë",
+ "dëgjuar",
+ "mirë",
+ "orë",
+ "më mirë",
+ "e vërtetë",
+ "gjatë",
+ "njëqind",
+ "pesë",
+ "kujtoj",
+ "hapi",
+ "fillim",
+ "mbajë",
+ "perëndim",
+ "terren",
+ "interesi",
+ "arrijnë",
+ "shpejtë",
+ "folje",
+ "këndoj",
+ "dëgjoni",
+ "gjashtë",
+ "Tabela",
+ "udhëtimit",
+ "më pak",
+ "mëngjes",
+ "dhjetë",
+ "thjeshtë",
+ "disa",
+ "zanore",
+ "drejt",
+ "luftë",
+ "vë",
+ "kundër",
+ "model",
+ "i ngadalshëm",
+ "qendër",
+ "dashuri",
+ "person",
+ "paratë",
+ "shërbejnë",
+ "duket",
+ "rrugë",
+ "Harta",
+ "shi",
+ "rregull",
+ "qeverisur",
+ "tërheq",
+ "ftohtë",
+ "njoftim",
+ "zë",
+ "energjisë",
+ "gjueti",
+ "mundshme",
+ "krevat",
+ "vëlla",
+ "vezë",
+ "udhëtim",
+ "qelizë",
+ "besoj",
+ "ndoshta",
+ "marr",
+ "papritur",
+ "të llogarisë",
+ "katrore",
+ "arsyeja",
+ "Gjatësia",
+ "përfaqësojnë",
+ "art",
+ "subjekt",
+ "rajoni",
+ "Madhësia",
+ "ndryshojnë",
+ "vendosen",
+ "flasin",
+ "pesha",
+ "përgjithshme",
+ "akull",
+ "çështje",
+ "rrethi",
+ "palë",
+ "përfshijnë",
+ "ndarje",
+ "rrokje",
+ "ndjerë",
+ "i madh",
+ "top",
+ "ende",
+ "vala",
+ "rënie",
+ "zemra",
+ "jam",
+ "pranishëm",
+ "rëndë",
+ "valle",
+ "motor",
+ "pozita",
+ "krah",
+ "të gjerë",
+ "lundrojnë",
+ "material",
+ "fraksion",
+ "pyjeve",
+ "rri",
+ "garë",
+ "dritare",
+ "dyqan",
+ "verë",
+ "tren",
+ "gjumë",
+ "provoj",
+ "i vetëm",
+ "këmbë",
+ "ushtrim",
+ "mur",
+ "kapur",
+ "mali",
+ "uroj",
+ "qiell",
+ "bordi",
+ "lumturi",
+ "dimrit",
+ "sat",
+ "shkruar",
+ "egra",
+ "instrument",
+ "mbajtur",
+ "qelqi",
+ "bari",
+ "lopë",
+ "punë",
+ "edge",
+ "shenjë",
+ "vizitë",
+ "e kaluara",
+ "e butë",
+ "argëtim",
+ "ndritshme",
+ "gazit",
+ "mot",
+ "muaj",
+ "milion",
+ "mbajnë",
+ "finish",
+ "të lumtur",
+ "shpresoj",
+ "lule",
+ "vesh",
+ "çuditshme",
+ "shkuar",
+ "tregtisë",
+ "melodi",
+ "udhëtim",
+ "zyrë",
+ "marrë",
+ "rresht",
+ "gojë",
+ "saktë",
+ "simbol",
+ "vdes",
+ "më pak",
+ "probleme",
+ "bërtas",
+ "me përjashtim të",
+ "shkroi",
+ "farë",
+ "ton",
+ "bashkohen",
+ "sugjerojnë",
+ "i pastër",
+ "pushim",
+ "lady",
+ "oborr",
+ "ngrihem",
+ "keq",
+ "goditje",
+ "naftës",
+ "gjak",
+ "prek",
+ "u rrit",
+ "cent",
+ "përzierje",
+ "ekipi",
+ "tela",
+ "kosto",
+ "humbur",
+ "kafe",
+ "vesh",
+ "kopsht",
+ "barabartë",
+ "dërguar",
+ "zgjidhni",
+ "ra",
+ "përshtaten",
+ "rrjedhë",
+ "drejtë",
+ "banka",
+ "mbledhë",
+ "ruani",
+ "kontrollit",
+ "dhjetor",
+ "vesh",
+ "tjetër",
+ "mjaft",
+ "thyen",
+ "rasti",
+ "mesme",
+ "vrasin",
+ "djali",
+ "liqeni",
+ "moment",
+ "shkallë",
+ "me zë të lartë",
+ "pranverë",
+ "vëzhguar",
+ "fëmijë",
+ "drejt",
+ "bashkëtingëllore",
+ "komb",
+ "fjalor",
+ "qumësht",
+ "shpejtësi",
+ "Metoda",
+ "organ",
+ "paguajnë",
+ "mosha",
+ "seksion",
+ "veshje",
+ "cloud",
+ "surprizë",
+ "i qetë",
+ "guri",
+ "vogël",
+ "ngjit",
+ "i ftohtë",
+ "dizajn",
+ "varfër",
+ "shumë",
+ "eksperiment",
+ "fund",
+ "kyç",
+ "hekuri",
+ "i vetëm",
+ "shkop",
+ "banesë",
+ "njëzet",
+ "lëkurës",
+ "buzëqeshje",
+ "rrudhë",
+ "vrimë",
+ "kërcejnë",
+ "fëmijë",
+ "tetë",
+ "fshati",
+ "takohen",
+ "rrënjë",
+ "blej",
+ "të rritur",
+ "zgjidhur",
+ "metalike",
+ "nëse",
+ "shtytje",
+ "shtatë",
+ "paragraf",
+ "tretë",
+ "duhet",
+ "mbajtur",
+ "flokët",
+ "përshkruajnë",
+ "kuzhinier",
+ "kati",
+ "ose",
+ "Rezultati",
+ "djeg",
+ "kodër",
+ "i sigurt",
+ "mace",
+ "shekulli",
+ "konsiderojnë",
+ "lloj",
+ "ligji",
+ "bit",
+ "Bregdeti",
+ "kopje",
+ "fraza",
+ "heshtur",
+ "i gjatë",
+ "rërë",
+ "tokës",
+ "roll",
+ "temperatura",
+ "gisht",
+ "industri",
+ "Vlera",
+ "lufta",
+ "gënjeshtër",
+ "rrah",
+ "nxeh",
+ "natyrore",
+ "view",
+ "kuptim",
+ "kapitalit",
+ "nuk do të",
+ "karrige",
+ "rrezik",
+ "fruta",
+ "i pasur",
+ "i trashë",
+ "ushtar",
+ "procesi",
+ "operoj",
+ "praktikë",
+ "të ndara",
+ "i vështirë",
+ "mjeku",
+ "ju lutem",
+ "mbrojtur",
+ "mesditë",
+ "kulture",
+ "moderne",
+ "element",
+ "hit",
+ "studenti",
+ "qoshe",
+ "parti",
+ "furnizim",
+ "të cilit",
+ "gjetur",
+ "unazë",
+ "karakter",
+ "insekteve",
+ "kapur",
+ "periudha",
+ "tregojnë",
+ "radio",
+ "foli",
+ "atom",
+ "njerëzore",
+ "historia",
+ "efekti",
+ "elektrike",
+ "presin",
+ "kockave",
+ "hekurudhor",
+ "imagjinoni",
+ "sigurojë",
+ "pajtohem",
+ "kështu",
+ "i butë",
+ "grua",
+ "kapiten",
+ "guess",
+ "nevojshme",
+ "mprehtë",
+ "krahut",
+ "krijuar",
+ "fqinji",
+ "laj",
+ "lakuriq nate",
+ "më tepër",
+ "turmë",
+ "misri",
+ "të krahasuar",
+ "poemë",
+ "string",
+ "zile",
+ "varet",
+ "mish",
+ "fshij",
+ "tub",
+ "i famshëm",
+ "dollar",
+ "lumë",
+ "frikë",
+ "pamje",
+ "i hollë",
+ "trekëndësh",
+ "planet",
+ "nxitim",
+ "shefi",
+ "koloni",
+ "ora",
+ "minave",
+ "kravatë",
+ "hyjnë",
+ "i madh",
+ "freskët",
+ "kërko",
+ "dërgoni",
+ "verdhë",
+ "armë",
+ "lejojnë",
+ "print",
+ "vdekur",
+ "vend",
+ "shkretëtirë",
+ "kostum",
+ "aktuale",
+ "ashensor",
+ "u rrit",
+ "arrijnë",
+ "mjeshtër",
+ "udhë",
+ "prind",
+ "breg",
+ "ndarje",
+ "fletë",
+ "substancë",
+ "favor",
+ "lidhur",
+ "pas",
+ "shpenzojnë",
+ "akord",
+ "yndyrë",
+ "kënaqur",
+ "origjinal",
+ "pjesa",
+ "stacion",
+ "baba",
+ "bukë",
+ "ngarkuar",
+ "i duhur",
+ "bar",
+ "Oferta",
+ "segment",
+ "rob",
+ "duck",
+ "i menjëhershëm",
+ "tregu",
+ "shkallë",
+ "populloj",
+ "zogth",
+ "i dashur",
+ "armik",
+ "përgjigjen",
+ "pije",
+ "ndodhin",
+ "mbështetje",
+ "fjalim",
+ "natyra",
+ "varg",
+ "avull",
+ "lëvizje",
+ "rrugë",
+ "lëngshme",
+ "log",
+ "do të thoshte",
+ "herës",
+ "dhëmbët",
+ "shell",
+ "qafë",
+ "oksigjen",
+ "sheqer",
+ "vdekja",
+ "mjaft",
+ "aftësi",
+ "gratë",
+ "sezon",
+ "zgjidhje",
+ "magnet",
+ "argjendi",
+ "thank",
+ "degë",
+ "ndeshje",
+ "prapashtesë",
+ "sidomos",
+ "fiku",
+ "i frikësuar",
+ "i madh",
+ "motra",
+ "çeliku",
+ "diskutuar",
+ "përpara",
+ "ngjashme",
+ "udhëzojë",
+ "përvojë",
+ "pikë",
+ "mollë",
+ "blerë",
+ "udhëhequr",
+ "katran",
+ "pallto",
+ "në masë",
+ "kartë",
+ "band",
+ "litar",
+ "shqip",
+ "fitore",
+ "ëndërr",
+ "mbrëmje",
+ "kusht",
+ "ushqim",
+ "mjet",
+ "totale",
+ "themelore",
+ "erë",
+ "luginë",
+ "as",
+ "dyfishtë",
+ "vend",
+ "vazhdojnë",
+ "bllok",
+ "tabelë",
+ "hat",
+ "shes",
+ "suksesi",
+ "Kompania",
+ "zbres",
+ "ngjarje",
+ "i veçantë",
+ "marrëveshje",
+ "notoj",
+ "term",
+ "kundërta",
+ "gruaja",
+ "këpucëve",
+ "shpatull",
+ "përhap",
+ "organizoni",
+ "kampi",
+ "trillime",
+ "pambuku",
+ "Born",
+ "përcaktuar",
+ "kuart",
+ "nëntë",
+ "kamion",
+ "zhurmë",
+ "nivel",
+ "shans",
+ "mblidhen",
+ "dyqan",
+ "shtrirje",
+ "hedh",
+ "shndrit",
+ "pronë",
+ "kolona",
+ "molekulë",
+ "zgjidhni",
+ "gabuar",
+ "gri",
+ "përsëritje",
+ "kërkojnë",
+ "gjerë",
+ "përgatisë",
+ "kripë",
+ "hundë",
+ "shumës",
+ "zemërimi",
+ "pretendim",
+ "kontinenti"
+ ]
+}
diff --git a/static/languages/spanish_10k.json b/static/languages/spanish_10k.json
index e80a51999..56773a8e3 100644
--- a/static/languages/spanish_10k.json
+++ b/static/languages/spanish_10k.json
@@ -355,7 +355,7 @@
"puesto",
"ahí",
"propia",
- "m",
+ "manosear",
"libro",
"igual",
"político",
@@ -366,7 +366,7 @@
"creo",
"tengo",
"dios",
- "c",
+ "cecina",
"española",
"condiciones",
"México",
@@ -585,7 +585,7 @@
"cine",
"salir",
"comunicación",
- "b",
+ "balística",
"experiencia",
"demasiado",
"plan",
@@ -614,7 +614,7 @@
"color",
"actividades",
"mesa",
- "p",
+ "bursatil",
"decía",
"cuyo",
"debido",
@@ -702,7 +702,7 @@
"ve",
"derecha",
"ambiente",
- "i",
+ "ruedín",
"habrá",
"precisamente",
"enfermedad",
@@ -774,7 +774,7 @@
"carrera",
"cierta",
"sola",
- "PSOE",
+ "sonda",
"lejos",
"juez",
"características",
@@ -900,7 +900,7 @@
"cama",
"aun",
"presenta",
- "PP",
+ "rifle",
"revolución",
"busca",
"abril",
@@ -913,7 +913,7 @@
"pequeña",
"armas",
"debía",
- "ii",
+ "lubricante",
"esfuerzo",
"humana",
"posibilidades",
@@ -1232,7 +1232,7 @@
"afirma",
"oficiales",
"diálogo",
- "vi",
+ "ví",
"respeto",
"tratado",
"llevaba",
@@ -1289,7 +1289,7 @@
"institución",
"edificio",
"nota",
- "franco",
+ "constelaciones",
"jugar",
"temerario",
"representa",
@@ -1339,7 +1339,7 @@
"agentes",
"planta",
"Venezuela",
- "f",
+ "bellota",
"actuación",
"iban",
"actos",
@@ -1366,14 +1366,14 @@
"pagar",
"colegio",
"sabes",
- "l",
+ "lastre",
"personaje",
"áreas",
"audiencia",
"doce",
"haga",
"periódico",
- "v",
+ "inundación",
"distribución",
"ausencia",
"entrevista",
@@ -1663,7 +1663,7 @@
"cuarenta",
"encontró",
"poesía",
- "t",
+ "tranvía",
"planes",
"ejercitar",
"negocios",
@@ -1745,7 +1745,7 @@
"éstas",
"saben",
"generalmente",
- "h",
+ "hermandad",
"dormir",
"individuo",
"cuerpos",
@@ -2033,7 +2033,7 @@
"mezcla",
"drogas",
"vivienda",
- "x",
+ "mezcal",
"escuchar",
"coronel",
"completamente",
@@ -2047,7 +2047,7 @@
"porcentaje",
"artes",
"vienen",
- "iii",
+ "fisco",
"villa",
"ah",
"Nicaragua",
@@ -2130,7 +2130,7 @@
"indios",
"raíz",
"John",
- "xix",
+ "gozo",
"recordó",
"absoluto",
"agricultura",
@@ -2599,7 +2599,7 @@
"cumplimiento",
"transición",
"campeón",
- "xx",
+ "termostato",
"verse",
"anteriormente",
"defender",
@@ -2711,7 +2711,7 @@
"subir",
"iniciar",
"droga",
- "iv",
+ "tsunami",
"asegurar",
"entusiasmo",
"prestigio",
@@ -3215,7 +3215,7 @@
"dama",
"líquido",
"estarán",
- "xviii",
+ "parmesano",
"decidir",
"tribunales",
"calma",
@@ -3410,7 +3410,7 @@
"condena",
"daban",
"respaldo",
- "PNV",
+ "textil",
"sufre",
"tristeza",
"regionales",
@@ -3563,7 +3563,7 @@
"veremos",
"domicilio",
"escucha",
- "UGT",
+ "autoescuela",
"novia",
"caras",
"reflejo",
@@ -3710,7 +3710,7 @@
"grasa",
"incluyen",
"poseen",
- "xvi",
+ "embrismo",
"compuesto",
"determinación",
"viejas",
@@ -3755,7 +3755,7 @@
"escenas",
"montaje",
"supongo",
- "TVE",
+ "vasto",
"abandono",
"Irene",
"modificación",
@@ -3972,7 +3972,7 @@
"retirada",
"decirse",
"soberanía",
- "xvii",
+ "parlamentarismo",
"basado",
"Núñez",
"anuales",
@@ -4063,7 +4063,7 @@
"cálculo",
"malas",
"propietario",
- "puta",
+ "auriculares",
"efectuar",
"fuimos",
"vivió",
@@ -5373,7 +5373,7 @@
"clínico",
"entraba",
"tele",
- "w",
+ "wolframio",
"crímenes",
"emisoras",
"plantear",
@@ -5841,7 +5841,7 @@
"placas",
"introduce",
"placa",
- "vii",
+ "placenta",
"volúmenes",
"establecidos",
"parámetros",
@@ -6167,7 +6167,7 @@
"frenar",
"quieras",
"salarial",
- "xiii",
+ "fisgar",
"catedrático",
"hubo",
"patente",
@@ -6211,7 +6211,7 @@
"afectada",
"IVA",
"portal",
- "xxi",
+ "pomada",
"despertó",
"levantado",
"rompe",
@@ -6401,7 +6401,7 @@
"participado",
"tregua",
"horizontal",
- "che",
+ "cheque",
"divina",
"Márquez",
"sociología",
@@ -6610,7 +6610,7 @@
"grita",
"joyas",
"mercancías",
- "ce",
+ "ceniza",
"ocupaba",
"salí",
"Barça",
@@ -6726,7 +6726,7 @@
"producciones",
"pedirle",
"trasladado",
- "xii",
+ "metalingüística",
"buscado",
"romana",
"exponer",
@@ -6842,7 +6842,7 @@
"generado",
"mármol",
"tomarse",
- "xv",
+ "marciano",
"engaño",
"esplendor",
"formó",
@@ -7166,7 +7166,7 @@
"bs",
"medianoche",
"moción",
- "q",
+ "quarán",
"unió",
"mencionada",
"encargó",
@@ -7473,7 +7473,7 @@
"meterse",
"mono",
"publicados",
- "RTVE",
+ "futbolista",
"matado",
"privilegios",
"echado",
@@ -7723,7 +7723,7 @@
"acude",
"aprecia",
"girar",
- "ja",
+ "jarrón",
"ligado",
"fundamentos",
"magnífica",
@@ -7953,7 +7953,7 @@
"significados",
"visuales",
"vacíos",
- "viii",
+ "visualización",
"bancario",
"dominicano",
"japoneses",
@@ -8288,7 +8288,7 @@
"desconcierto",
"descubrimientos",
"detectado",
- "to",
+ "toco",
"apartados",
"frescos",
"lata",
@@ -8460,7 +8460,7 @@
"reconstruir",
"secuencias",
"coincidieron",
- "Guevara",
+ "transistor",
"antropología",
"Benítez",
"disparar",
@@ -8647,7 +8647,7 @@
"hortalizas",
"inventado",
"subraya",
- "xiv",
+ "algoritmos",
"Cantabria",
"chimenea",
"perdona",
@@ -9095,7 +9095,7 @@
"incumplimiento",
"manzano",
"trágica",
- "xi",
+ "trucha",
"campesina",
"contenía",
"Liaño",
@@ -9318,7 +9318,7 @@
"condado",
"dormida",
"explorar",
- "ix",
+ "internacionalización",
"literarias",
"Palencia",
"activamente",
@@ -9500,7 +9500,7 @@
"arrastra",
"ciclismo",
"conoces",
- "du",
+ "dudoso",
"realizador",
"velo",
"cobran",
@@ -9752,7 +9752,7 @@
"irregulares",
"narcotraficantes",
"salva",
- "Stalin",
+ "toalla",
"desarrolladas",
"incluía",
"maduro",
diff --git a/static/languages/spanish_1k.json b/static/languages/spanish_1k.json
index 651f4f539..a47b31e92 100644
--- a/static/languages/spanish_1k.json
+++ b/static/languages/spanish_1k.json
@@ -288,7 +288,7 @@
"tú",
"derecho",
"verdad",
- "maría",
+ "María",
"unidos",
"podría",
"sería",
@@ -566,7 +566,7 @@
"importancia",
"cuales",
"contrario",
- "manuel",
+ "Manuel",
"García",
"fuerte",
"sol",
@@ -683,7 +683,7 @@
"viene",
"permite",
"análisis",
- "argentina",
+ "Argentina",
"acto",
"hechos",
"tiempos",
@@ -774,7 +774,7 @@
"carrera",
"cierta",
"sola",
- "PSOE",
+ "rincón",
"lejos",
"juez",
"características",
@@ -832,12 +832,12 @@
"llamado",
"técnica",
"título",
- "s",
+ "electricidad",
"principios",
"octubre",
"volvió",
"período",
- "g",
+ "gastrópodo",
"encontrar",
"democracia",
"aumento",
@@ -900,7 +900,7 @@
"cama",
"aun",
"presenta",
- "PP",
+ "pomada",
"revolución",
"busca",
"abril",
@@ -989,7 +989,7 @@
"líder",
"hospital",
"diversas",
- "rafael",
+ "Rafael",
"vuelve",
"destino",
"torno",
diff --git a/static/privacy-policy.html b/static/privacy-policy.html
index ac43a58f5..20f4ac378 100644
--- a/static/privacy-policy.html
+++ b/static/privacy-policy.html
@@ -149,7 +149,6 @@
-
Allow you to view result history of previous tests you completed
- completed
-
Save results from tests you take and show you statistics based on
diff --git a/static/quotes/albanian.json b/static/quotes/albanian.json
new file mode 100644
index 000000000..c5459e71b
--- /dev/null
+++ b/static/quotes/albanian.json
@@ -0,0 +1,125 @@
+{
+ "language": "albanian",
+ "groups": [
+ [0, 100],
+ [101, 300],
+ [301, 600],
+ [601, 9999]
+ ],
+ "quotes": [
+ {
+ "text": "O malet' e Shqipërisë e ju o lisat' e gjatë!Fushat e gjëra me lule, q'u kam ndër mënt dit' e natë!Ju bregore bukuroshe e ju lumenjt' e kulluar!Çuka, kodra, brinja, gërxhe dhe pylle të gjelbëruar!Do të këndonj bagëtinë që mbani ju e ushqeni,O vendëthit e bekuar, ju mëndjen ma dëfreni.",
+ "source": "Bagëti e Bujqësi",
+ "length": 284,
+ "id": 1
+ },
+ {
+ "text": "Njeriu në jetë ka nevoj për 1 filxhan shkencë, 1 shishe kujdes, dhe 1 oqean durim",
+ "source": "Naim Frashëri",
+ "length": 81,
+ "id": 2
+ },
+ {
+ "text": "Nëse do të mbjellësh për një vit, mbill misër e grurë. Nëse do të mbjellësh përgjithmonë, mbill arsim e kulturë.",
+ "source": "Sami Frashëri",
+ "length": 112,
+ "id": 3
+ },
+ {
+ "text": "Njeriu mund të zgjedhë cilëndo fe që ka trashëguar apo që i pëlqen, por s'mund të zgjedhë një tjetër kombësi dhe të luftojë të tijën, pa vënë në ballë një vulë të madhe prej tradhtari.",
+ "source": "Fan Noli",
+ "length": 184,
+ "id": 4
+ },
+ {
+ "text": "Thjeshtësia dhe natyrshmëria janë shumë herë veshja e vetme e një mendimi të thellë që mbetet brez pas brezi.",
+ "source": "Mitrush Kuteli",
+ "length": 109,
+ "id": 5
+ },
+ {
+ "text": "Vritmëni, po ma ruani gjakun se do t’u duhet nipërve dhe stërnipërve tuaj të shkruajnë gjuhën shqipe.",
+ "source": "Petro Nini Luarasi",
+ "length": 101,
+ "id": 6
+ },
+ {
+ "text": "Duke u ngritur përmbi egoizmat e pafuqishëm dhe mëritë e pafrytshme vetjake, le të ulim kokat e të punojmë për formimin e një Shqipërie ku poshtërsia keqbërëse e armiqve tanë trashëgimtarë t'i lërë vendin drejtësisë dhe ndershmërisë së mëkëmbur të stërgjyshërve tanë. Boll duke krasitur degë kuturu, dhe me një vendosmëri të ftohtë por të pamëshirshme, le të japim goditjen përfundimtare në rrënjët e së keqes.",
+ "source": "Faik Konica",
+ "length": 410,
+ "id": 7
+ },
+ {
+ "text": "Le të sulemi nën flamurin e kuq në flakë të luftës, që të na drithërohet trupi nga dehja e barutit, që të na ndizet shpirti nga zjarri i shenjtë i lirisë dhe le të vdesirn duke thirrur: “Rroftë Shqipëria“.",
+ "source": "Fan Noli",
+ "length": 205,
+ "id": 8
+ },
+ {
+ "text": "“Kujdestar surrat patate, mirë ja bëmë zotërisë sate.” “Ç’ti bëj drejtorit që është zemërmirë, pa jua tregoja unëqejfin juve.”",
+ "source": "Lulekuqe mbi mure",
+ "length": 126,
+ "id": 9
+ },
+ {
+ "text": "“Shitën gomarin, blenë biçikleta e çoç u duket vetja.” “Po si jeni ? C'thonë këta katundaret këtej. Marrin ndonjëçikë erë nga jeta?”",
+ "source": "Zonja nga Qyteti",
+ "length": 132,
+ "id": 10
+ },
+ {
+ "text": "OHANA do te thote familje dhe familja do te thote qe askush nuk braktiset apo harrohet",
+ "source": "Lilo & Stitch",
+ "length": 86,
+ "id": 11
+ },
+ {
+ "text": "Ty Milona kaur i derit, je ardhur ne keto ane... Mato ty njeri i madh.... Ha gjiz agush ha, se te ben esell.....",
+ "source": "Njeriu me top",
+ "length": 112,
+ "id": 12
+ },
+ {
+ "text": "Kam dëgjuar se Bin Bashi i Gjirokastrës paguan shumë para për kokën time. Çoj selam e i thuaj se Çerçiz Topulli me shokët është shëndosh e mirë si do vet zoti. Ti vër gishtin kokës e ta di sigurt se unë QË KUR KAM LER AS JAM SHITUR E AS JAM BLER",
+ "source": "Liri a vdekje",
+ "length": 245,
+ "id": 13
+ },
+ {
+ "text": "Në pyestë nënëja për mua. I thoni që u martua. Në pyeste se ç'nuse mori. Tre plumba te kraharori. Në pyeste se ç'krushq i vanë. Sorrat e korbat e hanë.",
+ "source": "Balada E Kurbinit",
+ "length": 151,
+ "id": 14
+ },
+ {
+ "text": "Çe ke në terezi ti, i fut një tralala edhe…“Po kjo tona, kjo tona thuaj, që nuk hahet as me vaj e as me uthull.“Krushqi me Jovan Bregun? Pu pu pu…“Irenkë pse të djeg miza moj xhan?“Po kur u bë dhe Sandër Mafishja, i biri i tetos të bëjë dashuriçka poshtë e përpjetë, mos ngeltë njeri më këmbë.“S’kisha bërë ndonjëherë nga këto anonimet, thashë ta provoja njëherë.“A drejtor, a drejtor. O të bëj krushk , o plaça në vend plaça!“Me kë ishe të keqen xhaxhi? Me një shoqe me pantallona eee?“O Fredi, është babai im ai. Pse ai që shani ju, nuk është i imi ai?“I zbret shkallët fap e fap e fap, flutur që iu bëftë mamaja.“Po qan ti? Epo qaj plas. Irena mos qaj ti Irena, mos qaj.“Desh ju lashë dhe juve pa fejuar.“Po unë zgjodha njerinë o ba.“Plasën çokollatat edhe këndeja. Po pse mo kaq budallenj jeni ju djemtë e fisit tonë?“Të kam ndjekur, të kam vëzhguar e, të kam studiuar ee.“Po mi shoqe po. Po jo mi shoqe jo. Vani, po qenkan thyer vezët mor i uruar! – Po jo moj Liri, ishin ca si të buta vetë.",
+ "source": "Pallati 176",
+ "length": 997,
+ "id": 15
+ },
+ {
+ "text": "E gjetëm Vangjel Gjino, u poqën fiqtë Po bota, ç’do thotë bota? Ka ligj, por ka dhe Maliq. E hodhët dobiçin në ferrë dhe tani vini të na bëni budallaçka ne. Është fati im, më ra nga qielli. Jam grua e martuar, kam një burrë. Bëri ç’bëri, mori atë që deshi.",
+ "source": "Përrallë nga e kaluara",
+ "length": 256,
+ "id": 16
+ },
+ {
+ "text": "Pulave u ka hije të kakarisin vetëm në kotec. Me cilin sy e pe, me atë me xham apo me atë pa xham? - Do pi, do dehem. – Të piftë dreqi në bark!",
+ "source": "Kapedani",
+ "length": 143,
+ "id": 17
+ },
+ {
+ "text": "Gërmo Tare, gërmo se qenin e ngordhur ke për të gjetur. Çohu, se të ka sjellë babi bukë lepurushi.",
+ "source": "Përballimi",
+ "length": 98,
+ "id": 18
+ },
+ {
+ "text": "Jo po ta dijë ai se po u nxeva unë, i thyej të gjitha, me pjata e filxhanë.",
+ "source": "Shi ne Plazh",
+ "length": 75,
+ "id": 19
+ }
+ ]
+}
diff --git a/static/quotes/german.json b/static/quotes/german.json
index 7029f746d..fa74b0371 100644
--- a/static/quotes/german.json
+++ b/static/quotes/german.json
@@ -1430,7 +1430,7 @@
"id": 238
},
{
- "text": "Worte sind, meinen nicht so bescheidenen Meinung nach, unsere wohl unerschöpflichste Quelle der Magie, Harry. Sie können Schmerz sowohl zufügen als auch lindern.",
+ "text": "Worte sind, meiner nicht so bescheidenen Meinung nach, unsere wohl unerschöpflichste Quelle der Magie, Harry. Sie können Schmerz sowohl zufügen als auch lindern.",
"source": "Harry Potter und die Heiligtümer des Todes",
"length": 161,
"id": 239
@@ -1742,13 +1742,13 @@
"id": 290
},
{
- "text": "Sie stolpert, und neben ihr bewegte sich etwas. Als sie sich umdrehte, sah sie einen zweiten Mann auf sich zukommen. Irgendetwas stimmte nicht mit ihm – mit seiner Haut, mit seinem Gesicht es sah nicht echt au. Fast wie aus Papier. Sie versuchte, ihn wegzustoßen, doch es war, als boxe man in einen Luftsack. Eine Faust flog ihr entgegen, doch im Gegensatz zu seinem Körper war die Faust kompakt und kräftig, und er riss ihr den Kopf zurück. Sie strauchelte, und er wollte sie packen, doch dann war Skulduggery zur Stelle und schleuderte ihn weg.",
+ "text": "Sie stolpert, und neben ihr bewegte sich etwas. Als sie sich umdrehte, sah sie einen zweiten Mann auf sich zukommen. Irgendetwas stimmte nicht mit ihm - mit seiner Haut, mit seinem Gesicht es sah nicht echt au. Fast wie aus Papier. Sie versuchte, ihn wegzustoßen, doch es war, als boxe man in einen Luftsack. Eine Faust flog ihr entgegen, doch im Gegensatz zu seinem Körper war die Faust kompakt und kräftig, und er riss ihr den Kopf zurück. Sie strauchelte, und er wollte sie packen, doch dann war Skulduggery zur Stelle und schleuderte ihn weg.",
"source": "Skulduggery Pleasant – Der Gentleman mit der Feuerhand",
"length": 546,
"id": 291
},
{
- "text": "Das Leben ist ein Kreislauf Skulduggery, nicht wahr? Es wiederholt sich alles, das ist unser Schicksal. Du – von meiner Gnade abhängig. Ich – gnadenlos.",
+ "text": "Das Leben ist ein Kreislauf Skulduggery, nicht wahr? Es wiederholt sich alles, das ist unser Schicksal. Du - von meiner Gnade abhängig. Ich - gnadenlos.",
"source": "Skulduggery Pleasant – Der Gentleman mit der Feuerhand",
"length": 152,
"id": 292
@@ -1844,7 +1844,7 @@
"id": 307
},
{
- "text": "Ich mag sie. Durch sie probierst du neue Sachen aus, das tut dir gut. Ich mein’s ernst – du wirst als hättest du weniger Angst, wenn du bei ihr bist. Das ist schön und es macht mich auch irgendwie traurig.",
+ "text": "Ich mag sie. Durch sie probierst du neue Sachen aus, das tut dir gut. Ich mein’s ernst - du wirst als hättest du weniger Angst, wenn du bei ihr bist. Das ist schön und es macht mich auch irgendwie traurig.",
"source": "Tote Mädchen lügen nicht",
"length": 205,
"id": 308
@@ -1868,13 +1868,13 @@
"id": 311
},
{
- "text": "Millionen sterben an Krankheiten, die wir heilen können. Millionen leben in Armut, obwohl es genug für alle gibt. Wir zerstören unsere Biosphäre, obwohl wir wissen, dass sie unsere einzige Heimat ist. Wir bedrohen uns gegenseitig mit Atomwaffen, auch wenn wir wissen, wohin das führen kann. Wir lieben Lebendiges, lassen aber massenhaftes Artensterben zu. Und dann der Ganze Rest – Genozid, Folter, Versklavung, häusliche Gewalt bis hin zum Mord, Kindesmissbrauch, Schießereien an Schulen, Vergewaltigung, tagtäglich eine schier endlose Zahl skandalöser Gräueltaten. Wir leben mit all diesen Grausamkeiten und sind nicht mal erstaunt, wenn wir trotzdem unser Glück, sogar Liebe finden. Künstliche Intelligenzen sind da weniger gut geschützt.",
+ "text": "Millionen sterben an Krankheiten, die wir heilen können. Millionen leben in Armut, obwohl es genug für alle gibt. Wir zerstören unsere Biosphäre, obwohl wir wissen, dass sie unsere einzige Heimat ist. Wir bedrohen uns gegenseitig mit Atomwaffen, auch wenn wir wissen, wohin das führen kann. Wir lieben Lebendiges, lassen aber massenhaftes Artensterben zu. Und dann der Ganze Rest - Genozid, Folter, Versklavung, häusliche Gewalt bis hin zum Mord, Kindesmissbrauch, Schießereien an Schulen, Vergewaltigung, tagtäglich eine schier endlose Zahl skandalöser Gräueltaten. Wir leben mit all diesen Grausamkeiten und sind nicht mal erstaunt, wenn wir trotzdem unser Glück, sogar Liebe finden. Künstliche Intelligenzen sind da weniger gut geschützt.",
"source": "Maschinen wie ich",
"length": 741,
"id": 312
},
{
- "text": "Werkseinstellungen – ein modernes Synonym für Schicksal.",
+ "text": "Werkseinstellungen - ein modernes Synonym für Schicksal.",
"source": "Maschinen wie ich",
"length": 56,
"id": 313
@@ -1910,7 +1910,7 @@
"id": 318
},
{
- "text": "Vielleicht bin ich tot. Vielleicht wird da nie noch was sein. Die Lebenden in ihrer Welt weitermachen – sich berühren, gehen. Und ich werde in dieser leeren Welt bleiben und lautlos gegen die Glasscheiben zwischen uns pochen.",
+ "text": "Vielleicht bin ich tot. Vielleicht wird da nie noch was sein. Die Lebenden in ihrer Welt weitermachen - sich berühren, gehen. Und ich werde in dieser leeren Welt bleiben und lautlos gegen die Glasscheiben zwischen uns pochen.",
"source": "Bevor ich sterbe",
"length": 225,
"id": 319
@@ -1946,7 +1946,7 @@
"id": 324
},
{
- "text": "Ich möchte, dass ihr alle wisst, dass wir die erste Verteidigungslinie sind. Genau genommen sind wir die einzige Verteidigungslinie. Falls wir scheitern, wird es für die anderen – wer immer das sein wird – nicht mehr allzu viel zu tun geben. Was ich damit sagen will, ist, dass Versagen an dieser Stelle keine wirklich clevere Alternative ist. Wir dürfen nicht versagen. Hat das jeder verstanden? Versagen ist negativ, und wir tun uns auch auf lange Sicht keinen Gefallen damit, und ich glaube, ich habe jetzt den Faden verloren und weiß nicht mehr, was ich eigentlich sagen wollte. Aber ich weiß, womit ich angefangen habe, und das müsst ihr euch merken. Hat jemand meinen Hut gesehen?",
+ "text": "Ich möchte, dass ihr alle wisst, dass wir die erste Verteidigungslinie sind. Genau genommen sind wir die einzige Verteidigungslinie. Falls wir scheitern, wird es für die anderen - wer immer das sein wird - nicht mehr allzu viel zu tun geben. Was ich damit sagen will, ist, dass Versagen an dieser Stelle keine wirklich clevere Alternative ist. Wir dürfen nicht versagen. Hat das jeder verstanden? Versagen ist negativ, und wir tun uns auch auf lange Sicht keinen Gefallen damit, und ich glaube, ich habe jetzt den Faden verloren und weiß nicht mehr, was ich eigentlich sagen wollte. Aber ich weiß, womit ich angefangen habe, und das müsst ihr euch merken. Hat jemand meinen Hut gesehen?",
"source": "Skulduggery Pleasant – Das Groteskerium kehrt zurück",
"length": 686,
"id": 325