Charcoal, 6464 62 bytes
WS⊞υι≔Eθ⪫⪪⭆υ§λκ-|¦#|υFυFΦ⪪ι#λ«P↓№κ|→→»←⸿⸿FE§υ⁰⌕A⭆υ§λκ#Wι«⊕⁻⊟ι⊟ι→|¦#|θFθFΦ⪪ι#λ«P↓№κ|→→»←⸿⸿FEυ⌕A⭆θ§λκ#Wι«⊕⁻⊟ι⊟ι→
Try it online!Try it online! Link is to verbose version of code. Takes input as a rectangular list of newline-terminated strings. Explanation:
WS⊞υι
Input the stack of tables.
≔Eθ⪫⪪⭆υ§λκ-|¦#|υ|¦#|θ
Transpose the stack and identify the ends of the tabletops i.e. those parts above the legs.
FυFΦ⪪ι#λ«FθFΦ⪪ι#λ«
For each column of the original stack split it on tabletop ends, dropping the first element (which is the space above the first end) and loop over the resulting legs.
P↓№κ|→→
Print the length of the leg vertically (which Charcoal automatically translates into a line of |
s) without moving the cursor and then allow two columns for the next leg.
»←⸿⸿
Move up to the start of the previous row but one.
FE§υ⁰⌕A⭆υ§λκ#FEυ⌕A⭆θ§λκ#
Transpose the stack back and find all of the tabletop ends.
Wι«⊕⁻⊟ι⊟ι→
Loop over the ends in pairs, print the inclusive difference between each pair (which Charcoal automatically translates into a line of -
s) and then allow a column for the next tabletop.