Subramanya Sastry has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/95574


Change subject: (Bug 56983) Correctly serialize magic words added on client
......................................................................

(Bug 56983) Correctly serialize magic words added on client

* Added generic support for serialization of magic words added
  on the client.

* Minor code cleanup associated with adding support for this.

* Added new parser test to test this (passes with this patch
  and fails without).

Change-Id: I4afef6a1e8a5acbe5b0ac673fabe1d9bcd3cc0bf
---
M js/lib/ext.core.BehaviorSwitchHandler.js
M js/lib/mediawiki.WikiConfig.js
M js/lib/mediawiki.WikitextSerializer.js
M js/tests/parserTests.txt
4 files changed, 66 insertions(+), 14 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Parsoid 
refs/changes/74/95574/1

diff --git a/js/lib/ext.core.BehaviorSwitchHandler.js 
b/js/lib/ext.core.BehaviorSwitchHandler.js
index 8a44fd6..2413492 100644
--- a/js/lib/ext.core.BehaviorSwitchHandler.js
+++ b/js/lib/ext.core.BehaviorSwitchHandler.js
@@ -28,16 +28,14 @@
  * See {@link TokenTransformManager#addTransform}'s transformation parameter
  */
 BehaviorSwitchHandler.prototype.onBehaviorSwitch = function ( token, manager, 
cb ) {
-       var metaToken, magicWord = token.attribs[0].v,
+       var metaToken,
                env = this.manager.env,
-               switchType = magicWord.toLowerCase(),
-               actualType = env.conf.wiki.magicWords[magicWord] ||
-                       env.conf.wiki.magicWords[switchType];
+               magicWord = 
env.conf.wiki.magicWordCanonicalName(token.attribs[0].v);
 
-       env.setVariable( actualType, true );
+       env.setVariable( magicWord, true );
 
        metaToken = new SelfclosingTagTk( 'meta',
-               [ new KV( 'property', 'mw:PageProp/' + actualType ) ],
+               [ new KV( 'property', 'mw:PageProp/' + magicWord ) ],
                Util.clone( token.dataAttribs ) );
 
        return { tokens: [ metaToken ] };
diff --git a/js/lib/mediawiki.WikiConfig.js b/js/lib/mediawiki.WikiConfig.js
index f299c66..88f13e7 100644
--- a/js/lib/mediawiki.WikiConfig.js
+++ b/js/lib/mediawiki.WikiConfig.js
@@ -200,18 +200,22 @@
        // List of magic word aliases with $1 in their names, indexed by 
canonical name.
        this._interpolatedMagicWordAliases = {};
 
-       for ( var mwx = 0; mwx < mws.length; mwx++ ) {
-               mw = mws[mwx];
+       for ( var j = 0; j < mws.length; j++ ) {
+               mw = mws[j];
                aliases = mw.aliases;
                if ( aliases.length > 0 ) {
                        this.mwAliases[mw.name] = [];
                        this._interpolatedMagicWordAliases[mw.name] = [];
                }
-               for ( var mwax = 0; mwax < aliases.length; mwax++ ) {
-                       var alias = aliases[mwax];
+               for ( var k = 0; k < aliases.length; k++ ) {
+                       var alias = aliases[k];
+
+                       this.mwAliases[mw.name].push( alias );
                        if ( mw['case-sensitive'] !== '' ) {
                                alias = alias.toLowerCase();
+                               this.mwAliases[mw.name].push( alias );
                        }
+                       this.magicWords[alias] = mw.name;
 
                        if ( alias.match( /\$1/ ) !== null ) {
                                // This is a named option. Add it to the array.
@@ -219,8 +223,6 @@
                                this._interpolatedMagicWords.push( alias );
                                
this._interpolatedMagicWordAliases[mw.name].push( alias );
                        }
-                       this.magicWords[alias] = mw.name;
-                       this.mwAliases[mw.name].push( alias );
                }
                this._mwRegexps[mw.name] =
                        new RegExp( '^(' +
@@ -379,10 +381,28 @@
 };
 
 /**
+ * Get canonical magicword name for the input word
+ *
+ * @param {string} word
+ * @returns {string}
+ */
+WikiConfig.prototype.magicWordCanonicalName = function ( word ) {
+       return this.magicWords[word] || this.magicWords[word.toLowerCase()] || 
null;
+};
+
+/**
  * Check if a string is a recognized magic word
  */
 WikiConfig.prototype.isMagicWord = function ( word ) {
-       return this.magicWords[word] || this.magicWords[word.toLowerCase()];
+       return this.magicWordCanonicalName(word) !== null;
+};
+
+/**
+ * Convert the internal canonical magic word name to the wikitext alias
+ */
+WikiConfig.prototype.getMagicWordWT = function(word) {
+       var aliases = this.mwAliases[word];
+       return (aliases && aliases.length > 0) ? aliases[0] : null;
 };
 
 /**
diff --git a/js/lib/mediawiki.WikitextSerializer.js 
b/js/lib/mediawiki.WikitextSerializer.js
index 0833e7d..52777d6 100644
--- a/js/lib/mediawiki.WikitextSerializer.js
+++ b/js/lib/mediawiki.WikitextSerializer.js
@@ -2718,6 +2718,8 @@
                                                }
                                        } else if ( node.data.parsoid.magicSrc 
) {
                                                out = 
node.data.parsoid.magicSrc;
+                                       } else {
+                                               out = 
state.env.conf.wiki.getMagicWordWT(switchType[1]) || switchType[1];
                                        }
                                        cb(out, node);
                                }
diff --git a/js/tests/parserTests.txt b/js/tests/parserTests.txt
index 48fe6bb..2b9acd1 100644
--- a/js/tests/parserTests.txt
+++ b/js/tests/parserTests.txt
@@ -18741,8 +18741,12 @@
 <p><i>A</i><b data-parsoid='{}'><i data-parsoid='{}'>B</i></b></p>
 !! end
 
+#------------------------------------
+# End of I/B quote minimization tests
+#------------------------------------
+
 !!test
-5. Bug 54262: New entities
+Bug 54262: New entities
 !! options
 parsoid=html2wt
 !! input
@@ -18751,6 +18755,34 @@
 <span typeof="mw:Entity">foo</span>
 !! end
 
+!! test
+Magic words
+!! options
+parsoid=html2wt
+!! input
+__TOC__
+__NOTOC__
+__FORCETOC__
+__INDEX__
+__NOINDEX__
+__NOGALLERY__
+__NOEDITSECTION__
+__NOTITLECONVERT__
+__NOCONTENTCONVERT__
+unknownproperty
+!! result
+<meta property='mw:PageProp/toc' />
+<meta property='mw:PageProp/notoc' />
+<meta property='mw:PageProp/forcetoc' />
+<meta property='mw:PageProp/index' />
+<meta property='mw:PageProp/noindex' />
+<meta property='mw:PageProp/nogallery' />
+<meta property='mw:PageProp/noeditsection' />
+<meta property='mw:PageProp/notitleconvert' />
+<meta property='mw:PageProp/nocontentconvert' />
+<meta property='mw:PageProp/unknownproperty' />
+!! end
+
 # -----------------------------------------------------------------
 # End of section for Parsoid-only html2wt tests for serialization
 # of new content

-- 
To view, visit https://gerrit.wikimedia.org/r/95574
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4afef6a1e8a5acbe5b0ac673fabe1d9bcd3cc0bf
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Parsoid
Gerrit-Branch: master
Gerrit-Owner: Subramanya Sastry <[email protected]>

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

Reply via email to