jenkins-bot merged this change.

View Change

Approvals: Zhuyifei1999: Looks good to me, but someone else must approve Xqt: Looks good to me, approved jenkins-bot: Verified
pywikibot.tools: Add exceptions for first_upper

MediaWiki uppercases these characters differently. See T200357#4496988 for
more details.

Bug: T200357
Change-Id: I6060617d0fe36dac289c6fece7c225fb044204e2
---
M pywikibot/tools/__init__.py
1 file changed, 262 insertions(+), 5 deletions(-)

diff --git a/pywikibot/tools/__init__.py b/pywikibot/tools/__init__.py
index d3b0b94..a1f8220 100644
--- a/pywikibot/tools/__init__.py
+++ b/pywikibot/tools/__init__.py
@@ -90,6 +90,264 @@

_logger = 'tools'

+# A mapping of characters to their MediaWiki title-cased forms. Python,
+# depending on version, handles these characters differently, which causes
+# errors in normalizing titles. (T200357) This dict was created using
+# Python 3.7 (Unicode version 11.0.0) and should be updated at least with every
+# new release of Python with an updated unicodedata.unidata_version.
+_first_upper_exception = {
+ '\xdf': '\xdf', '\u0149': '\u0149', '\u0180': '\u0180', '\u019a': '\u019a',
+ '\u01c5': '\u01c5', '\u01c6': '\u01c5', '\u01c8': '\u01c8', '\u01c9':
+ '\u01c8', '\u01cb': '\u01cb', '\u01cc': '\u01cb', '\u01f0': '\u01f0',
+ '\u01f2': '\u01f2', '\u01f3': '\u01f2', '\u023c': '\u023c', '\u023f':
+ '\u023f', '\u0240': '\u0240', '\u0242': '\u0242', '\u0247': '\u0247',
+ '\u0249': '\u0249', '\u024b': '\u024b', '\u024d': '\u024d', '\u024f':
+ '\u024f', '\u0250': '\u0250', '\u0251': '\u0251', '\u0252': '\u0252',
+ '\u025c': '\u025c', '\u0261': '\u0261', '\u0265': '\u0265', '\u0266':
+ '\u0266', '\u026a': '\u026a', '\u026b': '\u026b', '\u026c': '\u026c',
+ '\u0271': '\u0271', '\u027d': '\u027d', '\u0287': '\u0287', '\u0289':
+ '\u0289', '\u028c': '\u028c', '\u029d': '\u029d', '\u029e': '\u029e',
+ '\u0345': '\u0345', '\u0371': '\u0371', '\u0373': '\u0373', '\u0377':
+ '\u0377', '\u037b': '\u037b', '\u037c': '\u037c', '\u037d': '\u037d',
+ '\u0390': '\u0390', '\u03b0': '\u03b0', '\u03d7': '\u03d7', '\u03f2':
+ '\u03a3', '\u03f3': '\u03f3', '\u03f8': '\u03f8', '\u03fb': '\u03fb',
+ '\u04cf': '\u04cf', '\u04f7': '\u04f7', '\u04fb': '\u04fb', '\u04fd':
+ '\u04fd', '\u04ff': '\u04ff', '\u0511': '\u0511', '\u0513': '\u0513',
+ '\u0515': '\u0515', '\u0517': '\u0517', '\u0519': '\u0519', '\u051b':
+ '\u051b', '\u051d': '\u051d', '\u051f': '\u051f', '\u0521': '\u0521',
+ '\u0523': '\u0523', '\u0525': '\u0525', '\u0527': '\u0527', '\u0529':
+ '\u0529', '\u052b': '\u052b', '\u052d': '\u052d', '\u052f': '\u052f',
+ '\u0587': '\u0587', '\u10d0': '\u10d0', '\u10d1': '\u10d1', '\u10d2':
+ '\u10d2', '\u10d3': '\u10d3', '\u10d4': '\u10d4', '\u10d5': '\u10d5',
+ '\u10d6': '\u10d6', '\u10d7': '\u10d7', '\u10d8': '\u10d8', '\u10d9':
+ '\u10d9', '\u10da': '\u10da', '\u10db': '\u10db', '\u10dc': '\u10dc',
+ '\u10dd': '\u10dd', '\u10de': '\u10de', '\u10df': '\u10df', '\u10e0':
+ '\u10e0', '\u10e1': '\u10e1', '\u10e2': '\u10e2', '\u10e3': '\u10e3',
+ '\u10e4': '\u10e4', '\u10e5': '\u10e5', '\u10e6': '\u10e6', '\u10e7':
+ '\u10e7', '\u10e8': '\u10e8', '\u10e9': '\u10e9', '\u10ea': '\u10ea',
+ '\u10eb': '\u10eb', '\u10ec': '\u10ec', '\u10ed': '\u10ed', '\u10ee':
+ '\u10ee', '\u10ef': '\u10ef', '\u10f0': '\u10f0', '\u10f1': '\u10f1',
+ '\u10f2': '\u10f2', '\u10f3': '\u10f3', '\u10f4': '\u10f4', '\u10f5':
+ '\u10f5', '\u10f6': '\u10f6', '\u10f7': '\u10f7', '\u10f8': '\u10f8',
+ '\u10f9': '\u10f9', '\u10fa': '\u10fa', '\u10fd': '\u10fd', '\u10fe':
+ '\u10fe', '\u10ff': '\u10ff', '\u13f8': '\u13f8', '\u13f9': '\u13f9',
+ '\u13fa': '\u13fa', '\u13fb': '\u13fb', '\u13fc': '\u13fc', '\u13fd':
+ '\u13fd', '\u1c80': '\u1c80', '\u1c81': '\u1c81', '\u1c82': '\u1c82',
+ '\u1c83': '\u1c83', '\u1c84': '\u1c84', '\u1c85': '\u1c85', '\u1c86':
+ '\u1c86', '\u1c87': '\u1c87', '\u1c88': '\u1c88', '\u1d79': '\u1d79',
+ '\u1d7d': '\u1d7d', '\u1e96': '\u1e96', '\u1e97': '\u1e97', '\u1e98':
+ '\u1e98', '\u1e99': '\u1e99', '\u1e9a': '\u1e9a', '\u1efb': '\u1efb',
+ '\u1efd': '\u1efd', '\u1eff': '\u1eff', '\u1f50': '\u1f50', '\u1f52':
+ '\u1f52', '\u1f54': '\u1f54', '\u1f56': '\u1f56', '\u1f71': '\u0386',
+ '\u1f73': '\u0388', '\u1f75': '\u0389', '\u1f77': '\u038a', '\u1f79':
+ '\u038c', '\u1f7b': '\u038e', '\u1f7d': '\u038f', '\u1f80': '\u1f88',
+ '\u1f81': '\u1f89', '\u1f82': '\u1f8a', '\u1f83': '\u1f8b', '\u1f84':
+ '\u1f8c', '\u1f85': '\u1f8d', '\u1f86': '\u1f8e', '\u1f87': '\u1f8f',
+ '\u1f88': '\u1f88', '\u1f89': '\u1f89', '\u1f8a': '\u1f8a', '\u1f8b':
+ '\u1f8b', '\u1f8c': '\u1f8c', '\u1f8d': '\u1f8d', '\u1f8e': '\u1f8e',
+ '\u1f8f': '\u1f8f', '\u1f90': '\u1f98', '\u1f91': '\u1f99', '\u1f92':
+ '\u1f9a', '\u1f93': '\u1f9b', '\u1f94': '\u1f9c', '\u1f95': '\u1f9d',
+ '\u1f96': '\u1f9e', '\u1f97': '\u1f9f', '\u1f98': '\u1f98', '\u1f99':
+ '\u1f99', '\u1f9a': '\u1f9a', '\u1f9b': '\u1f9b', '\u1f9c': '\u1f9c',
+ '\u1f9d': '\u1f9d', '\u1f9e': '\u1f9e', '\u1f9f': '\u1f9f', '\u1fa0':
+ '\u1fa8', '\u1fa1': '\u1fa9', '\u1fa2': '\u1faa', '\u1fa3': '\u1fab',
+ '\u1fa4': '\u1fac', '\u1fa5': '\u1fad', '\u1fa6': '\u1fae', '\u1fa7':
+ '\u1faf', '\u1fa8': '\u1fa8', '\u1fa9': '\u1fa9', '\u1faa': '\u1faa',
+ '\u1fab': '\u1fab', '\u1fac': '\u1fac', '\u1fad': '\u1fad', '\u1fae':
+ '\u1fae', '\u1faf': '\u1faf', '\u1fb2': '\u1fb2', '\u1fb3': '\u1fbc',
+ '\u1fb4': '\u1fb4', '\u1fb6': '\u1fb6', '\u1fb7': '\u1fb7', '\u1fbc':
+ '\u1fbc', '\u1fc2': '\u1fc2', '\u1fc3': '\u1fcc', '\u1fc4': '\u1fc4',
+ '\u1fc6': '\u1fc6', '\u1fc7': '\u1fc7', '\u1fcc': '\u1fcc', '\u1fd2':
+ '\u1fd2', '\u1fd3': '\u0390', '\u1fd6': '\u1fd6', '\u1fd7': '\u1fd7',
+ '\u1fe2': '\u1fe2', '\u1fe3': '\u03b0', '\u1fe4': '\u1fe4', '\u1fe6':
+ '\u1fe6', '\u1fe7': '\u1fe7', '\u1ff2': '\u1ff2', '\u1ff3': '\u1ffc',
+ '\u1ff4': '\u1ff4', '\u1ff6': '\u1ff6', '\u1ff7': '\u1ff7', '\u1ffc':
+ '\u1ffc', '\u214e': '\u214e', '\u2170': '\u2170', '\u2171': '\u2171',
+ '\u2172': '\u2172', '\u2173': '\u2173', '\u2174': '\u2174', '\u2175':
+ '\u2175', '\u2176': '\u2176', '\u2177': '\u2177', '\u2178': '\u2178',
+ '\u2179': '\u2179', '\u217a': '\u217a', '\u217b': '\u217b', '\u217c':
+ '\u217c', '\u217d': '\u217d', '\u217e': '\u217e', '\u217f': '\u217f',
+ '\u2184': '\u2184', '\u24d0': '\u24d0', '\u24d1': '\u24d1', '\u24d2':
+ '\u24d2', '\u24d3': '\u24d3', '\u24d4': '\u24d4', '\u24d5': '\u24d5',
+ '\u24d6': '\u24d6', '\u24d7': '\u24d7', '\u24d8': '\u24d8', '\u24d9':
+ '\u24d9', '\u24da': '\u24da', '\u24db': '\u24db', '\u24dc': '\u24dc',
+ '\u24dd': '\u24dd', '\u24de': '\u24de', '\u24df': '\u24df', '\u24e0':
+ '\u24e0', '\u24e1': '\u24e1', '\u24e2': '\u24e2', '\u24e3': '\u24e3',
+ '\u24e4': '\u24e4', '\u24e5': '\u24e5', '\u24e6': '\u24e6', '\u24e7':
+ '\u24e7', '\u24e8': '\u24e8', '\u24e9': '\u24e9', '\u2c30': '\u2c30',
+ '\u2c31': '\u2c31', '\u2c32': '\u2c32', '\u2c33': '\u2c33', '\u2c34':
+ '\u2c34', '\u2c35': '\u2c35', '\u2c36': '\u2c36', '\u2c37': '\u2c37',
+ '\u2c38': '\u2c38', '\u2c39': '\u2c39', '\u2c3a': '\u2c3a', '\u2c3b':
+ '\u2c3b', '\u2c3c': '\u2c3c', '\u2c3d': '\u2c3d', '\u2c3e': '\u2c3e',
+ '\u2c3f': '\u2c3f', '\u2c40': '\u2c40', '\u2c41': '\u2c41', '\u2c42':
+ '\u2c42', '\u2c43': '\u2c43', '\u2c44': '\u2c44', '\u2c45': '\u2c45',
+ '\u2c46': '\u2c46', '\u2c47': '\u2c47', '\u2c48': '\u2c48', '\u2c49':
+ '\u2c49', '\u2c4a': '\u2c4a', '\u2c4b': '\u2c4b', '\u2c4c': '\u2c4c',
+ '\u2c4d': '\u2c4d', '\u2c4e': '\u2c4e', '\u2c4f': '\u2c4f', '\u2c50':
+ '\u2c50', '\u2c51': '\u2c51', '\u2c52': '\u2c52', '\u2c53': '\u2c53',
+ '\u2c54': '\u2c54', '\u2c55': '\u2c55', '\u2c56': '\u2c56', '\u2c57':
+ '\u2c57', '\u2c58': '\u2c58', '\u2c59': '\u2c59', '\u2c5a': '\u2c5a',
+ '\u2c5b': '\u2c5b', '\u2c5c': '\u2c5c', '\u2c5d': '\u2c5d', '\u2c5e':
+ '\u2c5e', '\u2c61': '\u2c61', '\u2c65': '\u2c65', '\u2c66': '\u2c66',
+ '\u2c68': '\u2c68', '\u2c6a': '\u2c6a', '\u2c6c': '\u2c6c', '\u2c73':
+ '\u2c73', '\u2c76': '\u2c76', '\u2c81': '\u2c81', '\u2c83': '\u2c83',
+ '\u2c85': '\u2c85', '\u2c87': '\u2c87', '\u2c89': '\u2c89', '\u2c8b':
+ '\u2c8b', '\u2c8d': '\u2c8d', '\u2c8f': '\u2c8f', '\u2c91': '\u2c91',
+ '\u2c93': '\u2c93', '\u2c95': '\u2c95', '\u2c97': '\u2c97', '\u2c99':
+ '\u2c99', '\u2c9b': '\u2c9b', '\u2c9d': '\u2c9d', '\u2c9f': '\u2c9f',
+ '\u2ca1': '\u2ca1', '\u2ca3': '\u2ca3', '\u2ca5': '\u2ca5', '\u2ca7':
+ '\u2ca7', '\u2ca9': '\u2ca9', '\u2cab': '\u2cab', '\u2cad': '\u2cad',
+ '\u2caf': '\u2caf', '\u2cb1': '\u2cb1', '\u2cb3': '\u2cb3', '\u2cb5':
+ '\u2cb5', '\u2cb7': '\u2cb7', '\u2cb9': '\u2cb9', '\u2cbb': '\u2cbb',
+ '\u2cbd': '\u2cbd', '\u2cbf': '\u2cbf', '\u2cc1': '\u2cc1', '\u2cc3':
+ '\u2cc3', '\u2cc5': '\u2cc5', '\u2cc7': '\u2cc7', '\u2cc9': '\u2cc9',
+ '\u2ccb': '\u2ccb', '\u2ccd': '\u2ccd', '\u2ccf': '\u2ccf', '\u2cd1':
+ '\u2cd1', '\u2cd3': '\u2cd3', '\u2cd5': '\u2cd5', '\u2cd7': '\u2cd7',
+ '\u2cd9': '\u2cd9', '\u2cdb': '\u2cdb', '\u2cdd': '\u2cdd', '\u2cdf':
+ '\u2cdf', '\u2ce1': '\u2ce1', '\u2ce3': '\u2ce3', '\u2cec': '\u2cec',
+ '\u2cee': '\u2cee', '\u2cf3': '\u2cf3', '\u2d00': '\u2d00', '\u2d01':
+ '\u2d01', '\u2d02': '\u2d02', '\u2d03': '\u2d03', '\u2d04': '\u2d04',
+ '\u2d05': '\u2d05', '\u2d06': '\u2d06', '\u2d07': '\u2d07', '\u2d08':
+ '\u2d08', '\u2d09': '\u2d09', '\u2d0a': '\u2d0a', '\u2d0b': '\u2d0b',
+ '\u2d0c': '\u2d0c', '\u2d0d': '\u2d0d', '\u2d0e': '\u2d0e', '\u2d0f':
+ '\u2d0f', '\u2d10': '\u2d10', '\u2d11': '\u2d11', '\u2d12': '\u2d12',
+ '\u2d13': '\u2d13', '\u2d14': '\u2d14', '\u2d15': '\u2d15', '\u2d16':
+ '\u2d16', '\u2d17': '\u2d17', '\u2d18': '\u2d18', '\u2d19': '\u2d19',
+ '\u2d1a': '\u2d1a', '\u2d1b': '\u2d1b', '\u2d1c': '\u2d1c', '\u2d1d':
+ '\u2d1d', '\u2d1e': '\u2d1e', '\u2d1f': '\u2d1f', '\u2d20': '\u2d20',
+ '\u2d21': '\u2d21', '\u2d22': '\u2d22', '\u2d23': '\u2d23', '\u2d24':
+ '\u2d24', '\u2d25': '\u2d25', '\u2d27': '\u2d27', '\u2d2d': '\u2d2d',
+ '\ua641': '\ua641', '\ua643': '\ua643', '\ua645': '\ua645', '\ua647':
+ '\ua647', '\ua649': '\ua649', '\ua64b': '\ua64b', '\ua64d': '\ua64d',
+ '\ua64f': '\ua64f', '\ua651': '\ua651', '\ua653': '\ua653', '\ua655':
+ '\ua655', '\ua657': '\ua657', '\ua659': '\ua659', '\ua65b': '\ua65b',
+ '\ua65d': '\ua65d', '\ua65f': '\ua65f', '\ua661': '\ua661', '\ua663':
+ '\ua663', '\ua665': '\ua665', '\ua667': '\ua667', '\ua669': '\ua669',
+ '\ua66b': '\ua66b', '\ua66d': '\ua66d', '\ua681': '\ua681', '\ua683':
+ '\ua683', '\ua685': '\ua685', '\ua687': '\ua687', '\ua689': '\ua689',
+ '\ua68b': '\ua68b', '\ua68d': '\ua68d', '\ua68f': '\ua68f', '\ua691':
+ '\ua691', '\ua693': '\ua693', '\ua695': '\ua695', '\ua697': '\ua697',
+ '\ua699': '\ua699', '\ua69b': '\ua69b', '\ua723': '\ua723', '\ua725':
+ '\ua725', '\ua727': '\ua727', '\ua729': '\ua729', '\ua72b': '\ua72b',
+ '\ua72d': '\ua72d', '\ua72f': '\ua72f', '\ua733': '\ua733', '\ua735':
+ '\ua735', '\ua737': '\ua737', '\ua739': '\ua739', '\ua73b': '\ua73b',
+ '\ua73d': '\ua73d', '\ua73f': '\ua73f', '\ua741': '\ua741', '\ua743':
+ '\ua743', '\ua745': '\ua745', '\ua747': '\ua747', '\ua749': '\ua749',
+ '\ua74b': '\ua74b', '\ua74d': '\ua74d', '\ua74f': '\ua74f', '\ua751':
+ '\ua751', '\ua753': '\ua753', '\ua755': '\ua755', '\ua757': '\ua757',
+ '\ua759': '\ua759', '\ua75b': '\ua75b', '\ua75d': '\ua75d', '\ua75f':
+ '\ua75f', '\ua761': '\ua761', '\ua763': '\ua763', '\ua765': '\ua765',
+ '\ua767': '\ua767', '\ua769': '\ua769', '\ua76b': '\ua76b', '\ua76d':
+ '\ua76d', '\ua76f': '\ua76f', '\ua77a': '\ua77a', '\ua77c': '\ua77c',
+ '\ua77f': '\ua77f', '\ua781': '\ua781', '\ua783': '\ua783', '\ua785':
+ '\ua785', '\ua787': '\ua787', '\ua78c': '\ua78c', '\ua791': '\ua791',
+ '\ua793': '\ua793', '\ua797': '\ua797', '\ua799': '\ua799', '\ua79b':
+ '\ua79b', '\ua79d': '\ua79d', '\ua79f': '\ua79f', '\ua7a1': '\ua7a1',
+ '\ua7a3': '\ua7a3', '\ua7a5': '\ua7a5', '\ua7a7': '\ua7a7', '\ua7a9':
+ '\ua7a9', '\ua7b5': '\ua7b5', '\ua7b7': '\ua7b7', '\ua7b9': '\ua7b9',
+ '\uab53': '\uab53', '\uab70': '\uab70', '\uab71': '\uab71', '\uab72':
+ '\uab72', '\uab73': '\uab73', '\uab74': '\uab74', '\uab75': '\uab75',
+ '\uab76': '\uab76', '\uab77': '\uab77', '\uab78': '\uab78', '\uab79':
+ '\uab79', '\uab7a': '\uab7a', '\uab7b': '\uab7b', '\uab7c': '\uab7c',
+ '\uab7d': '\uab7d', '\uab7e': '\uab7e', '\uab7f': '\uab7f', '\uab80':
+ '\uab80', '\uab81': '\uab81', '\uab82': '\uab82', '\uab83': '\uab83',
+ '\uab84': '\uab84', '\uab85': '\uab85', '\uab86': '\uab86', '\uab87':
+ '\uab87', '\uab88': '\uab88', '\uab89': '\uab89', '\uab8a': '\uab8a',
+ '\uab8b': '\uab8b', '\uab8c': '\uab8c', '\uab8d': '\uab8d', '\uab8e':
+ '\uab8e', '\uab8f': '\uab8f', '\uab90': '\uab90', '\uab91': '\uab91',
+ '\uab92': '\uab92', '\uab93': '\uab93', '\uab94': '\uab94', '\uab95':
+ '\uab95', '\uab96': '\uab96', '\uab97': '\uab97', '\uab98': '\uab98',
+ '\uab99': '\uab99', '\uab9a': '\uab9a', '\uab9b': '\uab9b', '\uab9c':
+ '\uab9c', '\uab9d': '\uab9d', '\uab9e': '\uab9e', '\uab9f': '\uab9f',
+ '\uaba0': '\uaba0', '\uaba1': '\uaba1', '\uaba2': '\uaba2', '\uaba3':
+ '\uaba3', '\uaba4': '\uaba4', '\uaba5': '\uaba5', '\uaba6': '\uaba6',
+ '\uaba7': '\uaba7', '\uaba8': '\uaba8', '\uaba9': '\uaba9', '\uabaa':
+ '\uabaa', '\uabab': '\uabab', '\uabac': '\uabac', '\uabad': '\uabad',
+ '\uabae': '\uabae', '\uabaf': '\uabaf', '\uabb0': '\uabb0', '\uabb1':
+ '\uabb1', '\uabb2': '\uabb2', '\uabb3': '\uabb3', '\uabb4': '\uabb4',
+ '\uabb5': '\uabb5', '\uabb6': '\uabb6', '\uabb7': '\uabb7', '\uabb8':
+ '\uabb8', '\uabb9': '\uabb9', '\uabba': '\uabba', '\uabbb': '\uabbb',
+ '\uabbc': '\uabbc', '\uabbd': '\uabbd', '\uabbe': '\uabbe', '\uabbf':
+ '\uabbf', '\ufb00': '\ufb00', '\ufb01': '\ufb01', '\ufb02': '\ufb02',
+ '\ufb03': '\ufb03', '\ufb04': '\ufb04', '\ufb05': '\ufb05', '\ufb06':
+ '\ufb06', '\ufb13': '\ufb13', '\ufb14': '\ufb14', '\ufb15': '\ufb15',
+ '\ufb16': '\ufb16', '\ufb17': '\ufb17', '\U0001044e': '\U0001044e',
+ '\U0001044f': '\U0001044f', '\U000104d8': '\U000104d8', '\U000104d9':
+ '\U000104d9', '\U000104da': '\U000104da', '\U000104db': '\U000104db',
+ '\U000104dc': '\U000104dc', '\U000104dd': '\U000104dd', '\U000104de':
+ '\U000104de', '\U000104df': '\U000104df', '\U000104e0': '\U000104e0',
+ '\U000104e1': '\U000104e1', '\U000104e2': '\U000104e2', '\U000104e3':
+ '\U000104e3', '\U000104e4': '\U000104e4', '\U000104e5': '\U000104e5',
+ '\U000104e6': '\U000104e6', '\U000104e7': '\U000104e7', '\U000104e8':
+ '\U000104e8', '\U000104e9': '\U000104e9', '\U000104ea': '\U000104ea',
+ '\U000104eb': '\U000104eb', '\U000104ec': '\U000104ec', '\U000104ed':
+ '\U000104ed', '\U000104ee': '\U000104ee', '\U000104ef': '\U000104ef',
+ '\U000104f0': '\U000104f0', '\U000104f1': '\U000104f1', '\U000104f2':
+ '\U000104f2', '\U000104f3': '\U000104f3', '\U000104f4': '\U000104f4',
+ '\U000104f5': '\U000104f5', '\U000104f6': '\U000104f6', '\U000104f7':
+ '\U000104f7', '\U000104f8': '\U000104f8', '\U000104f9': '\U000104f9',
+ '\U000104fa': '\U000104fa', '\U000104fb': '\U000104fb', '\U00010cc0':
+ '\U00010cc0', '\U00010cc1': '\U00010cc1', '\U00010cc2': '\U00010cc2',
+ '\U00010cc3': '\U00010cc3', '\U00010cc4': '\U00010cc4', '\U00010cc5':
+ '\U00010cc5', '\U00010cc6': '\U00010cc6', '\U00010cc7': '\U00010cc7',
+ '\U00010cc8': '\U00010cc8', '\U00010cc9': '\U00010cc9', '\U00010cca':
+ '\U00010cca', '\U00010ccb': '\U00010ccb', '\U00010ccc': '\U00010ccc',
+ '\U00010ccd': '\U00010ccd', '\U00010cce': '\U00010cce', '\U00010ccf':
+ '\U00010ccf', '\U00010cd0': '\U00010cd0', '\U00010cd1': '\U00010cd1',
+ '\U00010cd2': '\U00010cd2', '\U00010cd3': '\U00010cd3', '\U00010cd4':
+ '\U00010cd4', '\U00010cd5': '\U00010cd5', '\U00010cd6': '\U00010cd6',
+ '\U00010cd7': '\U00010cd7', '\U00010cd8': '\U00010cd8', '\U00010cd9':
+ '\U00010cd9', '\U00010cda': '\U00010cda', '\U00010cdb': '\U00010cdb',
+ '\U00010cdc': '\U00010cdc', '\U00010cdd': '\U00010cdd', '\U00010cde':
+ '\U00010cde', '\U00010cdf': '\U00010cdf', '\U00010ce0': '\U00010ce0',
+ '\U00010ce1': '\U00010ce1', '\U00010ce2': '\U00010ce2', '\U00010ce3':
+ '\U00010ce3', '\U00010ce4': '\U00010ce4', '\U00010ce5': '\U00010ce5',
+ '\U00010ce6': '\U00010ce6', '\U00010ce7': '\U00010ce7', '\U00010ce8':
+ '\U00010ce8', '\U00010ce9': '\U00010ce9', '\U00010cea': '\U00010cea',
+ '\U00010ceb': '\U00010ceb', '\U00010cec': '\U00010cec', '\U00010ced':
+ '\U00010ced', '\U00010cee': '\U00010cee', '\U00010cef': '\U00010cef',
+ '\U00010cf0': '\U00010cf0', '\U00010cf1': '\U00010cf1', '\U00010cf2':
+ '\U00010cf2', '\U000118c0': '\U000118c0', '\U000118c1': '\U000118c1',
+ '\U000118c2': '\U000118c2', '\U000118c3': '\U000118c3', '\U000118c4':
+ '\U000118c4', '\U000118c5': '\U000118c5', '\U000118c6': '\U000118c6',
+ '\U000118c7': '\U000118c7', '\U000118c8': '\U000118c8', '\U000118c9':
+ '\U000118c9', '\U000118ca': '\U000118ca', '\U000118cb': '\U000118cb',
+ '\U000118cc': '\U000118cc', '\U000118cd': '\U000118cd', '\U000118ce':
+ '\U000118ce', '\U000118cf': '\U000118cf', '\U000118d0': '\U000118d0',
+ '\U000118d1': '\U000118d1', '\U000118d2': '\U000118d2', '\U000118d3':
+ '\U000118d3', '\U000118d4': '\U000118d4', '\U000118d5': '\U000118d5',
+ '\U000118d6': '\U000118d6', '\U000118d7': '\U000118d7', '\U000118d8':
+ '\U000118d8', '\U000118d9': '\U000118d9', '\U000118da': '\U000118da',
+ '\U000118db': '\U000118db', '\U000118dc': '\U000118dc', '\U000118dd':
+ '\U000118dd', '\U000118de': '\U000118de', '\U000118df': '\U000118df',
+ '\U00016e60': '\U00016e60', '\U00016e61': '\U00016e61', '\U00016e62':
+ '\U00016e62', '\U00016e63': '\U00016e63', '\U00016e64': '\U00016e64',
+ '\U00016e65': '\U00016e65', '\U00016e66': '\U00016e66', '\U00016e67':
+ '\U00016e67', '\U00016e68': '\U00016e68', '\U00016e69': '\U00016e69',
+ '\U00016e6a': '\U00016e6a', '\U00016e6b': '\U00016e6b', '\U00016e6c':
+ '\U00016e6c', '\U00016e6d': '\U00016e6d', '\U00016e6e': '\U00016e6e',
+ '\U00016e6f': '\U00016e6f', '\U00016e70': '\U00016e70', '\U00016e71':
+ '\U00016e71', '\U00016e72': '\U00016e72', '\U00016e73': '\U00016e73',
+ '\U00016e74': '\U00016e74', '\U00016e75': '\U00016e75', '\U00016e76':
+ '\U00016e76', '\U00016e77': '\U00016e77', '\U00016e78': '\U00016e78',
+ '\U00016e79': '\U00016e79', '\U00016e7a': '\U00016e7a', '\U00016e7b':
+ '\U00016e7b', '\U00016e7c': '\U00016e7c', '\U00016e7d': '\U00016e7d',
+ '\U00016e7e': '\U00016e7e', '\U00016e7f': '\U00016e7f', '\U0001e922':
+ '\U0001e922', '\U0001e923': '\U0001e923', '\U0001e924': '\U0001e924',
+ '\U0001e925': '\U0001e925', '\U0001e926': '\U0001e926', '\U0001e927':
+ '\U0001e927', '\U0001e928': '\U0001e928', '\U0001e929': '\U0001e929',
+ '\U0001e92a': '\U0001e92a', '\U0001e92b': '\U0001e92b', '\U0001e92c':
+ '\U0001e92c', '\U0001e92d': '\U0001e92d', '\U0001e92e': '\U0001e92e',
+ '\U0001e92f': '\U0001e92f', '\U0001e930': '\U0001e930', '\U0001e931':
+ '\U0001e931', '\U0001e932': '\U0001e932', '\U0001e933': '\U0001e933',
+ '\U0001e934': '\U0001e934', '\U0001e935': '\U0001e935', '\U0001e936':
+ '\U0001e936', '\U0001e937': '\U0001e937', '\U0001e938': '\U0001e938',
+ '\U0001e939': '\U0001e939', '\U0001e93a': '\U0001e93a', '\U0001e93b':
+ '\U0001e93b', '\U0001e93c': '\U0001e93c', '\U0001e93d': '\U0001e93d',
+ '\U0001e93e': '\U0001e93e', '\U0001e93f': '\U0001e93f', '\U0001e940':
+ '\U0001e940', '\U0001e941': '\U0001e941', '\U0001e942': '\U0001e942',
+}.get
+

