Make LanguageConverter roman-numeral cases consistent
authorC. Scott Ananian <cscott@cscott.net>
Mon, 2 Apr 2018 03:49:19 +0000 (23:49 -0400)
committerC. Scott Ananian <cscott@cscott.net>
Mon, 2 Apr 2018 03:49:19 +0000 (23:49 -0400)
Add a look-ahead to ensure that the regex intended to match roman numerals
doesn't also match the empty string.  Tweak the regular expressions slightly
to ensure that Sr/Ku/Crh all have identical regular expressions.

Change-Id: If43bf99a21c42c6c5050f814c0bc99edec353228

languages/classes/LanguageCrh.php
languages/classes/LanguageKu.php
languages/classes/LanguageSr.php

index d5418b9..01a5a79 100644 (file)
@@ -219,7 +219,8 @@ class CrhConverter extends LanguageConverter {
                }
 
                // check for roman numbers like VII, XIX...
-               $roman = '/^M{0,3}(C[DM]|D{0,1}C{0,3})(X[LC]|L{0,1}X{0,3})(I[VX]|V{0,1}I{0,3})$/u';
+               // Lookahead assertion ensures $roman doesn't match the empty string
+               $roman = '/^(?=[MDCLXVI])M{0,4}(C[DM]|D?C{0,3})(X[LC]|L?X{0,3})(I[VX]|V?I{0,3})$/u';
 
                # match any sub-string of the relevant letters and convert it
                $matches = preg_split( '/(\b|^)[^' . $letters . ']+(\b|$)/u',
index ef77775..b90ca41 100644 (file)
@@ -192,7 +192,8 @@ class KuConverter extends LanguageConverter {
                /* From Kazakh interface, maybe we need it later
                $breaks = '[^\w\x80-\xff]';
                // regexp for roman numbers
-               $roman = 'M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})';
+               // Lookahead assertion ensures $roman doesn't match the empty string
+               $roman = '(?=[MDCLXVI])M{0,4}(C[DM]|D?C{0,3})(X[LC]|L?X{0,3})(I[VX]|V?I{0,3})';
                $roman = '';
 
                $reg = '/^'.$roman.'$|^'.$roman.$breaks.'|'.$breaks.$roman.'$|'.$breaks.$roman.$breaks.'/';
index e0ff5e1..0ad7860 100644 (file)
@@ -115,7 +115,8 @@ class SrConverter extends LanguageConverter {
                $breaks = '[^\w\x80-\xff]';
 
                // regexp for roman numbers
-               $roman = 'M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})';
+               // Lookahead assertion ensures $roman doesn't match the empty string
+               $roman = '(?=[MDCLXVI])M{0,4}(C[DM]|D?C{0,3})(X[LC]|L?X{0,3})(I[VX]|V?I{0,3})';
 
                $reg = '/^' . $roman . '$|^' . $roman . $breaks . '|' . $breaks
                        . $roman . '$|' . $breaks . $roman . $breaks . '/';