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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
|
module dumb_render
use render
implicit none
integer, parameter::width = 79
integer, parameter::height = 24
type, extends(renderer) :: dumb_renderer
integer::link_index
character(len=1024), dimension(height)::link_urls
contains
procedure :: initialize => dumb_initialize
procedure :: prepare_for_layout => prepare_for_dumb_layout
procedure :: text_width => dumb_text_width
procedure :: text_height => dumb_text_height
procedure :: is_text_visible => dumb_text_visible
procedure :: draw_porportional => dumb_text_draw
procedure :: preformatted_width => dumb_text_width
procedure :: preformatted_height => dumb_text_height
procedure :: is_preformatted_visible => dumb_text_visible
procedure :: draw_preformatted => dumb_text_draw
procedure :: link_width => dumb_link_width
procedure :: link_height => dumb_text_height
procedure :: is_link_visible => dumb_text_visible
procedure :: draw_link => dumb_link_draw
end type dumb_renderer
contains
subroutine dumb_initialize(self)
implicit none
class(dumb_renderer)::self
self%max_width = width
self%y = 0
self%link_index = 0
self%link_urls = " "
end subroutine dumb_initialize
subroutine prepare_for_dumb_layout(self)
implicit none
class(dumb_renderer)::self
self%link_index = 0
self%link_urls = " "
! Write a page feed to clear the screen (not really necessary, but...)
write(*, '(A1)', advance='no') char(12)
end subroutine prepare_for_dumb_layout
function store_link(self, url)
implicit none
class(dumb_renderer)::self
character(*), intent(in)::url
integer::store_link
self%link_index = self%link_index + 1
self%link_urls(self%link_index) = url
store_link = self%link_index
end function store_link
function dumb_text_width(self, text)
implicit none
class(dumb_renderer)::self
character(*), intent(in)::text
integer::dumb_text_width
dumb_text_width = len_trim(text)
end function dumb_text_width
function dumb_text_height(self, text)
implicit none
class(dumb_renderer)::self
character(*), intent(in)::text
integer::dumb_text_height
dumb_text_height = 1
end function dumb_text_height
function dumb_text_visible(self, text)
implicit none
class(dumb_renderer)::self
character(*), intent(in)::text
logical::dumb_text_visible
dumb_text_visible = (self%y >= 0 .AND. self%y < 24)
end function dumb_text_visible
subroutine dumb_text_draw(self, text)
implicit none
class(dumb_renderer)::self
character(*), intent(in)::text
integer::limit_x
character(5)::formatting
limit_x = min(len_trim(text), self%max_width)
if(limit_x == 0) then
write(*,*) " "
else
if(limit_x < 10) then
write(formatting, '(A2, I1, A1)') '(A', limit_x, ')'
else
write(formatting, '(A2, I2, A1)') '(A', limit_x, ')'
end if
write(*, formatting) text(1:limit_x)
end if
end subroutine dumb_text_draw
function build_link_text(self, text, idnum) result(res)
implicit none
class(dumb_renderer)::self
character(*), intent(in)::text
integer, intent(in)::idnum
character(width)::res
write(res, '(A1, I3, A2)') '[', idnum,']['
if(len_trim(text) < (width - 7)) then
res = trim(res)//trim(text)//']'
else
res = trim(res)//text(1:(width-7))//']'
end if
end function build_link_text
function dumb_link_width(self, text)
implicit none
class(dumb_renderer)::self
character(*), intent(in)::text
integer::dumb_link_width
character(width)::link
link = build_link_text(self, text, 0)
dumb_link_width = dumb_text_width(self, link)
end function dumb_link_width
subroutine dumb_link_draw(self, text, url)
implicit none
class(dumb_renderer)::self
character(*), intent(in)::text, url
integer::i
character(width)::link
i = store_link(self, url)
link = build_link_text(self, text, i)
call dumb_text_draw(self, link)
end subroutine dumb_link_draw
end module dumb_render
|