70 lines
2.3 KiB
JavaScript
70 lines
2.3 KiB
JavaScript
/*
|
|
* Unindent, a Powercord Plugin to trim unnecessary indent from messages
|
|
* Copyright (C) 2021 Vendicated
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
const { Plugin } = require("powercord/entities");
|
|
const { inject, uninject } = require("powercord/injector");
|
|
const { messages, getModule } = require("powercord/webpack");
|
|
|
|
const sendMessageInjectionId = "unindentSendMessage";
|
|
const codeblockInjectionId = "unindentCodeblocks";
|
|
|
|
module.exports = class Unindent extends Plugin {
|
|
async startPlugin() {
|
|
inject(
|
|
sendMessageInjectionId,
|
|
messages,
|
|
"sendMessage",
|
|
args => {
|
|
const msg = args[1];
|
|
msg.content = msg.content.replace(/```(.|\n)*?```/g, m => {
|
|
const lines = m.split("\n");
|
|
if (lines.length < 2) return m; // Do not affect inline codeblocks
|
|
let suffix = "";
|
|
if (lines[lines.length - 1] === "```") suffix = lines.pop();
|
|
return `${lines[0]}\n${this.unindent(lines.slice(1).join("\n"))}\n${suffix}`;
|
|
});
|
|
return args;
|
|
},
|
|
true
|
|
);
|
|
|
|
const parser = await getModule(["parse", "parseTopic"]);
|
|
|
|
inject(
|
|
codeblockInjectionId,
|
|
parser.defaultRules.codeBlock,
|
|
"react",
|
|
args => {
|
|
args[0].content = this.unindent(args[0].content);
|
|
return args;
|
|
},
|
|
true
|
|
);
|
|
}
|
|
|
|
unindent(str) {
|
|
// Users cannot send tabs, they get converted to spaces. However, a bot may send tabs, so convert them to 4 spaces first
|
|
str = str.replace(/\t/g, " ");
|
|
const minIndent = str.match(/^ *(?=\S)/gm)?.reduce((prev, curr) => Math.min(prev, curr.length), Infinity) ?? 0;
|
|
if (!minIndent) return str;
|
|
return str.replace(new RegExp(`^ {${minIndent}}`, "gm"), "");
|
|
}
|
|
|
|
pluginWillUnload() {
|
|
uninject(sendMessageInjectionId);
|
|
uninject(codeblockInjectionId);
|
|
}
|
|
};
|