| Conditions | 45 |
| Paths | 10380 |
| Total Lines | 204 |
| Code Lines | 122 |
| Lines | 23 |
| Ratio | 11.27 % |
| Changes | 2 | ||
| Bugs | 0 | Features | 0 |
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | <?php |
||
| 176 | private function execute() { |
||
| 177 | $text = $this->text; |
||
| 178 | # Parsing through the text line by line. The main thing |
||
| 179 | # happening here is handling of block-level elements p, pre, |
||
| 180 | # and making lists from lines starting with * # : etc. |
||
| 181 | $textLines = StringUtils::explode( "\n", $text ); |
||
| 182 | |||
| 183 | $lastPrefix = $output = ''; |
||
| 184 | $this->DTopen = $inBlockElem = false; |
||
| 185 | $prefixLength = 0; |
||
| 186 | $pendingPTag = false; |
||
| 187 | $inBlockquote = false; |
||
| 188 | |||
| 189 | foreach ( $textLines as $inputLine ) { |
||
| 190 | # Fix up $lineStart |
||
| 191 | if ( !$this->lineStart ) { |
||
| 192 | $output .= $inputLine; |
||
| 193 | $this->lineStart = true; |
||
| 194 | continue; |
||
| 195 | } |
||
| 196 | # * = ul |
||
| 197 | # # = ol |
||
| 198 | # ; = dt |
||
| 199 | # : = dd |
||
| 200 | |||
| 201 | $lastPrefixLength = strlen( $lastPrefix ); |
||
| 202 | $preCloseMatch = preg_match( '/<\\/pre/i', $inputLine ); |
||
| 203 | $preOpenMatch = preg_match( '/<pre/i', $inputLine ); |
||
| 204 | # If not in a <pre> element, scan for and figure out what prefixes are there. |
||
| 205 | if ( !$this->inPre ) { |
||
| 206 | # Multiple prefixes may abut each other for nested lists. |
||
| 207 | $prefixLength = strspn( $inputLine, '*#:;' ); |
||
| 208 | $prefix = substr( $inputLine, 0, $prefixLength ); |
||
| 209 | |||
| 210 | # eh? |
||
| 211 | # ; and : are both from definition-lists, so they're equivalent |
||
| 212 | # for the purposes of determining whether or not we need to open/close |
||
| 213 | # elements. |
||
| 214 | $prefix2 = str_replace( ';', ':', $prefix ); |
||
| 215 | $t = substr( $inputLine, $prefixLength ); |
||
| 216 | $this->inPre = (bool)$preOpenMatch; |
||
| 217 | } else { |
||
| 218 | # Don't interpret any other prefixes in preformatted text |
||
| 219 | $prefixLength = 0; |
||
| 220 | $prefix = $prefix2 = ''; |
||
| 221 | $t = $inputLine; |
||
| 222 | } |
||
| 223 | |||
| 224 | # List generation |
||
| 225 | if ( $prefixLength && $lastPrefix === $prefix2 ) { |
||
| 226 | # Same as the last item, so no need to deal with nesting or opening stuff |
||
| 227 | $output .= $this->nextItem( substr( $prefix, -1 ) ); |
||
| 228 | $pendingPTag = false; |
||
| 229 | |||
| 230 | if ( substr( $prefix, -1 ) === ';' ) { |
||
| 231 | # The one nasty exception: definition lists work like this: |
||
| 232 | # ; title : definition text |
||
| 233 | # So we check for : in the remainder text to split up the |
||
| 234 | # title and definition, without b0rking links. |
||
| 235 | $term = $t2 = ''; |
||
| 236 | View Code Duplication | if ( $this->findColonNoLinks( $t, $term, $t2 ) !== false ) { |
|
| 237 | $t = $t2; |
||
| 238 | $output .= $term . $this->nextItem( ':' ); |
||
| 239 | } |
||
| 240 | } |
||
| 241 | } elseif ( $prefixLength || $lastPrefixLength ) { |
||
| 242 | # We need to open or close prefixes, or both. |
||
| 243 | |||
| 244 | # Either open or close a level... |
||
| 245 | $commonPrefixLength = $this->getCommon( $prefix, $lastPrefix ); |
||
| 246 | $pendingPTag = false; |
||
| 247 | |||
| 248 | # Close all the prefixes which aren't shared. |
||
| 249 | while ( $commonPrefixLength < $lastPrefixLength ) { |
||
| 250 | $output .= $this->closeList( $lastPrefix[$lastPrefixLength - 1] ); |
||
| 251 | --$lastPrefixLength; |
||
| 252 | } |
||
| 253 | |||
| 254 | # Continue the current prefix if appropriate. |
||
| 255 | if ( $prefixLength <= $commonPrefixLength && $commonPrefixLength > 0 ) { |
||
| 256 | $output .= $this->nextItem( $prefix[$commonPrefixLength - 1] ); |
||
| 257 | } |
||
| 258 | |||
| 259 | # Open prefixes where appropriate. |
||
| 260 | if ( $lastPrefix && $prefixLength > $commonPrefixLength ) { |
||
| 261 | $output .= "\n"; |
||
| 262 | } |
||
| 263 | while ( $prefixLength > $commonPrefixLength ) { |
||
| 264 | $char = substr( $prefix, $commonPrefixLength, 1 ); |
||
| 265 | $output .= $this->openList( $char ); |
||
| 266 | |||
| 267 | View Code Duplication | if ( ';' === $char ) { |
|
| 268 | # @todo FIXME: This is dupe of code above |
||
| 269 | if ( $this->findColonNoLinks( $t, $term, $t2 ) !== false ) { |
||
| 270 | $t = $t2; |
||
| 271 | $output .= $term . $this->nextItem( ':' ); |
||
| 272 | } |
||
| 273 | } |
||
| 274 | ++$commonPrefixLength; |
||
| 275 | } |
||
| 276 | if ( !$prefixLength && $lastPrefix ) { |
||
| 277 | $output .= "\n"; |
||
| 278 | } |
||
| 279 | $lastPrefix = $prefix2; |
||
| 280 | } |
||
| 281 | |||
| 282 | # If we have no prefixes, go to paragraph mode. |
||
| 283 | if ( 0 == $prefixLength ) { |
||
| 284 | # No prefix (not in list)--go to paragraph mode |
||
| 285 | # @todo consider using a stack for nestable elements like span, table and div |
||
| 286 | $openMatch = preg_match( |
||
| 287 | '/(?:<table|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|' |
||
| 288 | . '<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS', |
||
| 289 | $t |
||
| 290 | ); |
||
| 291 | $closeMatch = preg_match( |
||
| 292 | '/(?:<\\/table|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|' |
||
| 293 | . '<td|<th|<\\/?blockquote|<\\/?div|<hr|<\\/pre|<\\/p|<\\/mw:|' |
||
| 294 | . Parser::MARKER_PREFIX |
||
| 295 | . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS', |
||
| 296 | $t |
||
| 297 | ); |
||
| 298 | |||
| 299 | if ( $openMatch || $closeMatch ) { |
||
| 300 | $pendingPTag = false; |
||
| 301 | # @todo bug 5718: paragraph closed |
||
| 302 | $output .= $this->closeParagraph(); |
||
| 303 | if ( $preOpenMatch && !$preCloseMatch ) { |
||
| 304 | $this->inPre = true; |
||
| 305 | } |
||
| 306 | $bqOffset = 0; |
||
| 307 | while ( preg_match( '/<(\\/?)blockquote[\s>]/i', $t, |
||
| 308 | $bqMatch, PREG_OFFSET_CAPTURE, $bqOffset ) |
||
| 309 | ) { |
||
| 310 | $inBlockquote = !$bqMatch[1][0]; // is this a close tag? |
||
| 311 | $bqOffset = $bqMatch[0][1] + strlen( $bqMatch[0][0] ); |
||
| 312 | } |
||
| 313 | $inBlockElem = !$closeMatch; |
||
| 314 | } elseif ( !$inBlockElem && !$this->inPre ) { |
||
| 315 | if ( ' ' == substr( $t, 0, 1 ) |
||
| 316 | && ( $this->lastSection === 'pre' || trim( $t ) != '' ) |
||
| 317 | && !$inBlockquote |
||
| 318 | ) { |
||
| 319 | # pre |
||
| 320 | View Code Duplication | if ( $this->lastSection !== 'pre' ) { |
|
| 321 | $pendingPTag = false; |
||
| 322 | $output .= $this->closeParagraph() . '<pre>'; |
||
| 323 | $this->lastSection = 'pre'; |
||
| 324 | } |
||
| 325 | $t = substr( $t, 1 ); |
||
| 326 | } else { |
||
| 327 | # paragraph |
||
| 328 | if ( trim( $t ) === '' ) { |
||
| 329 | if ( $pendingPTag ) { |
||
| 330 | $output .= $pendingPTag . '<br />'; |
||
| 331 | $pendingPTag = false; |
||
| 332 | $this->lastSection = 'p'; |
||
| 333 | } else { |
||
| 334 | View Code Duplication | if ( $this->lastSection !== 'p' ) { |
|
| 335 | $output .= $this->closeParagraph(); |
||
| 336 | $this->lastSection = ''; |
||
| 337 | $pendingPTag = '<p>'; |
||
| 338 | } else { |
||
| 339 | $pendingPTag = '</p><p>'; |
||
| 340 | } |
||
| 341 | } |
||
| 342 | } else { |
||
| 343 | if ( $pendingPTag ) { |
||
| 344 | $output .= $pendingPTag; |
||
| 345 | $pendingPTag = false; |
||
| 346 | $this->lastSection = 'p'; |
||
| 347 | } elseif ( $this->lastSection !== 'p' ) { |
||
| 348 | $output .= $this->closeParagraph() . '<p>'; |
||
| 349 | $this->lastSection = 'p'; |
||
| 350 | } |
||
| 351 | } |
||
| 352 | } |
||
| 353 | } |
||
| 354 | } |
||
| 355 | # somewhere above we forget to get out of pre block (bug 785) |
||
| 356 | if ( $preCloseMatch && $this->inPre ) { |
||
| 357 | $this->inPre = false; |
||
| 358 | } |
||
| 359 | if ( $pendingPTag === false ) { |
||
| 360 | $output .= $t; |
||
| 361 | if ( $prefixLength === 0 ) { |
||
| 362 | $output .= "\n"; |
||
| 363 | } |
||
| 364 | } |
||
| 365 | } |
||
| 366 | while ( $prefixLength ) { |
||
| 367 | $output .= $this->closeList( $prefix2[$prefixLength - 1] ); |
||
| 368 | --$prefixLength; |
||
| 369 | if ( !$prefixLength ) { |
||
| 370 | $output .= "\n"; |
||
| 371 | } |
||
| 372 | } |
||
| 373 | if ( $this->lastSection !== '' ) { |
||
| 374 | $output .= '</' . $this->lastSection . '>'; |
||
| 375 | $this->lastSection = ''; |
||
| 376 | } |
||
| 377 | |||
| 378 | return $output; |
||
| 379 | } |
||
| 380 | |||
| 536 |