Patch title: Release 92 bulk changes
Abstract:
File: /appli/browser/tag/table.pli
Key:
    Removed line
    Added line
module "/pliant/language/unsafe.pli"
module "/pliant/appli/browser/core.pli"
module "/pliant/graphic/misc/float.pli"


tag_position td
  newline
  position_recurse node
  position_container node

tag_draw td
  if not ((query "table" "border") parse (var Float border))
    border := 0
  border *= 25.4/72
  if border>0
    var Int bcolor := html_color (query "table" "bordercolor")
    if bcolor=undefined
      bcolor := 808080h
    rectangle area:x0-border area:y0-border area:x1+border area:y0 addressof:bcolor
    rectangle area:x0-border area:y0-border area:x0 area:y1+border addressof:bcolor
    rectangle area:x1 area:y0-border area:x1+border area:y1+border addressof:bcolor
    rectangle area:x0-border area:y1 area:x1+border area:y1+border addressof:bcolor
  var Int c := html_color (query "td" "bgcolor")
  if c<>undefined and area:x0<>undefined
    rectangle area:x0 area:y0 area:x1 area:y1 addressof:c
  draw_recurse node


function compute_col_row_size n ix iy sx sy
  arg_rw DocumentNode n ; arg_rw Int ix iy ; arg_rw Array:Float sx sy
  if n:tag="td"
    while ix>=sx:size
      sx += 0
    while iy>=sy:size
      sy += 0
    if n:area:x0<>undefined
      sx ix := max sx:ix n:area:x1-n:area:x0
      sy iy := max sy:iy n:area:y1-n:area:y0
    ix += 1
  eif n:tag="table"
    void
  else
    each sub n
      compute_col_row_size sub ix iy sx sy
    if n:tag="tr"
      ix := 0 ; iy += 1

method c adjust_col_row_size n ix iy sx sy
  arg_rw DocumentContext c ; arg_rw DocumentNode n ; arg_rw Int ix iy ; arg_rw Array:Float sx sy
  if n:tag="td"
    var Float memo_x0 := c area_x0 ; var Float memo_y0 := c area_y0 ; var Float memo_x1 := c area_x1 ; var Float memo_y1 := c area_y1
    c area_x0 := 0 ; c area_y0 := 0 ; c area_x1 := sx ix ; c area_y1 := float_max/2
    c newline
    c position n
    c area_x0 := memo_x0 ; c area_y0 := memo_y0 ; c area_x1 := memo_x1 ; c area_y1 := memo_y1
    c newline
    if n:area:x0<>undefined
      sy iy := max sy:iy n:area:y1
    ix += 1
  eif n:tag="table"
    void
  else
    each sub n
      c adjust_col_row_size sub ix iy sx sy
    if n:tag="tr"
      ix := 0 ; iy += 1

function adjust_cell_position n ix iy px py padding extra
  arg_rw DocumentNode n ; arg_rw Int ix iy ; arg Array:Float px py ; arg Float padding extra
  if n:tag="td"
    if n:area:x0<>undefined
      position_translate n px:ix-n:area:x0+padding py:iy-n:area:y0+padding
    n:area x0 := px ix ; n:area y0 := py iy ; n:area x1 := (px ix+1)-extra ; n:area y1 := (py iy+1)-extra
    ix += 1
  eif n:tag="table"
    void
  else
    each sub n
      adjust_cell_position sub ix iy px py padding extra
    if n:tag="tr"
      ix := 0 ; iy += 1


tag_position table
  if not ((query "table" "cellpadding") parse (var Float padding))
    padding := 0
  if not ((query "table" "border") parse (var Float border))
    border := 0
  if not ((query "table" "cellspacing") parse (var Float spacing))
    spacing := 0
  padding *= 25.4/72
  border *= 25.4/72
  spacing *= 25.4/72
  # ask cells for size
  area x0 := area_x0 ; area y0 := area_y0
  newline
  position_recurse node
  var Array:Float sx sy
  var Int ix := 0 ; var Int iy := 0
  each sub node
    compute_col_row_size sub ix iy sx sy
  # adjust columns horizontal size
  var Float total := 0
  for (var Int i) 0 sx:size-1
    total += sx i
  var Float room := area_x1-area_x0-padding*2*sx:size-border*2*(sx:size+1)-spacing*(sx:size+1)
  if total>room
    var Float limit := room/sx:size
    part adjust_limit
      var Float total := 0 ; var Int candidate := 0
      for (var Int i) 0 sx:size-1
        total += min sx:i limit
        if sx:i>limit
          candidate += 1
      if room>total+1e-6 and candidate>0
        limit += (room-total)/candidate
        restart adjust_limit
    for (var Int i) 0 sx:size-1
      sx i := min sx:i limit
    var Int ix := 0 ; var Int iy := 0
    each sub node
      adjust_col_row_size sub ix iy sx sy
  # computess absolute horizontal and vertical positions
  var Array:Float px py
  px size := sx:size+1
  px 0 := area:x0+2*border+spacing
  for (var Int i) 1 px:size-1
    px i := (px i-1)+(sx i-1)+2*padding+2*border+spacing
  py size := sy:size+1
  py 0 := area:y0+2*border+spacing
  for (var Int i) 1 py:size-1
    py i := (py i-1)+(sy i-1)+2*padding+2*border+spacing
  # adjust cells positions
  var Int ix := 0 ; var Int iy := 0
  each sub node
    adjust_cell_position sub ix iy px py padding 2*border+spacing
  # overall table position
  area x1 := px px:size-1 ; area y1 := py py:size-1
  area_y0 := area y1
  newline

tag_draw table
  if not ((query "table" "cellpadding") parse (var Float padding))
    padding := 0
  if not ((query "table" "border") parse (var Float border))
    border := 0
  if not ((query "table" "cellspacing") parse (var Float spacing))
    spacing := 0
  padding *= 25.4/72
  border *= 25.4/72
  spacing *= 25.4/72
  if border>0
    var Int bcolor := html_color (query "table" "bordercolor")
    if bcolor=undefined
      bcolor := 808080h
    rectangle area:x0 area:y0 area:x1 area:y0+border addressof:bcolor
    rectangle area:x0 area:y0 area:x0+border area:y1 addressof:bcolor
    rectangle area:x1-border area:y0 area:x1 area:y1 addressof:bcolor
    rectangle area:x0 area:y1-border area:x1 area:y1 addressof:bcolor
  draw_recurse node