Page MenuHomePhabricator

Parser generates broken lists when closing table (td, th, tr, table) tags are on the same line as the list item
Closed, DuplicatePublic

Description

A bullet list wikitext

* a
* b

should generate ul tag wrapping li elements with a and b.

php parser generates broken HTML for

<table>
<tr>
<td>
*a
*b</td></tr><tr><td>
*c
*d</td></tr></table>

This generates broken HTML:

<div class="mw-parser-output"><table>
<tr>
<td>
<ul><li>a</li>
<li>b</td></tr><tr><td></li>
<li>c</li>
<li>d</td></tr></table></li></ul>

which isn't fixable by remex

Event Timeline

eranroz renamed this task from Missing ul generation for to Missing ul generation for bullet list.Apr 5 2018, 11:22 AM
eranroz updated the task description. (Show Details)

@eranroz, check this out:

<li><a href="/wiki/%D7%94%D7%A8%D7%91_%D7%94%D7%A6%D7%91%D7%90%D7%99_%D7%94%D7%A8%D7%90%D7%A9%D7%99" class="mw-redirect" title="הרב הצבאי הראשי">הרב הצבאי הראשי</a></td></tr><tr><th colspan="2" style="text-align:center;background: #E0F090;">תפקידים אזרחיים</th></tr><tr><td colspan="2" style="text-align:right"></li>

I "fixed" the module with new lines. However, this seems like a parser bug and enwiki as other wikis would encounter similar issues.

For reference this is the output before and after fix:

before

