util_close_html_tags_ns_parsehtml (private)
util_close_html_tags_ns_parsehtml html_fragment
Defined in packages/acs-tcl/tcl/text-html-procs.tcl
Faster version of util_close_html_tags based on ns_parse, but closer to the original semantics and faster than the tdom variant
- Parameters:
- html_fragment
- See Also:
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.
Source code: #ns_log notice "util_close_html_tags_ns_parsehtml" set close_tags { abbr acronym b bdo big blockquote center cite code del dfn dir div dl em font h1 h2 h3 h4 h5 h6 i ins kbo menu ol pre q s samp small span strike strong sub sup table tt u ul var } set depth 0 set parseListElements [ns_parsehtml -onlytags -- $html_fragment] foreach parseListElement $parseListElements { set tag [string tolower [lindex $parseListElement 0]] if {$tag in $close_tags} { set stack($depth) $tag incr open($tag) incr depth } elseif {[string range $tag 0 0] eq "/" && [string range $tag 1 end] in $close_tags} { set ctag [string range $tag 1 end] if {$depth > 0} { incr depth -1 if {$stack($depth) eq $ctag} { incr open($ctag) -1 } else { # # The current tag to be closed (top stack # element) is not closed by the parsed # ctag. Try to find on the stack a # corresponding open tag for the ctag. # #ns_log notice "... search depth $depth" set d $depth for {set d $depth} {$d > 0} {incr d -1} { ns_log notice "... check stack($d) ?[info exists stack($d)] == $ctag" if {$stack($d) eq $ctag} { incr open($ctag) -1 break } } #ns_log notice "... final depth $d" set depth $d } } } } if {[ns_conn isconnected]} { ns_log notice "util_close_html_tags_ns_parsehtml called in [ns_conn url]?[ns_conn query]" } #ns_log notice "===== final depth: $depth stack: <[array get stack]> open: <[array get open]>" set closing_html "" # # If the stack is not unwound, close the elements in the right # order. # for {set d $depth} {$d > 0} {incr d -1} { set d1 [expr {$d-1}] append closing_html "</$stack($d1)>" set r [incr open($stack($d1)) -1] if {$r == 0} { unset stack($d1) } } # # For unbalanced tags (where the tags in not closed in the right # order) close the tags in any order. # #ns_log notice "===== final open: [array get open]" foreach {k v} [array get open] { for {set i 0} {$i < $v} {incr i} { append closing_html "</$k>" } } #ns_log notice "===== final html '$closing_html'" return "$html_fragment$closing_html"XQL Not present: Generic, PostgreSQL, Oracle