Completed
Push — master ( 28e891...fcc325 )
by Carsten
02:35
created

EmphStrongTrait::renderEmph()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
crap 1
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