attr_update Subroutine

public subroutine attr_update(key, valin, mono_valin)

!>

NAME

attr_update(3f) - [M_attr] update internal dictionary given keyword
                  and value
(LICENSE:MIT)

SYNOPSIS

subroutine attr_update(key,val)

 character(len=*),intent(in)           :: key
 character(len=*),intent(in),optional  :: val
 character(len=*),intent(in),optional  :: mono_val

DESCRIPTION

Update internal dictionary in M_attr(3fm) module.

OPTIONS

key       name of keyword to add, replace, or delete from dictionary
val       if present add or replace value associated with keyword. If
          not present remove keyword entry from dictionary.
mono_val  if present add or replace second value associated with
          keyword used for plain text mode.
          Must only be specified if VAL is also specified.

KEYWORDS

The following keywords are defined by default

colors:

  r,red     c,cyan     w,white
  g,green   m,magenta  e,ebony
  b,blue    y,yellow

If the color keywords are capitalized they control the text background
instead of the text color.

attributes:

  ul,underline
  it,italics (often produces inverse colors on many devices

EXAMPLE

Sample program

  program demo_update
  use M_attr, only : attr, attr_update
     write(*,'(a)') attr('<clear>TEST CUSTOMIZATIONS:')
     ! add custom keywords
     call attr_update('blink',char(27)//'[5m')
     call attr_update('/blink',char(27)//'[25m')
     write(*,*)
     write(*,'(a)') attr('<blink>Items for Friday</blink>')
     call attr_update('ouch',attr( &
     ' <R><bo><w>BIG mistake!</R></w> '))
     write(*,*)
     write(*,'(a)') attr('<ouch> Did not see that coming.')
     write(*,*)
     write(*,'(a)') attr( &
     'ORIGINALLY: <r>Apple</r>, <b>Sky</b>, <g>Grass</g>')
     ! delete
     call attr_update('r')
     call attr_update('/r')
     ! replace (or create)
     call attr_update('b','<<<<')
     call attr_update('/b','>>>>')
     write(*,*)
     write(*,'(a)') attr( &
     'CUSTOMIZED: <r>Apple</r>, <b>Sky</b>, <g>Grass</g>')
  end program demo_update

AUTHOR

John S. Urban, 2021

LICENSE

MIT

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: key
character(len=*), intent(in), optional :: valin
character(len=*), intent(in), optional :: mono_valin

Source Code

subroutine attr_update(key,valin,mono_valin)
character(len=*),intent(in)           :: key
character(len=*),intent(in),optional  :: valin
character(len=*),intent(in),optional  :: mono_valin
integer                               :: place
character(len=:),allocatable          :: val
character(len=:),allocatable          :: mono_val

if(.not.allocated(mode))then  ! set substitution mode
   mode='color' ! 'color'|'raw'|'plain'
   call vt102()
endif

if(present(mono_valin))then
   mono_val=mono_valin
else
   mono_val=''
endif

if(present(valin))then
   val=valin
   ! find where string is or should be
   call locate(keywords,key,place)
   ! if string was not found insert it
   if(place.lt.1)then
      call insert(keywords,key,iabs(place))
      call insert(values,val,iabs(place))
      call insert(mono_values,mono_val,iabs(place))
   else
      call replace(values,val,place)
      call replace(mono_values,mono_val,place)
   endif
else
   call locate(keywords,key,place)
   if(place.gt.0)then
      call remove(keywords,place)
      call remove(values,place)
      call remove(mono_values,place)
   endif
endif
end subroutine attr_update