Another copy of my dotfiles. Because I don't completely trust GitHub.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

674 lines
21 KiB

/**
* @name BetterCodeblocks
* @invite undefined
* @authorLink undefined
* @donate undefined
* @patreon undefined
* @website https://github.com/vBread/BetterCodeblocks
* @source https://github.com/vBread/BetterCodeblocks/blob/master/BetterCodeblocks.plugin.js
*/
/*@cc_on
@if (@_jscript)
// Offer to self-install for clueless users that try to run this directly.
var shell = WScript.CreateObject("WScript.Shell");
var fs = new ActiveXObject("Scripting.FileSystemObject");
var pathPlugins = shell.ExpandEnvironmentStrings("%APPDATA%\BetterDiscord\plugins");
var pathSelf = WScript.ScriptFullName;
// Put the user at ease by addressing them in the first person
shell.Popup("It looks like you've mistakenly tried to run me directly. \n(Don't do that!)", 0, "I'm a plugin for BetterDiscord", 0x30);
if (fs.GetParentFolderName(pathSelf) === fs.GetAbsolutePathName(pathPlugins)) {
shell.Popup("I'm in the correct folder already.", 0, "I'm already installed", 0x40);
} else if (!fs.FolderExists(pathPlugins)) {
shell.Popup("I can't find the BetterDiscord plugins folder.\nAre you sure it's even installed?", 0, "Can't install myself", 0x10);
} else if (shell.Popup("Should I copy myself to BetterDiscord's plugins folder for you?", 0, "Do you need some help?", 0x34) === 6) {
fs.CopyFile(pathSelf, fs.BuildPath(pathPlugins, fs.GetFileName(pathSelf)), true);
// Show the user where to put plugins in the future
shell.Exec("explorer " + pathPlugins);
shell.Popup("I'm installed!", 0, "Successfully installed", 0x40);
}
WScript.Quit();
@else@*/
module.exports = (() => {
const config = { "info": { "name": "BetterCodeblocks", "authors": [{ "name": "Bread", "discord_id": "304260051915374603" }], "version": "1.0.0", "description": "Enhances the look and feel of Discord's codeblocks with customizable colors", "github": "https://github.com/vBread/BetterCodeblocks", "github_raw": "https://github.com/vBread/BetterCodeblocks/blob/master/BetterCodeblocks.plugin.js" }, "changelog": [], "main": "index.js" };
return !global.ZeresPluginLibrary ? class {
constructor() { this._config = config; }
getName() { return config.info.name; }
getAuthor() { return config.info.authors.map(a => a.name).join(", "); }
getDescription() { return config.info.description; }
getVersion() { return config.info.version; }
load() {
BdApi.showConfirmationModal("Library Missing", `The library plugin needed for ${config.info.name} is missing. Please click Download Now to install it.`, {
confirmText: "Download Now",
cancelText: "Cancel",
onConfirm: () => {
require("request").get("https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js", async (error, response, body) => {
if (error) return require("electron").shell.openExternal("https://betterdiscord.net/ghdl?url=https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js");
await new Promise(r => require("fs").writeFile(require("path").join(BdApi.Plugins.folder, "0PluginLibrary.plugin.js"), body, r));
});
}
});
}
start() {}
stop() {}
} : (([Plugin, Api]) => {
const plugin = (Plugin, Library) => {
const { Patcher, WebpackModules, DiscordModules, PluginUtilities, Settings } = Library;
const { SettingPanel, SettingGroup, Textbox } = Settings
const { React, hljs } = DiscordModules
return class BetterCodeblocks extends Plugin {
constructor() {
super()
this.defaults = {
addition: '#98c379',
attr_1: '#d19a66',
attr_2: '#d19a66',
attribute: '#98c379',
background: '#282c34',
built_in: '#e6c07b',
bullet: '#61aeee',
code: '#abb2bf',
comment: '#5c6370',
deletion: '#e06c75',
doctag: '#c678dd',
keyword: '#c678dd',
literal: '#56b6c2',
meta_string: '#98c379',
meta: '#61aeee',
name: '#e06c75',
nomarkup: '#98c379',
number: '#d19a66',
params: '#abb2bf',
quote: '#5c6370',
regexp: '#98c379',
section: '#e06c75',
selector_attr: '#d19a66',
selector_class: '#d19a66',
selector_id: '#61aeee',
selector_pseudo: '#d19a66',
selector_tag: '#e06c75',
string: '#98c379',
subst: '#e06c75',
symbol: '#61aeee',
tag: '#e06c75',
template_variable: '#d19a66',
text: '#abb2bf',
title: '#61aeee',
type: '#d19a66',
variable: '#d19a66'
}
this.hljs = PluginUtilities.loadSettings('BetterCodeblocks', this.defaults)
}
onStart() {
const parser = WebpackModules.getByProps('parse', 'parseTopic')
Patcher.after(parser.defaultRules.codeBlock, 'react', (_, args, res) => {
this.inject(args, res)
return res
});
PluginUtilities.addStyle('BetterCodeblocks', this.css)
}
onStop() {
PluginUtilities.removeStyle('BetterCodeblocks')
Patcher.unpatchAll();
}
getSettingsPanel() {
return SettingPanel.build(PluginUtilities.saveSettings('BetterCodeblocks', this.hljs),
new SettingGroup('Customization').append(
new Textbox('Additions', 'Changes the color of additions for Diff', this.hljs.addition, (color) => this.updateColor('addition', color)),
new Textbox('Annotation Tags', 'Changes the color of documentation/annotation tags', this.hljs.doctag, (color) => this.updateColor('doctag', color)),
new Textbox('Attributes', 'Changes the color of HTML tag attributes', this.hljs.attribute, (color) => this.updateColor('attribute', color)),
new Textbox('Background', 'Changes the color of the codeblock background', this.hljs.background, (color) => this.updateColor('background', color)),
new Textbox('Built-In', 'Changes the color of built-in keywords', this.hljs.built_in, (color) => this.updateColor('built_in', color)),
new Textbox('Bullets', 'Changes the color of bullet points for Markdown', this.hljs.bullet, (color) => this.updateColor('bullet', color)),
new Textbox('Comments', 'Changes the color of comments', this.hljs.comment, (color) => this.updateColor('comment', color)),
new Textbox('Deletions', 'Changes the color of deletions for Diff', this.hljs.deletion, (color) => this.updateColor('deletion', color)),
new Textbox('Keywords', 'Changes the color of keywords', this.hljs.keyword, (color) => this.updateColor('keyword', color)),
new Textbox('Literals', 'Changes the color of literal keywords', this.hljs.literal, (color) => this.updateColor('literal', color)),
new Textbox('Names', 'Changes the color of function names', this.hljs.title, (color) => this.updateColor('title', color)),
new Textbox('Number', 'Changes the color of numbers', this.hljs.number, (color) => this.updateColor('number', color)),
new Textbox('Parameters', 'Changes the color of function parameters', this.hljs.params, (color) => this.updateColor('params', color)),
new Textbox('Regular Expressions', 'Changes the color of regular expressions', this.hljs.regexp, (color) => this.updateColor('regexp', color)),
new Textbox('Selector Attributes', 'Changes the color of CSS selector attributes', this.hljs.selector_attr, (color) => this.updateColor('selector_attr', color)),
new Textbox('Selector Classes', 'Changes the color of CSS selector classes', this.hljs.selector_class, (color) => this.updateColor('selector_class', color)),
new Textbox('Selector IDs', 'Changes the color of CSS selector IDs', this.hljs.selector_id, (color) => this.updateColor('selector_id', color)),
new Textbox('Selector Pseudos', 'Changes the color of CSS selector pseudos', this.hljs.selector_pseudo, (color) => this.updateColor('selector_pseudo', color)),
new Textbox('Selector Tags', 'Changes the color of CSS selector tags', this.hljs.selector_tag, (color) => this.updateColor('selector_tag', color)),
new Textbox('Strings', 'Changes the color of strings', this.hljs.string, (color) => this.updateColor('string', color)),
new Textbox('Template Literals', 'Changes the color of template literals', this.hljs.template_variable, (color) => this.updateColor('template_variable', color)),
new Textbox('Types', 'Changes the color of types', this.hljs.type, (color) => this.updateColor('type', color)),
new Textbox('Variables', 'Changes the color of variables', this.hljs.variable, (color) => this.updateColor('variable', color)),
)
)
}
updateColor(property, color) {
let reset = false
if (!/#?\w{6}/.test(color) || color === '') {
color = this.defaults[property]
reset = true
}
if (!color.startsWith('#')) {
color = `#${color}`
}
this.hljs[property] = color
if (reset) PluginUtilities.saveSettings('BetterCodeblocks', this.hljs)
PluginUtilities.removeStyle('BetterCodeblocks')
PluginUtilities.addStyle('BetterCodeblocks', this.css)
}
inject(args, res) {
const { render } = res.props;
res.props.render = (props) => {
const codeblock = render(props);
const codeElement = codeblock.props.children;
const classes = codeElement.props.className.split(' ');
const lang = args ? args[0].lang : classes[classes.indexOf('hljs') + 1];
const lines = codeElement.props.dangerouslySetInnerHTML
? codeElement.props.dangerouslySetInnerHTML.__html
.replace(
/<span class="(hljs-[a-z]+)">([^<]*)<\/span>/g,
(_, className, code) => code.split('\n').map(l => `<span class="${className}">${l}</span>`).join('\n')
)
.split('\n')
: codeElement.props.children.split('\n');
delete codeElement.props.dangerouslySetInnerHTML;
codeElement.props.children = this.render(lang, lines);
return codeblock;
};
}
render(lang, lines) {
const { Messages } = WebpackModules.getByProps('Messages')
if (hljs && typeof hljs.getLanguage === 'function') {
lang = hljs.getLanguage(lang);
}
return React.createElement(React.Fragment, null,
lang && React.createElement('div', { className: 'bd-codeblock-lang' }, lang.name),
React.createElement('table', { className: 'bd-codeblock-table' },
...lines.map((line, i) => React.createElement('tr', null,
React.createElement('td', null, i + 1),
React.createElement('td',
lang ? {
dangerouslySetInnerHTML: {
__html: line
}
} : {
children: line
}
)
))
),
React.createElement('button', {
className: 'bd-codeblock-copy-btn',
onClick: this.clickHandler
}, Messages.COPY)
);
}
clickHandler({ target }) {
const { Messages } = WebpackModules.getByProps('Messages')
const { clipboard } = require('electron')
if (target.classList.contains('copied')) return;
target.innerText = Messages.ACCOUNT_USERNAME_COPY_SUCCESS_1;
target.classList.add('copied');
setTimeout(() => {
target.innerText = Messages.COPY;
target.classList.remove('copied');
}, 1e3);
const code = [...target.parentElement.querySelectorAll('td:last-child')].map(t => t.textContent).join('\n');
clipboard.writeText(code);
}
get css() {
return `
.hljs {
background-color: ${this.hljs.background} !important;
color: ${this.hljs.text};
position: relative;
}
.hljs:not([class$='hljs']) {
padding-top: 2px;
}
.bd-codeblock-lang {
color: var(--text-normal);
border-bottom: 1px solid var(--background-modifier-accent);
padding: 0 5px;
margin-bottom: 6px;
font-size: .8em;
font-family: 'Raleway', sans-serif;
font-weight: bold;
}
.bd-codeblock-table {
border-collapse: collapse;
}
.bd-codeblock-table tr {
height: 19px;
width: 100%;
}
.bd-codeblock-table td:first-child {
border-right: 1px solid var(--background-modifier-accent);
padding-left: 5px;
padding-right: 8px;
user-select: none;
}
.bd-codeblock-table td:last-child {
padding-left: 8px;
word-break: break-all;
}
.bd-codeblock-copy-btn {
color: #fff;
border-radius: 4px;
line-height: 20px;
padding: 0 10px;
font-family: 'Raleway', sans-serif;
font-size: .8em;
text-transform: uppercase;
font-weight: bold;
margin: 3px;
background: var(--background-floating);
position: absolute;
right: 0 !important;
bottom: 0 !important;
opacity: 0;
transition: .3s;
}
.bd-codeblock-copy-btn.copied {
background-color: #43b581;
opacity: 1;
}
.hljs:hover .bd-codeblock-copy-btn {
opacity: 1;
}
// HLJS Styling
.hljs > .bd-codeblock-table > tr > td > span > .hljs-tag {
color: ${this.hljs.tag};
}
.hljs > .bd-codeblock-table > tr > td > span > .hljs-tag > .hljs-name {
color: ${this.hljs.name};
}
.hljs > .bd-codeblock-table > tr > td > span > .hljs-tag > .hljs-attr {
color: ${this.hljs.attr_2};
}
.hljs > .bd-codeblock-table > tr > td > .bash > .hljs-built_in {
color: ${this.hljs.built_in};
}
.hljs > .bd-codeblock-table > tr > td > .bash > .hljs-variable {
color: ${this.hljs.variable};
}
.hljs > .bd-codeblock-table > tr > td > .hljs-tag {
color: ${this.hljs.tag} !important;
}
.hljs > .bd-codeblock-table > tr > td > .hljs-tag > .hljs-name {
color: ${this.hljs.tag};
}
.hljs > .bd-codeblock-table > tr > td > .hljs-tag > .hljs-attr {
color: ${this.hljs.tag};
}
.hljs > .bd-codeblock-table > tr > td > .hljs-function > .hljs-params {
color: ${this.hljs.params};
}
.hljs > .bd-codeblock-table > tr > td > .hljs-function > .hljs-params > .hljs-type {
color: ${this.hljs.type};
}
.hljs > .bd-codeblock-table > tr > td > .hljs-params {
color: ${this.hljs.params};
}
.hljs > .bd-codeblock-table > tr > td > .hljs-params > .hljs-built_in {
color: ${this.hljs.built_in};
}
.hljs > .bd-codeblock-table > tr > td > .hljs-selector-attr {
color: ${this.hljs.selector_attr};
}
.hljs > .bd-codeblock-table > tr > td > .hljs-type {
color: ${this.hljs.type};
}
.hljs > .bd-codeblock-table > tr > td > .hljs-selector-id {
color: ${this.hljs.selector_id};
}
.hljs > .bd-codeblock-table > tr > td > .hljs-selector-pseudo {
color: ${this.hljs.selector_pseudo};
}
.hljs > .bd-codeblock-table > tr > td > .hljs-bullet {
color: ${this.hljs.bullet};
}
.hljs > .bd-codeblock-table > tr > td > .hljs-addition {
color: ${this.hljs.addition};
}
.hljs > .bd-codeblock-table > tr > td > .hljs-deletion {
color: ${this.hljs.deletion};
}
.hljs > .bd-codeblock-table > tr > td > .hljs-regexp {
color: ${this.hljs.regexp};
}
.hljs > .bd-codeblock-table > tr > td > .hljs-doctag {
color: ${this.hljs.doctag};
}
.hljs > .bd-codeblock-table > tr > td > .hljs-built_in {
color: ${this.hljs.built_in};
}
.hljs > .bd-codeblock-table > tr > td > .hljs-attr {
color: ${this.hljs.attr_1};
}
.hljs > .bd-codeblock-table > tr > td .hljs-nomarkup > span {
color: ${this.hljs.nomarkup};
}
.hljs > .bd-codeblock-table > tr > td .hljs-section {
color: ${this.hljs.section};
}
.hljs > .bd-codeblock-table > tr > td .hljs-meta {
color: ${this.hljs.meta};
}
.hljs > .bd-codeblock-table > tr > td .hljs-literal {
color: ${this.hljs.literal};
}
.hljs > .bd-codeblock-table > tr > td .hljs-title {
color: ${this.hljs.title};
}
.hljs > .bd-codeblock-table > tr > td .hljs-keyword {
color: ${this.hljs.keyword};
}
.hljs > .bd-codeblock-table > tr > td .hljs-selector-tag {
color: ${this.hljs.selector_tag};
}
.hljs > .bd-codeblock-table > tr > td .hljs-selector-class {
color: ${this.hljs.selector_class};
}
.hljs > .bd-codeblock-table > tr > td .hljs-attribute {
color: ${this.hljs.attribute};
}
.hljs > .bd-codeblock-table > tr > td .hljs-symbol {
color: ${this.hljs.symbol};
}
.hljs > .bd-codeblock-table > tr > td .hljs-number {
color: ${this.hljs.number};
}
.hljs > .bd-codeblock-table > tr > td .hljs-string {
color: ${this.hljs.string};
}
.hljs > .bd-codeblock-table > tr > td .hljs-subst {
color: ${this.hljs.subst};
}
.hljs > .bd-codeblock-table > tr > td .hljs-code {
color: ${this.hljs.code};
}
.hljs > .bd-codeblock-table > tr > td .hljs-comment {
color: ${this.hljs.comment};
}
.hljs > .bd-codeblock-table > tr > td .hljs-quote {
color: ${this.hljs.quote};
}
.hljs > .bd-codeblock-table > tr > td .hljs-variable {
color: ${this.hljs.variable};
}
.hljs > .bd-codeblock-table > tr > td .hljs-template-variable {
color: ${this.hljs.template_variable};
}
.hljs > .bd-codeblock-table > tr > td .hljs-meta-string {
color: ${this.hljs.meta_string};
}
// Chat CB
.codeLine-14BKbG > span > span {
color: ${this.hljs.text};
}
.codeLine-14BKbG > span > span > span > .hljs-tag {
color: ${this.hljs.tag};
}
.codeLine-14BKbG > span > span > span > .hljs-tag > .hljs-name {
color: ${this.hljs.name};
}
.codeLine-14BKbG > span > span > span > .hljs-tag > .hljs-attr {
color: ${this.hljs.attr_2};
}
.codeLine-14BKbG > span > span > .bash > .hljs-built_in {
color: ${this.hljs.built_in};
}
.codeLine-14BKbG > span > span > .bash > .hljs-variable {
color: ${this.hljs.variable};
}
.codeLine-14BKbG > span > span > .hljs-tag {
color: ${this.hljs.tag} !important;
}
.codeLine-14BKbG > span > span > .hljs-tag > .hljs-name {
color: ${this.hljs.tag};
}
.codeLine-14BKbG > span > span > .hljs-tag > .hljs-attr {
color: ${this.hljs.tag};
}
.codeLine-14BKbG > span > span > .hljs-function > .hljs-params {
color: ${this.hljs.params};
}
.codeLine-14BKbG > span > span > .hljs-function > .hljs-params > .hljs-type {
color: ${this.hljs.type};
}
.codeLine-14BKbG > span > span > .hljs-params {
color: ${this.hljs.params};
}
.codeLine-14BKbG > span > span > .hljs-params > .hljs-built_in {
color: ${this.hljs.built_in};
}
.codeLine-14BKbG > span > span > .hljs-selector-attr {
color: ${this.hljs.selector_attr};
}
.codeLine-14BKbG > span > span > .hljs-type {
color: ${this.hljs.type};
}
.codeLine-14BKbG > span > span > .hljs-selector-id {
color: ${this.hljs.selector_id};
}
.codeLine-14BKbG > span > span > .hljs-selector-pseudo {
color: ${this.hljs.selector_pseudo};
}
.codeLine-14BKbG > span > span > .hljs-bullet {
color: ${this.hljs.bullet};
}
.codeLine-14BKbG > span > span > .hljs-addition {
color: ${this.hljs.addition};
}
.codeLine-14BKbG > span > span > .hljs-deletion {
color: ${this.hljs.deletion};
}
.codeLine-14BKbG > span > span > .hljs-regexp {
color: ${this.hljs.regexp};
}
.codeLine-14BKbG > span > span > .hljs-doctag {
color: ${this.hljs.doctag};
}
.codeLine-14BKbG > span > span > .hljs-built_in {
color: ${this.hljs.built_in};
}
.codeLine-14BKbG > span > span > .hljs-attr {
color: ${this.hljs.attr_1};
}
.codeLine-14BKbG > span > span .hljs-nomarkup > span {
color: ${this.hljs.nomarkup};
}
.codeLine-14BKbG > span > span .hljs-section {
color: ${this.hljs.section};
}
.codeLine-14BKbG > span > span .hljs-meta {
color: ${this.hljs.meta};
}
.codeLine-14BKbG > span > span .hljs-literal {
color: ${this.hljs.literal};
}
.codeLine-14BKbG > span > span .hljs-title {
color: ${this.hljs.title};
}
.codeLine-14BKbG > span > span .hljs-keyword {
color: ${this.hljs.keyword};
}
.codeLine-14BKbG > span > span .hljs-selector-tag {
color: ${this.hljs.selector_tag};
}
.codeLine-14BKbG > span > span .hljs-selector-class {
color: ${this.hljs.selector_class};
}
.codeLine-14BKbG > span > span .hljs-attribute {
color: ${this.hljs.attribute};
}
.codeLine-14BKbG > span > span .hljs-symbol {
color: ${this.hljs.symbol};
}
.codeLine-14BKbG > span > span .hljs-number {
color: ${this.hljs.number};
}
.codeLine-14BKbG > span > span .hljs-string {
color: ${this.hljs.string};
}
.codeLine-14BKbG > span > span .hljs-subst {
color: ${this.hljs.subst};
}
.codeLine-14BKbG > span > span .hljs-code {
color: ${this.hljs.code};
}
.codeLine-14BKbG > span > span .hljs-comment {
color: ${this.hljs.comment};
}
.codeLine-14BKbG > span > span .hljs-quote {
color: ${this.hljs.quote};
}
.codeLine-14BKbG > span > span .hljs-variable {
color: ${this.hljs.variable};
}
.codeLine-14BKbG > span > span .hljs-template-variable {
color: ${this.hljs.template_variable};
}
.codeLine-14BKbG > span > span .hljs-meta-string {
color: ${this.hljs.meta_string};
}
`
}
};
};
return plugin(Plugin, Api);
})(global.ZeresPluginLibrary.buildPlugin(config));
})();
/*@end@*/