#----------------------------------------------------------------------------------------------------------------------
# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*-
# vim: ft=zsh sw=2 ts=2 et
#----------------------------------------------------------------------------------------------------------------------
#
# $1 - PREBUFFER
# $2 - BUFFER
#
-fast-highlight-string-process() {
  builtin emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace}
  builtin setopt extended_glob typeset_silent no_short_loops rc_quotes no_auto_pushd

  local -A pos_to_level level_to_pos pair_map final_pairs
  local input=$1$2 _mybuf=$1$2 __style __quoting
  integer __idx=0 __pair_idx __level=0 __start __end
  local -a match mbegin mend

  pair_map=( "(" ")" "{" "}" "[" "]" )

  while [[ $_mybuf = (#b)([^"{}()[]\\\"'"]#)((["({[]})\"'"])|[\\](*))(*) ]]; do
    if [[ -n ${match[4]} ]] {
      __idx+=${mbegin[2]}
      [[ $__quoting = \' ]] && _mybuf=${match[4]} || { _mybuf=${match[4]:1}; (( ++ __idx )); }
    } else {
      __idx+=${mbegin[2]}
      [[ -z $__quoting && -z ${_FAST_COMPLEX_BRACKETS[(r)$((__idx-${#PREBUFFER}-1))]} ]] && {
        if [[ ${match[2]} = ["({["] ]]; then
          pos_to_level[$__idx]=$(( ++__level ))
          level_to_pos[$__level]=$__idx
        elif [[ ${match[2]} = ["]})"] ]]; then
          if (( __level > 0 )); then
            __pair_idx=${level_to_pos[$__level]}
            pos_to_level[$__idx]=$(( __level -- ))
            [[ ${pair_map[${input[__pair_idx]}]} = ${input[__idx]} ]] && {
              final_pairs[$__idx]=$__pair_idx
              final_pairs[$__pair_idx]=$__idx
            }
            else
              pos_to_level[$__idx]=-1
          fi
        fi
      }
      if [[ ${match[2]} = \" && $__quoting != \' ]] {
        [[ $__quoting = '"' ]] && __quoting="" || __quoting='"';
      }
      if [[ ${match[2]} = \' && $__quoting != \" ]] {
        if [[ $__quoting = ("'"|"$'") ]] {
          __quoting=""
        } else {
          if [[ $match[1] = *\$ ]] {
            __quoting="\$'";
          } else {
            __quoting="'";
          }
        }
      }
      _mybuf=${match[5]}
    }
  done

  for __idx in ${(k)pos_to_level}; do
    (( ${+final_pairs[$__idx]} )) && \
      __style=${FAST_THEME_NAME}bracket-level-$(( ( (pos_to_level[$__idx]-1) % 3 ) + 1 )) || \
        __style=${FAST_THEME_NAME}unknown-token
    (( __start=__idx-${#PREBUFFER}-1, __end=__idx-${#PREBUFFER}, __start >= 0 )) && \
      reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}")
  done

  # If cursor is on a bracket, then highlight corresponding bracket, if any.
  if [[ $WIDGET != zle-line-finish ]]; then
    __idx=$(( CURSOR + 1 ))
    if (( ${+pos_to_level[$__idx]} )) && (( ${+final_pairs[$__idx]} )); then
      (( __start=final_pairs[$__idx]-${#PREBUFFER}-1, __end=final_pairs[$__idx]-${#PREBUFFER}, __start >= 0 )) && \
        reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}paired-bracket]}") && \
        reply+=("$CURSOR $__idx ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}paired-bracket]}")
    fi
  fi
  return 0
}
