Compare commits

...

5 Commits

Author SHA1 Message Date
naskya de497a22d8
v20240225 2024-02-25 21:05:50 +09:00
sup39 ca67ca7bbe
feat: use syntax highlight assets on server
Co-authored-by: naskya <m@naskya.net>
2024-02-25 20:50:33 +09:00
naskya 61b09eaf9a
chore: don't use CDN if useEmojiCdn is disabled 2024-02-25 20:49:10 +09:00
sup39 6eab8fde16
feat: auto load MkCode syntax highlight 2024-02-25 20:44:10 +09:00
naskya f468fe988d
fix (backend): check url properly
Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2024-02-25 20:37:41 +09:00
17 changed files with 63 additions and 31 deletions

View File

@ -2,6 +2,11 @@
Critical security updates are indicated by the :warning: icon.
## v20240225
- Fix bugs
- Add syntax highlighting in MFM code blocks in various programming languages
## v20240222
- Enhance Mastodon post import feature (!10652)

View File

@ -1,4 +1,4 @@
# Unreleased
# v20240225
## For Docker/Podman users

View File

@ -2215,9 +2215,6 @@ renotes: Impulsos
moreUrls: Pàgines fixades
moreUrlsDescription: "Introdueix les pàgines que vols fixar al menú d'ajuda a la part
inferior esquerra fent servir aquesta notació:\n\"Nom a mostrar\": https://example.com/"
useEmojiCdn: Aconsegueix Twemoji des d'un CDN
useEmojiCdnDescription: Fes servir Twemoji des del CDN de JSDeliver en lloc de fer
servir el del propi servidor.
suggested: Suggerit
noLanguage: Cap idioma definit
showPreviewByDefault: Per defecte mostrar la previsualització al formulari per publicar

View File

@ -2234,8 +2234,5 @@ moreUrls: Angeheftete Seiten
iconSet: Icon Satz
renotes: Boosts
quotes: Zitate
useEmojiCdn: Hole Twemoji von einem CDN
useEmojiCdnDescription: Benutze Twemoji von einem JSDelivr CDN anstelle der servereigenen
Assets.
moreUrlsDescription: "Die Seiten, welche angepinnt werde sollen, im Hilfe-Menü in
der unteren linken Ecke in folgender Notation angeben:\n\"Anzeigename\": https://example.com/"

View File

@ -1157,10 +1157,10 @@ detectPostLanguage: "Automatically detect the language and show a translate butt
vibrate: "Play vibrations"
openServerInfo: "Show server information by clicking the server ticker on a post"
iconSet: "Icon set"
useCdn: "Get assets from CDN"
useCdnDescription: "Load some static assets like Twemoji from the JSDelivr CDN instead of this Firefish server."
suggested: "Suggested"
noLanguage: "No language"
useEmojiCdn: "Get Twemoji from CDN"
useEmojiCdnDescription: "Use Twemoji from the JSDelivr CDN instead of the server's assets."
showPreviewByDefault: "Show preview in posting form by default"
preventMisclick: "Accidental click prevention"
hideFollowButtons: "Hide follow buttons in a misclickable position"

View File

