Autoload fonts

This commit is contained in:
Heerko 2021-07-15 23:53:20 +02:00
parent f0e732f6e1
commit fc292b1c7e
3 changed files with 96 additions and 34 deletions

View file

@ -1,8 +1,16 @@
<template>
<div class="rule" :class="classes" :style="rule.rules">
<pre v-if="rule.is_codeblock">
{{ contentFiltered }}
<div class="rule" :class="classes" :style="rules">
<pre v-if="rule.type === 'raw'"
>{{ contentFiltered }}
</pre>
<template v-else-if="rule.type === 'font'">
<pre>
@font-face {
font-family: "{{ font.family }}";
src: "{{ font.src }}" format({{ "font.format" }});
}
</pre>
</template>
<template v-else>
<p :title="toEmojiCode(rule.className)">{{ rule.className }} {</p>
<p v-for="dec in rule.rules" :key="dec">&nbsp; {{ dec }}</p>
@ -20,10 +28,8 @@ export default {
props: ["rule"],
computed: {
contentFiltered() {
var reg = this.emoji_regex;
let reg = this.emoji_regex;
let c = this.rule.content.replace(reg, (c) => {
console.log("c", c, this.toEmojiCode(c));
return c + ", .u" + this.toEmojiCode(c);
});
@ -31,11 +37,18 @@ export default {
},
classes() {
let style = "";
if (this.rule.is_codeblock) {
if (this.rule.type == "raw") {
style += " raw";
}
return style;
},
font() {
return this.rule.content;
},
rules() {
if (this.rule.type !== "font") return this.rule.rules;
else return ["font-family: " + this.font.family + ";"];
},
},
};
</script>
@ -59,6 +72,7 @@ export default {
}
.rule.raw:after {
all: revert;
content: "raw css";
background-color: #333;
border-radius: 10px;
@ -66,7 +80,9 @@ export default {
bottom: -0.5em;
left: 50%;
transform: translateX(-50%);
padding: 3px;
padding: 0 10px;
border: 1px solid white;
font-family: initial;
font-size: 1rem;
}
</style>

View file

@ -17,24 +17,31 @@ export default {
generateStyleRules() {
let styles = "";
this.rules.map((r) => {
if (r.is_codeblock) {
styles += r.content;
} else {
if (r.className.startsWith("@")) {
styles += r.className;
} else {
styles += `.${r.parentClassName} ${r.className}`;
if (this.containsEmoji(r.className)) {
styles += `, .${r.parentClassName} .u${this.toEmojiCode(
r.className
)}`;
}
}
styles += "{";
r.rules.map((s) => {
styles += s;
});
styles += "}";
switch (r.type) {
case "raw":
console.log("raw", r.content);
styles += r.content.replaceAll("\n", " ");
break;
case "font":
// styles += `@font-face { font-family: "${r.content.family}"; src: "${r.content.src}" format("${r.content.format}"); }`;
styles += `@font-face { font-family: "${r.content.family}"; src: url("${r.content.src}") format("${r.content.format}"); }`;
break;
default:
if (r.className.startsWith("@")) {
styles += r.className;
} else {
styles += `.${r.parentClassName} ${r.className}`;
if (this.containsEmoji(r.className)) {
styles += `, .${r.parentClassName} .u${this.toEmojiCode(
r.className
)}`;
}
}
styles += "{";
r.rules.map((s) => {
styles += s;
});
styles += "}";
}
});
return styles;
@ -51,7 +58,6 @@ export default {
},
watch: {
rules() {
console.log("rules!");
const newStyle = this.createStyleElement();
document.head.replaceChild(newStyle, this.el);
this.el = newStyle;

View file

@ -10,32 +10,72 @@ var EmojiConvertor = require('emoji-js');
var emojiConv = new EmojiConvertor();
let toCSS = (message, currentStream) => {
let content = stripHtml(message.content).result;
let className = "",
emoji_code = "",
rules = [],
parentClassName = currentStream,
id = message.id,
is_codeblock = message.content.includes("<code>") || message.content.startsWith("```");
is_codeblock = message.content.includes("<code>") || message.content.startsWith("```"),
is_font = /<p><a href=".+?\.(ttf|otf|woff)/gm.test(message.content);
// let regex = /[/s]?(?<selector>.+)\s*\n?{\n?(?<prop>[\s\w.~:>-]+\s*:\s*.+;?\n?)*\n?}/gm
let regex = /\s?(?<selector>.+)\s*\n?{\n?(?<props>(.*;\n?)+)}/gm
let content = stripHtml(message.content).result;
let type = is_codeblock ? "raw" : is_font ? "font" : "rule"; // okay okay okay, i know this is ugly :)
let regex = /\s?(?<selector>.+)\s*\n?{\n?(?<props>(.*;\n?)+)}/gm
let results = content.matchAll(regex);
results = Array.from(results);
if (results.length > 0) {
if (is_font) { // font
let re_path = /\/user_uploads(\/.*?\.(?:ttf|otf|woff))/gm;
// content = message.content.matchAll(re_path);
content = re_path.exec(message.content)[1];
// console.log(message.content, content)
return { className: '', emoji_code: '', rules: [], parentClassName: '', id: id, content: font(content), type: type }
} else if (results.length > 0) { // rule and raw
className = emojiConv.replace_colons(results[0]['groups']['selector']);
if (emoji.methods.containsEmoji(className)) {
emoji_code = emoji.methods.toEmojiCode(className);
}
rules = results[0]['groups']['props'].split("\n");
rules = rules.filter((rule) => validateRule(rule))
return { className, emoji_code, rules, parentClassName, id, content, is_codeblock };
return { className, emoji_code, rules, parentClassName, id, content, type };
}
return null;
}
let font = (content) => {
let font = {
family: "",
src: "",
format: "",
};
let path = content;
let filename = getFilename(path);
let ext = filename.split(".").pop();
font.src =
"https://chatty-pub-files.hackersanddesigners.nl/files" + path;
font.format = getFormat(ext);
font.family = filename.replace(".", "_");
return font;
}
let getFilename = (str) => {
return str.split("\\").pop().split("/").pop();
}
let getFormat = (ext) => {
let fmt = "truetype";
switch (ext) {
case 'woff':
fmt = "woff";
break;
case 'eof':
fmt = "embedded-opentype";
break;
}
return fmt;
}
let validateRule = (rule) => {
return rule.match(/.+:.+;/gm);
}