From a81d2cc77825355065eac9f99f57c540462c763d Mon Sep 17 00:00:00 2001 From: limepotato Date: Sun, 14 Jul 2024 20:32:39 -0600 Subject: [PATCH] brrh --- README.md | 3 +- patches/newmfm/0001-add-border-mfm.patch | 76 ++++++++++ patches/newmfm/0002-ruby-mfm.patch | 34 +++++ patches/newmfm/0003-Unix-Time-MFM.patch | 48 ++++++ patches/newmfm/0004-Follow-Mouse-MFM.patch | 143 ++++++++++++++++++ .../newmfm/0005-add-mfm-autocomplete.patch | 31 ++++ patches/newmfm/README.md | 3 + patches/newmfm/newmfm.patch | 5 + patches/newmfm/newmfm.tar.gz | Bin 0 -> 3559 bytes 9 files changed, 342 insertions(+), 1 deletion(-) create mode 100644 patches/newmfm/0001-add-border-mfm.patch create mode 100644 patches/newmfm/0002-ruby-mfm.patch create mode 100644 patches/newmfm/0003-Unix-Time-MFM.patch create mode 100644 patches/newmfm/0004-Follow-Mouse-MFM.patch create mode 100644 patches/newmfm/0005-add-mfm-autocomplete.patch create mode 100644 patches/newmfm/README.md create mode 100644 patches/newmfm/newmfm.patch create mode 100644 patches/newmfm/newmfm.tar.gz diff --git a/README.md b/README.md index 9253aa4..d7c0117 100644 --- a/README.md +++ b/README.md @@ -17,4 +17,5 @@ To apply a patch ``git am --keep-cr --signoff < {patch}`` - [Remove Maintainer-info Nag](./patches/remove-maintainer-info-nag.patch): Removes nag if you dont input maintainer information - [Post Form Height](./patches/textarea.patch): Increases the post form height for usability - [Remove Chats](./patches/remove-messaging.patch): Removes the pages and buttons referring to the local chats feature -- [Observers] Renames Followers/Following to Observers/Observing, as well as replaces the hand icon with an eye \ No newline at end of file +- [Observers] Renames Followers/Following to Observers/Observing, as well as replaces the hand icon with an eye +- [New MFM](./newmfm/) Adds `followmouse`, `unixtime`, `ruby`, and `border` mfm tags from Sharkey/Misskey. \ No newline at end of file diff --git a/patches/newmfm/0001-add-border-mfm.patch b/patches/newmfm/0001-add-border-mfm.patch new file mode 100644 index 0000000..acc6086 --- /dev/null +++ b/patches/newmfm/0001-add-border-mfm.patch @@ -0,0 +1,76 @@ +From bb131259350d68a6081fa5202477ba090d163363 Mon Sep 17 00:00:00 2001 +From: limepotato +Date: Sun, 14 Jul 2024 05:46:32 -0600 +Subject: [PATCH 1/5] add border mfm + +--- + packages/client/src/components/mfm.ts | 20 ++++++++++++++++++++ + packages/client/src/scripts/safe-parse.ts | 11 +++++++++++ + 2 files changed, 31 insertions(+) + create mode 100644 packages/client/src/scripts/safe-parse.ts + +diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts +index a2c4fdcb7..32b72564b 100644 +--- a/packages/client/src/components/mfm.ts ++++ b/packages/client/src/components/mfm.ts +@@ -14,6 +14,7 @@ import MkA from "@/components/global/MkA.vue"; + import { host } from "@/config"; + import { reducedMotion } from "@/scripts/reduced-motion"; + import { defaultStore } from "@/store"; ++import { safeParseFloat } from "@/scripts/safe-parse"; + + export default defineComponent({ + props: { +@@ -70,6 +71,11 @@ export default defineComponent({ + // : null + // } + ++ const validColor = (c: unknown): string | null => { ++ if (typeof c !== 'string') return null; ++ return c.match(/^[0-9a-f]{3,6}$/i) ? c : null; ++ }; ++ + const genEl = (ast: mfm.MfmNode[]) => + concat( + ast.map((token, index): VNode[] => { +@@ -300,6 +306,20 @@ export default defineComponent({ + style = `background-color: #${color};`; + break; + } ++ case 'border': { ++ let color = validColor(token.props.args.color); ++ color = color ? `#${color}` : 'var(--accent)'; ++ let b_style = token.props.args.style; ++ if ( ++ typeof b_style !== 'string' || ++ !['hidden', 'dotted', 'dashed', 'solid', 'double', 'groove', 'ridge', 'inset', 'outset'] ++ .includes(b_style) ++ ) b_style = 'solid'; ++ const width = safeParseFloat(token.props.args.width) ?? 1; ++ const radius = safeParseFloat(token.props.args.radius) ?? 0; ++ style = `border: ${width}px ${b_style} ${color}; border-radius: ${radius}px;${token.props.args.noclip ? '' : ' overflow: clip;'}`; ++ break; ++ } + case "small": { + return h( + "small", +diff --git a/packages/client/src/scripts/safe-parse.ts b/packages/client/src/scripts/safe-parse.ts +new file mode 100644 +index 000000000..6bfcef6c3 +--- /dev/null ++++ b/packages/client/src/scripts/safe-parse.ts +@@ -0,0 +1,11 @@ ++/* ++ * SPDX-FileCopyrightText: syuilo and misskey-project ++ * SPDX-License-Identifier: AGPL-3.0-only ++ */ ++ ++export function safeParseFloat(str: unknown): number | null { ++ if (typeof str !== 'string' || str === '') return null; ++ const num = parseFloat(str); ++ if (isNaN(num)) return null; ++ return num; ++} +-- +2.45.2 + diff --git a/patches/newmfm/0002-ruby-mfm.patch b/patches/newmfm/0002-ruby-mfm.patch new file mode 100644 index 0000000..0aeb422 --- /dev/null +++ b/patches/newmfm/0002-ruby-mfm.patch @@ -0,0 +1,34 @@ +From 54a84e11c19a4f90803c126d203e0e34fb202bd7 Mon Sep 17 00:00:00 2001 +From: limepotato +Date: Sun, 14 Jul 2024 06:01:33 -0600 +Subject: [PATCH 2/5] ruby mfm + +--- + packages/client/src/components/mfm.ts | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts +index 32b72564b..2beee156c 100644 +--- a/packages/client/src/components/mfm.ts ++++ b/packages/client/src/components/mfm.ts +@@ -320,6 +320,17 @@ export default defineComponent({ + style = `border: ${width}px ${b_style} ${color}; border-radius: ${radius}px;${token.props.args.noclip ? '' : ' overflow: clip;'}`; + break; + } ++ case 'ruby': { ++ if (token.children.length === 1) { ++ const child = token.children[0]; ++ let 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)!; ++ let 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 "small": { + return h( + "small", +-- +2.45.2 + diff --git a/patches/newmfm/0003-Unix-Time-MFM.patch b/patches/newmfm/0003-Unix-Time-MFM.patch new file mode 100644 index 0000000..a699cae --- /dev/null +++ b/patches/newmfm/0003-Unix-Time-MFM.patch @@ -0,0 +1,48 @@ +From 846baf305be2d4547b91e6cfd6db5c64bc6ce793 Mon Sep 17 00:00:00 2001 +From: limepotato +Date: Sun, 14 Jul 2024 06:09:33 -0600 +Subject: [PATCH 3/5] Unix Time MFM + +--- + packages/client/src/components/mfm.ts | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts +index 2beee156c..382b1b9e7 100644 +--- a/packages/client/src/components/mfm.ts ++++ b/packages/client/src/components/mfm.ts +@@ -2,6 +2,7 @@ import { defineComponent, h } from "vue"; + import * as mfm from "@transfem-org/sfm-js"; + import type { VNode } from "vue"; + import MkUrl from "@/components/global/MkUrl.vue"; ++import MkTime from '@/components/global/MkTime.vue'; + import MkLink from "@/components/MkLink.vue"; + import MkMention from "@/components/MkMention.vue"; + import MkEmoji from "@/components/global/MkEmoji.vue"; +@@ -331,6 +332,23 @@ export default defineComponent({ + 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: var(--radius-ellipse); padding: 4px 10px 4px 6px;', ++ }, [ ++ h('i', { ++ class: 'ph-clock ph-bold ph-lg', ++ style: 'margin-right: 0.25em;', ++ }), ++ h(MkTime, { ++ key: Math.random(), ++ time: unixtime * 1000, ++ mode: 'detail', ++ }), ++ ]); ++ } + case "small": { + return h( + "small", +-- +2.45.2 + diff --git a/patches/newmfm/0004-Follow-Mouse-MFM.patch b/patches/newmfm/0004-Follow-Mouse-MFM.patch new file mode 100644 index 0000000..56feef3 --- /dev/null +++ b/patches/newmfm/0004-Follow-Mouse-MFM.patch @@ -0,0 +1,143 @@ +From d41a81f60051c197ca98db912d706745edd002d7 Mon Sep 17 00:00:00 2001 +From: limepotato +Date: Sun, 14 Jul 2024 06:11:58 -0600 +Subject: [PATCH 4/5] Follow Mouse MFM + +--- + .../client/src/components/CkFollowMouse.vue | 86 +++++++++++++++++++ + packages/client/src/components/mfm.ts | 19 ++++ + 2 files changed, 105 insertions(+) + create mode 100644 packages/client/src/components/CkFollowMouse.vue + +diff --git a/packages/client/src/components/CkFollowMouse.vue b/packages/client/src/components/CkFollowMouse.vue +new file mode 100644 +index 000000000..ce7e3c79a +--- /dev/null ++++ b/packages/client/src/components/CkFollowMouse.vue +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++ ++ +diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts +index 382b1b9e7..25faf680b 100644 +--- a/packages/client/src/components/mfm.ts ++++ b/packages/client/src/components/mfm.ts +@@ -1,6 +1,7 @@ + import { defineComponent, h } from "vue"; + import * as mfm from "@transfem-org/sfm-js"; + import type { VNode } from "vue"; ++import CkFollowMouse from "./CkFollowMouse.vue"; + import MkUrl from "@/components/global/MkUrl.vue"; + import MkTime from '@/components/global/MkTime.vue'; + import MkLink from "@/components/MkLink.vue"; +@@ -275,6 +276,24 @@ export default defineComponent({ + style = `transform: ${rotate}(${degrees}deg); transform-origin: center center;`; + break; + } ++ case 'followmouse': { ++ // Make sure advanced MFM is on and that reduced motion is off ++ ++ let x = (!!token.props.args.x); ++ let y = (!!token.props.args.y); ++ ++ if (!x && !y) { ++ x = true; ++ y = true; ++ } ++ ++ return h(CkFollowMouse, { ++ x: x, ++ y: y, ++ speed: validTime(token.props.args.speed) ?? '0.1s', ++ rotateByVelocity: !!token.props.args.rotateByVelocity, ++ }, genEl(token.children)); ++ } + case "position": { + const x = parseFloat(token.props.args.x ?? "0"); + const y = parseFloat(token.props.args.y ?? "0"); +-- +2.45.2 + diff --git a/patches/newmfm/0005-add-mfm-autocomplete.patch b/patches/newmfm/0005-add-mfm-autocomplete.patch new file mode 100644 index 0000000..61762ba --- /dev/null +++ b/patches/newmfm/0005-add-mfm-autocomplete.patch @@ -0,0 +1,31 @@ +From bf99394851a6bc3e0bb8c5326ffed6a0be616593 Mon Sep 17 00:00:00 2001 +From: limepotato +Date: Sun, 14 Jul 2024 06:23:21 -0600 +Subject: [PATCH 5/5] add mfm autocomplete + +--- + packages/client/src/scripts/mfm-tags.ts | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/packages/client/src/scripts/mfm-tags.ts b/packages/client/src/scripts/mfm-tags.ts +index a3b51e483..2b15df815 100644 +--- a/packages/client/src/scripts/mfm-tags.ts ++++ b/packages/client/src/scripts/mfm-tags.ts +@@ -11,10 +11,14 @@ export const MFM_TAGS = [ + "x3", + "x4", + "scale", ++ "followmouse", + "position", + "crop", + "fg", + "bg", ++ "border", ++ "ruby", ++ "unixtime", + "font", + "blur", + "rainbow", +-- +2.45.2 + diff --git a/patches/newmfm/README.md b/patches/newmfm/README.md new file mode 100644 index 0000000..26ef6c8 --- /dev/null +++ b/patches/newmfm/README.md @@ -0,0 +1,3 @@ +# NEW MFM + +You first need to apply [This Patch](https://iceshrimp.dev/kopper/iceshrimp/commit/d36021406dfa01f551a3fa4ca62bd20a85b7717a) from kopper, then [download all patches](./newmfm.tar.gz) in this directory, and apply [newmfm.patch](./newmfm.patch). \ No newline at end of file diff --git a/patches/newmfm/newmfm.patch b/patches/newmfm/newmfm.patch new file mode 100644 index 0000000..a09168e --- /dev/null +++ b/patches/newmfm/newmfm.patch @@ -0,0 +1,5 @@ +0001-add-border-mfm.patch +0002-ruby-mfm.patch +0003-Unix-Time-MFM.patch +0004-Follow-Mouse-MFM.patch +0005-add-mfm-autocomplete.patch diff --git a/patches/newmfm/newmfm.tar.gz b/patches/newmfm/newmfm.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..988d54715f115a5ece9b5e9c1801e0839ff1fb53 GIT binary patch literal 3559 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 hQ0