#!/usr/bin/ksh93 ################################################################ function usagemsg_txt2html_k93 { print " Program: txt2html_k93 Convert preformatted text into HTML. Similar in function to "Grutatxt" Perl module. Usage: ${1##*/} [-?] [-vV] [file...] Where: Default -a align = Table data cell alignment (left) -A vertAlign = Table data cell vertical alignment (middle) -b color = Table data cell background color (white) -B color = Table header cell background color (lightgrey) -d color = Table data cell font color (black) -D color = Table header cell font color (black) -o list = Ordered list numbering scheme (1aiAI) -C = Center all tables on the page -H = Mark the first row of all tables as a header row -v = Verbose Mode -V = Very Verbose Mode Example: txt2html_k93 file1.txt Author: Dana French (dfrench@mtxia.com) Copyright 2006 by Dana French \"AutoContent\" enabled " return 0 } ################################################################ #### #### Description: #### #### Assumptions: #### #### Dependencies: #### #### Products: #### #### Configured Usage: #### #### Details: #### #### [:space:] = whitespace (space, tab, newline) #### [:blank:] = space or tab #### #### ################################################################ function txt2html_k93 { typeset VERSION="1.0" typeset TRUE="0" typeset FALSE="1" typeset VERBOSE="${FALSE}" typeset VERYVERB="${FALSE}" typeset SPACES=$'\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20' typeset OLSCHEME="1aiAI" typeset ULFLAG="${FALSE}" typeset PREFLAG="${FALSE}" typeset CITEFLAG="${FALSE}" typeset CODEFLAG="${FALSE}" typeset HTMLFLAG="${FALSE}" typeset CLR_TDBG="white" typeset CLR_THBG="lightgrey" typeset CLR_TDFG="black" typeset CLR_THFG="darkblue" typeset SIZ_TBLBDR="1" typeset TBLHDRROW="${FALSE}" typeset TBLALIGN="left" typeset TBLVALIGN="middle" typeset TBLCENTER="${FALSE}" FPATH="/home/dfrench/src/shunix/shellutils-ksh/shellutils-ksh.latest/functions" while getopts ":vV" OPTION do case "${OPTION}" in 'v') VERBOSE="${TRUE}";; 'V') VERYVERB="${TRUE}";; [?:#]) usagemsg_txt2html_k93 "${0}" && return 1 ;; esac done shift $(( ${OPTIND} - 1 )) typeset OLTYPE="0" typeset ICNT=0 for (( ICNT=0; ICNT<=10; ++ICNT )) do OLTYPE="${OLTYPE}${OLSCHEME}" done ################################################################ typeset STDIN="${1:+${FALSE}}" [[ "_${1}" == '_-' ]] && STDIN="${TRUE}" STDIN="${STDIN:-${TRUE}}" #### Read in the data either from STDIN or one or more files if (( STDIN == TRUE )) then set -- - fi for FNAME in "${@}" do if (( STDIN == FALSE )) && [[ ! -e "${FNAME}" ]] then print -u 2 "${0##*/}: ${FNAME}: No such file or directory" continue fi LCNT="0" cat_k93 -- "${FNAME}" | while IFS="" read -r -- LINE do TXTARRY[LCNT]="${LINE}" #### Paragraph separator if [[ "_${LINE}" == "_" ]] then ULFLAG="${FALSE}" TAGTYPE[LCNT]="P" fi #### Horizontal Rule [[ "_${LINE}" == _\#\#\#\#*(\#) ]] && TAGTYPE[LCNT]="HR" #### Headers if (( LCNT > 0 )) then [[ "_${LINE}" == _*([[:blank:]])+([=]) ]] && TAGTYPE[LCNT-1]="H1" [[ "_${LINE}" == _*([[:blank:]])+([-]) ]] && TAGTYPE[LCNT-1]="H2" [[ "_${LINE}" == _*([[:blank:]])+([\~]) ]] && TAGTYPE[LCNT-1]="H3" [[ "_${LINE}" == _*([[:blank:]])+([=\-\~]) ]] && TAGTYPE[LCNT]="DELETE" fi #### Imbedded HTML if (( HTMLFLAG == TRUE )) then TAGTYPE[LCNT]="HTML" fi if [[ "_${LINE}" == _*@('<<'|'>>')* ]] then if [[ "_${LINE}" == _*'<<'* ]] then HTMLFLAG="${TRUE}" TAGTYPE[LCNT]="HTML" fi if [[ "_${LINE}" == _*'>>'* ]] then HTMLFLAG="${FALSE}" TAGTYPE[LCNT]="HTML" fi fi #### Preformatted Text segments if [[ "_${LINE}" == _+([[:blank:]])* ]] then TAGTYPE[LCNT]="PRE" [[ "${TAGTYPE[LCNT-1]}" == "CITE" ]] && TAGTYPE[LCNT]="CITE" fi #### Cite Text segments if [[ "_${LINE}" == _+([[:blank:]])\"* ]] then TAGTYPE[LCNT]="CITE" fi #### Programming Code segments if [[ "_${LINE}" == _*([[:blank:]])\$* ]] then TAGTYPE[LCNT]="CODE" #### TXTARRY[LCNT]="${LINE##*([[:blank:]])\$*([[:blank:]])}" fi #### Unordered/Ordered Lists if (( ULFLAG == TRUE )) then TAGTYPE[LCNT]="LI" LSTTYPE[LCNT]="${TAGTYPE[LCNT-1]}" ULSPACE[LCNT]="${ULSPACE[LCNT-1]:-0}" ULLEVEL[LCNT]="${ULLEVEL[LCNT-1]:-0}" fi if [[ "_${LINE}" == _*([[:blank:]])[\*\#]* ]] then ULFLAG="${TRUE}" [[ "_${LINE}" == _*([[:blank:]])\*[!\*]* ]] && TAGTYPE[LCNT]="UL" [[ "_${LINE}" == _*([[:blank:]])\#[!\#]* ]] && TAGTYPE[LCNT]="OL" TMPNBR="${LINE%%[!$' \t\n']*}" ULSPACE[LCNT]="${#TMPNBR}" ULDELTA="0" (( ${ULSPACE[LCNT]} > ${ULSPACE[LCNT-1]:-0} )) && ULDELTA="+1" (( ${ULSPACE[LCNT]} < ${ULSPACE[LCNT-1]:-0} )) && ULDELTA="-1" ULLEVEL[LCNT]="$(( ${ULLEVEL[LCNT-1]:-0} + ${ULDELTA} ))" LSTTYPE[LCNT]="${TAGTYPE[LCNT]}" fi #### Definition Lists if [[ "_${LINE}" == _*([[:blank:]])\**:* ]] then TAGTYPE[LCNT]="DL" ULFLAG="${FALSE}" LSTTYPE[LCNT]="" ULSPACE[LCNT]="" ULLEVEL[LCNT]="" fi #### Tables and rows [[ "_${LINE}" == _*([[:blank:]])\+-* ]] && TAGTYPE[LCNT]="TABLE" [[ "_${LINE}" == _*([[:blank:]])\|* ]] && TAGTYPE[LCNT]="ROW" [[ "_${LINE}" == _*([[:blank:]])\|\!* ]] && TAGTYPE[LCNT]="HEADER" #### Array element counter for lines read in (( ++LCNT )) done ################################################################ TABLEFLAG="${FALSE}" print -- "

