Files
Fortran-docker-mvc/jade.f90
Tommy Parnell a7037b9e92 init
2017-02-20 16:06:45 -05:00

211 lines
6.8 KiB
Fortran

module jade
use string_helpers
implicit none
contains
subroutine jadetemplate(templatefile, unitNo, replacements)
character(len=10000) :: templatefile
integer :: unitNo, i
character(len=*), dimension(10,2) :: replacements
character(len=3) :: AFORMAT = '(a)'
call jadefile(templatefile, 0)
i = 1
do
if ((i > 10) .or. (replacements(i,1) == '')) then
exit
endif
call string_replace(templatefile, '#{' // trim(replacements(i, 1)) // '}', trim(replacements(i, 2)))
i = i + 1
enddo
write(unitNo, AFORMAT) templatefile
endsubroutine
subroutine jadefile(templatefile, unitNo)
character(len=10000) :: templatefile
character(len=80) :: spaceless, tag, closeTag, className, elemID
character(len=1000) :: inputLine, outputLine, innerContent
integer :: templater, io, spaceCount, unitNo, lastSpaceCount, lastIndent
integer, dimension (0:30) :: spaceLevels
character(len=80), dimension (0:30) :: tagLevels
character(len=3) :: AFORMAT = '(a)'
open(newunit=templater, file=templatefile)
templatefile = ''
lastSpaceCount = -1
lastIndent = 0
do
read(templater, '(A)', IOSTAT=io) inputLine
if (io < 0) then
outputLine = '</' // &
trim(tagLevels(lastIndent)) // &
'>'
if (unitNo == 0) then
templatefile = trim(templatefile) // outputLine
else
write(unitNo, AFORMAT) outputLine
endif
exit
endif
spaceless = trim(inputLine)
call compact(spaceless)
spaceless = trim(spaceless) // ' '
spaceCount = index(inputLine, trim(spaceless))
className = ''
elemID = ''
innerContent = spaceless(index(spaceless, ' ') + 1:)
if (spaceless(1:1) == '.') then
! starts with a class definition
tag = 'div'
className = spaceless(2: index(spaceless, ' ') - 1)
if (index(className, '(') > 0) then
tag = trim(tag) // className( index(className, '(') : index(className, ')'))
className = className(1 : index(className, '#') - 1)
endif
if (index(className, '#') > 0) then
className = className(1 : index(className, '#') - 1)
elemID = spaceless(index(spaceless, '#') : index(spaceless, ' '))
endif
else
! starts with an ID definition
if (spaceless(1:1) == '#') then
tag = 'div'
elemID = spaceless(2: index(spaceless, ' ') - 1)
if (index(elemID, '(') > 0) then
tag = trim(tag) // elemID( index(elemID, '(') : index(elemID, ')'))
elemID = elemID(1 : index(elemID, '#') - 1)
endif
if (index(elemID, '.') > 0) then
elemID = elemID(1 : index(elemID, '.') - 1)
className = spaceless(index(spaceless, '.') : index(spaceless, ' '))
endif
else
if (spaceless(1:1) == '(') then
! starts with a div attributes
if (index(spaceless, ')') > index(spaceless, ' ')) then
tag = 'div' // spaceless(1: index(spaceless, ')'))
else
tag = 'div' // spaceless(1: index(spaceless, ' ') - 1)
endif
else
! custom tag
tag = spaceless(1: index(spaceless, ' ') - 1)
if (index(tag, '.') > 0 .and. index(tag, '.') < index(tag, '(')) then
tag = tag(1: index(tag, '.') - 1)
className = spaceless(index(spaceless, '.') : index(spaceless, '(') - 1)
endif
if (index(tag, '#') > 0 .and. index(tag, '#') < index(tag, '(')) then
tag = tag(1: index(tag, '#') - 1)
elemID = spaceless(index(spaceless, '#') : index(spaceless, '(') - 1)
endif
if (index(tag, '(') == 0) then
if (index(tag, '#') > 0) then
elemID = tag(index(tag, '#') : index(tag, ' '))
tag = tag(1: index(tag, '#') - 1)
endif
if (index(tag, '.') > 0) then
className = tag(index(tag, '.') : index(tag, ' '))
tag = tag(1: index(tag, '.') - 1)
endif
endif
endif
endif
endif
! handle multiple classes
call string_replace(className, '.', ' ')
! just make sure I don't leave a # in the ID
call string_replace(elemID, '#', '')
if (index(tag, '(') > 0) then
call string_replace(tag, '(', ' ')
call string_replace(tag, ')', ' ')
call string_replace(tag, ',', ' ')
endif
! determine close tag, ahead of time
closeTag = tag
if (index(closeTag, ' ') > 0) then
closeTag = closeTag(1 : index(closeTag, ' '))
endif
if (index(closeTag, '#') > 0) then
closeTag = closeTag(1 : index(closeTag, '#') - 1)
endif
if (index(closeTag, '.') > 0) then
closeTag = closeTag(1 : index(closeTag, '.'))
endif
outputLine = ''
if (lastSpaceCount < spaceCount) then
! went up a level
lastIndent = lastIndent + 1
spaceLevels(lastIndent) = spaceCount
tagLevels(lastIndent) = closeTag
else
if (lastSpaceCount == spaceCount) then
! same level; previous tag is closed; replace with this tag
outputLine = trim(outputLine) // &
'</' // &
trim(tagLevels(lastIndent)) // &
'>'
tagLevels(lastIndent) = closeTag
else
! went down at least one level
do
if (spaceLevels(lastIndent) >= spaceCount) then
! closed or sibling tag
outputLine = trim(outputLine) // &
'</' // &
trim(tagLevels(lastIndent)) // &
'>'
lastIndent = lastIndent - 1
else
! bottomed out; open this tag
lastIndent = lastIndent + 1
tagLevels(lastIndent) = closeTag
spaceLevels(lastIndent) = spaceCount
exit
endif
end do
endif
endif
outputLine = trim(outputLine) // '<' // &
trim(tag) // &
' id="' // trim(elemID) // '"' // &
' class="' // trim(className) // '"'
!if (index(tag, 'img') == 1 .or. index(tag, 'link') == 1) then
! single closing tag
! outputLine = trim(outputLine) // &
! '/>'
!else
! complete opening tag and inner content
outputLine = trim(outputLine) // &
'>' // &
trim(innerContent)
!endif
lastSpaceCount = spaceCount
if (.not. trim(closeTag) == '') then
if (unitNo == 0) then
templatefile = trim(templatefile) // outputLine
else
write(unitNo, AFORMAT) outputLine
endif
endif
end do
close(templater)
endsubroutine
endmodule