Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(xml_tag), | intent(inout) | :: | self | XML tag. |
||
character(len=*), | intent(in) | :: | attribute(1:) | Attribute name/value pair [1:2]. |
||
logical, | intent(in), | optional | :: | sanitize_value | Sanitize attribute value. |
Add one attribute name/value pair.
Type | Visibility | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|---|
type(string), | public, | allocatable | :: | new_attribute(:,:) | Temporary storage for attributes. |
||
logical, | public | :: | sanitize_value_ | Sanitize attribute value. |
|||
logical, | public | :: | is_updated | Flag to check if the attribute has been updeted. |
|||
integer(kind=I4P), | public | :: | a | Counter. |
pure subroutine add_single_attribute(self, attribute, sanitize_value)
!---------------------------------------------------------------------------------------------------------------------------------
!< Add one attribute name/value pair.
!<
!< @note Leading and trailing white spaces are trimmed out by attribute's name.
!---------------------------------------------------------------------------------------------------------------------------------
class(xml_tag), intent(inout) :: self !< XML tag.
character(*), intent(in) :: attribute(1:) !< Attribute name/value pair [1:2].
logical, intent(in), optional :: sanitize_value !< Sanitize attribute value.
type(string), allocatable :: new_attribute(:,:) !< Temporary storage for attributes.
logical :: sanitize_value_ !< Sanitize attribute value.
logical :: is_updated !< Flag to check if the attribute has been updeted.
integer(I4P) :: a !< Counter.
!---------------------------------------------------------------------------------------------------------------------------------
!---------------------------------------------------------------------------------------------------------------------------------
sanitize_value_ = .false. ; if (present(sanitize_value)) sanitize_value_ = sanitize_value
if (self%attributes_number>0) then
is_updated = .false.
update_if_already_present: do a=1, self%attributes_number
if (self%attribute(1, a)==attribute(1)) then
if (sanitize_value_) then
self%attribute(2, a) = trim(adjustl(attribute(2)))
else
self%attribute(2, a) = attribute(2)
endif
is_updated = .true.
exit update_if_already_present
endif
enddo update_if_already_present
if (.not.is_updated) then
allocate(new_attribute(1:2, 1:self%attributes_number+1))
new_attribute(1:2, 1:self%attributes_number) = self%attribute
new_attribute(1, self%attributes_number+1) = trim(adjustl(attribute(1)))
if (sanitize_value_) then
new_attribute(2, self%attributes_number+1) = trim(adjustl(attribute(2)))
else
new_attribute(2, self%attributes_number+1) = attribute(2)
endif
call move_alloc(from=new_attribute, to=self%attribute)
self%attributes_number = self%attributes_number + 1
endif
else
call self%alloc_attributes(Na=1)
self%attribute(1, 1) = trim(adjustl(attribute(1)))
if (sanitize_value_) then
self%attribute(2, 1) = trim(adjustl(attribute(2)))
else
self%attribute(2, 1) = attribute(2)
endif
endif
!---------------------------------------------------------------------------------------------------------------------------------
endsubroutine add_single_attribute