module layout implicit none integer, parameter::line_type_text = 1 integer, parameter::line_type_preformatted = 2 integer, parameter::line_type_link = 3 integer, parameter::line_type_indicator = 99 type::line character(len=:), allocatable::text integer::line_type type(line), pointer::next end type line contains subroutine layout_lines(first_line, rendering_engine) use render implicit none type(line), pointer::first_line class(renderer)::rendering_engine type(line), pointer::walker logical::laying_out walker => first_line laying_out = .true. call rendering_engine%prepare_for_layout() do while(laying_out) select case (walker%line_type) case (line_type_text) call render_proportional(rendering_engine, walker%text) case (line_type_preformatted) call render_preformatted(rendering_engine, walker%text) case (line_type_link) call render_link(rendering_engine, walker%text) end select laying_out = associated(walker%next) if(laying_out) then walker => walker%next end if end do end subroutine layout_lines end module layout