Completed
Push — master ( b6b576...25b28b )
by Carsten
01:08
created

EmphStrongTrait   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 68
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 0

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 15
lcom 0
cbo 0
dl 0
loc 68
ccs 24
cts 24
cp 1
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A renderStrong() 0 4 1
A renderEmph() 0 4 1
C parseEmphStrong() 0 50 13
1
<?php
2
/**
3
 * @copyright Copyright (c) 2014 Carsten Brandt
4
 * @license https://github.com/cebe/markdown/blob/master/LICENSE
5
 * @link https://github.com/cebe/markdown#readme
6
 */
7
8
namespace cebe\markdown\inline;
9
10
/**
11
 * Adds inline emphasizes and strong elements
12
 */
13
trait EmphStrongTrait
14
{
15
	/**
16
	 * Parses empathized and strong elements.
17
	 * @marker _
18
	 * @marker *
19
	 */
20 33
	protected function parseEmphStrong($text)
21
	{
22 33
		$marker = $text[0];
23
24 33
		if (!isset($text[1])) {
25 3
			return [['text', $text[0]], 1];
26
		}
27
28 33
		if ($marker == $text[1]) { // strong
29
			// work around a PHP bug that crashes with a segfault on too much regex backtrack
30
			// check whether the end marker exists in the text
31
			// https://github.com/erusev/parsedown/issues/443
32
			// https://bugs.php.net/bug.php?id=45735
33 27
			if (strpos($text, $marker . $marker, 2) === false) {
34 6
				return [['text', $text[0] . $text[1]], 2];
35
			}
36
37 21
			if ($marker == '*' && preg_match('/^[*]{2}((?:[^*]|[*][^*]*[*])+?)[*]{2}(?![*]{2})/s', $text, $matches) ||
38 21
				$marker == '_' && preg_match('/^__((?:[^_]|_[^_]*_)+?)__(?!__)/us', $text, $matches)) {
39
40
				return [
41
					[
42 21
						'strong',
43 21
						$this->parseInline($matches[1]),
44
					],
45 21
					strlen($matches[0])
46
				];
47
			}
48
		} else { // emph
49
			// work around a PHP bug that crashes with a segfault on too much regex backtrack
50
			// check whether the end marker exists in the text
51
			// https://github.com/erusev/parsedown/issues/443
52
			// https://bugs.php.net/bug.php?id=45735
53 21
			if (strpos($text, $marker, 1) === false) {
54 10
				return [['text', $text[0]], 1];
55
			}
56
57 16
			if ($marker == '*' && preg_match('/^[*]((?:[^*]|[*][*][^*]+?[*][*])+?)[*](?![*][^*])/s', $text, $matches) ||
58 16
				$marker == '_' && preg_match('/^_((?:[^_]|__[^_]*__)+?)_(?!_[^_])\b/us', $text, $matches)) {
59
				return [
60
					[
61 15
						'emph',
62 15
						$this->parseInline($matches[1]),
63
					],
64 15
					strlen($matches[0])
65
				];
66
			}
67
		}
68 5
		return [['text', $text[0]], 1];
69
	}
70
71 21
	protected function renderStrong($block)
72
	{
73 21
		return '<strong>' . $this->renderAbsy($block[1]) . '</strong>';
74
	}
75
76 15
	protected function renderEmph($block)
77
	{
78 15
		return '<em>' . $this->renderAbsy($block[1]) . '</em>';
79
	}
80
}
81