-
Notifications
You must be signed in to change notification settings - Fork 20
/
gradient.py
168 lines (154 loc) · 5.62 KB
/
gradient.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
"""This file contains an example of a gradient quirk function."""
import re
import itertools
def rainbow(text):
"""Example implementation of a gradient function,
distributes colors over text, accounting for links,
#memos, @handles, smilies.
Add it as:
Regexp Replace
Regexp: ^(.*)$
Replace With: rainbow(\1)
To customize it:
1. Copy this function.
2. Replace the hex colors in 'gradient' below with your own colors.
3. Replace 'rainbow' above and below with something more fitting :3
You shouldn't enable the 'exclude links and smilies' option, this function
already does that!
There's lots of implementations of this that predate mine,
see: https://paste.0xfc.de/?e60df5a155e93583#AmcgN9cRnCcBycmVMvw6KJ1YLKPXGbaSzZLbgAhoNCQD
^ There's more useful info here too :3c
"""
# Values of 'gradient' can be any amount of hex/RGB colors.
gradient = [
"#ff0000",
"#ff8000",
"#ffff00",
"#80ff00",
"#00ff00",
"#00ff80",
"#00ffff",
"#0080ff",
"#0000ff",
"#8000ff",
"#ff00ff",
"#ff0080",
]
# Set base distribution of colors over text,
# stored as list of lists.
colors_and_positions = []
for color_pos, color in enumerate(gradient):
ratio = len(text) / len(gradient) # To account for text length.
colors_and_positions.append([color, round(color_pos * ratio)])
# Iterate through match objects representing all links/smilies in text,
# if a color tag is going to be placed within it,
# move its position to after the link/smilies/thingy.
match_chain = itertools.chain(
re.finditer(_urlre, text),
re.finditer(_smilere, text),
re.finditer(_memore, text),
re.finditer(_handlere, text),
re.finditer(_alternian_begin, text),
re.finditer(_alternian_end, text),
)
for match in match_chain:
for color_and_position in colors_and_positions:
# color_and_position[1] is pos
if (
color_and_position[1] >= match.start()
and color_and_position[1] <= match.end()
):
# Move to 1 character after link.
color_and_position[1] = match.end() + 1
# Iterate through characters in text and write them to the output,
# if a color tag should be placed, add it before the character.
output = ""
for char_pos, char in enumerate(text):
# Add color if at position.
for color_and_position in colors_and_positions:
# color_and_position[0] is color
# color_and_position[1] is pos
if char_pos == color_and_position[1]:
# Add closing bracket for previous color.
output += "</c>"
# Add color
output += f"<c={color_and_position[0]}>"
# Add character.
output += char
return output
rainbow.command = "rainbow"
# These can't always be imported from their original functions,
# since those functions won't always be accessible from builds.
# List of smilies.
smiledict = {
":rancorous:": "pc_rancorous.png",
":apple:": "apple.png",
":bathearst:": "bathearst.png",
":cathearst:": "cathearst.png",
":woeful:": "pc_bemused.png",
":sorrow:": "blacktear.png",
":pleasant:": "pc_pleasant.png",
":blueghost:": "blueslimer.gif",
":slimer:": "slimer.gif",
":candycorn:": "candycorn.png",
":cheer:": "cheer.gif",
":duhjohn:": "confusedjohn.gif",
":datrump:": "datrump.png",
":facepalm:": "facepalm.png",
":bonk:": "headbonk.gif",
":mspa:": "mspa_face.png",
":gun:": "mspa_reader.gif",
":cal:": "lilcal.png",
":amazedfirman:": "pc_amazedfirman.png",
":amazed:": "pc_amazed.png",
":chummy:": "pc_chummy.png",
":cool:": "pccool.png",
":smooth:": "pccool.png",
":distraughtfirman:": "pc_distraughtfirman.png",
":distraught:": "pc_distraught.png",
":insolent:": "pc_insolent.png",
":bemused:": "pc_bemused.png",
":3:": "pckitty.png",
":mystified:": "pc_mystified.png",
":pranky:": "pc_pranky.png",
":tense:": "pc_tense.png",
":record:": "record.gif",
":squiddle:": "squiddle.gif",
":tab:": "tab.gif",
":beetip:": "theprofessor.png",
":flipout:": "weasel.gif",
":befuddled:": "what.png",
":pumpkin:": "whatpumpkin.png",
":trollcool:": "trollcool.png",
":jadecry:": "jadespritehead.gif",
":ecstatic:": "ecstatic.png",
":relaxed:": "relaxed.png",
":discontent:": "discontent.png",
":devious:": "devious.png",
":sleek:": "sleek.png",
":detestful:": "detestful.png",
":mirthful:": "mirthful.png",
":manipulative:": "manipulative.png",
":vigorous:": "vigorous.png",
":perky:": "perky.png",
":acceptant:": "acceptant.png",
":olliesouty:": "olliesouty.gif",
":billiards:": "poolballS.gif",
":billiardslarge:": "poolballL.gif",
":whatdidyoudo:": "whatdidyoudo.gif",
":brocool:": "pcstrider.png",
":trollbro:": "trollbro.png",
":playagame:": "saw.gif",
":trollc00l:": "trollc00l.gif",
":suckers:": "Suckers.gif",
":scorpio:": "scorpio.gif",
":shades:": "shades.png",
":honk:": "honk.png",
}
# Regular expression templates for detecting links/smilies.
_smilere = re.compile("|".join(list(smiledict.keys())))
_urlre = re.compile(r"(?i)(?:^|(?<=\s))(?:(?:https?|ftp)://|magnet:)[^\s]+")
_memore = re.compile(r"(\s|^)(#[A-Za-z0-9_]+)")
_handlere = re.compile(r"(\s|^)(@[A-Za-z0-9_]+)")
_alternian_begin = re.compile(r"<alt>") # Matches get set to alternian font
_alternian_end = re.compile(r"</alt>")