Arlolra has uploaded a new change for review.
https://gerrit.wikimedia.org/r/188488
Change subject: Hoist metas from headings when serializing
......................................................................
Hoist metas from headings when serializing
Bug: T52373
Change-Id: Icb02b4c4e90c0d553d8292c823cbddbc5124fe82
---
M lib/mediawiki.DOMUtils.js
M lib/mediawiki.WikitextSerializer.js
M lib/wts.TagHandlers.js
M tests/parserTests.txt
4 files changed, 65 insertions(+), 5 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/parsoid
refs/changes/88/188488/1
diff --git a/lib/mediawiki.DOMUtils.js b/lib/mediawiki.DOMUtils.js
index fb3fd6b..b07e367 100644
--- a/lib/mediawiki.DOMUtils.js
+++ b/lib/mediawiki.DOMUtils.js
@@ -871,12 +871,17 @@
}
},
+ isSolTransparentLink: function( node ) {
+ return DU.isElt(node) && node.nodeName === 'LINK' &&
+
/mw:PageProp\/(?:Category|redirect)/.test(node.getAttribute('rel'));
+ },
+
/**
* Check if 'node' emits wikitext that is sol-transparent in wikitext
form.
* This is a test for wikitext that doesn't introduce line breaks.
*
* Comment, whitespace text nodes, category links, redirect links, and
include
- * directives currently satisfy this defintion.
+ * directives currently satisfy this definition.
*
* @param {Node} node
*/
@@ -888,8 +893,7 @@
} else if (node.nodeName === 'META') {
return
(/(^|\s)mw:Includes\//).test(node.getAttribute('typeof'));
} else {
- return (wt2htmlMode || !this.isNewElt(node)) &&
node.nodeName === 'LINK' &&
-
/mw:PageProp\/(?:Category|redirect)/.test(node.getAttribute('rel'));
+ return (wt2htmlMode || !this.isNewElt(node)) &&
DU.isSolTransparentLink(node);
}
},
@@ -1043,6 +1047,10 @@
return this.isText(node) && node.nodeValue.match(/^\s*$/);
},
+ isDocumentFragment: function( node ) {
+ return node && node.nodeType === 11;
+ },
+
isContentNode: function(node) {
return !this.isComment(node) &&
!this.isIEW(node) &&
diff --git a/lib/mediawiki.WikitextSerializer.js
b/lib/mediawiki.WikitextSerializer.js
index 48b1a81..ec2bfaa 100644
--- a/lib/mediawiki.WikitextSerializer.js
+++ b/lib/mediawiki.WikitextSerializer.js
@@ -711,6 +711,7 @@
// new elements in html-syntax rather than wiki-syntax.
} else if (dp.stx === 'html' ||
(DU.isNewElt(node) && node.nodeName !== 'BODY' &&
+ !DU.isDocumentFragment( node.parentNode ) &&
DU.getDataParsoid( node.parentNode ).stx === 'html' &&
((DU.isList(node.parentNode) && DU.isListItem(node)) ||
(Consts.ParentTableTags.has(node.parentNode.nodeName) &&
diff --git a/lib/wts.TagHandlers.js b/lib/wts.TagHandlers.js
index 12d4103..29160bd 100644
--- a/lib/wts.TagHandlers.js
+++ b/lib/wts.TagHandlers.js
@@ -28,6 +28,28 @@
type.split(/\s+/).find(function(t) { return
genContentSpanTypes.has(t); }) !== undefined;
}
+function hoistLinks( node, rtl ) {
+ var sibling = rtl ? node.lastChild : node.firstChild,
+ prop = rtl ? "prevSibling" : "nextSibling",
+ next, fragment;
+ while ( sibling ) {
+ next = sibling[prop];
+ if ( !DU.isContentNode( sibling ) ) {
+ sibling = next;
+ continue;
+ }
+ if ( !DU.isSolTransparentLink( sibling ) ) {
+ break;
+ }
+ if ( !fragment ) {
+ fragment = node.ownerDocument.createDocumentFragment();
+ }
+ fragment.insertBefore( sibling, rtl ? fragment.firstChild :
null );
+ sibling = next;
+ }
+ return fragment;
+}
+
function buildHeadingHandler(headingWT) {
return {
handle: function(node, state, cb) {
@@ -38,6 +60,16 @@
var fc = node.firstChild;
if (fc && (!DU.isText(fc) ||
!fc.nodeValue.match(/^\s/))) {
space = ' ';
+ }
+ }
+
+ // Force SOL transparent links to serialize
before/after heading
+ var beforeFragment, afterFragment;
+ if ( node.childNodes.length ) {
+ beforeFragment = hoistLinks( node );
+ afterFragment = hoistLinks( node, true );
+ if ( beforeFragment &&
beforeFragment.childNodes.length ) {
+ state.serializeChildren(
beforeFragment, cb, null );
}
}
@@ -61,6 +93,10 @@
}
}
cb(space + headingWT, node);
+
+ if ( afterFragment && afterFragment.childNodes.length )
{
+ state.serializeChildren( afterFragment, cb,
null );
+ }
},
sepnls: {
before: function (node, otherNode) {
@@ -1023,7 +1059,7 @@
before: function (node, otherNode) {
var type = node.getAttribute('rel');
if
(/(?:^|\s)mw:(PageProp|WikiLink)\/(Category|redirect)(?=$|\s)/.test(type) &&
- DU.isNewElt(node) ) {
+ (DU.isNewElt(node) ||
DU.isDocumentFragment(node.parentNode))) {
// Fresh category link: Serialize on
its own line
return {min: 1};
} else {
@@ -1033,7 +1069,7 @@
after: function (node, otherNode) {
var type = node.getAttribute('rel');
if
(/(?:^|\s)mw:(PageProp|WikiLink)\/Category(?=$|\s)/.test(type) &&
- DU.isNewElt(node) &&
+ (DU.isNewElt(node) ||
DU.isDocumentFragment(node.parentNode)) &&
otherNode.nodeName !== 'BODY')
{
// Fresh category link: Serialize on
its own line
diff --git a/tests/parserTests.txt b/tests/parserTests.txt
index cc0f27f..b1a1b86 100644
--- a/tests/parserTests.txt
+++ b/tests/parserTests.txt
@@ -22749,6 +22749,21 @@
!! end
!! test
+Headings: Force metas to serialize before/after
+!! options
+parsoid=html2wt
+!! html
+<h2>hello there<link href="Category:A1" rel="mw:PageProp/Category" /></h2>
+<h2><link href="Category:A2" rel="mw:PageProp/Category" />hi pal</h2>
+!! wikitext
+== hello there ==
+[[Category:A1]]
+
+[[Category:A2]]
+== hi pal ==
+!! end
+
+!! test
Parsoid: Serialize positional parameters with = in them as named parameter
!! options
parsoid=html2wt
--
To view, visit https://gerrit.wikimedia.org/r/188488
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Icb02b4c4e90c0d553d8292c823cbddbc5124fe82
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: Arlolra <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits