1 | <?php |
||
13 | trait HeadlineTrait |
||
14 | { |
||
15 | /** |
||
16 | * identify a line as a headline |
||
17 | */ |
||
18 | 205 | protected function identifyHeadline($line, $lines, $current) |
|
19 | { |
||
20 | return ( |
||
21 | // heading with # |
||
22 | 205 | $line[0] === '#' && !preg_match('/^#\d+/', $line) |
|
23 | || |
||
24 | // underlined headline |
||
25 | 205 | !empty($lines[$current + 1]) && |
|
26 | 205 | (($l = $lines[$current + 1][0]) === '=' || $l === '-') && |
|
27 | 205 | preg_match('/^(\-+|=+)\s*$/', $lines[$current + 1]) |
|
28 | ); |
||
29 | } |
||
30 | |||
31 | /** |
||
32 | * Consume lines for a headline |
||
33 | */ |
||
34 | 36 | protected function consumeHeadline($lines, $current) |
|
35 | { |
||
36 | 36 | if ($lines[$current][0] === '#') { |
|
37 | // ATX headline |
||
38 | 21 | $level = 1; |
|
39 | 21 | while (isset($lines[$current][$level]) && $lines[$current][$level] === '#' && $level < 6) { |
|
40 | 20 | $level++; |
|
41 | } |
||
42 | $block = [ |
||
43 | 21 | 'headline', |
|
44 | 21 | 'content' => $this->parseInline(trim($lines[$current], "# \t")), |
|
45 | 21 | 'level' => $level, |
|
46 | ]; |
||
47 | 21 | return [$block, $current]; |
|
48 | } else { |
||
49 | // underlined headline |
||
50 | $block = [ |
||
51 | 25 | 'headline', |
|
52 | 25 | 'content' => $this->parseInline($lines[$current]), |
|
53 | 25 | 'level' => $lines[$current + 1][0] === '=' ? 1 : 2, |
|
54 | ]; |
||
55 | 25 | return [$block, $current + 1]; |
|
56 | } |
||
57 | } |
||
58 | |||
59 | /** |
||
60 | * Renders a headline |
||
61 | */ |
||
62 | 24 | protected function renderHeadline($block) |
|
63 | { |
||
64 | 24 | $tag = 'h' . $block['level']; |
|
65 | 24 | return "<$tag>" . $this->renderAbsy($block['content']) . "</$tag>\n"; |
|
66 | } |
||
67 | |||
68 | abstract protected function parseInline($text); |
||
70 | } |
||
71 |