This commit is contained in:
Miodec 2021-08-09 11:06:31 +01:00
commit d1d780c7f0
14 changed files with 417 additions and 116 deletions

View file

@ -162,7 +162,6 @@ export let result = new Chart($("#wpmChart"), {
});
export let accountHistory = new Chart($(".pageAccount #accountHistoryChart"), {
animationSteps: 60,
type: "line",
data: {
datasets: [
@ -254,9 +253,6 @@ export let accountHistory = new Chart($(".pageAccount #accountHistoryChart"), {
},
},
},
animation: {
duration: 250,
},
legend: {
display: false,
labels: {
@ -322,7 +318,6 @@ export let accountHistory = new Chart($(".pageAccount #accountHistoryChart"), {
export let accountActivity = new Chart(
$(".pageAccount #accountActivityChart"),
{
animationSteps: 60,
type: "bar",
data: {
datasets: [
@ -376,9 +371,6 @@ export let accountActivity = new Chart(
},
},
},
animation: {
duration: 250,
},
legend: {
display: false,
labels: {
@ -631,63 +623,96 @@ export let miniResult = new Chart($(".pageAccount #miniResultChart"), {
},
});
export function updateColors(chart) {
if (ThemeColors.main == "") {
ThemeColors.update();
}
chart.data.datasets[0].borderColor = ThemeColors.main;
chart.data.datasets[1].borderColor = ThemeColors.sub;
export async function updateColors(chart) {
let bgcolor = await ThemeColors.get("bg");
let subcolor = await ThemeColors.get("sub");
let maincolor = await ThemeColors.get("main");
chart.data.datasets[0].borderColor = maincolor;
chart.data.datasets[1].borderColor = subcolor;
if (chart.data.datasets[0].type === undefined) {
if (chart.config.type === "line") {
chart.data.datasets[0].pointBackgroundColor = ThemeColors.main;
chart.data.datasets[0].pointBackgroundColor = maincolor;
} else if (chart.config.type === "bar") {
chart.data.datasets[0].backgroundColor = ThemeColors.main;
chart.data.datasets[0].backgroundColor = maincolor;
}
} else if (chart.data.datasets[0].type === "bar") {
chart.data.datasets[0].backgroundColor = ThemeColors.main;
chart.data.datasets[0].backgroundColor = maincolor;
} else if (chart.data.datasets[0].type === "line") {
chart.data.datasets[0].pointBackgroundColor = ThemeColors.main;
chart.data.datasets[0].pointBackgroundColor = maincolor;
}
if (chart.data.datasets[1].type === undefined) {
if (chart.config.type === "line") {
chart.data.datasets[1].pointBackgroundColor = ThemeColors.sub;
chart.data.datasets[1].pointBackgroundColor = subcolor;
} else if (chart.config.type === "bar") {
chart.data.datasets[1].backgroundColor = ThemeColors.sub;
chart.data.datasets[1].backgroundColor = subcolor;
}
} else if (chart.data.datasets[1].type === "bar") {
chart.data.datasets[1].backgroundColor = ThemeColors.sub;
chart.data.datasets[1].backgroundColor = subcolor;
} else if (chart.data.datasets[1].type === "line") {
chart.data.datasets[1].pointBackgroundColor = ThemeColors.sub;
chart.data.datasets[1].pointBackgroundColor = subcolor;
}
try {
chart.options.scales.xAxes[0].ticks.minor.fontColor = ThemeColors.sub;
chart.options.scales.xAxes[0].scaleLabel.fontColor = ThemeColors.sub;
chart.options.scales.xAxes[0].ticks.minor.fontColor = subcolor;
chart.options.scales.xAxes[0].scaleLabel.fontColor = subcolor;
} catch {}
try {
chart.options.scales.yAxes[0].ticks.minor.fontColor = ThemeColors.sub;
chart.options.scales.yAxes[0].scaleLabel.fontColor = ThemeColors.sub;
chart.options.scales.yAxes[0].ticks.minor.fontColor = subcolor;
chart.options.scales.yAxes[0].scaleLabel.fontColor = subcolor;
} catch {}
try {
chart.options.scales.yAxes[1].ticks.minor.fontColor = ThemeColors.sub;
chart.options.scales.yAxes[1].scaleLabel.fontColor = ThemeColors.sub;
chart.options.scales.yAxes[1].ticks.minor.fontColor = subcolor;
chart.options.scales.yAxes[1].scaleLabel.fontColor = subcolor;
} catch {}
try {
chart.options.scales.yAxes[2].ticks.minor.fontColor = ThemeColors.sub;
chart.options.scales.yAxes[2].scaleLabel.fontColor = ThemeColors.sub;
chart.options.scales.yAxes[2].ticks.minor.fontColor = subcolor;
chart.options.scales.yAxes[2].scaleLabel.fontColor = subcolor;
} catch {}
try {
chart.data.datasets[0].trendlineLinear.style = ThemeColors.sub;
chart.data.datasets[1].trendlineLinear.style = ThemeColors.sub;
chart.data.datasets[0].trendlineLinear.style = subcolor;
chart.data.datasets[1].trendlineLinear.style = subcolor;
} catch {}
chart.update();
try {
chart.options.annotation.annotations.forEach((annotation) => {
annotation.borderColor = subcolor;
annotation.label.backgroundColor = subcolor;
annotation.label.fontColor = bgcolor;
});
} catch {}
// ChartController.result.options.annotation.annotations.push({
// enabled: false,
// type: "line",
// mode: "horizontal",
// scaleID: "wpm",
// value: lpb,
// borderColor: themecolors['sub'],
// borderWidth: 1,
// borderDash: [2, 2],
// label: {
// backgroundColor: themecolors['sub'],
// fontFamily: Config.fontFamily.replace(/_/g, " "),
// fontSize: 11,
// fontStyle: "normal",
// fontColor: themecolors['bg'],
// xPadding: 6,
// yPadding: 6,
// cornerRadius: 3,
// position: "center",
// enabled: true,
// content: `PB: ${lpb}`,
// },
// });
chart.update({ duration: 250 });
}
Chart.prototype.updateColors = function () {

View file

@ -2135,6 +2135,10 @@ export let themeCommands = {
};
Misc.getThemesList().then((themes) => {
//sort themes by name
themes = themes.sort((a, b) => {
return a.name < b.name;
});
themes.forEach((theme) => {
themeCommands.list.push({
id: "changeTheme" + Misc.capitalizeFirstLetter(theme.name),

View file

@ -27,3 +27,5 @@ global.crownTest = async () => {
};
global.filterDebug = Account.toggleFilterDebug;
global.stats = TestStats.getStats;

View file

@ -23,3 +23,4 @@ import "./input-controller";
import "./ready";
import "./about-page";
import * as Account from "./account";
import * as TestStats from "./test-stats";

View file

@ -175,7 +175,7 @@ function randomColor() {
/**
* @param {boolean} good Good power or not?
*/
export function addPower(good = true, extra = false) {
export async function addPower(good = true, extra = false) {
if (!TestLogic.active || Config.monkeyPowerLevel === "off") return;
// Shake
@ -208,8 +208,8 @@ export function addPower(good = true, extra = false) {
const color = ["2", "4"].includes(Config.monkeyPowerLevel)
? randomColor()
: good
? ThemeColors.caret
: ThemeColors.error;
? await ThemeColors.get("caret")
: await ThemeColors.get("error");
ctx.particles.push(createParticle(...coords, color));
}

View file

@ -228,29 +228,31 @@ $(".pageSettings #loadCustomColorsFromPreset").click((e) => {
document.documentElement.style.setProperty(e, "");
});
setTimeout(() => {
setTimeout(async () => {
ChartController.updateAllChartColors();
let themecolors = await ThemeColors.get();
ThemeController.colorVars.forEach((colorName) => {
let color;
if (colorName === "--bg-color") {
color = ThemeColors.bg;
color = themecolors.bg;
} else if (colorName === "--main-color") {
color = ThemeColors.main;
color = themecolors.main;
} else if (colorName === "--sub-color") {
color = ThemeColors.sub;
color = themecolors.sub;
} else if (colorName === "--caret-color") {
color = ThemeColors.caret;
color = themecolors.caret;
} else if (colorName === "--text-color") {
color = ThemeColors.text;
color = themecolors.text;
} else if (colorName === "--error-color") {
color = ThemeColors.error;
color = themecolors.error;
} else if (colorName === "--error-extra-color") {
color = ThemeColors.errorExtra;
color = themecolors.errorExtra;
} else if (colorName === "--colorful-error-color") {
color = ThemeColors.colorfulError;
color = themecolors.colorfulError;
} else if (colorName === "--colorful-error-extra-color") {
color = ThemeColors.colorfulErrorExtra;
color = themecolors.colorfulErrorExtra;
}
$(".colorPicker #" + colorName).attr("value", color);
$(".colorPicker #" + colorName).val(color);

View file

@ -61,7 +61,7 @@ export function highlightKey(currentKey) {
}
}
export function flashKey(key, correct) {
export async function flashKey(key, correct) {
if (key == undefined) return;
switch (key) {
case "\\":
@ -107,20 +107,22 @@ export function flashKey(key, correct) {
key = ".key-split-space";
}
let themecolors = await ThemeColors.get();
try {
if (correct || Config.blindMode) {
$(key)
.stop(true, true)
.css({
color: ThemeColors.bg,
backgroundColor: ThemeColors.main,
borderColor: ThemeColors.main,
color: themecolors.bg,
backgroundColor: themecolors.main,
borderColor: themecolors.main,
})
.animate(
{
color: ThemeColors.sub,
color: themecolors.sub,
backgroundColor: "transparent",
borderColor: ThemeColors.sub,
borderColor: themecolors.sub,
},
500,
"easeOutExpo"
@ -129,15 +131,15 @@ export function flashKey(key, correct) {
$(key)
.stop(true, true)
.css({
color: ThemeColors.bg,
backgroundColor: ThemeColors.error,
borderColor: ThemeColors.error,
color: themecolors.bg,
backgroundColor: themecolors.error,
borderColor: themecolors.error,
})
.animate(
{
color: ThemeColors.sub,
color: themecolors.sub,
backgroundColor: "transparent",
borderColor: ThemeColors.sub,
borderColor: themecolors.sub,
},
500,
"easeOutExpo"

View file

@ -948,7 +948,7 @@ export function restart(
TestTimer.clear();
if ($("#commandLineWrapper").hasClass("hidden"))
TestUI.focusWords();
ChartController.result.update();
// ChartController.result.update();
TestUI.updateModesNotice();
UI.setPageTransition(false);
// console.log(TestStats.incompleteSeconds);
@ -1091,7 +1091,7 @@ export async function addWord() {
TestUI.addWord(randomWord);
}
export function finish(difficultyFailed = false) {
export async function finish(difficultyFailed = false) {
if (!active) return;
if (Config.mode == "zen" && input.current.length != 0) {
input.pushHistory();
@ -1556,7 +1556,7 @@ export function finish(difficultyFailed = false) {
Config.punctuation,
Config.language,
Config.difficulty
).then((highestwpm) => {
).then(async (highestwpm) => {
PbCrown.hide();
$("#result .stats .wpm .crown").attr("aria-label", "");
if (lpb < stats.wpm && stats.wpm < highestwpm) {
@ -1581,6 +1581,7 @@ export function finish(difficultyFailed = false) {
);
}
}
let themecolors = await ThemeColors.get();
if (lpb > 0) {
ChartController.result.options.annotation.annotations.push({
enabled: false,
@ -1588,15 +1589,15 @@ export function finish(difficultyFailed = false) {
mode: "horizontal",
scaleID: "wpm",
value: lpb,
borderColor: ThemeColors.sub,
borderColor: themecolors["sub"],
borderWidth: 1,
borderDash: [2, 2],
label: {
backgroundColor: ThemeColors.sub,
backgroundColor: themecolors["sub"],
fontFamily: Config.fontFamily.replace(/_/g, " "),
fontSize: 11,
fontStyle: "normal",
fontColor: ThemeColors.bg,
fontColor: themecolors["bg"],
xPadding: 6,
yPadding: 6,
cornerRadius: 3,
@ -1624,6 +1625,7 @@ export function finish(difficultyFailed = false) {
}
$("#result .stats .tags .bottom").text("");
let annotationSide = "left";
let labelAdjust = 15;
activeTags.forEach(async (tag) => {
let tpb = await DB.getLocalTagPB(
tag.id,
@ -1666,27 +1668,30 @@ export function finish(difficultyFailed = false) {
mode: "horizontal",
scaleID: "wpm",
value: tpb,
borderColor: ThemeColors.sub,
borderColor: themecolors["sub"],
borderWidth: 1,
borderDash: [2, 2],
label: {
backgroundColor: ThemeColors.sub,
backgroundColor: themecolors["sub"],
fontFamily: Config.fontFamily.replace(/_/g, " "),
fontSize: 11,
fontStyle: "normal",
fontColor: ThemeColors.bg,
fontColor: themecolors["bg"],
xPadding: 6,
yPadding: 6,
cornerRadius: 3,
position: annotationSide,
xAdjust: labelAdjust,
enabled: true,
content: `${tag.name} PB: ${tpb}`,
},
});
if (annotationSide === "left") {
annotationSide = "right";
labelAdjust = -15;
} else {
annotationSide = "left";
labelAdjust = 15;
}
}
}
@ -1949,7 +1954,7 @@ export function finish(difficultyFailed = false) {
} else {
$("#result .stats .source").addClass("hidden");
}
let fc = await ThemeColors.get("sub");
if (Config.funbox !== "none") {
let content = Config.funbox;
if (Config.funbox === "layoutfluid") {
@ -1969,7 +1974,7 @@ export function finish(difficultyFailed = false) {
fontFamily: Config.fontFamily.replace(/_/g, " "),
fontSize: 11,
fontStyle: "normal",
fontColor: ThemeColors.sub,
fontColor: fc,
xPadding: 6,
yPadding: 6,
cornerRadius: 3,

View file

@ -42,6 +42,24 @@ export let keypressTimings = {
},
};
export function getStats() {
return {
start,
end,
wpmHistory,
rawHistory,
burstHistory,
keypressPerSecond,
currentKeypress,
lastKeypress,
currentBurstStart,
lastSecondNotRound,
missedWords,
accuracy,
keypressTimings,
};
}
export function restart() {
start = 0;
end = 0;

View file

@ -187,7 +187,7 @@ export function colorful(tc) {
}
}
export function screenshot() {
export async function screenshot() {
let revealReplay = false;
function revertScreenshot() {
$("#notificationCenter").removeClass("hidden");
@ -222,7 +222,7 @@ export function screenshot() {
$(".pageTest .loginTip").addClass("hidden");
try {
html2canvas(document.body, {
backgroundColor: ThemeColors.bg,
backgroundColor: await ThemeColors.get("bg"),
height: sourceHeight + 50,
width: sourceWidth + 50,
x: sourceX - 25,

View file

@ -1,27 +1,97 @@
export let bg = "#323437";
export let main = "#e2b714";
export let caret = "#e2b714";
export let sub = "#646669";
export let text = "#d1d0c5";
export let error = "#ca4754";
export let errorExtra = "#7e2a33";
export let colorfulError = "#ca4754";
export let colorfulErrorExtra = "#7e2a33";
// export let bg = "#323437";
// export let main = "#e2b714";
// export let caret = "#e2b714";
// export let sub = "#646669";
// export let text = "#d1d0c5";
// export let error = "#ca4754";
// export let errorExtra = "#7e2a33";
// export let colorfulError = "#ca4754";
// export let colorfulErrorExtra = "#7e2a33";
let colors = {
bg: "#323437",
main: "#e2b714",
caret: "#e2b714",
sub: "#646669",
text: "#d1d0c5",
error: "#ca4754",
errorExtra: "#7e2a33",
colorfulError: "#ca4754",
colorfulErrorExtra: "#7e2a33",
};
export async function get(color) {
let ret;
if (color === undefined) {
ret = colors;
} else {
ret = colors[color];
}
return ret;
// return check();
// async function run() {
// return new Promise(function (resolve, reject) {
// window.setTimeout(() => {
// update();
// if (color === undefined) {
// ret = colors;
// } else {
// ret = colors[color];
// }
// resolve(check());
// }, 250);
// });
// }
// async function check() {
// if (color === undefined) {
// if (ret.bg === "") {
// return await run();
// } else {
// return ret;
// }
// } else {
// if (ret === "") {
// return await run();
// } else {
// return ret;
// }
// }
// }
}
export function reset() {
colors = {
bg: "",
main: "",
caret: "",
sub: "",
text: "",
error: "",
errorExtra: "",
colorfulError: "",
colorfulErrorExtra: "",
};
}
export function update() {
let st = getComputedStyle(document.body);
bg = st.getPropertyValue("--bg-color").replace(" ", "");
main = st.getPropertyValue("--main-color").replace(" ", "");
caret = st.getPropertyValue("--caret-color").replace(" ", "");
sub = st.getPropertyValue("--sub-color").replace(" ", "");
text = st.getPropertyValue("--text-color").replace(" ", "");
error = st.getPropertyValue("--error-color").replace(" ", "");
errorExtra = st.getPropertyValue("--error-extra-color").replace(" ", "");
colorfulError = st
colors.bg = st.getPropertyValue("--bg-color").replace(" ", "");
colors.main = st.getPropertyValue("--main-color").replace(" ", "");
colors.caret = st.getPropertyValue("--caret-color").replace(" ", "");
colors.sub = st.getPropertyValue("--sub-color").replace(" ", "");
colors.text = st.getPropertyValue("--text-color").replace(" ", "");
colors.error = st.getPropertyValue("--error-color").replace(" ", "");
colors.errorExtra = st
.getPropertyValue("--error-extra-color")
.replace(" ", "");
colors.colorfulError = st
.getPropertyValue("--colorful-error-color")
.replace(" ", "");
colorfulErrorExtra = st
colors.colorfulErrorExtra = st
.getPropertyValue("--colorful-error-extra-color")
.replace(" ", "");
}

View file

@ -21,11 +21,11 @@ export const colorVars = [
"--colorful-error-extra-color",
];
function updateFavicon(size, curveSize) {
async function updateFavicon(size, curveSize) {
let maincolor, bgcolor;
bgcolor = ThemeColors.bg;
maincolor = ThemeColors.main;
bgcolor = await ThemeColors.get("bg");
maincolor = await ThemeColors.get("main");
if (bgcolor == maincolor) {
bgcolor = "#111";
@ -62,7 +62,24 @@ function clearCustomTheme() {
});
}
let loadStyle = function (name) {
return new Promise((resolve, reject) => {
let link = document.createElement("link");
link.type = "text/css";
link.rel = "stylesheet";
link.id = "currentTheme";
link.onload = () => {
resolve();
};
link.href = `themes/${name}.css`;
let headScript = document.querySelector("#currentTheme");
headScript.replaceWith(link);
});
};
export function apply(themeName) {
console.log(`Applying theme ${themeName}`);
clearCustomTheme();
let name = "serika_dark";
@ -82,32 +99,37 @@ export function apply(themeName) {
);
}
ThemeColors.reset();
$(".keymap-key").attr("style", "");
$("#currentTheme").attr("href", `themes/${name}.css`);
$(".current-theme .text").text(themeName.replace("_", " "));
// $("#currentTheme").attr("href", `themes/${name}.css`);
loadStyle(name).then(() => {
ThemeColors.update();
$(".current-theme .text").text(themeName.replace("_", " "));
if (themeName === "custom") {
colorVars.forEach((e, index) => {
document.documentElement.style.setProperty(
e,
Config.customThemeColors[index]
);
});
}
if (themeName === "custom") {
colorVars.forEach((e, index) => {
document.documentElement.style.setProperty(
e,
Config.customThemeColors[index]
);
try {
firebase.analytics().logEvent("changedTheme", {
theme: themeName,
});
} catch (e) {
console.log("Analytics unavailable");
}
ThemeColors.get().then((colors) => {
$(".keymap-key").attr("style", "");
console.log("updating chart colors");
ChartController.updateAllChartColors();
updateFavicon(32, 14);
$("#metaThemeColor").attr("content", colors.bg);
});
}
try {
firebase.analytics().logEvent("changedTheme", {
theme: themeName,
});
} catch (e) {
console.log("Analytics unavailable");
}
setTimeout(() => {
$(".keymap-key").attr("style", "");
ChartController.updateAllChartColors();
updateFavicon(32, 14);
$("#metaThemeColor").attr("content", ThemeColors.bg);
}, 500);
});
}
export function preview(themeName) {

View file

@ -258,7 +258,7 @@ $(document).on("click", "#bottom .leftright .right .current-theme", (e) => {
// if (Config.customTheme) {
// toggleCustomTheme();
// }
CommandlineLists.setCurrent([CommandlineLists.themeCommands]);
CommandlineLists.pushCurrent(CommandlineLists.themeCommands);
Commandline.show();
}
});

View file

@ -0,0 +1,150 @@
{
"language": "icelandic",
"groups": [[0, 100],[101, 300],[301, 600],[601, 9999]],
"quotes": [
{
"text": "Það mælti mín móðir að mér skyldi kaupa fley og fagrar árar, fara á brott með víkingum, standa upp í stafni, stýra dýrum knerri, halda svo til hafnar, höggva mann og annan.",
"source": "Egils saga",
"length": 172,
"id": 1
},
{
"text": "Þórólfur gerðist þá svo óður að hann kastaði skildinum á bak sér en tók spjótið tveimur höndum. Hljóp hann þá fram og hjó eða lagði til beggja handa. Stukku menn þá frá tveggja vegna en hann drap marga.",
"source": "Egils saga",
"length": 202,
"id": 2
},
{
"text": "Egill settist þar niður og skaut skildinum fyrir fætur sér. Hann hafði hjálm á höfði og lagði sverðið um kné sér og dró annað skeið til hálfs en þá skellti hann aftur í slíðrin.",
"source": "Egils saga",
"length": 177,
"id": 3
},
{
"text": "Vitfirringurinn segir að búið sé að jarða sig. Á hverjum sunnudegi fer hann upp í kirkjugarð og setur blóm á leiðið.",
"source": "Englar Alheimsins",
"length": 116,
"id": 4
},
{
"text": "Við erum allir vistmenn á Kleppi. Verið svo vinsamlegir að hringja á lögregluna strax. Þetta var ákaflega ánægjuleg máltíð.",
"source": "Englar Alheimsins",
"length": 123,
"id": 5
},
{
"text": "Það var komið sumar þegar ég kvaddi háhýsi einverunnar og þennan jarðneska heim.",
"source": "Englar Alheimsins",
"length": 80,
"id": 6
},
{
"text": "Kleppur er alls ekki ósnotur bygging, ekki svo ólík höll.",
"source": "Englar Alheimsins",
"length": 57,
"id": 7
},
{
"text": "Askurinn er allra trjáa mestur og bestur. Limar hans dreifast yfir heim allan og standa yfir himni.",
"source": "Snorra Edda",
"length": 99,
"id": 8
},
{
"text": "Loki er fríður og fagur sýnum, illur í skaplyndi, mjög fjölbreytinn að háttum.",
"source": "Snorra Edda",
"length": 78,
"id": 9
},
{
"text": "Hrafnar tveir sitja á öxlum honum og segja í eyru honum öll tíðindi þau er þeir sjá eða heyra. Þeir heita svo: Huginn og Muninn.",
"source": "Snorra Edda",
"length": 128,
"id": 10
},
{
"text": "Þegar þú í draumum mínum birtist allt er ljúft og gott. Og ég vildi ég gæti sofið heila öld. Því að nóttin veitir aðeins skamma stund með þér.",
"source": "Stefán og Eyfi - Nína",
"length": 142,
"id": 11
},
{
"text": "Svo þegar þú birtist fer sólin að skína, smáfuglar kvaka við raust. Í brjálæðishrifningu býð ég þér Tópas og berjasaft skilyrðislaust.",
"source": "Stuðmenn - Popplag í G-dúr",
"length": 134,
"id": 12
},
{
"text": "Hvað getum við gert ef aðrir bjóða betur? Dregið okkur saman, skriðið inn í skelina?",
"source": "Ný Dönsk - Hjálpaðu mér upp",
"length": 84,
"id": 13
},
{
"text": "Við ræddum saman heima og geyma. Ég hélt mig hlyti að vera að dreyma en ég var örugglega vakandi.",
"source": "Stuðmenn - Ofboðslega frægur",
"length": 97,
"id": 14
},
{
"text": "Af hverju get ég ekki gengið menntaveginn þangað til að ég æli. Af hverju get ég ekki gert neitt af viti. Af hverju fæddist ég loser.",
"source": "Sólstrandargæjarnir - Rangur Maður",
"length": 155,
"id": 15
},
{
"text": "Glóð er enn í öskunni og flabrauðssneið í töskunni. Lögg er enn í flöskunni. Við komum öskufullir heim.",
"source": "Helgi Björns og reiðmenn vindanna - Ríðum sem fjandinn",
"length": 103,
"id": 16
},
{
"text": "Stál og hnífur er merki mitt, merki farandverkamanna. Þitt var mitt og mitt var þitt meðan ég bjó a meðal manna.",
"source": "Bubbi Morthens - Stál og hnífur",
"length": 112,
"id": 17
},
{
"text": "Svitinn perlar á brjóstum þínum, þú bítur í hnúann. Þú flýgur á brott með syndum mínum, Svartur Afgan.",
"source": "Bubbi Morthens - Afgan",
"length": 102,
"id": 18
},
{
"text": "Það er stutt í það að storknað hraun mun renna á ný. Það er stutt í að jöklar munu breytast í gufuský.",
"source": "Utangarðsmenn - Hiroshima",
"length": 102,
"id": 19
},
{
"text": "Kvöldið er okkar og vor um Vaglaskóg. Við skulum tjalda í grænum berjamó. Leiddu mig vinur í lundinn frá í gær. Lindin þar niðar og birkihríslan grær",
"source": "Vor í Vaglaskógi",
"length": 149,
"id": 20
},
{
"text": "Hlakka svo til að hitta börnin: Maríu Hænu, Hafþór og Örninn. Vinna upp tíma, klippa smá og líma. Í eltingaleik fram að háttatíma",
"source": "Prins Póló - París norðursins",
"length": 129,
"id": 21
},
{
"text": "Sól slær silfri á voga, sjáið jökulinn loga. Allt er bjart fyrir okkur tveim, því ég er kominn heim.",
"source": "Ég er kominn heim",
"length": 100,
"id": 22
},
{
"text": "Fann á ný, betra líf. Af því ég fór loks að trúa því að það væri eitthvað annað, eitthvað meir og miklu stærra en allt sem er.",
"source": "Páll óskar - Betra líf",
"length": 126,
"id": 23
},
{
"text": "Hún fýlar ekki lögin mín, en mér er sama. Eitt er fyrir víst að þessi gella er slæm dama. Hún er alltaf vond við mig, orðið að vana. Myndi gera allt saman, allt fyrir hana.",
"source": "JóiPé og Króli - B.O.B.A.",
"length": 172,
"id": 24
}
]
}