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
|