Index: trunk/phase3/includes/parser/CoreParserFunctions.php |
— | — | @@ -67,6 +67,7 @@ |
68 | 68 | $parser->setFunctionHook( 'subjectpagename', array( __CLASS__, 'subjectpagename' ), SFH_NO_HASH ); |
69 | 69 | $parser->setFunctionHook( 'subjectpagenamee', array( __CLASS__, 'subjectpagenamee' ), SFH_NO_HASH ); |
70 | 70 | $parser->setFunctionHook( 'tag', array( __CLASS__, 'tagObj' ), SFH_OBJECT_ARGS ); |
| 71 | + $parser->setFunctionHook( 'formatdate', array( __CLASS__, 'formatDate' ), SFH_NO_HASH ); |
71 | 72 | |
72 | 73 | if ( $wgAllowDisplayTitle ) { |
73 | 74 | $parser->setFunctionHook( 'displaytitle', array( __CLASS__, 'displaytitle' ), SFH_NO_HASH ); |
— | — | @@ -87,6 +88,14 @@ |
88 | 89 | return array( 'found' => false ); |
89 | 90 | } |
90 | 91 | } |
| 92 | + |
| 93 | + static function formatDate( $parser, $date ) { |
| 94 | + $df = DateFormatter::getInstance(); |
| 95 | + |
| 96 | + $pref = $parser->mOptions->getDateFormat(); |
| 97 | + $date = $df->reformat( $pref, $date, false ); |
| 98 | + return $date; |
| 99 | + } |
91 | 100 | |
92 | 101 | static function ns( $parser, $part1 = '' ) { |
93 | 102 | global $wgContLang; |
Index: trunk/phase3/includes/parser/DateFormatter.php |
— | — | @@ -41,11 +41,11 @@ |
42 | 42 | $this->regexTrail = '(?![a-z])/iu'; |
43 | 43 | |
44 | 44 | # Partial regular expressions |
45 | | - $this->prxDM = '\[\[(\d{1,2})[ _](' . $this->monthNames . ')]]'; |
46 | | - $this->prxMD = '\[\[(' . $this->monthNames . ')[ _](\d{1,2})]]'; |
47 | | - $this->prxY = '\[\[(\d{1,4}([ _]BC|))]]'; |
48 | | - $this->prxISO1 = '\[\[(-?\d{4})]]-\[\[(\d{2})-(\d{2})]]'; |
49 | | - $this->prxISO2 = '\[\[(-?\d{4})-(\d{2})-(\d{2})]]'; |
| 45 | + $this->prxDM = '\[\[(\d{1,2})[ _](' . $this->monthNames . ')\]\]'; |
| 46 | + $this->prxMD = '\[\[(' . $this->monthNames . ')[ _](\d{1,2})\]\]'; |
| 47 | + $this->prxY = '\[\[(\d{1,4}([ _]BC|))\]\]'; |
| 48 | + $this->prxISO1 = '\[\[(-?\d{4})]]-\[\[(\d{2})-(\d{2})\]\]'; |
| 49 | + $this->prxISO2 = '\[\[(-?\d{4})-(\d{2})-(\d{2})\]\]'; |
50 | 50 | |
51 | 51 | # Real regular expressions |
52 | 52 | $this->regexes[self::DMY] = "/{$this->prxDM} *,? *{$this->prxY}{$this->regexTrail}"; |
— | — | @@ -117,7 +117,7 @@ |
118 | 118 | * @param $preference String: User preference |
119 | 119 | * @param $text String: Text to reformat |
120 | 120 | */ |
121 | | - function reformat( $preference, $text ) { |
| 121 | + function reformat( $preference, $text, $linked = true ) { |
122 | 122 | if ( isset( $this->preferences[$preference] ) ) { |
123 | 123 | $preference = $this->preferences[$preference]; |
124 | 124 | } else { |
— | — | @@ -138,7 +138,17 @@ |
139 | 139 | # Default |
140 | 140 | $this->mTarget = $i; |
141 | 141 | } |
142 | | - $text = preg_replace_callback( $this->regexes[$i], array( &$this, 'replace' ), $text ); |
| 142 | + $regex = $this->regexes[$i]; |
| 143 | + |
| 144 | + // Horrible hack |
| 145 | + if (!$linked) { |
| 146 | + $regex = str_replace( array( '\[\[', '\]\]' ), '', $regex ); |
| 147 | + } |
| 148 | + |
| 149 | + // Another horrible hack |
| 150 | + $this->mLinked = $linked; |
| 151 | + $text = preg_replace_callback( $regex, array( &$this, 'replace' ), $text ); |
| 152 | + unset($this->mLinked); |
143 | 153 | } |
144 | 154 | return $text; |
145 | 155 | } |
— | — | @@ -148,6 +158,10 @@ |
149 | 159 | */ |
150 | 160 | function replace( $matches ) { |
151 | 161 | # Extract information from $matches |
| 162 | + $linked = true; |
| 163 | + if ( isset( $this->mLinked ) ) |
| 164 | + $linked = $this->mLinked; |
| 165 | + |
152 | 166 | $bits = array(); |
153 | 167 | $key = $this->keys[$this->mSource]; |
154 | 168 | for ( $p=0; $p < strlen($key); $p++ ) { |
— | — | @@ -156,43 +170,50 @@ |
157 | 171 | } |
158 | 172 | } |
159 | 173 | |
160 | | - return $this->formatDate( $bits ); |
| 174 | + return $this->formatDate( $bits, $linked ); |
161 | 175 | } |
162 | 176 | |
163 | | - function formatDate( $bits ) { |
| 177 | + function formatDate( $bits, $link = true ) { |
164 | 178 | $format = $this->targets[$this->mTarget]; |
| 179 | + |
| 180 | + if (!$link) { |
| 181 | + // strip piped links |
| 182 | + $format = preg_replace( '/\[\[[^|]+\|([^\]]+)\]\]/', '$1', $format ); |
| 183 | + // strip remaining links |
| 184 | + $format = str_replace( array( '[[', ']]' ), '', $format ); |
| 185 | + } |
165 | 186 | |
166 | 187 | # Construct new date |
167 | 188 | $text = ''; |
168 | 189 | $fail = false; |
169 | 190 | |
170 | 191 | // Pre-generate y/Y stuff because we need the year for the <span> title. |
171 | | - if ( !isset( $bits['y'] ) ) |
| 192 | + if ( !isset( $bits['y'] ) && isset( $bits['Y'] ) ) |
172 | 193 | $bits['y'] = $this->makeIsoYear( $bits['Y'] ); |
173 | | - if ( !isset( $bits['Y'] ) ) |
| 194 | + if ( !isset( $bits['Y'] ) && isset( $bits['y'] ) ) |
174 | 195 | $bits['Y'] = $this->makeNormalYear( $bits['y'] ); |
| 196 | + |
| 197 | + if ( !isset( $bits['m'] ) ) { |
| 198 | + $m = $this->makeIsoMonth( $bits['F'] ); |
| 199 | + if ( !$m || $m == '00' ) { |
| 200 | + $fail = true; |
| 201 | + } else { |
| 202 | + $bits['m'] = $m; |
| 203 | + } |
| 204 | + } |
| 205 | + |
| 206 | + if ( !isset($bits['d']) ) { |
| 207 | + $bits['d'] = sprintf( '%02d', $bits['j'] ); |
| 208 | + } |
175 | 209 | |
176 | 210 | for ( $p=0; $p < strlen( $format ); $p++ ) { |
177 | 211 | $char = $format{$p}; |
178 | 212 | switch ( $char ) { |
179 | 213 | case 'd': # ISO day of month |
180 | | - if ( !isset($bits['d']) ) { |
181 | | - $text .= sprintf( '%02d', $bits['j'] ); |
182 | | - } else { |
183 | | - $text .= $bits['d']; |
184 | | - } |
| 214 | + $text .= $bits['d']; |
185 | 215 | break; |
186 | 216 | case 'm': # ISO month |
187 | | - if ( !isset($bits['m']) ) { |
188 | | - $m = $this->makeIsoMonth( $bits['F'] ); |
189 | | - if ( !$m || $m == '00' ) { |
190 | | - $fail = true; |
191 | | - } else { |
192 | | - $text .= $m; |
193 | | - } |
194 | | - } else { |
195 | | - $text .= $bits['m']; |
196 | | - } |
| 217 | + $text .= $bits['m']; |
197 | 218 | break; |
198 | 219 | case 'y': # ISO year |
199 | 220 | $text .= $bits['y']; |
— | — | @@ -228,7 +249,12 @@ |
229 | 250 | $text = $matches[0]; |
230 | 251 | } |
231 | 252 | |
232 | | - $isoDate = $bits['y'].$bits['m'].$bits['d']; |
| 253 | + $isoBits = array(); |
| 254 | + if ( isset($bits['y']) ) |
| 255 | + $isoBits[] = $bits['y']; |
| 256 | + $isoBits[] = $bits['m']; |
| 257 | + $isoBits[] = $bits['d']; |
| 258 | + $isoDate = implode( '-', $isoBits );; |
233 | 259 | |
234 | 260 | // Output is not strictly HTML (it's wikitext), but <span> is whitelisted. |
235 | 261 | $text = Xml::tags( 'span', |
Index: trunk/phase3/languages/messages/MessagesEn.php |
— | — | @@ -338,6 +338,7 @@ |
339 | 339 | 'numberingroup' => array( 1, 'NUMBERINGROUP', 'NUMINGROUP' ), |
340 | 340 | 'staticredirect' => array( 1, '__STATICREDIRECT__' ), |
341 | 341 | 'protectionlevel' => array( 1, 'PROTECTIONLEVEL' ), |
| 342 | + 'formatdate' => array( 0, 'formatdate', 'dateformat' ), |
342 | 343 | ); |
343 | 344 | |
344 | 345 | /** |