<table class="infobox" style="width:18em;width: 20em;"><caption style="background: #808000;  border:1px solid #aaaaaa; border-bottom:0px; color:white">ישראל וייס</caption><tr><td colspan="2" style="text-align:center"><div class="noexcerpt" style="display:inline;">[[קובץ:Male no free image yet-he.svg|150px|מרכז|קישור=ויקיפדיה:תמונה חופשית|גבול|אין תמונה חופשית]][[קטגוריה:ערכים בלי תמונה]]</div></td></tr><tr><th scope="row" style="text-align:right"><span style="white-space: nowrap;">תאריך לידה</span></th><td>
[[1949]] <span style="white-space: nowrap;"> (בן&nbsp;69 בערך)</span></td></tr><tr><th scope="row" style="text-align:right">מקום לידה</th><td>
[[צ'כוסלובקיה]] [[File:Blue pencil RTL.svg|15px|link=d:Q2909395#P19|עריכת הנתון בוויקינתונים]]</td></tr><tr><th scope="row" style="text-align:right">השתייכות</th><td>
[[קובץ:IDF_new.png|קישור=צבא הגנה לישראל|22px]]&nbsp; <span style="font-size:inherit">[[צבא הגנה לישראל|צבא הגנה לישראל]]</span></td></tr><tr><th scope="row" style="text-align:right">תקופת שירות</th><td>
[[1976]]—[[2006]]</td></tr><tr><th scope="row" style="text-align:right">דרגה</th><td>
[[קובץ:IDF tat aluf rotated.svg|תת אלוף|50px]]&nbsp; [[תת אלוף|תת אלוף]]</td></tr><tr><th colspan="2" style="text-align:center;background: #E0F090;">תפקידים צבאיים</th></tr><tr><td colspan="2" style="text-align:right">
* רב אוגדת השריון הסדירה של [[פיקוד המרכז]]
* [[מפקד (צבא)|מפקד]] המדרשה התורנית בירושלים 
* רב [[מפקדת זרוע היבשה|מפקדת חילות השדה]]
* [[הרב הצבאי הראשי]]</td></tr><tr><th colspan="2" style="text-align:center;background: #E0F090;">תפקידים אזרחיים</th></tr><tr><td colspan="2" style="text-align:right">
* [[דיין (הלכה)|דיין]] בבית הדין המיוחד לגיור ב[[תל אביב]]
* יועץ [[רוחני]] למשפחות שכולות מטעם [[משרד הביטחון]]</td></tr><tr><td colspan="2" style="text-align:left">[[File:Wikidata-logo S.svg|22px|link=d:Q2909395|לעריכה בוויקינתונים שמשמש מקור לחלק מהמידע בתבנית]] [[File:OOjs UI icon info big.svg|16px|link=עזרה:תבנית מידע]]</td></tr></table>[[קטגוריה: ויקינתונים - השוואת ערכים: מתאים]][[קטגוריה: ויקינתונים - השוואת ערכים: מתאים: מפקדה]][[קטגוריה: ויקינתונים - השוואת ערכים: חסר]][[קטגוריה: ויקינתונים - השוואת ערכים: חסר: דרגה צבאית]]

After

<table class="infobox" style="width:18em;width: 20em;"><caption style="background: #808000;  border:1px solid #aaaaaa; border-bottom:0px; color:white">ישראל וייס</caption><tr><td colspan="2" style="text-align:center"><div class="noexcerpt" style="display:inline;">[[קובץ:Male no free image yet-he.svg|150px|מרכז|קישור=ויקיפדיה:תמונה חופשית|גבול|אין תמונה חופשית]][[קטגוריה:ערכים בלי תמונה]]</div></td></tr><tr><th scope="row" style="text-align:right">
<span style="white-space: nowrap;">תאריך לידה</span></th><td>
[[1949]] <span style="white-space: nowrap;"> (בן&nbsp;69 בערך)</span></td></tr><tr><th scope="row" style="text-align:right">
מקום לידה</th><td>
[[צ'כוסלובקיה]] [[File:Blue pencil RTL.svg|15px|link=d:Q2909395#P19|עריכת הנתון בוויקינתונים]]</td></tr><tr><th scope="row" style="text-align:right">
השתייכות</th><td>
[[קובץ:IDF_new.png|קישור=צבא הגנה לישראל|22px]]&nbsp; <span style="font-size:inherit">[[צבא הגנה לישראל|צבא הגנה לישראל]]</span></td></tr><tr><th scope="row" style="text-align:right">
תקופת שירות</th><td>
[[1976]]—[[2006]]</td></tr><tr><th scope="row" style="text-align:right">
דרגה</th><td>
[[קובץ:IDF tat aluf rotated.svg|תת אלוף|50px]]&nbsp; [[תת אלוף|תת אלוף]]</td></tr><tr><th colspan="2" style="text-align:center;background: #E0F090;">
תפקידים צבאיים</th></tr><tr><td colspan="2" style="text-align:right">
* רב אוגדת השריון הסדירה של [[פיקוד המרכז]]
* [[מפקד (צבא)|מפקד]] המדרשה התורנית בירושלים 
* רב [[מפקדת זרוע היבשה|מפקדת חילות השדה]]
* [[הרב הצבאי הראשי]]</td></tr><tr><th colspan="2" style="text-align:center;background: #E0F090;">
תפקידים אזרחיים</th></tr><tr><td colspan="2" style="text-align:right">
* [[דיין (הלכה)|דיין]] בבית הדין המיוחד לגיור ב[[תל אביב]]
* יועץ [[רוחני]] למשפחות שכולות מטעם [[משרד הביטחון]]</td></tr><tr><td colspan="2" style="text-align:left">[[File:Wikidata-logo S.svg|22px|link=d:Q2909395|לעריכה בוויקינתונים שמשמש מקור לחלק מהמידע בתבנית]] [[File:OOjs UI icon info big.svg|16px|link=עזרה:תבנית מידע]]</td></tr></table>[[קטגוריה: ויקינתונים - השוואת ערכים: מתאים]][[קטגוריה: ויקינתונים - השוואת ערכים: מתאים: מפקדה]][[קטגוריה: ויקינתונים - השוואת ערכים: חסר]][[קטגוריה: ויקינתונים - השוואת ערכים: חסר: דרגה צבאית]]
This comment was removed by Arlolra.
  • Clarification: the bad output generates li (not *), but without ul.
  • Here is simplification of the above before/after (replacing Hebrew letters). Please try the new parsing (on hewiki) and than the same code in enwiki
<table>
<tr>
<td>
*a
*b</td></tr><tr><td>
*c
*d</td></tr></table>

PHP Parser generates fairly broken output (single list, not 2 lists separated by a table cell) which HTML4 tidy fixes up. Remex fixes it up but doesn't add the ul wrapper around list items. Technically, bare <li> tags are allowed in HTML5. Parsoid does the right thing overall.

------------- NO tidying --------------
[subbu@earth:~/work/wmf/mediawiki] php maintenance/parse.php < /tmp/wt
<div class="mw-parser-output"><table>
<tr>
<td>
<ul><li>a</li>
<li>b</tr><tr><td></li>
<li>c</li>
<li>d</td></tr></table></li></ul>

------------- HTML4-tidy --------------
[subbu@earth:~/work/wmf/mediawiki] php maintenance/parse.php  --tidy < /tmp/wt

<div class="mw-parser-output"><table>
<tr>
<td>
<ul>
<li>a</li>
<li>b</li>
</ul>
</td>
</tr>
<tr>
<td>
<ul>
<li>c</li>
<li>d</li>
</ul>
</td>
</tr>
</table>

------------ RemexHtml ----------------
[subbu@earth:~/work/wmf/mediawiki] php maintenance/parse.php  --tidy < /tmp/wt
parse.php: warning: reading wikitext from STDIN. Press CTRL+D to parse.

<div class="mw-parser-output"><table>
<tbody><tr>
<td>
<ul><li>a</li>
<li>b</li></ul></td></tr><tr><td>
<li>c</li>
<li>d</li></td></tr></tbody></table>
</div>

------------ Parsoid ----------------
[subbu@earth:~/work/wmf/mediawiki] parse.js < /tmp/wt
...
<table data-parsoid='{"stx":"html","dsr":[0,60,7,8]}'>
<tbody data-parsoid='{"dsr":[8,52,0,0]}'><tr data-parsoid='{"stx":"html","dsr":[8,28,4,5]}'>
<td data-parsoid='{"stx":"html","autoInsertedEnd":true,"dsr":[13,23,4,0]}'>
<ul data-parsoid='{"dsr":[18,23,0,0]}'><li data-parsoid='{"dsr":[18,20,1,0]}'>a</li>
<li data-parsoid='{"dsr":[21,23,1,0]}'>b</li></ul></td></tr><tr data-parsoid='{"stx":"html","dsr":[28,52,4,5]}'><td data-parsoid='{"stx":"html","dsr":[32,47,4,5]}'>
<ul data-parsoid='{"dsr":[37,42,0,0]}'><li data-parsoid='{"dsr":[37,39,1,0]}'>c</li>
<li data-parsoid='{"dsr":[40,42,1,0]}'>d</li></ul></td></tr></tbody></table>
...

sorry I had a mistake in the example above - we can't ask parser to handle so invalid HTML. After fixiing the </td></tr> this is reasonable wikitext that should generate <ul> list and it doesn't.
Either parser should be fixed (add </ul> when getting out of <td> in which the <ul> was added by the parser itself) or it should do post processing on the Remex

This node.js snippet below shows that what Remex is doing is the right thing, because as I said, HTML5 is fine with bare <li> tags. The bug is in the parser.

> DU.parseHTML(fs.readFileSync('/tmp/html', 'utf-8')).body.outerHTML
'<body><div class="mw-parser-output"><table>\n<tbody><tr>\n<td>\n<ul><li>a</li>\n<li>b</li></ul></td></tr><tr><td>\n<li>c</li>\n<li>d</li></td></tr></tbody></table>\n</div></body>'

@ssastry the php parser is broken and is dependent on Tidy for generating valid output (wiki valid - e.g blue bullets with css derived from ul) .

@ssastry the php parser is broken and is dependent on Tidy for generating valid output (wiki valid - e.g blue bullets with css derived from ul) .

Right, understood. What I pasted there shows that Remex output is not a problem necessarily since HTML5 allows that. In some scenarios, the absence of the ul can be a problem (ex: css). But, yes, we could introduce a linter rule or see how easy / difficult it is to fix the PHP parser. Parsoid does the right thing and is slated to replace the PHP parser in the coming year or two. So, unless the absence of the <ul> tag is a real problem in terms of rendering, we won't do that and maybe just introduce a linter rule to warn editors.

ssastry renamed this task from Missing ul generation for bullet list to Parser generates broken lists when closing table (td, th, tr, table) tags are on the same line as the list item.Apr 5 2018, 4:38 PM
ssastry triaged this task as Medium priority.