#!/bin/sh
##
## HTML <TABLE> tag to line up
##
## author : "Chilbong Kim" <san2(at)linuxchannel.net> http://linuxchannel.net/
## changes :
##    - 2004.11.09 : support null space
##    - 2004.10.28 : support cygwin
##    - 2004.10.14 : support FreeBSD
##    - 2003.04.22 : add comments and usage
##     - 2003.04.20 : new build
##
## download :
##    - don't download 'html2arr.sh'
##    - http://ftp.linuxchannel.net/devel/html2arr/html2arr.sh.tar.gz
##
## usage(example) :
##    shell> tar zxvf html2arr.sh.tar.gz
##    shell> mv html2arr.sh /usr/local/bin/html2arr
##    shell> chmod a+x /usr/local/bin/html2arr
##    shell> html2arr index.html
##    or
##    shell> html2arr index.html login.php xxx.htm

usage()
{
  echo 'HTML <TABLE> tag to lineup' >&2
  echo "usage : `basename $0` [-s|--status] filename.html [filname.html ...]" >&2
  exit 1
}

mktab()
{
  N=$1
  MAKETAB=''
  while [ "$N" -gt "1" ] ; do
    MAKETAB="`echo -e "\t"`$MAKETAB"
    N=`expr $N - 1`
  done
  echo "$MAKETAB"
}

mkspace()
{
  N=$1
  MAKESPACE=''
  while [ "$N" -gt "1" ] ; do
    MAKESPACE=" $MAKESPACE"
    N=`expr $N - 1`
  done
  echo "$MAKESPACE"
}

mklinesplit()
{
  echo "$1" | sed \
    -e "s;^[[:space:]]*;;" \
    -e "s;>[[:space:]]*\(</*TABLE\); >\1;g" \
    -e "s;>[[:space:]]*\(</*table\); >\1;g" \
    -e "s;>[[:space:]]*\(</*Table\); >\1;g" \
    -e "s;\(</TABLE\)><;\1 ><;g" \
    -e "s;\(</table\)><;\1 ><;g" \
    -e "s;\(</Table\)><;\1 ><;g" \
    | tr " " "\n"
}

lineup()
{
  LINE=$1
  MAKETAB=`mktab "$I"`
  for T in $LINE ; do
    if [ -n "`echo $T | grep -i '<TABLE'`" ] ; then
        I=`expr $I + 1`
        MAKETAB=`mktab "$I"`
    fi
    echo "$T" | sed -e "s;^;${MAKETAB};" >> $FILE
    if [ -n "`echo $T | grep -i '</TABLE'`" ] ; then
        I=`expr $I - 1`
        MAKETAB=`mktab "$I"`
    fi
  done
}

tag2arr()
{
  FILE=$1
  L=1
  I=0
  SKIP='nskip'
  CRLF='nskip'

  ## ^M : press Ctrl-V then Ctrl-M, not '^' + 'M'
  ##
  CONTENTS=`sed -e "s; ;;g" \
    -e "s;^[[:space:]]*$;_____CRLF;g" \
    -e "s;[[:space:]]*$;;g" \
    ${FILE}.bak 2>/dev/null | tr " " "\n"`

  TOTAL=`echo "$CONTENTS" | wc -l | sed -e 's; ;;g'`

  ## make new file
  ##
  cat /dev/null > $FILE

  for LINE in $CONTENTS ; do
    [ "X$LINE" = "X_____CRLF" ] &&
    {
        [ -n "$STATUS" ] && echo "$L / $TOTAL $I $SKIP" >&2
        [ "X$CRLF" = "Xnskip" ] && echo "" >> $FILE
        CRLF='skip'
        L=`expr $L + 1`
        continue
    }

    [ -n "`echo $LINE | grep -Ei '<(SCRIPT|STYLE)'`" ] && SKIP='skip'
    [ -n "`echo $LINE | grep -Ei '^[[:space:]]*<(\?|%)'`" ] && SKIP='skip'

    ## print of status
    ##
    [ -n "$STATUS" ] && echo "$L / $TOTAL $I $SKIP" >&2

    if [ "X$SKIP" = "Xskip" ] ; then
        echo "$LINE" | sed -e "s;${SPACE};${TAB};g" >> $FILE
    elif [ "X$SKIP" = "Xnskip" ] ; then
        [ -n "`echo $LINE | grep -i '</\?TABLE'`" ] &&
        {
            LINE=`mklinesplit "$LINE"`
            lineup "$LINE"
        } || {
            MAKETAB=`mktab "$I"`
            echo "$LINE" | sed -e "s;^[[:space:]]*;;" -e "s;^;${MAKETAB};" >> $FILE
        }
    fi

    [ -n "`echo $LINE | grep -Ei '</(SCRIPT|STYLE)'`" ] && SKIP='nskip'
    [ -n "`echo $LINE | grep -E '[[:space:]]*(\?|%)>'`" ] && SKIP='nskip'

    CRLF='nskip'
    L=`expr $L + 1`
  done
}

[ X"$1" = "X" ] && usage
[ X"$1" = X"-s" -o X"$1" = X"--status" ] && { STATUS=1; shift; }

TAB=`echo -e "\t"`
SPACE=`mkspace 8`
IFS='
'

for F in $* ; do
  [ -s "$F" ] && [ X$(file "$F" 2>/dev/null | grep -i 'text') != "X" ] &&
  (
    cp -f "$F" "$F.bak"
    tag2arr "$F"
  )
done

exit 0