Anomie has uploaded a new change for review.

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


Change subject: Regularize whitespace handling in mw.title
......................................................................

Regularize whitespace handling in mw.title

Specifically:
* String conversion in non-URL contexts (e.g. .prefixedText) uses spaces
  instead of underscores.
* Setting .fragment now applies the same transformations that are done
  (in PHP) by mw.title.new.

Bug: 56217
Change-Id: I12e354636bcde3327864088175fb4de61aecc81a
---
M engines/LuaCommon/lualib/mw.title.lua
M tests/engines/LuaCommon/TitleLibraryTests.lua
2 files changed, 93 insertions(+), 31 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Scribunto 
refs/changes/87/92887/1

diff --git a/engines/LuaCommon/lualib/mw.title.lua 
b/engines/LuaCommon/lualib/mw.title.lua
index 03184ef..e1ae572 100644
--- a/engines/LuaCommon/lualib/mw.title.lua
+++ b/engines/LuaCommon/lualib/mw.title.lua
@@ -65,7 +65,7 @@
 
        data.prefixedText = data.text
        if data.nsText ~= '' then
-               data.prefixedText = data.nsText .. ':' .. data.prefixedText
+               data.prefixedText = string.gsub( data.nsText .. ':' .. 
data.prefixedText, '_', ' ' )
        end
        if data.interwiki ~= '' then
                data.prefixedText = data.interwiki .. ':' .. data.prefixedText
@@ -235,6 +235,8 @@
                __newindex = function ( t, k, v )
                        if k == 'fragment' then
                                checkTypeForIndex( k, v, 'string' )
+                               v = string.gsub( v, '[%s_]+', ' ' )
+                               v = string.gsub( v, '^(.-) ?$', '%1' )
                                data[k] = v
                        elseif readOnlyFields[k] then
                                error( "index '" .. k .. "' is read only", 2 )
diff --git a/tests/engines/LuaCommon/TitleLibraryTests.lua 
b/tests/engines/LuaCommon/TitleLibraryTests.lua
index 84b5465..904e834 100644
--- a/tests/engines/LuaCommon/TitleLibraryTests.lua
+++ b/tests/engines/LuaCommon/TitleLibraryTests.lua
@@ -1,6 +1,6 @@
 local testframework = require 'Module:TestFramework'
 
-local title, title_copy, title2, title3, title4, title5, title6, title4p
+local title, title_copy, title2, title3, title4, title5, title6u, title6s, 
title4p
 if mw.title.testPageId then
        title = mw.title.getCurrentTitle()
        title_copy = mw.title.getCurrentTitle()
@@ -11,10 +11,16 @@
        title4.fragment = 'frag'
 
        title4p = mw.title.new( 'Talk:Has/A' )
+
+       title6u = mw.title.new( 'Module_talk:Test_Framework' )
+       title6u.fragment = '__frag__frag__'
+
+       title6s = mw.title.new( 'Module talk:Test Framework' )
+       title6s.fragment = '  frag  frag  '
 end
 
 local function prop_foreach( prop )
-       return title[prop], title2[prop], title3[prop], title4[prop], 
title5[prop]
+       return title[prop], title2[prop], title3[prop], title4[prop], 
title5[prop], title6u[prop], title6s[prop]
 end
 
 local function func_foreach( func, ... )
@@ -22,11 +28,18 @@
                title2[func]( title2, ... ),
                title3[func]( title3, ... ),
                title4[func]( title4, ... ),
-               title5[func]( title5, ... )
+               title5[func]( title5, ... ),
+               title6u[func]( title6u, ... ),
+               title6s[func]( title6s, ... )
 end
 
 local function identity( ... )
        return ...
+end
+
+local function test_space_normalization( s )
+       local title = mw.title.new( s )
+       return tostring( title ), tostring( title.fragment )
 end
 
 local function test_expensive()