class _NotImplementedWarning(RuntimeWarning):

@@ -449,13 +707,12 @@

Empty strings are supported. The original string is not changed.

- Warning: Python 2 and 3 capitalize "ß" differently. MediaWiki does
- not capitalize ß at the beginning. See T179115.
+ @note: MediaWiki doesn't capitalize some characters the same way as Python.
+ This function tries to be close to MediaWiki's capitalize function in
+ title.php. See T179115 and T200357.
"""
first = string[:1]
- if first != 'ß':
- first = first.upper()
- return first + string[1:]
+ return (_first_upper_exception(first) or first.upper()) + string[1:]


def normalize_username(username):

To view, visit change 452187. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I6060617d0fe36dac289c6fece7c225fb044204e2
Gerrit-Change-Number: 452187
Gerrit-PatchSet: 14
Gerrit-Owner: Dalba <dalba.wiki@gmail.com>
Gerrit-Reviewer: Dalba <dalba.wiki@gmail.com>
Gerrit-Reviewer: John Vandenberg <jayvdb@gmail.com>
Gerrit-Reviewer: Xqt <info@gno.de>
Gerrit-Reviewer: Zhuyifei1999 <zhuyifei1999@gmail.com>
Gerrit-Reviewer: Zoranzoki21 <zorandori4444@gmail.com>
Gerrit-Reviewer: jenkins-bot (75)
Gerrit-CC: D3r1ck01 <alangiderick@gmail.com>
Gerrit-CC: Dvorapa <dvorapa@seznam.cz>