aboutsummaryrefslogtreecommitdiff
path: root/captain/template.f90
diff options
context:
space:
mode:
authorJeffrey Armstrong <jeff@approximatrix.com>2021-03-26 13:54:00 -0400
committerJeffrey Armstrong <jeff@approximatrix.com>2021-03-26 13:54:00 -0400
commit0b8ec300ca4f2f2c3ce09d14ac1eed5478ea6420 (patch)
treed5a0dd22d26368ff5ef3f1e9da064119bab715ec /captain/template.f90
parent13f8f7e0e5b2361a5d3aa3f3a21519b03cd4c9c2 (diff)
downloadlevitating-0b8ec300ca4f2f2c3ce09d14ac1eed5478ea6420.tar.gz
levitating-0b8ec300ca4f2f2c3ce09d14ac1eed5478ea6420.zip
Template rendering implemented. Added configuration and external url handling procedure stubs
Diffstat (limited to 'captain/template.f90')
-rw-r--r--captain/template.f9075
1 files changed, 72 insertions, 3 deletions
diff --git a/captain/template.f90 b/captain/template.f90
index 3e1f2bc..9543c42 100644
--- a/captain/template.f90
+++ b/captain/template.f90
@@ -38,6 +38,7 @@ implicit none
procedure :: assign_string => template_assign_string
procedure :: render_unit => template_render_unit
procedure :: render_filename => template_render_filename
+ procedure :: evaluate => template_evaluate
generic :: render => render_unit, render_filename
generic :: assign => assign_integer, assign_string
@@ -248,15 +249,83 @@ contains
class(template)::self
integer, intent(in)::unum
- integer::input
-
- open(newunit=input, file=self%base_filename, status="old", form="formatted", action="read")
+ character::this_char, last_char
+ character(256)::brace_internals
+ character(len=:), pointer::replacement
+ integer::input, istat, i
+ open(newunit=input, file=self%base_filename, status="old", form="formatted", action="read")
+ last_char = ' '
+ read(input, '(A1)', iostat=istat) this_char
+ do while(istat == 0)
+ if(this_char /= '{') then
+ if(last_char == '{') then
+ write(unum, '(A1)', advance='no') last_char
+ end if
+ write(unum, '(A1)', advance='no') this_char
+
+ ! Two curly braces
+ else if(last_char == '{') then
+
+ brace_internals = ' '
+
+ read(input, '(A1)', iostat=istat) this_char
+ i = 1
+ do while(istat == 0 .and. .not. (this_char == '}' .and. last_char == '}'))
+ brace_internals(i:i) = this_char
+
+ i = i + 1
+ last_char = this_char
+ read(input, '(A1)', iostat=istat) this_char
+ end do
+ brace_internals(i:i) = ' ' ! Remove trailing bracket
+ brace_internals = adjustl(brace_internals)
+
+ replacement => self%evaluate(brace_internals)
+
+ if(associated(replacement)) then
+ do i=1, len_trim(replacement)
+ write(unum, '(A1)', advance='no') replacement(i:i)
+ end do
+ replacement => null() ! do not free - internal strings
+ end if
+
+ end if
+
+ last_char = this_char
+ read(input, '(A1)', iostat=istat) this_char
+ end do
close(input)
end subroutine template_render_unit
+ function template_evaluate(self, txt) result(res)
+ implicit none
+
+ class(template)::self
+ character(*), intent(in)::txt
+ character(:), pointer::res
+
+ integer::i
+
+ res => null()
+
+ ! Right now, we only support straight-up variables
+ do i = 1, size(self%variables)
+ if(self%variables(i)%vtype == VTYPE_NONE) then
+ exit
+ end if
+
+ if(self%variables(i)%vname == trim(txt) .and. associated(self%variables(i)%vstr)) then
+ res => self%variables(i)%vstr
+ exit
+ end if
+
+ end do
+
+ end function template_evaluate
+
end module page_template \ No newline at end of file