diff --git a/configs/common.nix b/configs/common.nix index 09ef1e8..97fa3ef 100644 --- a/configs/common.nix +++ b/configs/common.nix @@ -7,6 +7,7 @@ nixpkgs, agenix, home-manager, + vencord, ... }: let username = "leo"; @@ -131,7 +132,7 @@ in { nixpkgs = { config.allowUnfree = true; - overlays = [(import ../exprs/overlay.nix)]; + overlays = [(import ../exprs/overlay.nix vencord)]; }; programs = { diff --git a/configs/desktop.nix b/configs/desktop.nix index 251c242..fdce363 100644 --- a/configs/desktop.nix +++ b/configs/desktop.nix @@ -94,7 +94,7 @@ strawberry teams-for-linux thunderbird - (vesktop.override {withSystemVencord = false;}) + (vesktop.override {withSystemVencord = true;}) vscode # libreoffice stuff diff --git a/exprs/overlay.nix b/exprs/overlay.nix index 1af7aa5..64acc39 100644 --- a/exprs/overlay.nix +++ b/exprs/overlay.nix @@ -1,4 +1,4 @@ -final: prev: { +vencord-input: final: prev: { svn2git = prev.svn2git.overrideAttrs (_: rec { version = "2.4.2"; @@ -11,4 +11,15 @@ final: prev: { }); idea-ultimate-fixed = prev.callPackage ./idea-fixed.nix {}; + + vencord = prev.vencord.overrideAttrs (old: { + src = + vencord-input + // { + owner = "Vendicated"; + repo = "Vencord"; + }; + + patches = old.patches or [] ++ [./ventex.patch]; + }); } diff --git a/exprs/ventex.patch b/exprs/ventex.patch new file mode 100644 index 0000000..61e1c8f --- /dev/null +++ b/exprs/ventex.patch @@ -0,0 +1,128 @@ +diff --git a/src/plugins/ventex/README.md b/src/plugins/ventex/README.md +new file mode 100644 +index 00000000..3a0dc43d +--- /dev/null ++++ b/src/plugins/ventex/README.md +@@ -0,0 +1,4 @@ ++# vencord katex thing ++[forum guidelines told me to link this](https://docs.vencord.dev/installing/custom-plugins/) ++ ++renders inline codeblocks starting and ending in `$` and codeblocks with the language `latex` in TeX using KaTeX +\ No newline at end of file +diff --git a/src/plugins/ventex/index.tsx b/src/plugins/ventex/index.tsx +new file mode 100644 +index 00000000..11fc0d22 +--- /dev/null ++++ b/src/plugins/ventex/index.tsx +@@ -0,0 +1,97 @@ ++import "./katex.css"; ++ ++import { Devs } from "@utils/constants"; ++import definePlugin, { ReporterTestable } from "@utils/types"; ++import { makeLazy } from "@utils/lazy"; ++import { React, useEffect, useMemo, useState } from "@webpack/common"; ++ ++// @ts-expect-error ++export const getKatex = /* #__PURE__*/ makeLazy(async () => (await import("https://unpkg.com/katex@0.16.9/dist/katex.mjs")).default); ++ ++export function useKatex() { ++ const [katex, setKatex] = useState(); ++ useEffect(() => { ++ if (katex === undefined) ++ getKatex().then(setKatex); ++ }); ++ return katex; ++} ++ ++// @ts-expect-error ++export const getDomPurify = /* #__PURE__*/ makeLazy(async () => (await import("https://unpkg.com/dompurify@3.1.7/dist/purify.es.mjs")).default); ++ ++export function useDomPurify() { ++ const [domPurify, setDomPurify] = useState(); ++ useEffect(() => { ++ if (domPurify === undefined) ++ getDomPurify().then(setDomPurify); ++ }); ++ return domPurify; ++} ++ ++export interface HighlighterProps { ++ lang?: string; ++ content: string; ++ isPreview: boolean; ++ tempSettings?: Record; ++} ++ ++export default definePlugin({ ++ name: "KaTeX", ++ description: "TeX typesetting in discord", ++ authors: [Devs.skyevg], ++ reporterTestable: ReporterTestable.Patches, ++ ++ patches: [ ++ { ++ find: "codeBlock:{react(", ++ replacement: { ++ match: /codeBlock:\{react\((\i),(\i),(\i)\)\{/, ++ replace: "$&if($1.lang == 'latex') return $self.createBlock($1,$2,$3);" ++ } ++ }, ++ { ++ find: "inlineCode:{react:(", ++ replacement: { ++ match: /inlineCode:\{react:\((\i),(\i),(\i)\)=>/, ++ replace: "$&($1.content.startsWith('$$') && $1.content.endsWith('$$'))?$self.createInline($1,$2,$3):" ++ } ++ } ++ ], ++ start: async () => { ++ useKatex(); ++ useDomPurify(); ++ }, ++ stop: () => { ++ }, ++ ++ createBlock: (props: HighlighterProps) => ( ++ ++ ), ++ createInline: (props: HighlighterProps) => ( ++ ++ ), ++}); ++ ++function LazyLatex(props) { ++ const { formula } = props; ++ const katex = useKatex(); ++ const domPurify = useDomPurify(); ++ return katex && domPurify ++ ? ++ : {formula}; ++} ++ ++function Latex({ katex, formula, displayMode, domPurify }) { ++ const result = useMemo(() => { ++ const html = katex.renderToString(formula, { ++ displayMode, ++ throwOnError: false ++ }); ++ return domPurify.sanitize(html); ++ }, [formula, displayMode]); ++ ++ return displayMode ++ ?
++ : ; ++} +\ No newline at end of file +diff --git a/src/plugins/ventex/katex.css b/src/plugins/ventex/katex.css +new file mode 100644 +index 00000000..fbc06b44 +--- /dev/null ++++ b/src/plugins/ventex/katex.css +@@ -0,0 +1,6 @@ ++@import url("https://unpkg.com/katex@0.16.9/dist/katex.min.css"); ++ ++.katex-display { ++ width: min-content; ++ margin: 1em; ++} +\ No newline at end of file diff --git a/flake.lock b/flake.lock index ba6b255..2e67ec7 100644 --- a/flake.lock +++ b/flake.lock @@ -333,6 +333,7 @@ "nixpkgs": "nixpkgs", "systems": "systems_2", "ukubot-rs": "ukubot-rs", + "vencord": "vencord", "vscode-extensions": "vscode-extensions" } }, @@ -410,6 +411,22 @@ "type": "github" } }, + "vencord": { + "flake": false, + "locked": { + "lastModified": 1729849691, + "narHash": "sha256-3bCw0ocP8Z5hLPC7dEwz0ckSUCKwHHLMY7BSMXpd/iA=", + "owner": "Vendicated", + "repo": "Vencord", + "rev": "88e8fa7e904e525c4c1110d057f0812e4008ff7c", + "type": "github" + }, + "original": { + "owner": "Vendicated", + "repo": "Vencord", + "type": "github" + } + }, "vscode-extensions": { "inputs": { "flake-compat": [], diff --git a/flake.nix b/flake.nix index 2c8bb2c..207e58e 100644 --- a/flake.nix +++ b/flake.nix @@ -127,5 +127,11 @@ inputs.nixpkgs.follows = "nixpkgs"; inputs.flake-parts.follows = "flake-parts"; }; + + # ==== vencord ==== + vencord = { + url = "github:Vendicated/Vencord"; + flake = false; + }; }; }