pc-unindent/index.js

70 lines
2.3 KiB
JavaScript
Raw Permalink Normal View History

2021-05-30 23:17:59 +00:00
/*
* 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");
2021-05-30 23:52:35 +00:00
const { messages, getModule } = require("powercord/webpack");
2021-05-30 23:17:59 +00:00
2021-05-30 23:52:35 +00:00
const sendMessageInjectionId = "unindentSendMessage";
const codeblockInjectionId = "unindentCodeblocks";
2021-05-30 23:17:59 +00:00
module.exports = class Unindent extends Plugin {
2021-05-30 23:52:35 +00:00
async startPlugin() {
inject(
sendMessageInjectionId,
messages,
"sendMessage",
args => {
const msg = args[1];
msg.content = msg.content.replace(/```(.|\n)*?```/g, m => {
const lines = m.split("\n");
2021-06-01 00:11:04 +00:00
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}`;
});
2021-05-30 23:52:35 +00:00
return args;
},
true
);
2021-05-30 23:17:59 +00:00
2021-05-30 23:52:35 +00:00
const parser = await getModule(["parse", "parseTopic"]);
2021-05-30 23:17:59 +00:00
2021-05-30 23:52:35 +00:00
inject(
codeblockInjectionId,
parser.defaultRules.codeBlock,
"react",
args => {
args[0].content = this.unindent(args[0].content);
2021-05-30 23:52:35 +00:00
return args;
},
true
);
}
unindent(str) {
2021-06-01 00:11:04 +00:00
// 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, " ");
2021-05-31 01:09:06 +00:00
const minIndent = str.match(/^ *(?=\S)/gm)?.reduce((prev, curr) => Math.min(prev, curr.length), Infinity) ?? 0;
2021-06-01 00:11:04 +00:00
if (!minIndent) return str;
2021-05-31 01:09:06 +00:00
return str.replace(new RegExp(`^ {${minIndent}}`, "gm"), "");
2021-05-30 23:17:59 +00:00
}
pluginWillUnload() {
2021-05-30 23:52:35 +00:00
uninject(sendMessageInjectionId);
uninject(codeblockInjectionId);
2021-05-30 23:17:59 +00:00
}
};