xref: /dokuwiki/inc/Parsing/ParserMode/Formatting.php (revision be906b566b9bdfd92c032ee07c4fd077d820a8d1)
1*be906b56SAndreas Gohr<?php
2*be906b56SAndreas Gohr
3*be906b56SAndreas Gohrnamespace dokuwiki\Parsing\ParserMode;
4*be906b56SAndreas Gohr
5*be906b56SAndreas Gohr/**
6*be906b56SAndreas Gohr * This class sets the markup for bold (=strong),
7*be906b56SAndreas Gohr * italic (=emphasis), underline etc.
8*be906b56SAndreas Gohr */
9*be906b56SAndreas Gohrclass Formatting extends AbstractMode
10*be906b56SAndreas Gohr{
11*be906b56SAndreas Gohr    protected $type;
12*be906b56SAndreas Gohr
13*be906b56SAndreas Gohr    protected $formatting = array(
14*be906b56SAndreas Gohr        'strong' => array(
15*be906b56SAndreas Gohr            'entry' => '\*\*(?=.*\*\*)',
16*be906b56SAndreas Gohr            'exit' => '\*\*',
17*be906b56SAndreas Gohr            'sort' => 70
18*be906b56SAndreas Gohr        ),
19*be906b56SAndreas Gohr
20*be906b56SAndreas Gohr        'emphasis' => array(
21*be906b56SAndreas Gohr            'entry' => '//(?=[^\x00]*[^:])', //hack for bugs #384 #763 #1468
22*be906b56SAndreas Gohr            'exit' => '//',
23*be906b56SAndreas Gohr            'sort' => 80
24*be906b56SAndreas Gohr        ),
25*be906b56SAndreas Gohr
26*be906b56SAndreas Gohr        'underline' => array(
27*be906b56SAndreas Gohr            'entry' => '__(?=.*__)',
28*be906b56SAndreas Gohr            'exit' => '__',
29*be906b56SAndreas Gohr            'sort' => 90
30*be906b56SAndreas Gohr        ),
31*be906b56SAndreas Gohr
32*be906b56SAndreas Gohr        'monospace' => array(
33*be906b56SAndreas Gohr            'entry' => '\x27\x27(?=.*\x27\x27)',
34*be906b56SAndreas Gohr            'exit' => '\x27\x27',
35*be906b56SAndreas Gohr            'sort' => 100
36*be906b56SAndreas Gohr        ),
37*be906b56SAndreas Gohr
38*be906b56SAndreas Gohr        'subscript' => array(
39*be906b56SAndreas Gohr            'entry' => '<sub>(?=.*</sub>)',
40*be906b56SAndreas Gohr            'exit' => '</sub>',
41*be906b56SAndreas Gohr            'sort' => 110
42*be906b56SAndreas Gohr        ),
43*be906b56SAndreas Gohr
44*be906b56SAndreas Gohr        'superscript' => array(
45*be906b56SAndreas Gohr            'entry' => '<sup>(?=.*</sup>)',
46*be906b56SAndreas Gohr            'exit' => '</sup>',
47*be906b56SAndreas Gohr            'sort' => 120
48*be906b56SAndreas Gohr        ),
49*be906b56SAndreas Gohr
50*be906b56SAndreas Gohr        'deleted' => array(
51*be906b56SAndreas Gohr            'entry' => '<del>(?=.*</del>)',
52*be906b56SAndreas Gohr            'exit' => '</del>',
53*be906b56SAndreas Gohr            'sort' => 130
54*be906b56SAndreas Gohr        ),
55*be906b56SAndreas Gohr    );
56*be906b56SAndreas Gohr
57*be906b56SAndreas Gohr    /**
58*be906b56SAndreas Gohr     * @param string $type
59*be906b56SAndreas Gohr     */
60*be906b56SAndreas Gohr    public function __construct($type)
61*be906b56SAndreas Gohr    {
62*be906b56SAndreas Gohr        global $PARSER_MODES;
63*be906b56SAndreas Gohr
64*be906b56SAndreas Gohr        if (!array_key_exists($type, $this->formatting)) {
65*be906b56SAndreas Gohr            trigger_error('Invalid formatting type ' . $type, E_USER_WARNING);
66*be906b56SAndreas Gohr        }
67*be906b56SAndreas Gohr
68*be906b56SAndreas Gohr        $this->type = $type;
69*be906b56SAndreas Gohr
70*be906b56SAndreas Gohr        // formatting may contain other formatting but not it self
71*be906b56SAndreas Gohr        $modes = $PARSER_MODES['formatting'];
72*be906b56SAndreas Gohr        $key = array_search($type, $modes);
73*be906b56SAndreas Gohr        if (is_int($key)) {
74*be906b56SAndreas Gohr            unset($modes[$key]);
75*be906b56SAndreas Gohr        }
76*be906b56SAndreas Gohr
77*be906b56SAndreas Gohr        $this->allowedModes = array_merge(
78*be906b56SAndreas Gohr            $modes,
79*be906b56SAndreas Gohr            $PARSER_MODES['substition'],
80*be906b56SAndreas Gohr            $PARSER_MODES['disabled']
81*be906b56SAndreas Gohr        );
82*be906b56SAndreas Gohr    }
83*be906b56SAndreas Gohr
84*be906b56SAndreas Gohr    /** @inheritdoc */
85*be906b56SAndreas Gohr    public function connectTo($mode)
86*be906b56SAndreas Gohr    {
87*be906b56SAndreas Gohr
88*be906b56SAndreas Gohr        // Can't nest formatting in itself
89*be906b56SAndreas Gohr        if ($mode == $this->type) {
90*be906b56SAndreas Gohr            return;
91*be906b56SAndreas Gohr        }
92*be906b56SAndreas Gohr
93*be906b56SAndreas Gohr        $this->Lexer->addEntryPattern(
94*be906b56SAndreas Gohr            $this->formatting[$this->type]['entry'],
95*be906b56SAndreas Gohr            $mode,
96*be906b56SAndreas Gohr            $this->type
97*be906b56SAndreas Gohr        );
98*be906b56SAndreas Gohr    }
99*be906b56SAndreas Gohr
100*be906b56SAndreas Gohr    /** @inheritdoc */
101*be906b56SAndreas Gohr    public function postConnect()
102*be906b56SAndreas Gohr    {
103*be906b56SAndreas Gohr
104*be906b56SAndreas Gohr        $this->Lexer->addExitPattern(
105*be906b56SAndreas Gohr            $this->formatting[$this->type]['exit'],
106*be906b56SAndreas Gohr            $this->type
107*be906b56SAndreas Gohr        );
108*be906b56SAndreas Gohr    }
109*be906b56SAndreas Gohr
110*be906b56SAndreas Gohr    /** @inheritdoc */
111*be906b56SAndreas Gohr    public function getSort()
112*be906b56SAndreas Gohr    {
113*be906b56SAndreas Gohr        return $this->formatting[$this->type]['sort'];
114*be906b56SAndreas Gohr    }
115*be906b56SAndreas Gohr}
116