7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#!/usr/bin/ksh93
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# CDDL HEADER START
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# The contents of this file are subject to the terms of the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Common Development and Distribution License (the "License").
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# You may not use this file except in compliance with the License.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# or http://www.opensolaris.org/os/licensing.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# See the License for the specific language governing permissions
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# and limitations under the License.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# When distributing Covered Code, include this CDDL HEADER in each
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# If applicable, add the following below this CDDL HEADER, with the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# fields enclosed by brackets "[]" replaced with your own identifying
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# information: Portions Copyright [yyyy] [name of copyright owner]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# CDDL HEADER END
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Solaris needs /usr/xpg6/bin:/usr/xpg4/bin because the tools in /usr/bin are not POSIX-conformant
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexport PATH=/usr/xpg6/bin:/usr/xpg4/bin:/bin:/usr/bin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction fatal_error
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -u 2 "${progname}: $*"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin exit 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction attrstrtoattrarray
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#set -o xtrace
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset s="$1"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref aa=$2 # attribute array
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer aa_count=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer aa_count=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset nextattr
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer currattrlen=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset tagstr
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset tagval
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while (( ${#s} > 0 )) ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # skip whitespaces
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while [[ "${s:currattrlen:1}" == ~(E)[[:blank:][:space:]] ]] ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( currattrlen++ ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s="${s:currattrlen:${#s}}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # anything left ?
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( ${#s} == 0 )) && break
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # Pattern tests:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin #x="foo=bar huz=123" ; print "${x##~(E)[[:alnum:]_-:]*=[^[:blank:]\"]*}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin #x='foo="ba=r o" huz=123' ; print "${x##~(E)[[:alnum:]_-:]*=\"[^\"]*\"}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin #x="foo='ba=r o' huz=123" ; print "${x##~(E)[[:alnum:]_-:]*=\'[^\"]*\'}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin #x="foox huz=123" ; print "${x##~(E)[[:alnum:]_-:]*}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # All pattern combined via eregex (w|x|y|z):
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin #x='foo="bar=o" huz=123' ; print "${x##~(E)([[:alnum:]_-:]*=[^[:blank:]\"]*|[[:alnum:]_-:]*=\"[^\"]*\"|[[:alnum:]_-:]*=\'[^\"]*\')}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nextattr="${s##~(E)([[:alnum:]_-:]*=[^[:blank:]\"]*|[[:alnum:]_-:]*=\"[^\"]*\"|[[:alnum:]_-:]*=\'[^\"]*\'|[[:alnum:]_-:]*)}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin currattrlen=$(( ${#s} - ${#nextattr}))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # add entry
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tagstr="${s:0:currattrlen}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${tagstr}" == *=* ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # normal case: attribute with value
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tagval="${tagstr#*=}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # strip quotes ('' or "")
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${tagval}" == ~(Elr)(\'.*\'|\".*\") ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tagval="${tagval:1:${#tagval}-2}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin aa[${aa_count}]=( name="${tagstr%%=*}" value="${tagval}" )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # special case for HTML where you have something like <foo baz>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin aa[${aa_count}]=( name="${tagstr}" )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( aa_count++ ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( aa_count > 1000 )) && fatal_error "$0: aa_count too large" # assert
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction handle_document
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#set -o xtrace
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref callbacks=${1}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset tag_type="${2}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset tag_value="${3}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset tag_attributes="${4}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref doc=${callbacks["arg_tree"]}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref nodepath="${stack.items[stack.pos]}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref nodesnum="${stack.items[stack.pos]}num"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case "${tag_type}" in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tag_begin)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nodepath[${nodesnum}]+=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset tagtype="element"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset tagname="${tag_value}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz compound -A tagattributes
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz compound -A nodes
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer nodesnum=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # fill attributes
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${tag_attributes}" != "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin attrstrtoattrarray "${tag_attributes}" "nodepath[${nodesnum}].tagattributes"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( stack.pos++ ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin stack.items[stack.pos]="${stack.items[stack.pos-1]}[${nodesnum}].nodes"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( nodesnum++ ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tag_end)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( stack.pos-- ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tag_text)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nodepath[${nodesnum}]+=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset tagtype="text"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset tagvalue="${tag_value}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( nodesnum++ ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tag_comment)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nodepath[${nodesnum}]+=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset tagtype="comment"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset tagvalue="${tag_value}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( nodesnum++ ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin document_start)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin document_end)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# print "xmltok: '${tag_type}' = '${tag_value}'"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction xml_tok
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset buf=""
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset namebuf=""
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset attrbuf=""
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset c=""
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset isendtag # bool: true/false
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset issingletag # bool: true/false (used for tags like "<br />")
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref callbacks=${1}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ ! -z "${callbacks["document_start"]}" ]] && ${callbacks["document_start"]} "${1}" "document_start"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while IFS='' read -r -N 1 c ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin isendtag=false
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "$c" == "<" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # flush any text content
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "$buf" != "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ ! -z "${callbacks["tag_text"]}" ]] && ${callbacks["tag_text"]} "${1}" "tag_text" "$buf"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf=""
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin IFS='' read -r -N 1 c
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "$c" == "/" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin isendtag=true
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf="$c"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin IFS='' read -r -d '>' c
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf+="$c"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # handle comments
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "$buf" == ~(El)!-- ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # did we read the comment completely ?
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "$buf" != ~(Elr)!--.*-- ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf+=">"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while [[ "$buf" != ~(Elr)!--.*-- ]] ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin IFS='' read -r -N 1 c || break
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf+="$c"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ ! -z "${callbacks["tag_comment"]}" ]] && ${callbacks["tag_comment"]} "${1}" "tag_comment" "${buf:3:${#buf}-5}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf=""
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin continue
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # check if the tag starts and ends at the same time (like "<br />")
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "${buf}" == ~(Er).*/ ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin issingletag=true
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf="${buf%*/}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin issingletag=false
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # check if the tag has attributes (e.g. space after name)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if [[ "$buf" == ~(E)[[:space:][:blank:]] ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin namebuf="${buf%%~(E)[[:space:][:blank:]].*}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin attrbuf="${buf#~(E).*[[:space:][:blank:]]}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin namebuf="$buf"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin attrbuf=""
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if ${isendtag} ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ ! -z "${callbacks["tag_end"]}" ]] && ${callbacks["tag_end"]} "${1}" "tag_end" "$namebuf"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ ! -z "${callbacks["tag_begin"]}" ]] && ${callbacks["tag_begin"]} "${1}" "tag_begin" "$namebuf" "$attrbuf"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # handle tags like <br/> (which are start- and end-tag in one piece)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if ${issingletag} ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ ! -z "${callbacks["tag_end"]}" ]] && ${callbacks["tag_end"]} "${1}" "tag_end" "$namebuf"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf=""
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin buf+="$c"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin [[ ! -z "${callbacks["document_end"]}" ]] && ${callbacks["document_end"]} "${1}" "document_end" "exit_success"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print # final newline to make filters like "sed" happy
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction print_sample1_xml
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincat <<EOF
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin<br />
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin<score-partwise instrument="flute1">
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin <identification>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin <kaiman>nocrocodile</kaiman>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin </identification>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin <!-- a comment -->
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin <partlist>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin <foo>myfootext</foo>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin <bar>mybartext</bar>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin <snap />
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin <!-- another
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin comment -->
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin <ttt>myttttext</ttt>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin </partlist>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin</score-partwise>
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinEOF
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction usage
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin OPTIND=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin getopts -a "${progname}" "${xmldocumenttree1_usage}" OPT '-?'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin exit 2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# program start
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinbuiltin basename
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinbuiltin cat
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinbuiltin date
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinbuiltin uname
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset progname="${ basename "${0}" ; }"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -r xmldocumenttree1_usage=$'+
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz[-?\n@(#)\$Id: xmldocumenttree1 (Roland Mainz) 2009-05-09 \$\n]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[-author?Roland Mainz <roland.mainz@nrubsig.org>]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[+NAME?xmldocumenttree1 - XML tree demo]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[+DESCRIPTION?\bxmldocumenttree\b is a small ksh93 compound variable demo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin which reads a XML input file, converts it into an internal
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin variable tree representation and outputs it in the format
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz specified by viewmode (either "list", "namelist", "tree" or "compacttree").]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfile viewmode
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[+SEE ALSO?\bksh93\b(1)]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinwhile getopts -a "${progname}" "${xmldocumenttree1_usage}" OPT ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case ${OPT} in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *) usage ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindone
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinshift $((OPTIND-1))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset xmlfile="$1"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset viewmode="$2"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinif [[ "${xmlfile}" == "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fatal_error $"No file given."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzif [[ "${viewmode}" != ~(Elr)(list|namelist|tree|compacttree) ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fatal_error $"Invalid view mode \"${viewmode}\"."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcompound xdoc
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcompound -A xdoc.nodes
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chininteger xdoc.nodesnum=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcompound stack
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -a stack.items=( [0]="doc.nodes" )
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chininteger stack.pos=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# setup callbacks for xml_tok
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -A document_cb # callbacks for xml_tok
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindocument_cb["document_start"]="handle_document"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindocument_cb["document_end"]="handle_document"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindocument_cb["tag_begin"]="handle_document"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindocument_cb["tag_end"]="handle_document"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindocument_cb["tag_text"]="handle_document"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindocument_cb["tag_comment"]="handle_document"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# argument for "handle_document"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindocument_cb["arg_tree"]="xdoc"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinif [[ "${xmlfile}" == "#sample1" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print_sample1_xml | xml_tok document_cb
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinelif [[ "${xmlfile}" == "#sample2" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /usr/sfw/bin/wget \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin --user-agent='ksh93_xmldocumenttree' \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin --output-document=- \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 'http://www.google.com/custom?q=gummi+bears' |
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /usr/bin/iconv -f "ISO8859-1" |
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin xml_tok document_cb
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinelse
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin cat "${xmlfile}" | xml_tok document_cb
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinprint -u2 "#parsing completed."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincase "${viewmode}" in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin list)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin set | egrep "xdoc.*(tagname|tagtype|tagval|tagattributes)" | fgrep -v ']=$'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin namelist)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin typeset + | egrep "xdoc.*(tagname|tagtype|tagval|tagattributes)"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tree)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -v xdoc
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz compacttree)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -C xdoc
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin fatal_error $"Invalid view mode \"${viewmode}\"."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinesac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinprint -u2 "#done."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexit 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# EOF.