@ -2197,9 +2197,6 @@ _iconSets:
replies: Respuestas
renotes: Impulsos
iconSet: Conjunto de iconos
useEmojiCdn: Obtenga Twemoji desde un CDN
useEmojiCdnDescription: Utilice Twemoji desde JSDelivr CDN en lugar de los assetos
proporcionados del servidor.
moreUrlsDescription: 'Ingrese los enlaces de las páginas que desea Fijar en el menú
de ayuda, ubicado en la esquina inferior izquierda, usando este formato de notación:
["Nombre para mostrar": https://su-enlace.com/]'

View File

@ -2240,8 +2240,6 @@ renotes: Boosts
moreUrls: Pages épinglées
squareCatAvatars: Afficher les avatars carrés pour les comptes avec oreilles de chat
suggested: Suggéré
useEmojiCdnDescription: Utiliser Twemoji depuis le CDN JSDelivr au lieu des actifs
de ce serveur.
replaceChatButtonWithAccountButton: Remplacer le bouton de discussion par le bouton
de changement de compte
showBigPostButton: Afficher un gros bouton de publication sur le formulaire de publication
@ -2250,7 +2248,6 @@ moreUrlsDescription: "Saisir les pages que vous voulez épingler au menu d'aide
attachedToNotes: Publications avec ce fichier
showAttachedNotes: Afficher les publications avec ce fichier
noLanguage: Aucune langue
useEmojiCdn: Obtenir Twemoji depuis un CDN
showPreviewByDefault: Afficher l'aperçu dans le formulaire de publication par défaut
preventMisclick: Protection contre les clics accidentels
hideFollowButtons: Masquer les boutons d'abonnement dans une position où nous ne pouvons

View File

@ -2196,8 +2196,6 @@ attachedToNotes: Posting dengan berkas ini
moreUrls: Halaman tersemat
moreUrlsDescription: "Masukkan halaman yang ingin kamu sematkan ke menu bantuan di
pojok kiri bawah dengan notasi ini:\n\"Nama tampilan\": https://contoh.com/"
useEmojiCdn: Dapatkan Twemoji dari CDN
useEmojiCdnDescription: Gunakan Twemoji dari JSDelv CDN bukan dari aset server.
squareCatAvatars: Tampilkan avatar kotak untuk akun kucing
emojiModPerm: Perizinan pengelolaan emoji kustom
emojiModPermDescription: "Tambah: Perbolehkan pengguna ini untuk menambahkan emoji

View File

@ -2185,8 +2185,6 @@ attachedToNotes: Post con questo allegato
moreUrls: Pagine del menu di aiuto
moreUrlsDescription: "Inserisci con questo formato le pagine che vuoi aggiungere al
menu di aiuto nell'angolo in basso a sinistra:\n\"Nome link\": https://example.com/"
useEmojiCdn: Scarica Twemoji da CDN
useEmojiCdnDescription: Usa Twemoji dalla CDN di JSDelivr invece che dal server locale.
noLanguage: Nessuna lingua
showPreviewByDefault: Mostra sempre l'anteprima del messaggio
replaceWidgetsButtonWithReloadButton: Sostituisci il bottone dei widget con quello

View File

@ -995,8 +995,8 @@ addRe: "閲覧注意の投稿への返信で、注釈の先頭に\"re:\"を追
languageForTranslation: "投稿翻訳に使用する言語"
detectPostLanguage: "投稿の言語を自動検出し、外国語の投稿に翻訳ボタンを表示する"
iconSet: "アイコンのスタイル"
useEmojiCdn: "CDNのTwemojiを利用する"
useEmojiCdnDescription: "サーバー上に保存されているTwemojiのアセットの代わりに、JSDelivr CDNから配信されたものを用います。"
useCdn: "CDNのアセットを利用する"
useCdnDescription: "このFirefishサーバーからではなくJSDelivr CDNからTwiemojiなどのアセットを読み込みます。"
_sensitiveMediaDetection:
description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てられます。サーバーの負荷が少し増えます。"

View File

@ -2005,8 +2005,6 @@ _iconSets:
light: 細線
showAttachedNotes: 顯示有此附件的貼文
attachedToNotes: 帶有此附件的貼文
useEmojiCdn: 使用CDN的Twemoji
useEmojiCdnDescription: 使用JSDelivr CDN提供的Twemoji而不使用儲存在伺服器上的檔案。
moreUrls: 置頂的頁面
moreUrlsDescription: "請以下列形式輸入欲釘選在左下角幫助選單的頁面,一行一個:\n\"顯示名稱\": https://example.com/"
showPreviewByDefault: "自動開啟發文介面中的預覽顯示"

View File

@ -1,6 +1,6 @@
{
"name": "firefish",
"version": "20240222",
"version": "20240225",
"repository": {
"type": "git",
"url": "https://firefish.dev/firefish/firefish.git"

View File

@ -53,7 +53,9 @@ const bullBoardPath = "/queue";
// Authenticate
app.use(async (ctx, next) => {
if (ctx.path === bullBoardPath || ctx.path.startsWith(`${bullBoardPath}/`)) {
const url = decodeURI(ctx.path);
if (url === bullBoardPath || url.startsWith(`${bullBoardPath}/`)) {
const token = ctx.cookies.get("token");
if (token == null) {
ctx.status = 401;

View File

@ -0,0 +1 @@
../../node_modules/prismjs/components

View File

@ -7,8 +7,8 @@
</template>
<script lang="ts" setup>
import { computed } from "vue";
import Prism from "prismjs";
import { computed, ref } from "vue";
import Prism, { loadLanguage } from "@/scripts/prism";
import "prismjs/themes/prism-okaidia.css";
const props = defineProps<{
@ -17,9 +17,24 @@ const props = defineProps<{
inline?: boolean;
}>();
const prismLang = computed(() =>
Prism.languages[props.lang] ? props.lang : "plaintext",
// fallback to "plaintext" if language not loaded
const prismLang = ref(
props.lang != null && props.lang in Prism.languages
? props.lang
: "plaintext",
);
// try to load language asynchronously
if (props.lang != null && !(props.lang in Prism.languages)) {
const { lang } = props;
loadLanguage(props.lang).then(
// onLoaded
() => (prismLang.value = lang),
// onError
() => {},
);
}
const html = computed(() =>
Prism.highlight(
props.code,

View File

@ -289,9 +289,9 @@
i18n.ts.showBigPostButton
}}</FormSwitch>
<FormSwitch v-model="useEmojiCdn" class="_formBlock"
>{{ i18n.ts.useEmojiCdn
>{{ i18n.ts.useCdn
}}<template #caption>{{
i18n.ts.useEmojiCdnDescription
i18n.ts.useCdnDescription
}}</template></FormSwitch
>
<FormSwitch

View File

@ -0,0 +1,27 @@
import Prism from "prismjs";
import "prismjs/plugins/autoloader/prism-autoloader.js";
import { defaultStore } from "@/store";
Prism.plugins.autoloader.languages_path = defaultStore.state.useEmojiCdn
? "https://cdn.jsdelivr.net/npm/prismjs@1.29.0/components/"
: "/client-assets/prismjs/components/";
const nonExistingLanguagesCache = new Set<string>();
export const loadLanguage = (lang: string) =>
new Promise<void>((resolve, reject) => {
// cached non-existing language
if (nonExistingLanguagesCache.has(lang)) return reject();
// load language with autoloader
Prism.plugins.autoloader.loadLanguages(
lang,
// loaded
() => resolve(),
// failed
() => {
nonExistingLanguagesCache.add(lang);
reject();
},
);
});
export default Prism;