SHOW:
|
|
- or go back to the newest paste.
1 | - | -- pastebin get z9i36a06 colcode |
1 | + | -- pastebin get 7pLzbuZp colcode |
2 | -- main intended change: optimize JSON output | |
3 | ||
4 | local colors_names = { --for use with colors api, you see. | |
5 | ["0"] = colors.black, | |
6 | ["1"] = colors.blue, | |
7 | ["2"] = colors.green, | |
8 | ["3"] = colors.cyan, | |
9 | ["4"] = colors.red, | |
10 | ["5"] = colors.purple, | |
11 | ["6"] = colors.orange, | |
12 | ["7"] = colors.lightGray, | |
13 | ["8"] = colors.gray, | |
14 | ["9"] = colors.blue, --they don't translate perfectly, okay?? | |
15 | ["a"] = colors.lime, | |
16 | ["b"] = colors.lightBlue, | |
17 | ["c"] = colors.red, --two reds?? but the colors API has as many colors! | |
18 | ["d"] = colors.magenta, | |
19 | ["e"] = colors.yellow, | |
20 | ["f"] = colors.white, | |
21 | } | |
22 | ||
23 | local codeNames = { --just for checking, not for any translation | |
24 | ["k"] = "obfuscate", | |
25 | ["o"] = "italic", | |
26 | ["l"] = "bold", | |
27 | ["m"] = "strikethrough", | |
28 | ["n"] = "underline", | |
29 | ["r"] = "reset", | |
30 | } | |
31 | ||
32 | cleanColorFormat = function(i) | |
33 | local color = "white" | |
34 | - | local colorout = "" --for term.blit'ing |
34 | + | |
35 | local bold = false | |
36 | - | local col = "0" |
36 | + | |
37 | - | local cx,cy |
37 | + | |
38 | local italic = false | |
39 | ||
40 | local text = "" | |
41 | ||
42 | local output = {} | |
43 | local changed = false | |
44 | local opos = 1 | |
45 | - | col = "0" |
45 | + | |
46 | for a = 1, #i do | |
47 | if not output[opos] then output[opos] = {} end | |
48 | if i.color ~= color then | |
49 | changed = true | |
50 | color = i.color | |
51 | - | cx,cy = term.getCursorPos() |
51 | + | output[opos].color = color |
52 | - | if cx+#words[wordNo] > scr_x then |
52 | + | |
53 | - | term.setCursorPos(1,cy+1) |
53 | + | if i.obfuscated ~= obfuscated then |
54 | - | end |
54 | + | changed = true |
55 | obfuscated = i.obfuscated | |
56 | output[opos].obfuscated = obfuscated | |
57 | end | |
58 | if i.bold ~= bold then | |
59 | changed = true | |
60 | bold = i.bold | |
61 | - | colorout = colorout..col |
61 | + | output[opos].bold = bold |
62 | end | |
63 | if i.strikethrough ~= strikethrough then | |
64 | - | cx,cy = term.getCursorPos() |
64 | + | changed = true |
65 | - | if cx+#words[wordNo] > scr_x then |
65 | + | strikethrough = i.strikethrough |
66 | - | term.setCursorPos(1,cy+1) |
66 | + | output[opos].strikethrough = strikethrough |
67 | end | |
68 | if i.underline ~= underline then | |
69 | changed = true | |
70 | underline = i.underline | |
71 | output[opos].underline = underline | |
72 | end | |
73 | - | return output, colorout |
73 | + | if i.italic ~= italic then |
74 | changed = true | |
75 | italic = i.italic | |
76 | output[opos].italic = italic | |
77 | end | |
78 | ||
79 | if changed then | |
80 | text = "" | |
81 | opos = opos + 1 | |
82 | if not output[opos] then output[opos] = {} end | |
83 | changed = false | |
84 | end | |
85 | text = text..i[a].text | |
86 | output[opos].text = text | |
87 | end | |
88 | -- if text ~= "" then | |
89 | -- output[opos].text = text | |
90 | -- end | |
91 | -- for a = #output, 1, -1 do | |
92 | -- if #output[a] == 0 then | |
93 | -- table.remove(output,a) | |
94 | -- end | |
95 | -- end | |
96 | return output | |
97 | end | |
98 | ||
99 | filterColors = function(str,doprint) --takes all color codes out of a string when appropriate. having second argument true makes it write! | |
100 | local p = 1 | |
101 | local output = "" | |
102 | local code = "&" | |
103 | local col = "f" | |
104 | while p <= #str do | |
105 | if str:sub(p,p) == code then | |
106 | if colors_names[str:sub(p+1,p+1)] then | |
107 | col = str:sub(p+1,p+1) | |
108 | p = p + 1 | |
109 | elseif codeNames[str:sub(p+1,p+1)] then | |
110 | if str:sub(p+1,p+1) == "r" then | |
111 | col = "f" | |
112 | end | |
113 | p = p + 1 | |
114 | else | |
115 | if doprint then | |
116 | term.setTextColor(colors_names[col]) | |
117 | write(str:sub(p,p)) | |
118 | end | |
119 | end | |
120 | p = p + 1 | |
121 | else | |
122 | output = output..str:sub(p,p) | |
123 | if doprint then | |
124 | term.setTextColor(colors_names[col]) | |
125 | write(str:sub(p,p)) | |
126 | end | |
127 | p = p + 1 | |
128 | end | |
129 | end | |
130 | return output | |
131 | end | |
132 | ||
133 | local colnames = { | |
134 | ["0"] = "black", | |
135 | ["1"] = "dark_blue", | |
136 | ["2"] = "dark_green", | |
137 | ["3"] = "dark_aqua", | |
138 | ["4"] = "dark_red", | |
139 | ["5"] = "dark_purple", | |
140 | ["6"] = "gold", | |
141 | ["7"] = "gray", | |
142 | ["8"] = "dark_gray", | |
143 | ["9"] = "blue", | |
144 | ["a"] = "green", | |
145 | ["b"] = "aqua", | |
146 | ["c"] = "red", | |
147 | ["d"] = "light_purple", | |
148 | ["e"] = "yellow", | |
149 | ["f"] = "white", | |
150 | } | |
151 | ||
152 | colorFormat = function(str,returnTable) --returns a LARGE table in JSON format for use with commands.tellraw() | |
153 | local color = false | |
154 | local obfuscated = false | |
155 | local bold = false | |
156 | local strikethrough = false | |
157 | local underline = false | |
158 | local italic = false | |
159 | ||
160 | local code = "&" --ONE CHARACTER | |
161 | local pos = 1 | |
162 | local opos = 1 | |
163 | local output = {} | |
164 | ||
165 | while pos <= #str do | |
166 | output[opos] = {} | |
167 | if str:sub(pos,pos) == code and pos < #str then | |
168 | local changed = false | |
169 | if colnames[str:sub(pos+1,pos+1)] then | |
170 | color = str:sub(pos+1,pos+1) | |
171 | changed = true | |
172 | - | blitWrap = function(text,txt,bg) |
172 | + | |
173 | - | local wordNo = 1 |
173 | + | |
174 | - | local words = explode(" ",text) |
174 | + | |
175 | - | local lines = 0 |
175 | + | |
176 | - | local cx,cy |
176 | + | |
177 | - | for a = 1, #text do |
177 | + | |
178 | - | cx,cy = term.getCursorPos() |
178 | + | |
179 | - | if text:sub(a,a) == " " and text:sub(a-1,a-1) ~= " " and a > 1 then |
179 | + | |
180 | - | wordNo = wordNo + 1 |
180 | + | |
181 | - | if cx + #words[wordNo] > scr_x then |
181 | + | |
182 | - | term.setCursorPos(1,cy+1) |
182 | + | |
183 | - | lines = lines + 1 |
183 | + | |
184 | changed = true | |
185 | end | |
186 | - | cx,cy = term.getCursorPos() |
186 | + | |
187 | - | if text:sub(a,a) == "\n" then |
187 | + | |
188 | - | term.setCursorPos(1,cy+1) |
188 | + | |
189 | - | lines = lines + 1 |
189 | + | |
190 | - | elseif not (cx == 1 and text:sub(a,a) == " ") then |
190 | + | |
191 | - | term.blit(text:sub(a,a),txt:sub(a,a),bg:sub(a,a)) |
191 | + | |
192 | changed = true | |
193 | end | |
194 | - | return lines |
194 | + | |
195 | underline = true | |
196 | changed = true | |
197 | - | writef = function(txt) |
197 | + | |
198 | - | --Write Formatted (accepts color codes / ignores formatting codes). Returns lines. |
198 | + | |
199 | - | --Wraps text, finally! |
199 | + | |
200 | - | local tx = term.getTextColor() |
200 | + | |
201 | - | local text, textCol = filterColors(txt) |
201 | + | |
202 | - | local bgCol = blit_names[term.getBackgroundColor()]:rep(#text) |
202 | + | |
203 | - | local out = blitWrap(text,textCol,bgCol) |
203 | + | |
204 | - | term.setTextColor(tx) |
204 | + | |
205 | - | return out |
205 | + | |
206 | else | |
207 | output[opos].text = str:sub(pos,pos) | |
208 | - | printf = function(txt) |
208 | + | |
209 | - | return writef(tostring(txt.."\n")) |
209 | + | |
210 | else | |
211 | output[opos].text = str:sub(pos,pos) | |
212 | pos = pos + 1 | |
213 | end | |
214 | output[opos].color = colnames[color or "f"] | |
215 | output[opos].obfuscated = obfuscated | |
216 | output[opos].bold = bold | |
217 | output[opos].strikethrough = strikethrough | |
218 | output[opos].underline = underline | |
219 | output[opos].italic = italic | |
220 | opos = opos + 1 | |
221 | end | |
222 | if returnTable then | |
223 | return output | |
224 | else | |
225 | return textutils.serialiseJSON(output) | |
226 | end | |
227 | end |