" for IDX in "${!TXTARRY[@]}" do TEXTLINE="${TXTARRY[IDX]}" #### Imbedded HTML if [[ "${TAGTYPE[IDX]}" == "HTML" ]] then TEXTLINE="${TEXTLINE//'<<'/}" TEXTLINE="${TEXTLINE//'>>'/}" fi #### CODE HTML TAG output if [[ "${TAGTYPE[IDX]}" == "CODE" ]] && (( CODEFLAG == FALSE )) then print -- "\n

<${TAGTYPE[IDX]}>
"
              CODEFLAG="${TRUE}"
          fi

          if [[ "${TAGTYPE[IDX]}" == "CODE" ]]
          then
              TEXTLINE="${TEXTLINE/#*([[:blank:]])\$*([[:blank:]])}"
          fi

          if [[ "${TAGTYPE[IDX]}" != "CODE" ]] && (( CODEFLAG == TRUE ))
          then
              print -- "
" CODEFLAG="${FALSE}" fi #### CITE Text HTML TAG output if [[ "${TAGTYPE[IDX]}" == "CITE" ]] && (( CITEFLAG == FALSE )) then print -- "" CITEFLAG="${TRUE}" fi if [[ "${TAGTYPE[IDX]}" != "CITE" ]] && (( CITEFLAG == TRUE )) then print -- "" CITEFLAG="${FALSE}" fi #### Preformatted Text HTML TAG output if [[ "${TAGTYPE[IDX]}" == "PRE" ]] && (( PREFLAG == FALSE )) then print -- "
"
              PREFLAG="${TRUE}"
          fi

          if [[ "${TAGTYPE[IDX]}" != "PRE" ]] && (( PREFLAG == TRUE ))
          then
              print -- "
" PREFLAG="${FALSE}" fi #### Horizontal Rule HTML TAG output if [[ "${TAGTYPE[IDX]}" == "HR" ]] then print -- "<${TAGTYPE[IDX]}>" continue fi #### Table and Row HTML TAG output if [[ "${TAGTYPE[IDX]}" == "TABLE" ]] then if (( TABLEFLAG == FALSE )) then if (( TBLCENTER == TRUE )) then print -- "
" fi print -- "" TBLROW="0" fi TABLEFLAG="${TRUE}" print -- "

\n

" continue fi #### If the current line is not a TABLE, HEADER, or ROW line #### but the TABLEFLAG variable is set to true, then end the #### table and set the TABLEFLAG variable to false. if [[ "${TAGTYPE[IDX]}" != @(TABLE|HEADER|ROW) ]] then (( TABLEFLAG == TRUE )) && print -- " \n

\n
" if (( TBLCENTER == TRUE )) then print -- "
" fi TABLEFLAG="${FALSE}" fi #### Determine if this is the first row of the table and if it should #### be marked as a HEADER row if [[ "${TAGTYPE[IDX]}" == "ROW" ]] && (( TBLHDRROW == TRUE )) && (( TBLROW == 0 )) then TAGTYPE[IDX]="HEADER" fi #### If the table row is a header row, incapsulate the cell contents #### using table header tags "TH". if [[ "${TAGTYPE[IDX]}" == "HEADER" ]] then TEXTLINE="${TEXTLINE/#*([[:blank:]])\|?(!)/ \$'\n'}" TEXTLINE="${TEXTLINE/%\|*([[:blank:]])/$'\n' \}" TEXTLINE="${TEXTLINE//\|?(!)/$'\n' \$'\n' \$'\n'}" (( ++TBLROW )) fi #### If the table row is a regular data row, incapsulate the cell contents #### using table data tags "TD". if [[ "${TAGTYPE[IDX]}" == "ROW" ]] then TEXTLINE="${TEXTLINE/#*([[:blank:]])\|/ \$'\n'}" TEXTLINE="${TEXTLINE/%\|*([[:blank:]])/$'\n' \}" TEXTLINE="${TEXTLINE//\|/$'\n' \$'\n' \$'\n'}" (( ++TBLROW )) fi #### Ordered/Unordered list HTML TAG output if [[ "${TAGTYPE[IDX]}" == @(UL|OL) ]] then TEXTLINE="${TXTARRY[IDX]#*[\*\#]}" if (( ${ULLEVEL[IDX]} > ${ULLEVEL[IDX-1]:-0} )) then print -n -- "\n${SPACES:0:${ULLEVEL[IDX]}}<${TAGTYPE[IDX]}" if [[ "${TAGTYPE[IDX]}" == "OL" ]] then print -n -- " Type=\"${OLTYPE:${ULLEVEL[IDX]}:1}\"" fi print -- ">" fi if (( ${ULLEVEL[IDX]} <= ${ULLEVEL[IDX-1]:-0} )) then print -- "${SPACES:0:${ULLEVEL[IDX]}}" fi if (( ${ULLEVEL[IDX]} < ${ULLEVEL[IDX-1]:-0} )) then print -- "\n${SPACES:0:${ULLEVEL[IDX-1]}}" fi print -- "${SPACES:0:${ULLEVEL[IDX]}}
  • " fi #### Definition List output if [[ "${TAGTYPE[IDX]}" == @(DL) ]] then TMPTEXT="${TEXTLINE#*\*}" print -- "
    ${TMPTEXT%%:*}
    " TEXTLINE="${TEXTLINE#*:}" fi #### Header line HTML TAG output [[ "${TAGTYPE[IDX]}" == "DELETE" ]] && continue [[ "${TAGTYPE[IDX]}" == "H1" ]] && print -- "\n<${TAGTYPE[IDX]}>" [[ "${TAGTYPE[IDX]}" == "H2" ]] && print -- "\n<${TAGTYPE[IDX]}>" [[ "${TAGTYPE[IDX]}" == "H3" ]] && print -- "\n<${TAGTYPE[IDX]}>" #### Text effects - bold, italics, URL's if [[ "${TAGTYPE[IDX]}" != @(PRE|CITE|CODE|HTML) ]] then TEXTLINE="${TEXTLINE//\*([![:blank:]]+(?)[![:blank:]])\*/\\1\}" TEXTLINE="${TEXTLINE//_([![:blank:]]+(?)[![:blank:]])_/\\1\}" TEXTLINE="${TEXTLINE//\'\'\'([![:blank:]]+(?)[![:blank:]])\'\'\'/\\1\}" TEXTLINE="${TEXTLINE//\'\'([![:blank:]]+(?)[![:blank:]])\'\'/\\1\}" TEXTLINE="${TEXTLINE//(http:\/\/+([![:blank:]]))/\\1\}" TEXTLINE="${TEXTLINE//([[:space:]])(.\/+([![:space:]]))/\1\\2\}" fi ################################################################ #### Original text output [[ "_${TXTARRY[IDX]}" != "_" ]] && print -r -- "${TEXTLINE}" ################################################################ #### Ordered/Unordered List HTML TAG completion if [[ "${TAGTYPE[IDX]}" != @(UL|OL|LI) ]] && (( IDX > 0 )) && (( ${ULLEVEL[IDX-1]:-0} > 0 )) then for (( i=${ULLEVEL[IDX-1]}; i>0; --i )) do print -- "${SPACES:0:${i}}
  • " print -- "${SPACES:0:${i}}" done fi #### Definition List completion if [[ "${TAGTYPE[IDX]}" == @(DL) ]] then print -- "" fi #### Header HTML TAG completion [[ "${TAGTYPE[IDX]}" == "ROW" ]] && print -- " \n

    " # DLF [[ "${TAGTYPE[IDX]}" == "CODE" ]] && print -- "" [[ "${TAGTYPE[IDX]}" == "H3" ]] && print -- "" [[ "${TAGTYPE[IDX]}" == "H2" ]] && print -- "" [[ "${TAGTYPE[IDX]}" == "H1" ]] && print -- "" [[ "${TAGTYPE[IDX]}" == "P" ]] && print -- "<${TAGTYPE[IDX]}>" done | uniq print -- "

    " done return 0 } ################################################################ txt2html_k93 "${@}"