Closed pkra closed 2 years ago
While https://bugs.chromium.org/p/chromium/issues/detail?id=2902#c79 is finally being fixed, this issue here persists: texml creates invalid table markup to workaround the limitations of its CSS creation.
A quick research idea: gather stats on CSS rules texml generates.
Here's all the rules we have.
1 { border-bottom: thin solid black }
1 { border-right: medium solid black; }
1 { padding-bottom: 1.0pt; }
1 { padding-bottom: -12.0pt; }
1 { padding-bottom: -2.5pt; }
1 { padding-bottom: 3.61371pt; }
1 { padding-bottom: 5.05942pt; }
1 { padding-bottom: 7.11317pt; }
1 { padding-bottom: 7.22743pt; }
1 { padding-right: 3.69885pt; }
1 { padding-right: 7.11317pt; }
1 { width: 113.81102pt; }
1 { width: 142.26378pt; }
1 { width: 180.0pt; }
1 { width: 216.81pt; }
1 { width: 86.72377pt; }
2 { border-top: medium solid black; }
2 { padding-bottom: 12.0pt; }
2 { padding-bottom: -15.0pt; }
2 { padding-bottom: 9.00002pt; }
2 { padding-right: 1.99168pt; }
2 { padding-right: 20.0pt; }
2 { padding-right: 4.2679pt; }
2 { padding-right: 5.12149pt; }
2 { width: 108.405pt; }
2 { width: 140.0pt; }
2 { width: 22.76228pt; }
2 { width: 25.6073pt; }
2 { width: 51.21504pt; }
2 { width: 75.60242pt; }
3 { padding-bottom: 10.0pt; }
3 { padding-bottom: -5.0pt; }
3 { padding-left: 10.0pt; }
3 { padding-right: 10.0pt; }
3 { padding-right: 1.42262pt; }
3 { vertical-align: middle; }
3 { width: 19.91684pt; }
3 { width: 569.05511pt; }
3 { width: 56.9055pt; }
4 { padding-bottom: 2.84526pt; }
4 { padding-bottom: 4.0pt; }
4 { padding-bottom: 4.26773pt; }
4 { padding-bottom: 8.0pt; }
4 { width: 162.6075pt; }
4 { width: 31.2982pt; }
4 { width: 42.67912pt; }
5 { padding-bottom: -4.0pt; }
5 { padding-bottom: 5.69054pt; }
5 { padding-left: 1.56468pt; }
5 { padding-left: 1.70709pt; }
5 { padding-left: -3.0pt; }
5 { padding-right: 1.56468pt; }
5 { padding-right: 1.70709pt; }
5 { padding-right: -2.84526pt; }
5 { padding-right: -3.0pt; }
5 { padding-right: 3.98337pt; }
5 { width: 48.36958pt; }
6 { border: none; }
6 { padding-bottom: 6.0pt; }
6 { padding-left: 5.0pt; }
6 { padding-right: 8.53581pt; }
7 { background-color: Gray; }
7 { border-left: double black; }
7 { padding-bottom: -5.69054pt; }
7 { padding-right: 40.0pt; }
8 { border-bottom: medium solid black; }
8 { padding-bottom: -7.5pt; }
8 { padding-bottom: 7.5pt; }
9 { padding-bottom: 0.0pt; }
9 { padding-bottom: -6.0pt; }
9 { padding-left: 3.69899pt; }
9 { padding-right: 3.69899pt; }
9 { padding-right: 5.69054pt; }
9 { width: 28.45274pt; }
10 { padding-left: 3.00003pt; }
10 { padding-left: 4.00002pt; }
10 { padding-right: 3.00003pt; }
10 { padding-right: 4.00002pt; }
12 { padding-right: 2.84526pt; }
16 { padding-bottom: -10.0pt; }
16 { padding-bottom: 3.0pt; }
17 { padding-bottom: 2.0pt; }
17 { padding-left: 3.8pt; }
17 { padding-right: 3.8pt; }
20 { background-color: lightgray; }
21 { padding-left: 1.5pt; }
21 { padding-right: 1.5pt; }
32 { background-color: white; }
34 { border-top: double black; }
34 { padding-left: 4.25pt; }
34 { padding-right: 4.25pt; }
35 { padding-bottom: 2.5pt; }
35 { padding-left: 2.5pt; }
35 { padding-right: 2.5pt; }
49 { vertical-align: top; }
60 { padding-left: 2.0pt; }
60 { padding-right: 2.0pt; }
62 { background-color: LightGray; }
75 { padding-bottom: 5.0pt; }
112 { border-bottom: thin dashed black; }
126 { padding-right: 0.0pt; }
146 { padding-bottom: 2.84544pt; }
169 { padding-left: 3.0pt; }
169 { padding-right: 3.0pt; }
171 { padding-left: 0.0pt; }
181 { border-left: none; }
192 { border-bottom: double black; }
241 { border-right: double black; }
302 { padding-left: 4.0pt; }
302 { padding-right: 4.0pt; }
412 { border-right: none; }
566 { text-align: left; }
574 { border-top: thin solid black; }
619 { text-align: right; }
727 { border-left: thin solid black; }
871 { border-collapse: collapse; }
3466 { border-right: thin solid black; }
4633 { border-bottom: thin solid black; }
5232 { text-align: center; }
5601 { padding-right: 5.0pt; }
5607 { padding-left: 5.0pt; }
How many lines of CSS do we generate?
5 ./mcom/mcom3518/xml/mcom3518.css
11 ./mcom/mcom3483/xml/mcom3483.css
12 ./bproc/bproc26/xml/bproc26.css
12 ./btran/btran49/xml/btran49.css
13 ./bull/bull1707/xml/bull1707.css
13 ./mcom/mcom3343/xml/mcom3343.css
13 ./mcom/mcom3548/xml/mcom3548.css
14 ./mcom/mcom3424/xml/mcom3424.css
15 ./mcom/mcom3431/xml/mcom3431.css
16 ./mcom/mcom3341/xml/mcom3341.css
17 ./mcom/mcom3565/xml/mcom3565.css
18 ./mcom/mcom3338/xml/mcom3338.css
19 ./mcom/mcom3387/xml/mcom3387.css
19 ./mcom/mcom3423/xml/mcom3423.css
19 ./mcom/mcom3441/xml/mcom3441.css
19 ./mcom/mcom3583/xml/mcom3583.css
21 ./btran/btran45/xml/btran45.css
21 ./mcom/mcom3542/xml/mcom3542.css
21 ./mcom/mcom3602/xml/mcom3602.css
21 ./mj3/btran/btran45/xml/btran45.css
21 ./mj3/mcom/mcom3602/xml/mcom3602.css
22 ./bproc/bproc45/xml/bproc45.css
22 ./mcom/mcom3348/xml/mcom3348.css
23 ./gsm/gsm211/xml/gsm211.css
23 ./jams/jams907/xml/jams907.css
24 ./btran/btran52/xml/btran52.css
24 ./mj3/btran/btran52/xml/btran52.css
25 ./bproc/bproc48/xml/bproc48.css
25 ./btran/btran62/xml/btran62.css
25 ./mcom/mcom3539/xml/mcom3539.css
26 ./jams/jams950/xml/jams950.css
26 ./mcom/mcom1180/xml/mcom1180.css
26 ./mcom/mcom3446/xml/mcom3446.css
28 ./btran/btran28/xml/btran28.css
28 ./mcom/mcom3451/xml/mcom3451.css
28 ./mcom/mcom3466/xml/mcom3466.css
29 ./jams/jams385/xml/jams385.css
29 ./jams/jams949/xml/jams949.css
29 ./mcom/mcom3320/xml/mcom3320.css
30 ./mcom/mcom3410/xml/mcom3410.css
32 ./mcom/mcom3609/xml/mcom3609.css
33 ./mcom/mcom3377/xml/mcom3377.css
34 ./bull/bull1670/xml/bull1670.css
34 ./mcom/mcom3416/xml/mcom3416.css
36 ./mcom/mcom3498/xml/mcom3498.css
36 ./mcom/mcom3501/xml/mcom3501.css
37 ./jams/jams421/xml/jams421.css
37 ./mcom/mcom3371/xml/mcom3371.css
37 ./mcom/mcom3426/xml/mcom3426.css
37 ./mcom/mcom3594/xml/mcom3594.css
38 ./btran/btran29/xml/btran29.css
39 ./mcom/mcom3358/xml/mcom3358.css
39 ./mcom/mcom3485/xml/mcom3485.css
39 ./mcom/mcom3490/xml/mcom3490.css
39 ./mcom/mcom3561/xml/mcom3561.css
40 ./mcom/mcom3586/xml/mcom3586.css
41 ./mcom/mcom3398/xml/mcom3398.css
42 ./mcom/mcom3397/xml/mcom3397.css
42 ./mcom/mcom3421/xml/mcom3421.css
42 ./mcom/mcom3505/xml/mcom3505.css
42 ./mcom/mcom3589/xml/mcom3589.css
44 ./jams/jams934/xml/jams934.css
44 ./mcom/mcom3432/xml/mcom3432.css
44 ./mcom/mcom3585/xml/mcom3585.css
45 ./jams/jams928/xml/jams928.css
46 ./mcom/mcom3517/xml/mcom3517.css
47 ./jams/jams960/xml/jams960.css
49 ./mcom/mcom3334/xml/mcom3334.css
50 ./btran/btran25/xml/btran25.css
50 ./mcom/mcom1149/xml/mcom1149.css
50 ./mcom/mcom3370/xml/mcom3370.css
50 ./mcom/mcom3601/xml/mcom3601.css
51 ./mcom/mcom3481/xml/mcom3481.css
52 ./mcom/mcom3360/xml/mcom3360.css
52 ./mcom/mcom3497/xml/mcom3497.css
52 ./mcom/mcom3535/xml/mcom3535.css
53 ./mcom/mcom3580/xml/mcom3580.css
54 ./bproc/bproc15/xml/bproc15.css
54 ./mcom/mcom3486/xml/mcom3486.css
54 ./mcom/mcom3530/xml/mcom3530.css
55 ./mcom/mcom3391/xml/mcom3391.css
56 ./jams/jams477/xml/jams477.css
56 ./mcom/mcom3369/xml/mcom3369.css
58 ./mcom/mcom3450/xml/mcom3450.css
58 ./mcom/mcom3493/xml/mcom3493.css
58 ./mj3/mcom/mcom3493/xml/mcom3493.css
62 ./mcom/mcom3475/xml/mcom3475.css
64 ./mcom/mcom3496/xml/mcom3496.css
65 ./mcom/mcom3393/xml/mcom3393.css
65 ./mcom/mcom3434/xml/mcom3434.css
66 ./jams/jams434/xml/jams434.css
66 ./mcom/mcom3401/xml/mcom3401.css
67 ./mcom/mcom3459/xml/mcom3459.css
68 ./mcom/mcom3477/xml/mcom3477.css
69 ./mcom/mcom3312/xml/mcom3312.css
69 ./mcom/mcom3390/xml/mcom3390.css
70 ./mcom/mcom1441/xml/mcom1441.css
72 ./mcom/mcom3353/xml/mcom3353.css
72 ./mcom/mcom3396/xml/mcom3396.css
72 ./mcom/mcom3473/xml/mcom3473.css
72 ./mcom/mcom3591/xml/mcom3591.css
75 ./mcom/mcom3336/xml/mcom3336.css
76 ./mcom/mcom3436/xml/mcom3436.css
78 ./mcom/mcom3372/xml/mcom3372.css
83 ./mcom/mcom3422/xml/mcom3422.css
83 ./mcom/mcom3478/xml/mcom3478.css
84 ./mcom/mcom3444/xml/mcom3444.css
85 ./mcom/mcom3537/xml/mcom3537.css
86 ./mcom/mcom3504/xml/mcom3504.css
86 ./mcom/mcom3599/xml/mcom3599.css
87 ./btran/btran48/xml/btran48.css
88 ./mcom/mcom3412/xml/mcom3412.css
88 ./mcom/mcom3428/xml/mcom3428.css
90 ./mcom/mcom3354/xml/mcom3354.css
97 ./mcom/mcom3342/xml/mcom3342.css
100 ./mcom/mcom3351/xml/mcom3351.css
101 ./mcom/mcom3389/xml/mcom3389.css
102 ./mcom/mcom3335/xml/mcom3335.css
102 ./mcom/mcom3552/xml/mcom3552.css
102 ./spec/spec100/xml/spec100.css
103 ./mcom/mcom3524/xml/mcom3524.css
104 ./mcom/mcom3527/xml/mcom3527.css
106 ./mcom/mcom3433/xml/mcom3433.css
111 ./mcom/mcom3419/xml/mcom3419.css
115 ./mcom/mcom3457/xml/mcom3457.css
117 ./mcom/mcom3425/xml/mcom3425.css
120 ./btran/btran10/xml/btran10.css
120 ./mcom/mcom1463/xml/mcom1463.css
121 ./mcom/mcom1801/xml/mcom1801.css
131 ./mcom/mcom3376/xml/mcom3376.css
134 ./mcom/mcom3572/xml/mcom3572.css
138 ./mcom/mcom1718/xml/mcom1718.css
142 ./mcom/mcom3592/xml/mcom3592.css
143 ./mcom/mcom3414/xml/mcom3414.css
143 ./mcom/mcom3456/xml/mcom3456.css
145 ./mcom/mcom3386/xml/mcom3386.css
145 ./mcom/mcom3526/xml/mcom3526.css
146 ./mcom/mcom3547/xml/mcom3547.css
155 ./mcom/mcom3506/xml/mcom3506.css
158 ./mcom/mcom3479/xml/mcom3479.css
160 ./mcom/mcom3502/xml/mcom3502.css
161 ./mcom/mcom3499/xml/mcom3499.css
165 ./mcom/mcom3465/xml/mcom3465.css
169 ./mcom/mcom3374/xml/mcom3374.css
170 ./mcom/mcom3464/xml/mcom3464.css
174 ./mcom/mcom3581/xml/mcom3581.css
179 ./mcom/mcom3562/xml/mcom3562.css
182 ./mcom/mcom3367/xml/mcom3367.css
184 ./mcom/mcom3420/xml/mcom3420.css
184 ./mcom/mcom3587/xml/mcom3587.css
191 ./mcom/mcom3536/xml/mcom3536.css
203 ./mcom/mcom3582/xml/mcom3582.css
205 ./mcom/mcom3350/xml/mcom3350.css
206 ./mcom/mcom3471/xml/mcom3471.css
216 ./mcom/mcom3621/xml/mcom3621.css
220 ./mcom/mcom3413/xml/mcom3413.css
222 ./mcom/mcom3462/xml/mcom3462.css
235 ./stml/stml68/xml/stml68.css
238 ./mcom/mcom3514/xml/mcom3514.css
239 ./mcom/mcom2123/xml/mcom2123.css
244 ./bull/bull1681/xml/bull1681.css
246 ./mcom/mcom3403/xml/mcom3403.css
249 ./mcom/mcom3453/xml/mcom3453.css
252 ./mcom/mcom1317/xml/mcom1317.css
253 ./mcom/mcom3488/xml/mcom3488.css
254 ./mcom/mcom3487/xml/mcom3487.css
255 ./mcom/mcom3417/xml/mcom3417.css
261 ./mcom/mcom3402/xml/mcom3402.css
275 ./mcom/mcom3510/xml/mcom3510.css
282 ./mcom/mcom3556/xml/mcom3556.css
283 ./mcom/mcom3455/xml/mcom3455.css
291 ./mcom/mcom3331/xml/mcom3331.css
297 ./mcom/mcom1851/xml/mcom1851.css
315 ./mcom/mcom3333/xml/mcom3333.css
315 ./mcom/mcom3503/xml/mcom3503.css
319 ./mcom/mcom3525/xml/mcom3525.css
321 ./mcom/mcom3563/xml/mcom3563.css
321 ./mj3/mcom/mcom3563/xml/mcom3563.css
346 ./mcom/mcom3366/xml/mcom3366.css
355 ./mcom/mcom3337/xml/mcom3337.css
357 ./mcom/mcom3357/xml/mcom3357.css
379 ./mcom/mcom3399/xml/mcom3399.css
401 ./mcom/mcom3564/xml/mcom3564.css
408 ./mcom/mcom3550/xml/mcom3550.css
424 ./mcom/mcom3461/xml/mcom3461.css
441 ./mcom/mcom3593/xml/mcom3593.css
450 ./mcom/mcom3447/xml/mcom3447.css
456 ./mcom/mcom3458/xml/mcom3458.css
463 ./mcom/mcom1678/xml/mcom1678.css
464 ./mcom/mcom3415/xml/mcom3415.css
464 ./mj3/mcom/mcom3415/xml/mcom3415.css
476 ./mcom/mcom3407/xml/mcom3407.css
477 ./mcom/mcom3411/xml/mcom3411.css
551 ./mcom/mcom3463/xml/mcom3463.css
600 ./mcom/mcom3440/xml/mcom3440.css
675 ./mcom/mcom3507/xml/mcom3507.css
714 ./mcom/mcom3388/xml/mcom3388.css
748 ./mcom/mcom3435/xml/mcom3435.css
766 ./mcom/mcom3405/xml/mcom3405.css
943 ./mcom/mcom3443/xml/mcom3443.css
990 ./mcom/mcom1439/xml/mcom1439.css
1942 ./car/car36/xml/car36.css
There seems to be a lot of potential for switching to a utility-class approach. While the HTML would grow, the savings in CSS would offset it in pure payload and some more in rendering. (And would allow us to fix the invalid markup.)
Anyway, I realize that this doesn't mean the change within texml would not be complex.
@pkra Can you take a look at the various table-related test files in the atomic-table-css branch, especially tabular.xml and colortbl.xml? Others are arydshln, booktabs, hhline and multirowcell, which still suffers from the hidden cell counting bug.
Also multicolumn and multirow.
Very exciting!
float:right
which I'd like to avoid)5in
have an effect?l@{X}
gives an X in the column but it's not in the right (visual) positionfloat:right
(on a wrapping element or as ::after).#264059
on a conversion tool which seems closer to the PDFPhew, that took a lot longer than I expected.
random note: dumping all tables into a single HTML file for review gave me a clash of css for these two tables
This seems to have been due to the old booktabs CSS. In any case, I would suggest a texml-related prefix to namespace the class names.
Final note: all tables appear to render the same on Blink, WebKit, Gecko engines. :rocket:
tabular
table 3, 4: the hfill has no effect. Could be interpreted as right-align (or perhapsfloat:right which I'd like to avoid)
Won't fix; note added to tabular.tex.
table 4: Should the 5in have an effect?
Dunno. Hasn't been needed so far. Note added to tabular.tex
table 7,8 : B-line is missing an effect for [3\jot] (I think padding-bottom for the cells?)
Fixed.
table 8: l@{X} gives an X in the column but it's not in the right (visual) position
Won't fix; added note.
colortbl tex source is missing xcolor, I think
Hmm. Not needed on my machine -- color is automatically loaded by colortbl and that's good enough. But I'll add it.
row 1, 4, 5: filler cells at end
Ah. I was under the misapprehension that I needed to keep the filler cells to make horizontal rules work. I removed them.
row 2: last cell is green (PDF: gray) because it gets a class derived from the table-level rowcolor, overriding the class on the parent row (derived from row-level rowcolor)
blech. later. maybe.
it will probably avoid headaches if all row color is applied on the cell level
Ok.
row 3,4,5: cmyk to rgb comes out a too dark -- I get #264059 on a conversion tool which seems closer to the PDF
Meh. In practice, that color is too dark to be usable either way -- it was just a random example. I replaced it by something lighter. I went to a lot of trouble to get xcolor to do the color conversion for me. I don't think there's anything to be gained by second guessing it -- color is weird.
row 7: the red cell with 2 padding-left does not match PDF (not sure why the PDF cell looks this way)
Not sure what you're referring to.
arydshln -- looks good (except for the limitation noted in the source)
booktabs
That was broken. Fixed now.
hline: The double border lines come out quite differently across browsers; it's not great but good enough for now
I don't think we have any papers that use it (yet) -- I was just trying to be thorough in the test file.
multirowcell: table 2: there's a difference in how HTML spreads out the columns across the colspan. I don't see any css so this is probably core table layout.
Interesting. It looks like the browser is allocates the spanned columns equal shares of the width of the combined column. Cf. the new third tables in multicolumn.tex and multirowcell.tex.
@pkra I think the hhline2 test file works correctly (except as noted in the LaTeX file) now too.
Awesome update (and rolling out! :rocket:).
table 7,8 : B-line is missing an effect for [3\jot] (I think padding-bottom for the cells?) Fixed.
I see that you solved the problem of TRs not allowing padding by moving that to the TDs. That's great (and generally is best as we discussed -- and the borders could also move down if you want TRs to be clean).
Something trivial I realized later: you could of course still put a class on the TR and then have tr.pb > td { padding-bottom: ...}
in the stylesheet. Just in case we ever have a hard time
row 1, 4, 5: filler cells at end Ah. I was under the misapprehension that I needed to keep the filler cells to make horizontal rules work. I removed them.
Right. On the TR, the horizontal borders will be as long as the longest TR. For a partial border, put them on the relevant TDs.
row 2: last cell is green (PDF: gray) because it gets a class derived from the table-level rowcolor, overriding the class on the parent row (derived from row-level rowcolor) blech. later. maybe.
Quick fix should we ever need it: in the stylesheet change .bc { background-color: #bfbfbf; }
to .bc > td { background-color: #bfbfbf;}
-- the selector.bc > td
has higher specificity than .bc1
and thus "wins".
(Though selector specificity can be gnarly and we should be careful to check if this matches how colortbl would resolve clashing colors).
row 7: the red cell with 2 padding-left does not match PDF (not sure why the PDF cell looks this way) Not sure what you're referring to.
The 2
with red-background:
PDF has some left padding (compiled by me so maybe something's wrong on my system)>
HTML does not
@pkra I think the hhline2 test file works correctly (except as noted in the LaTeX file) now too.
If I understand the note in the TeX file correctly, a multicolumn won't come out flushed left but instead follow the column specifier says.
If that's right, then I don't understand. Table 2
On the one hand & \multicolumn{1}{p{4em}|}{C2} & \multicolumn{1}{p{4em}|}{C3}
On the other, the HTML renders
If I understand the note in the TeX file correctly, a multicolumn won't come out flushed left but instead follow the column specifier says.
The problem is with multirow, not multicolumn. See the "C6, R1-3" cell in that same table.
I see that you solved the problem of TRs not allowing padding by moving that to the TDs. That's great (and generally is best as we discussed -- and the borders could also move down if you want TRs to be clean).
But wouldn't we then have the problem that if a particular row has missing cells, the rule won't extend all the way across the full row width?
The 2 with red-background:
PDF has some left padding (compiled by me so maybe something's wrong on my system)
That appears to be because \cellcolor does not ignore space after it. This would be...difficult...to reproduce.
row 2: last cell is green (PDF: gray) because it gets a class derived from the table-level rowcolor, overriding the class on the parent row (derived from row-level rowcolor)
blech. later. maybe.
I think I found an approach that preserves the correct precedence for color specifiers without screwing anything up.
The problem is with multirow, not multicolumn. See the "C6, R1-3" cell in that same table.
Duh. Sorry. Thanks for clarifying.
But wouldn't we then have the problem that if a particular row has missing cells, the rule won't extend all the way across the full row width?
Yes, of course. Sorry about that.
When running locally, I get some stray color markup in the output, e.g., \rowcolor{gray!20}
leaves gray!20
in the cell content.
(I also get <p>color push rgb 0 0 0</p>
at the top of the document and there are other things that don't work in a my installation.)
When running locally, I get some stray color markup in the output, e.g., \rowcolor{gray!20} leaves gray!20 in the cell content.
Oh, it's actually worse -- the rowcolor is actually lost. (I'm on the main branch btw -- I think we can delete the atomic-css one?)
Finally, I've lost a table border
Finally, I've lost a table border
Ah, apparently, this is now matching TeX. Nice.
When running locally, I get some stray color markup in the output, e.g., \rowcolor{gray!20} leaves gray!20 in the cell content.
Oh, it's actually worse -- the rowcolor is actually lost. (I'm on the main branch btw -- I think we can delete the atomic-css one?)
Adding \usepackage[table]{xcolor}
seems to have solved this for me.
This has been rolled out completely now. I don't think additional docs are needed.
Hooray!
texml currently generates CSS using nth-child selectors to target individual rows and cells.
In the context of colspan and rowspan, this forced us to add hidden TD elements so that nth-child calculations would fit, cf. https://github.com/AmerMathSoc/texml/issues/45.
Unfortunately, this leads to invalid markup (html spec "If there exists a row or column in the table containing only slots that do not have a cell anchored to them, then this is a table model error.")
One solution would be to modify nth-child calculations (taking colspan and rowspan into account) to avoid this invalid markup.
Alternatively, texml could consider generating "functional CSS" instead, i.e., generate utility classes and add the class names to the table elements. Given the analysis in https://github.com/AmerMathSoc/texml/issues/45#issuecomment-585320408 this seems useful since the variations among styles seems limited. At least, it should be simple to do for borders (which is enough to fix the invalid markup).
I made a first example with a table in mcom3377 at https://codepen.io/pkra/pen/cc864b02c372e7451ad407dd7fffdd47.