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