View difference between Paste ID: 3E832x86 and wNf8kU5P
SHOW: | | - or go back to the newest paste.
1
-- Buffer API, By Symmetryc
2
-- Edited by AgentE382 to change ":" OO-syntax to "." OO-syntax. (First step to redirect target based on this.)
3
-- Edited by AgentE382 to add preliminary redirect-target capability.
4
-- Edited by AgentE382 to add full redirect-target functionality.
5
return {
6
	new = function()
7
		local self = {
8
			act = {pos = {}};
9
			pos = {};
10
			back = colors.white;
11
			text = colors.lightGray;
12
			blink = true
13
		}
14
15
		function self.write(_str)
16
			local act = self.act
17
			local selfpos = self.pos
18
			local append = true
19
			if selfpos[1] ~= act.pos[1] or selfpos[2] ~= act.pos[2] then
20
				act[#act + 1] = {term.setCursorPos, selfpos[1], selfpos[2]}
21
				append = false
22
			end
23
			if self.back ~= act.back then
24
				act[#act + 1] = {term.setBackgroundColor, self.back}
25
				act.back = self.back
26
				append = false
27
			end
28
			if self.text ~= act.text then
29
				act[#act + 1] = {term.setTextColor, self.text}
30
				act.text = self.text
31
				append = false
32
			end
33
			if self.blink ~= act.blink then
34
				act[#act + 1] = {term.setCursorBlink, self.blink}
35
				act.blink = self.blink
36
				append = false
37
			end
38
			for line, nl in _str:gmatch("([^\n]*)(\n?)") do
39
				if append then
40
					act[#act][2] = act[#act][2]..line
41
					append = false
42
				else
43
					act[#act + 1] = {term.write, line}
44
				end
45
				selfpos[1] = selfpos[1] + #line
46
				if nl == "\n" then
47
					selfpos[1] = 1
48
					selfpos[2] = selfpos[2] + 1
49
					act[#act + 1] = {term.setCursorPos, 1, selfpos[2]}
50
				end
51
			end
52
			act.pos = {selfpos[1], selfpos[2]}
53
			return self
54
		end;
55
		function self.draw(self)
56
			for i, v in ipairs(self.act) do
57
				if v[3] then
58
					v[1](v[2], v[3])
59
				else
60
					v[1](v[2])
61-
			for i = #act, 1 do
61+
62-
				act[i] = nil
62+
63
			self.act = {}
64
			return self
65
		end;
66
67
		function self.clear()
68
			local a = self.act
69
			for i = #a, 1 do
70
				a[i] = nil
71
			end
72
			return self
73
		end
74
75
		function self.clearLine()
76
			local a = self.act
77
			if a[#a][1] ~= term.clearLine then
78
				a[#a + 1] = {term.clearLine}
79
			end
80
			return self
81
		end
82
83-
			
83+
84
			local p = self.pos
85
			return p[1], p[2]
86
		end
87
88
		function self.setCursorPos(x, y)
89
			local p = self.pos
90-
		self.redirect = term.redirect
90+
91
			return self
92-
		self.restore = term.restore
92+
93
94
		function self.setCursorBlink(state)
95-
			
95+
			self.blink = state
96
			return self
97
		end
98
99
		self.isColor = term.isColor
100
101
		self.getSize = term.getSize
102
103
		function self.redirect(target)
104
			term.redirect(target)
105
			return self
106
		end
107
108
		function self.restore()
109
			term.restore()
110
			return self
111
		end
112
113
		function self.scroll(n)
114
			local a = self.act
115
			if a[#a][1] ~= term.scroll then
116
				a[#a + 1] = {term.scroll, n}
117
			else
118
				local s = a[#a]
119
				s[2] = s[2] + n
120
			end
121
			return self
122
		end
123
124
		function self.setTextColor(color)
125
			self.text = color
126
			return self
127
		end
128
129
		function self.setBackgroundColor(color)
130
			self.back = color
131
			return self
132
		end
133
134
		return self
135
	end;
136
}