jenkins-bot has submitted this change and it was merged.

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(-)

Approvals:
  Marcoil: Looks good to me, approved
  jenkins-bot: Verified



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: merged
Gerrit-Change-Id: Icb02b4c4e90c0d553d8292c823cbddbc5124fe82
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: Arlolra <[email protected]>
Gerrit-Reviewer: Marcoil <[email protected]>
Gerrit-Reviewer: Subramanya Sastry <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to