@@ -50,8 +63,12 @@
 -- Tests
 local tests = {
        { name = 'tostring', func = identity, type = 'ToString',
-         args = { title, title2, title3, title4, title5 },
-         expect = { 'Main Page', 'Module:TestFramework', 
'scribuntotitletest:Module:TestFramework', 'Talk:Has/A/Subpage', 
'Not/A/Subpage' }
+         args = { title, title2, title3, title4, title5, title6u, title6s },
+         expect = {
+                 'Main Page', 'Module:TestFramework', 
'scribuntotitletest:Module:TestFramework',
+                 'Talk:Has/A/Subpage', 'Not/A/Subpage',
+                 'Module talk:Test Framework', 'Module talk:Test Framework'
+         }
        },
 
        { name = 'title.equal', func = mw.title.equals,
@@ -92,6 +109,10 @@
          args = { title2, title3 },
          expect = { -1 }
        },
+       { name = 'title.compare (6)', func = mw.title.compare,
+         args = { title6s, title6u },
+         expect = { 0 }
+       },
        { name = '<', func = function ()
                return title < title, title < title_copy, title < title2, 
title2 < title
          end,
@@ -114,6 +135,10 @@
        { name = 'title.new with namespace (3)', func = mw.title.new, type = 
'ToString',
          args = { 'Template:TestFramework', 'Module' },
          expect = { 'Template:TestFramework' }
+       },
+       { name = 'title.new space normalization', func = 
test_space_normalization,
+         args = { ' __ Template __ : __ Test _ Framework __ # _ frag _ frag _ 
' },
+         expect = { 'Template:Test Framework', ' frag frag' }
        },
        { name = 'title.new with invalid title', func = mw.title.new,
          args = { '<bad title>' },
@@ -147,83 +172,108 @@
 
        { name = '.isLocal', func = prop_foreach,
          args = { 'isLocal' },
-         expect = { true, true, false, true, true }
+         expect = { true, true, false, true, true, true, true }
        },
        { name = '.isTalkPage', func = prop_foreach,
          args = { 'isTalkPage' },
-         expect = { false, false, false, true, false }
+         expect = { false, false, false, true, false, true, true }
        },
        { name = '.isSubpage', func = prop_foreach,
          args = { 'isSubpage' },
-         expect = { false, false, false, true, false }
+         expect = { false, false, false, true, false, false, false }
        },
        { name = '.text', func = prop_foreach,
          args = { 'text' },
-         expect = { 'Main Page', 'TestFramework', 'Module:TestFramework', 
'Has/A/Subpage', 'Not/A/Subpage' }
+         expect = {
+                 'Main Page', 'TestFramework', 'Module:TestFramework', 
'Has/A/Subpage', 'Not/A/Subpage',
+                 'Test Framework', 'Test Framework'
+         }
        },
        { name = '.prefixedText', func = prop_foreach,
          args = { 'prefixedText' },
-         expect = { 'Main Page', 'Module:TestFramework', 
'scribuntotitletest:Module:TestFramework', 'Talk:Has/A/Subpage', 
'Not/A/Subpage' }
+         expect = {
+                 'Main Page', 'Module:TestFramework', 
'scribuntotitletest:Module:TestFramework',
+                 'Talk:Has/A/Subpage', 'Not/A/Subpage', 'Module talk:Test 
Framework', 'Module talk:Test Framework',
+         }
        },
        { name = '.rootText', func = prop_foreach,
          args = { 'rootText' },
-         expect = { 'Main Page', 'TestFramework', 'Module:TestFramework', 
'Has', 'Not/A/Subpage' }
+         expect = {
+                 'Main Page', 'TestFramework', 'Module:TestFramework', 'Has', 
'Not/A/Subpage',
+                 'Test Framework', 'Test Framework'
+         }
        },
        { name = '.baseText', func = prop_foreach,
          args = { 'baseText' },
-         expect = { 'Main Page', 'TestFramework', 'Module:TestFramework', 
'Has/A', 'Not/A/Subpage' }
+         expect = {
+                 'Main Page', 'TestFramework', 'Module:TestFramework', 
'Has/A', 'Not/A/Subpage',
+                 'Test Framework', 'Test Framework'
+         }
        },
        { name = '.subpageText', func = prop_foreach,
          args = { 'subpageText' },
-         expect = { 'Main Page', 'TestFramework', 'Module:TestFramework', 
'Subpage', 'Not/A/Subpage' }
+         expect = {
+                 'Main Page', 'TestFramework', 'Module:TestFramework', 
'Subpage', 'Not/A/Subpage',
+                 'Test Framework', 'Test Framework'
+         }
        },
        { name = '.fullText', func = prop_foreach,
          args = { 'fullText' },
-         expect = { 'Main Page', 'Module:TestFramework', 
'scribuntotitletest:Module:TestFramework', 'Talk:Has/A/Subpage#frag', 
'Not/A/Subpage' }
+         expect = {
+                 'Main Page', 'Module:TestFramework', 
'scribuntotitletest:Module:TestFramework',
+                 'Talk:Has/A/Subpage#frag', 'Not/A/Subpage',
+                 'Module talk:Test Framework# frag frag', 'Module talk:Test 
Framework# frag frag'
+         }
        },
        { name = '.subjectNsText', func = prop_foreach,
          args = { 'subjectNsText' },
-         expect = { '', 'Module', '', '', '' }
+         expect = { '', 'Module', '', '', '', 'Module', 'Module' }
        },
        { name = '.fragment', func = prop_foreach,
          args = { 'fragment' },
-         expect = { '', '', '', 'frag', '' }
+         expect = { '', '', '', 'frag', '', ' frag frag', ' frag frag' }
        },
        { name = '.interwiki', func = prop_foreach,
          args = { 'interwiki' },
-         expect = { '', '', 'scribuntotitletest', '', '' }
+         expect = { '', '', 'scribuntotitletest', '', '', '', '' }
        },
        { name = '.namespace', func = prop_foreach,
          args = { 'namespace' },
-         expect = { 0, mw.site.namespaces.Module.id, 0, 1, 0 }
+         expect = {
+                 0, mw.site.namespaces.Module.id, 0, 1, 0,
+                 mw.site.namespaces.Module_talk.id, 
mw.site.namespaces.Module_talk.id
+         }
        },
        { name = '.inNamespace()', func = func_foreach,
          args = { 'inNamespace', 'Module' },
-         expect = { false, true, false, false, false }
+         expect = { false, true, false, false, false, false, false }
        },
        { name = '.inNamespace() 2', func = func_foreach,
          args = { 'inNamespace', mw.site.namespaces.Module.id },
-         expect = { false, true, false, false, false }
+         expect = { false, true, false, false, false, false, false }
        },
        { name = '.inNamespaces()', func = func_foreach,
          args = { 'inNamespaces', 0, 1 },
-         expect = { true, false, true, true, true }
+         expect = { true, false, true, true, true, false, false }
        },
        { name = '.hasSubjectNamespace()', func = func_foreach,
          args = { 'hasSubjectNamespace', 0 },
-         expect = { true, false, true, true, true }
+         expect = { true, false, true, true, true, false, false }
        },
        { name = '.isSubpageOf() 1', func = func_foreach,
          args = { 'isSubpageOf', title },
-         expect = { false, false, false, false, false }
+         expect = { false, false, false, false, false, false, false }
        },
        { name = '.isSubpageOf() 2', func = func_foreach,
          args = { 'isSubpageOf', title4p },
-         expect = { false, false, false, true, false }
+         expect = { false, false, false, true, false, false, false }
        },
        { name = '.partialUrl()', func = func_foreach,
          args = { 'partialUrl' },
-         expect = { 'Main_Page', 'TestFramework', 'Module:TestFramework', 
'Has/A/Subpage', 'Not/A/Subpage' }
+         expect = {
+                 'Main_Page', 'TestFramework', 'Module:TestFramework', 
'Has/A/Subpage', 'Not/A/Subpage',
+                 'Test_Framework', 'Test_Framework'
+         }
        },
        { name = '.fullUrl()', func = func_foreach,
          args = { 'fullUrl' },
@@ -232,7 +282,9 @@
                  '//wiki.local/wiki/Module:TestFramework',
                  '//test.wikipedia.org/wiki/Module:TestFramework',
                  '//wiki.local/wiki/Talk:Has/A/Subpage#frag',
-                 '//wiki.local/wiki/Not/A/Subpage'
+                 '//wiki.local/wiki/Not/A/Subpage',
+                 '//wiki.local/wiki/Module_talk:Test_Framework#_frag_frag',
+                 '//wiki.local/wiki/Module_talk:Test_Framework#_frag_frag',
          }
        },
        { name = '.fullUrl() 2', func = func_foreach,
@@ -242,7 +294,9 @@
                  
'//wiki.local/w/index.php?title=Module:TestFramework&action=test',
                  '//test.wikipedia.org/wiki/Module:TestFramework?action=test',
                  
'//wiki.local/w/index.php?title=Talk:Has/A/Subpage&action=test#frag',
-                 '//wiki.local/w/index.php?title=Not/A/Subpage&action=test'
+                 '//wiki.local/w/index.php?title=Not/A/Subpage&action=test',
+                 
'//wiki.local/w/index.php?title=Module_talk:Test_Framework&action=test#_frag_frag',
+                 
'//wiki.local/w/index.php?title=Module_talk:Test_Framework&action=test#_frag_frag',
          }
        },
        { name = '.fullUrl() 3', func = func_foreach,
@@ -252,7 +306,9 @@
                  'http://wiki.local/wiki/Module:TestFramework',
                  'http://test.wikipedia.org/wiki/Module:TestFramework',
                  'http://wiki.local/wiki/Talk:Has/A/Subpage#frag',
-                 'http://wiki.local/wiki/Not/A/Subpage'
+                 'http://wiki.local/wiki/Not/A/Subpage',
+                 
'http://wiki.local/wiki/Module_talk:Test_Framework#_frag_frag',
+                 
'http://wiki.local/wiki/Module_talk:Test_Framework#_frag_frag',
          }
        },
        { name = '.localUrl()', func = func_foreach,
@@ -262,7 +318,9 @@
                  '/wiki/Module:TestFramework',
                  '//test.wikipedia.org/wiki/Module:TestFramework',
                  '/wiki/Talk:Has/A/Subpage',
-                 '/wiki/Not/A/Subpage'
+                 '/wiki/Not/A/Subpage',
+                 '/wiki/Module_talk:Test_Framework',
+                 '/wiki/Module_talk:Test_Framework',
          }
        },
        { name = '.canonicalUrl()', func = func_foreach,
@@ -272,7 +330,9 @@
                  'http://wiki.local/wiki/Module:TestFramework',
                  'http://test.wikipedia.org/wiki/Module:TestFramework',
                  'http://wiki.local/wiki/Talk:Has/A/Subpage#frag',
-                 'http://wiki.local/wiki/Not/A/Subpage'
+                 'http://wiki.local/wiki/Not/A/Subpage',
+                 
'http://wiki.local/wiki/Module_talk:Test_Framework#_frag_frag',
+                 
'http://wiki.local/wiki/Module_talk:Test_Framework#_frag_frag',
          }
        },
 

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I12e354636bcde3327864088175fb4de61aecc81a
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Scribunto
Gerrit-Branch: master
Gerrit-Owner: Anomie <[email protected]>

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

Reply via email to