Merge branch 'misskey-dev:develop' into develop
This commit is contained in:
commit
a1bc755fd7
@ -20,6 +20,10 @@
|
|||||||
- Enhance: 依存関係の更新
|
- Enhance: 依存関係の更新
|
||||||
|
|
||||||
### Client
|
### Client
|
||||||
|
- Enhance: MFMでルビを振れるように
|
||||||
|
- 例: `$[ruby 三須木 みすき]`
|
||||||
|
- Enhance: MFMでUNIX時間を指定して日時を表示できるように
|
||||||
|
- 例: `$[unixtime 1701356400]`
|
||||||
- Enhance: プラグインでエラーが発生した場合のハンドリングを強化
|
- Enhance: プラグインでエラーが発生した場合のハンドリングを強化
|
||||||
- Enhance: 細かなUIのブラッシュアップ
|
- Enhance: 細かなUIのブラッシュアップ
|
||||||
- Fix: 効果音が再生されるとデバイスで再生している動画や音声が停止する問題を修正 #12339
|
- Fix: 効果音が再生されるとデバイスで再生している動画や音声が停止する問題を修正 #12339
|
||||||
|
@ -764,7 +764,7 @@ inUse: "utilisé"
|
|||||||
editCode: "Modifier le code"
|
editCode: "Modifier le code"
|
||||||
apply: "Appliquer"
|
apply: "Appliquer"
|
||||||
receiveAnnouncementFromInstance: "Recevoir les messages d'information de l'instance"
|
receiveAnnouncementFromInstance: "Recevoir les messages d'information de l'instance"
|
||||||
emailNotification: "Notifications par mail"
|
emailNotification: "Notifications par courriel"
|
||||||
publish: "Public"
|
publish: "Public"
|
||||||
inChannelSearch: "Chercher dans le canal"
|
inChannelSearch: "Chercher dans le canal"
|
||||||
useReactionPickerForContextMenu: "Clic-droit pour ouvrir le panneau de réactions"
|
useReactionPickerForContextMenu: "Clic-droit pour ouvrir le panneau de réactions"
|
||||||
@ -998,6 +998,7 @@ license: "Licence"
|
|||||||
myClips: "Mes clips"
|
myClips: "Mes clips"
|
||||||
retryAllQueuesConfirmText: "Cela peut augmenter temporairement la charge du serveur."
|
retryAllQueuesConfirmText: "Cela peut augmenter temporairement la charge du serveur."
|
||||||
showClipButtonInNoteFooter: "Ajouter « Clip » au menu d'action de la note"
|
showClipButtonInNoteFooter: "Ajouter « Clip » au menu d'action de la note"
|
||||||
|
reactionsDisplaySize: "Taille de l'affichage des réactions"
|
||||||
noteIdOrUrl: "Identifiant de la note ou URL"
|
noteIdOrUrl: "Identifiant de la note ou URL"
|
||||||
video: "Vidéo"
|
video: "Vidéo"
|
||||||
videos: "Vidéos"
|
videos: "Vidéos"
|
||||||
@ -1053,6 +1054,7 @@ pastAnnouncements: "Annonces passées"
|
|||||||
replies: "Répondre"
|
replies: "Répondre"
|
||||||
renotes: "Renoter"
|
renotes: "Renoter"
|
||||||
loadReplies: "Inclure les réponses"
|
loadReplies: "Inclure les réponses"
|
||||||
|
loadConversation: "Afficher la conversation"
|
||||||
pinnedList: "Liste épinglée"
|
pinnedList: "Liste épinglée"
|
||||||
notifyNotes: "Notifier à propos des nouvelles notes"
|
notifyNotes: "Notifier à propos des nouvelles notes"
|
||||||
authentication: "Authentification"
|
authentication: "Authentification"
|
||||||
@ -1144,7 +1146,7 @@ _initialTutorial:
|
|||||||
direct: "Uniquement visible aux utilisateurs de votre choix. Les récipients seront notifiés. Cette option peut être utilisée comme alternative aux messages directs."
|
direct: "Uniquement visible aux utilisateurs de votre choix. Les récipients seront notifiés. Cette option peut être utilisée comme alternative aux messages directs."
|
||||||
doNotSendConfidencialOnDirect1: "Faites attention quand vous envoyez vos informations sensibles !"
|
doNotSendConfidencialOnDirect1: "Faites attention quand vous envoyez vos informations sensibles !"
|
||||||
doNotSendConfidencialOnDirect2: "Les administrateurs de l'instance destinataire peuvent voir toutes les notes publiées. Soyez prudent·e avec vos informations sensibles quand vous envoyez des notes directes aux utilisateurs dont vous ne vous fiez pas aux instances."
|
doNotSendConfidencialOnDirect2: "Les administrateurs de l'instance destinataire peuvent voir toutes les notes publiées. Soyez prudent·e avec vos informations sensibles quand vous envoyez des notes directes aux utilisateurs dont vous ne vous fiez pas aux instances."
|
||||||
localOnly: "Désactiver la fédération de la note à d'autres instances. Les utilisateurs d'autres instances ne pourront pas voir directement la note quelle que soit l'étendue de la publication mentionnée ci-dessus."
|
localOnly: "Désactiver la fédération de la note aux autres instances. Les utilisateurs des autres instances ne pourront pas voir directement la note quelle que soit l'étendue de la publication mentionnée ci-dessus."
|
||||||
_cw:
|
_cw:
|
||||||
title: "Masquer le contenu (CW)"
|
title: "Masquer le contenu (CW)"
|
||||||
description: "Au lieu du corps du texte, le contenu du champ « commentaires » s'affichera. Appuyez sur « afficher le contenu » pour voir le corps du texte."
|
description: "Au lieu du corps du texte, le contenu du champ « commentaires » s'affichera. Appuyez sur « afficher le contenu » pour voir le corps du texte."
|
||||||
@ -1171,7 +1173,12 @@ _timelineDescription:
|
|||||||
global: "Sur le fil global, vous pouvez voir les notes de toutes les instances connectées."
|
global: "Sur le fil global, vous pouvez voir les notes de toutes les instances connectées."
|
||||||
_serverSettings:
|
_serverSettings:
|
||||||
iconUrl: "URL de l’icône"
|
iconUrl: "URL de l’icône"
|
||||||
|
appIconResolutionMustBe: "La résolution doit être au moins {resolution}."
|
||||||
|
shortName: "Nom court"
|
||||||
|
shortNameDescription: "Si le nom officiel de l'instance est long, cette abréviation peut être affichée à la place."
|
||||||
fanoutTimelineDescription: "Si activée, la performance de la récupération de la chronologie augmentera considérablement et la charge sur la base de données sera réduite. En revanche, l'utilisation de la mémoire de Redis augmentera. Considérez désactiver cette option si le serveur est bas en mémoire ou instable."
|
fanoutTimelineDescription: "Si activée, la performance de la récupération de la chronologie augmentera considérablement et la charge sur la base de données sera réduite. En revanche, l'utilisation de la mémoire de Redis augmentera. Considérez désactiver cette option si le serveur est bas en mémoire ou instable."
|
||||||
|
fanoutTimelineDbFallback: "Recours à la base de données"
|
||||||
|
fanoutTimelineDbFallbackDescription: "Si activée, une demande supplémentaire à la base de données est effectuée comme solution de rechange quand le fil n'est pas mis en cache. Si désactivée, la demande à la base de données n'est pas effectuée, ce qui réduit davantage la charge du serveur mais limite l'étendue du fil récupérable."
|
||||||
_accountMigration:
|
_accountMigration:
|
||||||
moveFrom: "Migrer un autre compte vers le présent compte"
|
moveFrom: "Migrer un autre compte vers le présent compte"
|
||||||
moveFromSub: "Créer un alias vers un autre compte"
|
moveFromSub: "Créer un alias vers un autre compte"
|
||||||
@ -1304,6 +1311,9 @@ _achievements:
|
|||||||
flavor: "Attendez une minute, vous êtes sur le mauvais site web ?"
|
flavor: "Attendez une minute, vous êtes sur le mauvais site web ?"
|
||||||
_brainDiver:
|
_brainDiver:
|
||||||
flavor: "Misskey-Misskey La-Tu-Ma"
|
flavor: "Misskey-Misskey La-Tu-Ma"
|
||||||
|
_smashTestNotificationButton:
|
||||||
|
title: "Débordement de tests"
|
||||||
|
description: "Détruire le bouton de test de notifications dans un intervalle extrêmement court"
|
||||||
_tutorialCompleted:
|
_tutorialCompleted:
|
||||||
title: "Diplôme de la course élémentaire de Misskey"
|
title: "Diplôme de la course élémentaire de Misskey"
|
||||||
description: "Terminer le tutoriel"
|
description: "Terminer le tutoriel"
|
||||||
@ -1332,6 +1342,7 @@ _role:
|
|||||||
canManageCustomEmojis: "Gestion des émojis personnalisés"
|
canManageCustomEmojis: "Gestion des émojis personnalisés"
|
||||||
canManageAvatarDecorations: "Gestion des décorations d'avatar"
|
canManageAvatarDecorations: "Gestion des décorations d'avatar"
|
||||||
wordMuteMax: "Nombre maximal de caractères dans le filtre de mots"
|
wordMuteMax: "Nombre maximal de caractères dans le filtre de mots"
|
||||||
|
canUseTranslator: "Usage de la fonctionnalité de traduction"
|
||||||
_sensitiveMediaDetection:
|
_sensitiveMediaDetection:
|
||||||
description: "L'apprentissage automatique peut être utilisé pour détecter automatiquement les médias sensibles à modérer. La sollicitation des serveurs augmente légèrement."
|
description: "L'apprentissage automatique peut être utilisé pour détecter automatiquement les médias sensibles à modérer. La sollicitation des serveurs augmente légèrement."
|
||||||
sensitivity: "Sensibilité de la détection"
|
sensitivity: "Sensibilité de la détection"
|
||||||
@ -1819,6 +1830,7 @@ _notification:
|
|||||||
unreadAntennaNote: "Antenne {name}"
|
unreadAntennaNote: "Antenne {name}"
|
||||||
emptyPushNotificationMessage: "Les notifications push ont été mises à jour"
|
emptyPushNotificationMessage: "Les notifications push ont été mises à jour"
|
||||||
achievementEarned: "Accomplissement"
|
achievementEarned: "Accomplissement"
|
||||||
|
testNotification: "Tester la notification"
|
||||||
reactedBySomeUsers: "{n} utilisateur·rice·s ont réagi"
|
reactedBySomeUsers: "{n} utilisateur·rice·s ont réagi"
|
||||||
renotedBySomeUsers: "{n} utilisateur·rice·s ont renoté"
|
renotedBySomeUsers: "{n} utilisateur·rice·s ont renoté"
|
||||||
followedBySomeUsers: "{n} utilisateur·rice·s se sont abonné·e·s à vous"
|
followedBySomeUsers: "{n} utilisateur·rice·s se sont abonné·e·s à vous"
|
||||||
|
9
locales/index.d.ts
vendored
9
locales/index.d.ts
vendored
@ -1948,6 +1948,15 @@ export interface Locale {
|
|||||||
"yearsAgo": string;
|
"yearsAgo": string;
|
||||||
"invalid": string;
|
"invalid": string;
|
||||||
};
|
};
|
||||||
|
"_timeIn": {
|
||||||
|
"seconds": string;
|
||||||
|
"minutes": string;
|
||||||
|
"hours": string;
|
||||||
|
"days": string;
|
||||||
|
"weeks": string;
|
||||||
|
"months": string;
|
||||||
|
"years": string;
|
||||||
|
};
|
||||||
"_time": {
|
"_time": {
|
||||||
"second": string;
|
"second": string;
|
||||||
"minute": string;
|
"minute": string;
|
||||||
|
@ -1853,6 +1853,15 @@ _ago:
|
|||||||
yearsAgo: "{n}年前"
|
yearsAgo: "{n}年前"
|
||||||
invalid: "ありません"
|
invalid: "ありません"
|
||||||
|
|
||||||
|
_timeIn:
|
||||||
|
seconds: "{n}秒後"
|
||||||
|
minutes: "{n}分後"
|
||||||
|
hours: "{n}時間後"
|
||||||
|
days: "{n}日後"
|
||||||
|
weeks: "{n}週間後"
|
||||||
|
months: "{n}ヶ月後"
|
||||||
|
years: "{n}年後"
|
||||||
|
|
||||||
_time:
|
_time:
|
||||||
second: "秒"
|
second: "秒"
|
||||||
minute: "分"
|
minute: "分"
|
||||||
|
@ -59,7 +59,7 @@ copyFileId: "Скопировать ID файла"
|
|||||||
copyFolderId: "Скопировать ID папки"
|
copyFolderId: "Скопировать ID папки"
|
||||||
copyProfileUrl: "Скопировать URL профиля "
|
copyProfileUrl: "Скопировать URL профиля "
|
||||||
searchUser: "Поиск людей"
|
searchUser: "Поиск людей"
|
||||||
reply: "Ответить"
|
reply: "Ответ"
|
||||||
loadMore: "Показать еще"
|
loadMore: "Показать еще"
|
||||||
showMore: "Показать еще"
|
showMore: "Показать еще"
|
||||||
showLess: "Закрыть"
|
showLess: "Закрыть"
|
||||||
@ -1069,7 +1069,7 @@ unused: "Неиспользуемый"
|
|||||||
expired: "Срок действия приглашения истёк"
|
expired: "Срок действия приглашения истёк"
|
||||||
doYouAgree: "Согласны?"
|
doYouAgree: "Согласны?"
|
||||||
icon: "Аватар"
|
icon: "Аватар"
|
||||||
replies: "Ответить"
|
replies: "Ответы"
|
||||||
renotes: "Репост"
|
renotes: "Репост"
|
||||||
flip: "Переворот"
|
flip: "Переворот"
|
||||||
_initialAccountSetting:
|
_initialAccountSetting:
|
||||||
@ -1899,7 +1899,7 @@ _notification:
|
|||||||
app: "Уведомления из приложений"
|
app: "Уведомления из приложений"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "отвечает взаимной подпиской"
|
followBack: "отвечает взаимной подпиской"
|
||||||
reply: "Ответить"
|
reply: "Ответ"
|
||||||
renote: "Репост"
|
renote: "Репост"
|
||||||
_deck:
|
_deck:
|
||||||
alwaysShowMainColumn: "Всегда показывать главную колонку"
|
alwaysShowMainColumn: "Всегда показывать главную колонку"
|
||||||
|
@ -1266,6 +1266,8 @@ _serverSettings:
|
|||||||
shortName: "簡稱"
|
shortName: "簡稱"
|
||||||
shortNameDescription: "如果伺服器的正式名稱很長,可用簡稱或通稱代替。"
|
shortNameDescription: "如果伺服器的正式名稱很長,可用簡稱或通稱代替。"
|
||||||
fanoutTimelineDescription: "如果啟用的話,檢索各個時間軸的性能會顯著提昇,資料庫的負荷也會減少。不過,Redis 的記憶體使用量會增加。如果伺服器的記憶體容量比較少或者運行不穩定,可以停用。"
|
fanoutTimelineDescription: "如果啟用的話,檢索各個時間軸的性能會顯著提昇,資料庫的負荷也會減少。不過,Redis 的記憶體使用量會增加。如果伺服器的記憶體容量比較少或者運行不穩定,可以停用。"
|
||||||
|
fanoutTimelineDbFallback: "資料庫的回退"
|
||||||
|
fanoutTimelineDbFallbackDescription: "若啟用,在時間軸沒有快取的情況下將執行回退處理以額外查詢資料庫。若停用,可以透過不執行回退處理來進一步減少伺服器的負荷,但會限制可取得的時間軸範圍。"
|
||||||
_accountMigration:
|
_accountMigration:
|
||||||
moveFrom: "從其他帳戶遷移到這個帳戶"
|
moveFrom: "從其他帳戶遷移到這個帳戶"
|
||||||
moveFromSub: "為另一個帳戶建立別名"
|
moveFromSub: "為另一個帳戶建立別名"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"version": "2023.11.1-beta.1",
|
"version": "2023.11.1-beta.2",
|
||||||
"codename": "nasubi",
|
"codename": "nasubi",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -55,9 +55,9 @@
|
|||||||
"@typescript-eslint/eslint-plugin": "6.11.0",
|
"@typescript-eslint/eslint-plugin": "6.11.0",
|
||||||
"@typescript-eslint/parser": "6.11.0",
|
"@typescript-eslint/parser": "6.11.0",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"cypress": "13.5.0",
|
"cypress": "13.5.1",
|
||||||
"eslint": "8.53.0",
|
"eslint": "8.53.0",
|
||||||
"start-server-and-test": "2.0.2"
|
"start-server-and-test": "2.0.3"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@tensorflow/tfjs-core": "4.4.0"
|
"@tensorflow/tfjs-core": "4.4.0"
|
||||||
|
@ -64,7 +64,7 @@
|
|||||||
"@bull-board/ui": "5.9.1",
|
"@bull-board/ui": "5.9.1",
|
||||||
"@discordapp/twemoji": "14.1.2",
|
"@discordapp/twemoji": "14.1.2",
|
||||||
"@fastify/accepts": "4.2.0",
|
"@fastify/accepts": "4.2.0",
|
||||||
"@fastify/cookie": "9.1.0",
|
"@fastify/cookie": "9.2.0",
|
||||||
"@fastify/cors": "8.4.1",
|
"@fastify/cors": "8.4.1",
|
||||||
"@fastify/express": "2.3.0",
|
"@fastify/express": "2.3.0",
|
||||||
"@fastify/http-proxy": "9.3.0",
|
"@fastify/http-proxy": "9.3.0",
|
||||||
@ -78,7 +78,7 @@
|
|||||||
"@simplewebauthn/server": "8.3.5",
|
"@simplewebauthn/server": "8.3.5",
|
||||||
"@sinonjs/fake-timers": "11.2.2",
|
"@sinonjs/fake-timers": "11.2.2",
|
||||||
"@smithy/node-http-handler": "2.1.5",
|
"@smithy/node-http-handler": "2.1.5",
|
||||||
"@swc/cli": "0.1.62",
|
"@swc/cli": "0.1.63",
|
||||||
"@swc/core": "1.3.96",
|
"@swc/core": "1.3.96",
|
||||||
"accepts": "1.3.8",
|
"accepts": "1.3.8",
|
||||||
"ajv": "8.12.0",
|
"ajv": "8.12.0",
|
||||||
@ -87,7 +87,7 @@
|
|||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"blurhash": "2.0.5",
|
"blurhash": "2.0.5",
|
||||||
"body-parser": "1.20.2",
|
"body-parser": "1.20.2",
|
||||||
"bullmq": "4.13.2",
|
"bullmq": "4.13.3",
|
||||||
"cacheable-lookup": "7.0.0",
|
"cacheable-lookup": "7.0.0",
|
||||||
"cbor": "9.0.1",
|
"cbor": "9.0.1",
|
||||||
"chalk": "5.3.0",
|
"chalk": "5.3.0",
|
||||||
@ -99,7 +99,7 @@
|
|||||||
"date-fns": "2.30.0",
|
"date-fns": "2.30.0",
|
||||||
"deep-email-validator": "0.1.21",
|
"deep-email-validator": "0.1.21",
|
||||||
"fastify": "4.24.3",
|
"fastify": "4.24.3",
|
||||||
"fastify-raw-body": "^4.2.2",
|
"fastify-raw-body": "4.3.0",
|
||||||
"feed": "4.2.2",
|
"feed": "4.2.2",
|
||||||
"file-type": "18.7.0",
|
"file-type": "18.7.0",
|
||||||
"fluent-ffmpeg": "2.1.2",
|
"fluent-ffmpeg": "2.1.2",
|
||||||
@ -132,7 +132,7 @@
|
|||||||
"oauth2orize": "1.12.0",
|
"oauth2orize": "1.12.0",
|
||||||
"oauth2orize-pkce": "0.1.2",
|
"oauth2orize-pkce": "0.1.2",
|
||||||
"os-utils": "0.0.14",
|
"os-utils": "0.0.14",
|
||||||
"otpauth": "9.1.5",
|
"otpauth": "9.2.0",
|
||||||
"parse5": "7.1.2",
|
"parse5": "7.1.2",
|
||||||
"pg": "8.11.3",
|
"pg": "8.11.3",
|
||||||
"pkce-challenge": "4.0.1",
|
"pkce-challenge": "4.0.1",
|
||||||
@ -144,14 +144,14 @@
|
|||||||
"qrcode": "1.5.3",
|
"qrcode": "1.5.3",
|
||||||
"random-seed": "0.3.0",
|
"random-seed": "0.3.0",
|
||||||
"ratelimiter": "3.4.1",
|
"ratelimiter": "3.4.1",
|
||||||
"re2": "1.20.5",
|
"re2": "1.20.8",
|
||||||
"redis-lock": "0.1.4",
|
"redis-lock": "0.1.4",
|
||||||
"reflect-metadata": "0.1.13",
|
"reflect-metadata": "0.1.13",
|
||||||
"rename": "1.0.4",
|
"rename": "1.0.4",
|
||||||
"rss-parser": "3.13.0",
|
"rss-parser": "3.13.0",
|
||||||
"rxjs": "7.8.1",
|
"rxjs": "7.8.1",
|
||||||
"sanitize-html": "2.11.0",
|
"sanitize-html": "2.11.0",
|
||||||
"secure-json-parse": "^2.4.0",
|
"secure-json-parse": "2.7.0",
|
||||||
"sharp": "0.32.6",
|
"sharp": "0.32.6",
|
||||||
"sharp-read-bmp": "github:misskey-dev/sharp-read-bmp",
|
"sharp-read-bmp": "github:misskey-dev/sharp-read-bmp",
|
||||||
"slacc": "0.0.10",
|
"slacc": "0.0.10",
|
||||||
@ -192,7 +192,7 @@
|
|||||||
"@types/jsrsasign": "10.5.12",
|
"@types/jsrsasign": "10.5.12",
|
||||||
"@types/mime-types": "2.1.4",
|
"@types/mime-types": "2.1.4",
|
||||||
"@types/ms": "0.7.34",
|
"@types/ms": "0.7.34",
|
||||||
"@types/node": "20.9.0",
|
"@types/node": "20.9.1",
|
||||||
"@types/node-fetch": "3.0.3",
|
"@types/node-fetch": "3.0.3",
|
||||||
"@types/nodemailer": "6.4.14",
|
"@types/nodemailer": "6.4.14",
|
||||||
"@types/oauth": "0.9.4",
|
"@types/oauth": "0.9.4",
|
||||||
|
@ -276,9 +276,18 @@ export class MfmService {
|
|||||||
},
|
},
|
||||||
|
|
||||||
fn: (node) => {
|
fn: (node) => {
|
||||||
const el = doc.createElement('i');
|
if (node.props.name === 'unixtime') {
|
||||||
appendChildren(node.children, el);
|
const text = node.children[0]!.type === 'text' ? node.children[0].props.text : '';
|
||||||
return el;
|
const date = new Date(parseInt(text, 10) * 1000);
|
||||||
|
const el = doc.createElement('time');
|
||||||
|
el.setAttribute('datetime', date.toISOString());
|
||||||
|
el.textContent = date.toISOString();
|
||||||
|
return el;
|
||||||
|
} else {
|
||||||
|
const el = doc.createElement('i');
|
||||||
|
appendChildren(node.children, el);
|
||||||
|
return el;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
blockCode: (node) => {
|
blockCode: (node) => {
|
||||||
|
@ -24,8 +24,8 @@
|
|||||||
"@rollup/pluginutils": "5.0.5",
|
"@rollup/pluginutils": "5.0.5",
|
||||||
"@syuilo/aiscript": "0.16.0",
|
"@syuilo/aiscript": "0.16.0",
|
||||||
"@tabler/icons-webfont": "2.37.0",
|
"@tabler/icons-webfont": "2.37.0",
|
||||||
"@vitejs/plugin-vue": "4.4.1",
|
"@vitejs/plugin-vue": "4.5.0",
|
||||||
"@vue-macros/reactivity-transform": "0.3.23",
|
"@vue-macros/reactivity-transform": "0.4.0",
|
||||||
"@vue/compiler-sfc": "3.3.8",
|
"@vue/compiler-sfc": "3.3.8",
|
||||||
"astring": "1.8.6",
|
"astring": "1.8.6",
|
||||||
"autosize": "6.0.1",
|
"autosize": "6.0.1",
|
||||||
@ -57,7 +57,7 @@
|
|||||||
"photoswipe": "5.4.2",
|
"photoswipe": "5.4.2",
|
||||||
"punycode": "2.3.1",
|
"punycode": "2.3.1",
|
||||||
"querystring": "0.2.1",
|
"querystring": "0.2.1",
|
||||||
"rollup": "4.4.0",
|
"rollup": "4.4.1",
|
||||||
"sanitize-html": "2.11.0",
|
"sanitize-html": "2.11.0",
|
||||||
"shiki": "^0.14.5",
|
"shiki": "^0.14.5",
|
||||||
"sass": "1.69.5",
|
"sass": "1.69.5",
|
||||||
@ -101,7 +101,7 @@
|
|||||||
"@types/estree": "1.0.5",
|
"@types/estree": "1.0.5",
|
||||||
"@types/matter-js": "0.19.4",
|
"@types/matter-js": "0.19.4",
|
||||||
"@types/micromatch": "4.0.5",
|
"@types/micromatch": "4.0.5",
|
||||||
"@types/node": "20.9.0",
|
"@types/node": "20.9.1",
|
||||||
"@types/punycode": "2.1.2",
|
"@types/punycode": "2.1.2",
|
||||||
"@types/sanitize-html": "2.9.4",
|
"@types/sanitize-html": "2.9.4",
|
||||||
"@types/throttle-debounce": "5.0.2",
|
"@types/throttle-debounce": "5.0.2",
|
||||||
@ -115,7 +115,7 @@
|
|||||||
"@vue/runtime-core": "3.3.8",
|
"@vue/runtime-core": "3.3.8",
|
||||||
"acorn": "8.11.2",
|
"acorn": "8.11.2",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"cypress": "13.5.0",
|
"cypress": "13.5.1",
|
||||||
"eslint": "8.53.0",
|
"eslint": "8.53.0",
|
||||||
"eslint-plugin-import": "2.29.0",
|
"eslint-plugin-import": "2.29.0",
|
||||||
"eslint-plugin-vue": "9.18.1",
|
"eslint-plugin-vue": "9.18.1",
|
||||||
@ -128,7 +128,7 @@
|
|||||||
"prettier": "3.1.0",
|
"prettier": "3.1.0",
|
||||||
"react": "18.2.0",
|
"react": "18.2.0",
|
||||||
"react-dom": "18.2.0",
|
"react-dom": "18.2.0",
|
||||||
"start-server-and-test": "2.0.2",
|
"start-server-and-test": "2.0.3",
|
||||||
"storybook": "7.5.3",
|
"storybook": "7.5.3",
|
||||||
"storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme",
|
"storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme",
|
||||||
"summaly": "github:misskey-dev/summaly",
|
"summaly": "github:misskey-dev/summaly",
|
||||||
|
@ -45,12 +45,12 @@ import contains from '@/scripts/contains.js';
|
|||||||
import { char2twemojiFilePath, char2fluentEmojiFilePath } from '@/scripts/emoji-base.js';
|
import { char2twemojiFilePath, char2fluentEmojiFilePath } from '@/scripts/emoji-base.js';
|
||||||
import { acct } from '@/filters/user.js';
|
import { acct } from '@/filters/user.js';
|
||||||
import * as os from '@/os.js';
|
import * as os from '@/os.js';
|
||||||
import { MFM_TAGS } from '@/scripts/mfm-tags.js';
|
|
||||||
import { defaultStore } from '@/store.js';
|
import { defaultStore } from '@/store.js';
|
||||||
import { emojilist, getEmojiName } from '@/scripts/emojilist.js';
|
import { emojilist, getEmojiName } from '@/scripts/emojilist.js';
|
||||||
import { i18n } from '@/i18n.js';
|
import { i18n } from '@/i18n.js';
|
||||||
import { miLocalStorage } from '@/local-storage.js';
|
import { miLocalStorage } from '@/local-storage.js';
|
||||||
import { customEmojis } from '@/custom-emojis.js';
|
import { customEmojis } from '@/custom-emojis.js';
|
||||||
|
import { MFM_TAGS } from '@/const.js';
|
||||||
|
|
||||||
type EmojiDef = {
|
type EmojiDef = {
|
||||||
emoji: string;
|
emoji: string;
|
||||||
|
@ -7,6 +7,7 @@ import { VNode, h } from 'vue';
|
|||||||
import * as mfm from 'mfm-js';
|
import * as mfm from 'mfm-js';
|
||||||
import * as Misskey from 'misskey-js';
|
import * as Misskey from 'misskey-js';
|
||||||
import MkUrl from '@/components/global/MkUrl.vue';
|
import MkUrl from '@/components/global/MkUrl.vue';
|
||||||
|
import MkTime from '@/components/global/MkTime.vue';
|
||||||
import MkLink from '@/components/MkLink.vue';
|
import MkLink from '@/components/MkLink.vue';
|
||||||
import MkMention from '@/components/MkMention.vue';
|
import MkMention from '@/components/MkMention.vue';
|
||||||
import MkEmoji from '@/components/global/MkEmoji.vue';
|
import MkEmoji from '@/components/global/MkEmoji.vue';
|
||||||
@ -238,6 +239,34 @@ export default function(props: MfmProps) {
|
|||||||
style = `background-color: #${color};`;
|
style = `background-color: #${color};`;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 'ruby': {
|
||||||
|
if (token.children.length === 1) {
|
||||||
|
const child = token.children[0];
|
||||||
|
const text = child.type === 'text' ? child.props.text : '';
|
||||||
|
return h('ruby', {}, [text.split(' ')[0], h('rt', text.split(' ')[1])]);
|
||||||
|
} else {
|
||||||
|
const rt = token.children.at(-1)!;
|
||||||
|
const text = rt.type === 'text' ? rt.props.text : '';
|
||||||
|
return h('ruby', {}, [...genEl(token.children.slice(0, token.children.length - 1), scale), h('rt', text.trim())]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 'unixtime': {
|
||||||
|
const child = token.children[0];
|
||||||
|
const unixtime = parseInt(child.type === 'text' ? child.props.text : '');
|
||||||
|
return h('span', {
|
||||||
|
style: 'display: inline-block; font-size: 90%; border: solid 1px var(--divider); border-radius: 999px; padding: 4px 10px 4px 6px;',
|
||||||
|
}, [
|
||||||
|
h('i', {
|
||||||
|
class: 'ti ti-clock',
|
||||||
|
style: 'margin-right: 0.25em;',
|
||||||
|
}),
|
||||||
|
h(MkTime, {
|
||||||
|
key: Math.random(),
|
||||||
|
time: unixtime * 1000,
|
||||||
|
mode: 'detail',
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (style == null) {
|
if (style == null) {
|
||||||
return h('span', {}, ['$[', token.props.name, ' ', ...genEl(token.children, scale), ']']);
|
return h('span', {}, ['$[', token.props.name, ' ', ...genEl(token.children, scale), ']']);
|
||||||
|
@ -50,7 +50,15 @@ const relative = $computed<string>(() => {
|
|||||||
ago >= 60 ? i18n.t('_ago.minutesAgo', { n: (~~(ago / 60)).toString() }) :
|
ago >= 60 ? i18n.t('_ago.minutesAgo', { n: (~~(ago / 60)).toString() }) :
|
||||||
ago >= 10 ? i18n.t('_ago.secondsAgo', { n: (~~(ago % 60)).toString() }) :
|
ago >= 10 ? i18n.t('_ago.secondsAgo', { n: (~~(ago % 60)).toString() }) :
|
||||||
ago >= -1 ? i18n.ts._ago.justNow :
|
ago >= -1 ? i18n.ts._ago.justNow :
|
||||||
i18n.ts._ago.future);
|
ago < -31536000 ? i18n.t('_timeIn.years', { n: Math.round(-ago / 31536000).toString() }) :
|
||||||
|
ago < -2592000 ? i18n.t('_timeIn.months', { n: Math.round(-ago / 2592000).toString() }) :
|
||||||
|
ago < -604800 ? i18n.t('_timeIn.weeks', { n: Math.round(-ago / 604800).toString() }) :
|
||||||
|
ago < -86400 ? i18n.t('_timeIn.days', { n: Math.round(-ago / 86400).toString() }) :
|
||||||
|
ago < -3600 ? i18n.t('_timeIn.hours', { n: Math.round(-ago / 3600).toString() }) :
|
||||||
|
ago < -60 ? i18n.t('_timeIn.minutes', { n: (~~(-ago / 60)).toString() }) :
|
||||||
|
ago < -10 ? i18n.t('_timeIn.seconds', { n: (~~(-ago % 60)).toString() }) :
|
||||||
|
'?'
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
let tickId: number;
|
let tickId: number;
|
||||||
|
@ -92,3 +92,5 @@ export const CURRENT_STICKY_BOTTOM = 'CURRENT_STICKY_BOTTOM';
|
|||||||
export const DEFAULT_SERVER_ERROR_IMAGE_URL = 'https://xn--931a.moe/assets/error.jpg';
|
export const DEFAULT_SERVER_ERROR_IMAGE_URL = 'https://xn--931a.moe/assets/error.jpg';
|
||||||
export const DEFAULT_NOT_FOUND_IMAGE_URL = 'https://xn--931a.moe/assets/not-found.jpg';
|
export const DEFAULT_NOT_FOUND_IMAGE_URL = 'https://xn--931a.moe/assets/not-found.jpg';
|
||||||
export const DEFAULT_INFO_IMAGE_URL = 'https://xn--931a.moe/assets/info.jpg';
|
export const DEFAULT_INFO_IMAGE_URL = 'https://xn--931a.moe/assets/info.jpg';
|
||||||
|
|
||||||
|
export const MFM_TAGS = ['tada', 'jelly', 'twitch', 'shake', 'spin', 'jump', 'bounce', 'flip', 'x2', 'x3', 'x4', 'scale', 'position', 'fg', 'bg', 'font', 'blur', 'rainbow', 'sparkle', 'rotate', 'ruby', 'unixtime'];
|
||||||
|
@ -18,16 +18,16 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||||||
<MkSpacer v-else-if="tab === 'users'" :contentMax="1200">
|
<MkSpacer v-else-if="tab === 'users'" :contentMax="1200">
|
||||||
<div class="_gaps_s">
|
<div class="_gaps_s">
|
||||||
<div v-if="role">{{ role.description }}</div>
|
<div v-if="role">{{ role.description }}</div>
|
||||||
<MkUserList v-if="visiable" :pagination="users" :extractor="(item) => item.user"/>
|
<MkUserList v-if="visible" :pagination="users" :extractor="(item) => item.user"/>
|
||||||
<div v-else-if="!visiable" class="_fullinfo">
|
<div v-else-if="!visible" class="_fullinfo">
|
||||||
<img :src="infoImageUrl" class="_ghost"/>
|
<img :src="infoImageUrl" class="_ghost"/>
|
||||||
<div>{{ i18n.ts.nothing }}</div>
|
<div>{{ i18n.ts.nothing }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</MkSpacer>
|
</MkSpacer>
|
||||||
<MkSpacer v-else-if="tab === 'timeline'" :contentMax="700">
|
<MkSpacer v-else-if="tab === 'timeline'" :contentMax="700">
|
||||||
<MkTimeline v-if="visiable" ref="timeline" src="role" :role="props.role"/>
|
<MkTimeline v-if="visible" ref="timeline" src="role" :role="props.role"/>
|
||||||
<div v-else-if="!visiable" class="_fullinfo">
|
<div v-else-if="!visible" class="_fullinfo">
|
||||||
<img :src="infoImageUrl" class="_ghost"/>
|
<img :src="infoImageUrl" class="_ghost"/>
|
||||||
<div>{{ i18n.ts.nothing }}</div>
|
<div>{{ i18n.ts.nothing }}</div>
|
||||||
</div>
|
</div>
|
||||||
@ -55,7 +55,7 @@ const props = withDefaults(defineProps<{
|
|||||||
let tab = $ref(props.initialTab);
|
let tab = $ref(props.initialTab);
|
||||||
let role = $ref();
|
let role = $ref();
|
||||||
let error = $ref();
|
let error = $ref();
|
||||||
let visiable = $ref(false);
|
let visible = $ref(false);
|
||||||
|
|
||||||
watch(() => props.role, () => {
|
watch(() => props.role, () => {
|
||||||
os.api('roles/show', {
|
os.api('roles/show', {
|
||||||
@ -63,7 +63,7 @@ watch(() => props.role, () => {
|
|||||||
}).then(res => {
|
}).then(res => {
|
||||||
role = res;
|
role = res;
|
||||||
document.title = `${role?.name} | ${instanceName}`;
|
document.title = `${role?.name} | ${instanceName}`;
|
||||||
visiable = res.isExplorable && res.isPublic;
|
visible = res.isExplorable && res.isPublic;
|
||||||
}).catch((err) => {
|
}).catch((err) => {
|
||||||
if (err.code === 'NO_SUCH_ROLE') {
|
if (err.code === 'NO_SUCH_ROLE') {
|
||||||
error = i18n.ts.noRole;
|
error = i18n.ts.noRole;
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: syuilo and other misskey contributors
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
export const MFM_TAGS = ['tada', 'jelly', 'twitch', 'shake', 'spin', 'jump', 'bounce', 'flip', 'x2', 'x3', 'x4', 'scale', 'position', 'fg', 'bg', 'font', 'blur', 'rainbow', 'sparkle', 'rotate'];
|
|
@ -23,7 +23,7 @@
|
|||||||
"@microsoft/api-extractor": "7.38.3",
|
"@microsoft/api-extractor": "7.38.3",
|
||||||
"@swc/jest": "0.2.29",
|
"@swc/jest": "0.2.29",
|
||||||
"@types/jest": "29.5.8",
|
"@types/jest": "29.5.8",
|
||||||
"@types/node": "20.9.0",
|
"@types/node": "20.9.1",
|
||||||
"@typescript-eslint/eslint-plugin": "6.11.0",
|
"@typescript-eslint/eslint-plugin": "6.11.0",
|
||||||
"@typescript-eslint/parser": "6.11.0",
|
"@typescript-eslint/parser": "6.11.0",
|
||||||
"eslint": "8.53.0",
|
"eslint": "8.53.0",
|
||||||
@ -38,7 +38,7 @@
|
|||||||
"built"
|
"built"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@swc/cli": "0.1.62",
|
"@swc/cli": "0.1.63",
|
||||||
"@swc/core": "1.3.96",
|
"@swc/core": "1.3.96",
|
||||||
"eventemitter3": "5.0.1",
|
"eventemitter3": "5.0.1",
|
||||||
"reconnecting-websocket": "4.4.0"
|
"reconnecting-websocket": "4.4.0"
|
||||||
|
902
pnpm-lock.yaml
902
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user