Completed
Push — master ( 100fdc...1aa5b0 )
by Владислав
02:06
created
src/core/DeCaptchaWiki.php 2 patches
Doc Comments   +10 added lines, -1 removed lines patch added patch discarded remove patch
@@ -14,11 +14,17 @@  discard block
 block discarded – undo
14 14
     private $class;
15 15
     private $lang = 'en';
16 16
 
17
+    /**
18
+     * @param string $lang
19
+     */
17 20
     public function setLang($lang)
18 21
     {
19 22
         $this->lang = $lang;
20 23
     }
21 24
 
25
+    /**
26
+     * @param DeCaptchaBase $class
27
+     */
22 28
     public function __construct($class)
23 29
     {
24 30
         $this->class = $class;
@@ -251,7 +257,7 @@  discard block
 block discarded – undo
251 257
     }
252 258
 
253 259
     /**
254
-     * @param string|array $name
260
+     * @param string[] $name
255 261
      * @param string       $separator
256 262
      *
257 263
      * @return string|array
@@ -397,6 +403,9 @@  discard block
 block discarded – undo
397 403
         return $str;
398 404
     }
399 405
 
406
+    /**
407
+     * @param string $keyMask
408
+     */
400 409
     private function getNameConst($keyMask, $value)
401 410
     {
402 411
         $constants = (new \ReflectionClass($this->class))->getConstants();
Please login to merge, or discard this patch.
Spacing   +98 added lines, -98 removed lines patch added patch discarded remove patch
@@ -31,160 +31,160 @@  discard block
 block discarded – undo
31 31
             'recognize_data'      => [
32 32
                 ($this->class)::ACTION_FIELD_FILE => 'http://site.com/captcha.jpg',
33 33
             ],
34
-            'field_main_name_'.($this->class)::ACTION_FIELD_KEY => [
34
+            'field_main_name_' . ($this->class)::ACTION_FIELD_KEY => [
35 35
                 'ru' => 'Ключ',
36 36
             ],
37
-            'field_main_desc_'.($this->class)::ACTION_FIELD_KEY => [
37
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_KEY => [
38 38
                 'ru' => 'Ключ от учетной записи',
39 39
             ],
40
-            'field_main_name_'.($this->class)::ACTION_FIELD_LANGUAGE => [
40
+            'field_main_name_' . ($this->class)::ACTION_FIELD_LANGUAGE => [
41 41
                 'ru' => 'Язык',
42 42
             ],
43
-            'field_main_desc_'.($this->class)::ACTION_FIELD_LANGUAGE => [
43
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_LANGUAGE => [
44 44
                 'ru' => 'На каком языке текст на капче',
45 45
             ],
46
-            'field_main_name_'.($this->class)::ACTION_FIELD_FILE => [
46
+            'field_main_name_' . ($this->class)::ACTION_FIELD_FILE => [
47 47
                 'ru' => 'Картинка',
48 48
             ],
49
-            'field_main_desc_'.($this->class)::ACTION_FIELD_FILE => [
49
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_FILE => [
50 50
                 'ru' => 'Путь на файл с картинкой или ссылка на него',
51 51
             ],
52
-            'field_main_name_'.($this->class)::ACTION_FIELD_PHRASE => [
52
+            'field_main_name_' . ($this->class)::ACTION_FIELD_PHRASE => [
53 53
                 'ru' => 'Несколько слов',
54 54
             ],
55
-            'field_main_desc_'.($this->class)::ACTION_FIELD_PHRASE => [
55
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_PHRASE => [
56 56
                 'ru' => 'Работник должен ввести текст с одним или несколькими пробелами',
57 57
             ],
58
-            'field_main_name_'.($this->class)::ACTION_FIELD_REGSENSE => [
58
+            'field_main_name_' . ($this->class)::ACTION_FIELD_REGSENSE => [
59 59
                 'ru' => 'Регистр',
60 60
             ],
61
-            'field_main_desc_'.($this->class)::ACTION_FIELD_REGSENSE => [
61
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_REGSENSE => [
62 62
                 'ru' => 'Работник должен ввсести ответ с учетом регистра',
63 63
             ],
64
-            'field_main_name_'.($this->class)::ACTION_FIELD_NUMERIC => [
64
+            'field_main_name_' . ($this->class)::ACTION_FIELD_NUMERIC => [
65 65
                 'ru' => 'Символы',
66 66
             ],
67
-            'field_main_desc_'.($this->class)::ACTION_FIELD_NUMERIC => [
67
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_NUMERIC => [
68 68
                 'ru' => 'Какие символы используется в капче',
69 69
             ],
70
-            'field_main_name_'.($this->class)::ACTION_FIELD_CALC => [
70
+            'field_main_name_' . ($this->class)::ACTION_FIELD_CALC => [
71 71
                 'ru' => 'Вычисление',
72 72
             ],
73
-            'field_main_desc_'.($this->class)::ACTION_FIELD_CALC => [
73
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_CALC => [
74 74
                 'ru' => 'На капче изображенно математичекая выражение и её необходимо решить',
75 75
             ],
76
-            'field_main_name_'.($this->class)::ACTION_FIELD_MIN_LEN => [
76
+            'field_main_name_' . ($this->class)::ACTION_FIELD_MIN_LEN => [
77 77
                 'ru' => 'Длина min',
78 78
             ],
79
-            'field_main_desc_'.($this->class)::ACTION_FIELD_MIN_LEN => [
79
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_MIN_LEN => [
80 80
                 'ru' => 'Минимальная длина капчи',
81 81
             ],
82
-            'field_main_name_'.($this->class)::ACTION_FIELD_MAX_LEN => [
82
+            'field_main_name_' . ($this->class)::ACTION_FIELD_MAX_LEN => [
83 83
                 'ru' => 'Длина max',
84 84
             ],
85
-            'field_main_desc_'.($this->class)::ACTION_FIELD_MAX_LEN => [
85
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_MAX_LEN => [
86 86
                 'ru' => 'Максимальная длина капчи',
87 87
             ],
88
-            'field_main_name_'.($this->class)::ACTION_FIELD_QUESTION => [
88
+            'field_main_name_' . ($this->class)::ACTION_FIELD_QUESTION => [
89 89
                 'ru' => 'Вопрос',
90 90
             ],
91
-            'field_main_desc_'.($this->class)::ACTION_FIELD_QUESTION => [
91
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_QUESTION => [
92 92
                 'ru' => 'На изображении задан вопрос, работник должен написать ответ',
93 93
             ],
94
-            'field_main_name_'.($this->class)::ACTION_FIELD_IS_RUSSIAN => [
94
+            'field_main_name_' . ($this->class)::ACTION_FIELD_IS_RUSSIAN => [
95 95
                 'ru' => 'Кириллица',
96 96
             ],
97
-            'field_main_desc_'.($this->class)::ACTION_FIELD_IS_RUSSIAN => [
97
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_IS_RUSSIAN => [
98 98
                 'ru' => 'На изображении присутствуют русские символы',
99 99
             ],
100
-            'field_main_name_'.($this->class)::ACTION_FIELD_LANGUAGE => [
100
+            'field_main_name_' . ($this->class)::ACTION_FIELD_LANGUAGE => [
101 101
                 'ru' => 'Язык',
102 102
             ],
103
-            'field_main_desc_'.($this->class)::ACTION_FIELD_LANGUAGE => [
103
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_LANGUAGE => [
104 104
                 'ru' => 'Символы какого языка размещенны на капче',
105 105
             ],
106
-            'field_main_name_'.($this->class)::ACTION_FIELD_HEADER_ACAO => [
106
+            'field_main_name_' . ($this->class)::ACTION_FIELD_HEADER_ACAO => [
107 107
                 'ru' => 'Кросс-доменный',
108 108
             ],
109
-            'field_main_desc_'.($this->class)::ACTION_FIELD_HEADER_ACAO => [
109
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_HEADER_ACAO => [
110 110
                 'ru' => 'Необходимо для кросс-доменных AJAX запросов в браузерных приложениях.',
111 111
             ],
112
-            'field_main_name_'.($this->class)::ACTION_FIELD_INSTRUCTIONS => [
112
+            'field_main_name_' . ($this->class)::ACTION_FIELD_INSTRUCTIONS => [
113 113
                 'ru' => 'Инструкция',
114 114
             ],
115
-            'field_main_desc_'.($this->class)::ACTION_FIELD_INSTRUCTIONS => [
115
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_INSTRUCTIONS => [
116 116
                 'ru' => 'Текстовая капча или инструкция для прохождения капчи.',
117 117
             ],
118
-            'field_main_name_'.($this->class)::ACTION_FIELD_PINGBACK => [
118
+            'field_main_name_' . ($this->class)::ACTION_FIELD_PINGBACK => [
119 119
                 'ru' => 'Ответ на',
120 120
             ],
121
-            'field_main_desc_'.($this->class)::ACTION_FIELD_PINGBACK => [
121
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_PINGBACK => [
122 122
                 'ru' => 'Указание для сервера, что после распознания изображения, нужно отправить ответ на указанный адрес.',
123 123
             ],
124
-            'field_main_name_'.($this->class)::ACTION_FIELD_LABEL => [
124
+            'field_main_name_' . ($this->class)::ACTION_FIELD_LABEL => [
125 125
                 'ru' => 'От куда',
126 126
             ],
127
-            'field_main_desc_'.($this->class)::ACTION_FIELD_LABEL => [
127
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_LABEL => [
128 128
                 'ru' => 'Пояснение от куда пришла капча ("vk", "google", "recaptcha", "yandex", "mailru", "yahoo" и т.д.).',
129 129
             ],
130
-            'field_main_name_'.($this->class)::ACTION_FIELD_PAGEURL => [
130
+            'field_main_name_' . ($this->class)::ACTION_FIELD_PAGEURL => [
131 131
                 'ru' => 'Адрес',
132 132
             ],
133
-            'field_main_desc_'.($this->class)::ACTION_FIELD_PAGEURL => [
133
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_PAGEURL => [
134 134
                 'ru' => 'Адрес страницы на которой решается капча.',
135 135
             ],
136
-            'field_main_name_'.($this->class)::ACTION_FIELD_GOOGLEKEY => [
136
+            'field_main_name_' . ($this->class)::ACTION_FIELD_GOOGLEKEY => [
137 137
                 'ru' => 'Google key',
138 138
             ],
139
-            'field_main_desc_'.($this->class)::ACTION_FIELD_GOOGLEKEY => [
139
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_GOOGLEKEY => [
140 140
                 'ru' => 'Ключ-индентификатор рекапчи на целевой странице. <div class="g-recaptcha" data-sitekey="ВОТ_ЭТОТ"></div>',
141 141
             ],
142
-            'field_main_name_'.($this->class)::ACTION_FIELD_GOOGLETOKEN => [
142
+            'field_main_name_' . ($this->class)::ACTION_FIELD_GOOGLETOKEN => [
143 143
                 'ru' => 'Google token',
144 144
             ],
145
-            'field_main_desc_'.($this->class)::ACTION_FIELD_GOOGLETOKEN => [
145
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_GOOGLETOKEN => [
146 146
                 'ru' => 'Секретный токен для предыдущей версии рекапчи. В большинстве случаев сайты используют новую версию и этот токен не требуется. Секретный токен генерируется на сервере Google и вставляется на страницу в атрибуте data-stoken. Выглядит это примерно так: <script type="text/javascript" src="...." data-type="normal"  data-ray="..." async data-sitekey="..." data-stoken="ВОТ_ЭТОТ"></script> Токен действует пару минут после генерации, затем нужно снова зайти на страницу и получить его.',
147 147
             ],
148
-            'field_main_name_'.($this->class)::ACTION_FIELD_PROXYTYPE => [
148
+            'field_main_name_' . ($this->class)::ACTION_FIELD_PROXYTYPE => [
149 149
                 'ru' => 'Тип прокси',
150 150
             ],
151
-            'field_main_desc_'.($this->class)::ACTION_FIELD_PROXYTYPE => [
151
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_PROXYTYPE => [
152 152
                 'ru' => 'Тип прокси (http, socks4, ...)',
153 153
             ],
154
-            'field_main_name_'.($this->class)::ACTION_FIELD_PROXY => [
154
+            'field_main_name_' . ($this->class)::ACTION_FIELD_PROXY => [
155 155
                 'ru' => 'Адрес прокси',
156 156
             ],
157
-            'field_main_desc_'.($this->class)::ACTION_FIELD_PROXY => [
157
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_PROXY => [
158 158
                 'ru' => 'IP адрес прокси ipv4/ipv6.',
159 159
             ],
160
-            'field_main_name_'.($this->class)::ACTION_FIELD_PROXYPORT => [
160
+            'field_main_name_' . ($this->class)::ACTION_FIELD_PROXYPORT => [
161 161
                 'ru' => 'Порт прокси',
162 162
             ],
163
-            'field_main_desc_'.($this->class)::ACTION_FIELD_PROXYPORT => [
163
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_PROXYPORT => [
164 164
                 'ru' => 'Порт прокси.',
165 165
             ],
166
-            'field_main_name_'.($this->class)::ACTION_FIELD_PROXYLOGIN => [
166
+            'field_main_name_' . ($this->class)::ACTION_FIELD_PROXYLOGIN => [
167 167
                 'ru' => 'Логин прокси',
168 168
             ],
169
-            'field_main_desc_'.($this->class)::ACTION_FIELD_PROXYLOGIN => [
169
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_PROXYLOGIN => [
170 170
                 'ru' => 'Логин от прокси-сервера.',
171 171
             ],
172
-            'field_main_name_'.($this->class)::ACTION_FIELD_PROXYPASS => [
172
+            'field_main_name_' . ($this->class)::ACTION_FIELD_PROXYPASS => [
173 173
                 'ru' => 'Пароль прокси',
174 174
             ],
175
-            'field_main_desc_'.($this->class)::ACTION_FIELD_PROXYPASS => [
175
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_PROXYPASS => [
176 176
                 'ru' => 'Пароль от прокси-сервера.',
177 177
             ],
178
-            'field_main_name_'.($this->class)::ACTION_FIELD_USERAGENT => [
178
+            'field_main_name_' . ($this->class)::ACTION_FIELD_USERAGENT => [
179 179
                 'ru' => 'User-Agent браузера',
180 180
             ],
181
-            'field_main_desc_'.($this->class)::ACTION_FIELD_USERAGENT => [
181
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_USERAGENT => [
182 182
                 'ru' => 'User-Agent браузера, используемый в эмуляции. Необходимо использовать подпись современного браузера, иначе Google будет возвращать ошибку, требуя обновить браузер.',
183 183
             ],
184
-            'field_main_name_'.($this->class)::ACTION_FIELD_COOKIES => [
184
+            'field_main_name_' . ($this->class)::ACTION_FIELD_COOKIES => [
185 185
                 'ru' => 'Куки',
186 186
             ],
187
-            'field_main_desc_'.($this->class)::ACTION_FIELD_COOKIES => [
187
+            'field_main_desc_' . ($this->class)::ACTION_FIELD_COOKIES => [
188 188
                 'ru' => 'Дополнительные cookies которые мы должны использовать во время взаимодействия с целевой страницей.',
189 189
             ],
190 190
             'table_th_name' => [
@@ -258,7 +258,7 @@  discard block
 block discarded – undo
258 258
      */
259 259
     public function getText($name, $separator = '; ')
260 260
     {
261
-        $getResult = function ($name, $texts) {
261
+        $getResult = function($name, $texts) {
262 262
             if (is_array($name)) {
263 263
                 $name = implode('_', $name);
264 264
             }
@@ -293,51 +293,51 @@  discard block
 block discarded – undo
293 293
     {
294 294
         $rc = (new \ReflectionClass($this->class));
295 295
 
296
-        $str = "#####{$this->getText(['example', 'initialization'])}".PHP_EOL;
297
-        $str.= "```".PHP_EOL;
298
-        $str.= "use {$rc->getName()};".PHP_EOL;
299
-        $str.= "".PHP_EOL;
300
-        $str.= '$captcha = new '.$rc->getShortName().'(['.PHP_EOL;
296
+        $str = "#####{$this->getText(['example', 'initialization'])}" . PHP_EOL;
297
+        $str .= "```" . PHP_EOL;
298
+        $str .= "use {$rc->getName()};" . PHP_EOL;
299
+        $str .= "" . PHP_EOL;
300
+        $str .= '$captcha = new ' . $rc->getShortName() . '([' . PHP_EOL;
301 301
         foreach ($this->texts['constructor_data'] as $key => $val) {
302
-            $str.= "    {$rc->getShortName()}::{$this->getNameConst('ACTION_FIELD_', $key)} => ";
302
+            $str .= "    {$rc->getShortName()}::{$this->getNameConst('ACTION_FIELD_', $key)} => ";
303 303
             if (is_string($val)) {
304
-                $str.= "'{$val}'";
304
+                $str .= "'{$val}'";
305 305
             } else {
306
-                $str.= "{$val}";
306
+                $str .= "{$val}";
307 307
             }
308
-            $str.= ",".PHP_EOL;
308
+            $str .= "," . PHP_EOL;
309 309
         }
310
-        $str.= "]);".PHP_EOL;
311
-        $str.= "```".PHP_EOL;
310
+        $str .= "]);" . PHP_EOL;
311
+        $str .= "```" . PHP_EOL;
312 312
 
313
-        $str.= "#####{$this->getText(['example', 'recognize'])}".PHP_EOL;
314
-        $str.= "```".PHP_EOL;
313
+        $str .= "#####{$this->getText(['example', 'recognize'])}" . PHP_EOL;
314
+        $str .= "```" . PHP_EOL;
315 315
         $str .= 'if ($captcha->recognize(';
316 316
         if ($this->texts['recognize_file']) {
317 317
             $str .= "'{$this->getText(['recognize', 'data', 'file'])}'";
318 318
         }
319 319
         if ($this->texts['recognize_data']) {
320 320
             if ($this->texts['recognize_file']) {
321
-                $str.= ", ";
321
+                $str .= ", ";
322 322
             }
323
-            $str.= "[".PHP_EOL;
323
+            $str .= "[" . PHP_EOL;
324 324
             foreach ($this->texts['recognize_data'] as $key => $val) {
325
-                $str.= "    {$rc->getShortName()}::{$this->getNameConst('ACTION_FIELD_', $key)} => ";
325
+                $str .= "    {$rc->getShortName()}::{$this->getNameConst('ACTION_FIELD_', $key)} => ";
326 326
                 if (is_string($val)) {
327
-                    $str.= "'{$val}'";
327
+                    $str .= "'{$val}'";
328 328
                 } else {
329
-                    $str.= "{$val}";
329
+                    $str .= "{$val}";
330 330
                 }
331
-                $str.= ",".PHP_EOL;
331
+                $str .= "," . PHP_EOL;
332 332
             }
333
-            $str.= "]";
333
+            $str .= "]";
334 334
         }
335
-        $str.= ")) {".PHP_EOL;
336
-        $str.= '    $code = $captcha->getCode();'.PHP_EOL;
337
-        $str.= "} else {".PHP_EOL;
338
-        $str.= '    $error = $captcha->getError());'.PHP_EOL;
339
-        $str.= "}".PHP_EOL;
340
-        $str.= "```".PHP_EOL;
335
+        $str .= ")) {" . PHP_EOL;
336
+        $str .= '    $code = $captcha->getCode();' . PHP_EOL;
337
+        $str .= "} else {" . PHP_EOL;
338
+        $str .= '    $error = $captcha->getError());' . PHP_EOL;
339
+        $str .= "}" . PHP_EOL;
340
+        $str .= "```" . PHP_EOL;
341 341
 
342 342
         /*  constructor_data
343 343
         use jumper423\decaptcha\services\Anticaptcha;
@@ -363,8 +363,8 @@  discard block
 block discarded – undo
363 363
 
364 364
     private function viewFields()
365 365
     {
366
-        $str = " {$this->getText(['table', 'th', 'name'])} | {$this->getText(['table', 'th', 'code'])} | {$this->getText(['table', 'th', 'type'])} | {$this->getText(['table', 'th', 'req'])} | {$this->getText(['table', 'th', 'def'])} | {$this->getText(['table', 'th', 'enum'])} | {$this->getText(['table', 'th', 'desc'])} ".PHP_EOL;
367
-        $str .= ' --- | --- | --- | --- | --- | --- | --- '.PHP_EOL;
366
+        $str = " {$this->getText(['table', 'th', 'name'])} | {$this->getText(['table', 'th', 'code'])} | {$this->getText(['table', 'th', 'type'])} | {$this->getText(['table', 'th', 'req'])} | {$this->getText(['table', 'th', 'def'])} | {$this->getText(['table', 'th', 'enum'])} | {$this->getText(['table', 'th', 'desc'])} " . PHP_EOL;
367
+        $str .= ' --- | --- | --- | --- | --- | --- | --- ' . PHP_EOL;
368 368
         foreach ($this->class->actions[($this->class)::ACTION_RECOGNIZE][($this->class)::ACTION_FIELDS] as $param => $setting) {
369 369
             if (array_key_exists(($this->class)::ACTION_FIELDS, $setting) && is_array($setting[($this->class)::ACTION_FIELDS])) {
370 370
                 foreach ($setting[($this->class)::ACTION_FIELDS] as $param1 => $setting1) {
@@ -387,9 +387,9 @@  discard block
 block discarded – undo
387 387
     {
388 388
         $str = " {$this->getText(['field', 'main', 'name', $param])} |";
389 389
         $str .= " {$this->getNameConst('ACTION_FIELD_', $param)} |";
390
-        $str .= ' '.substr($this->getNameConst('PARAM_FIELD_TYPE_', $setting[($this->class)::PARAM_SLUG_TYPE]), 17).' |';
391
-        $str .= ' '.(array_key_exists(($this->class)::PARAM_SLUG_REQUIRE, $setting) ? '+' : '-').' |';
392
-        $str .= ' '.(array_key_exists(($this->class)::PARAM_SLUG_DEFAULT, $setting) ? $setting[($this->class)::PARAM_SLUG_DEFAULT] : '').' |';
390
+        $str .= ' ' . substr($this->getNameConst('PARAM_FIELD_TYPE_', $setting[($this->class)::PARAM_SLUG_TYPE]), 17) . ' |';
391
+        $str .= ' ' . (array_key_exists(($this->class)::PARAM_SLUG_REQUIRE, $setting) ? '+' : '-') . ' |';
392
+        $str .= ' ' . (array_key_exists(($this->class)::PARAM_SLUG_DEFAULT, $setting) ? $setting[($this->class)::PARAM_SLUG_DEFAULT] : '') . ' |';
393 393
         $str .= " {$this->getText(['field', 'slug', ($this->class)::PARAM_SLUG_ENUM, $param])} |";
394 394
         $str .= " {$this->getText(['field', 'main', 'desc', $param])} |";
395 395
         $str .= PHP_EOL;
@@ -411,20 +411,20 @@  discard block
 block discarded – undo
411 411
 
412 412
     public function view()
413 413
     {
414
-        $str = $this->getText(['service', 'name']).PHP_EOL;
415
-        $str .= '=============='.PHP_EOL;
416
-        $str .= "###{$this->getText(['slug', 'link'])}".PHP_EOL;
417
-        $str .= "[{$this->getText(['slug', 'link', 'to_service'])} {$this->getText(['service', 'name'])}]({$this->getText(['service', 'href'])})".PHP_EOL.PHP_EOL;
418
-        $str .= "###{$this->getText(['slug', 'service', 'desc'])}".PHP_EOL;
419
-        $str .= "{$this->getText(['service', 'desc'])}".PHP_EOL.PHP_EOL;
420
-        $str .= "###{$this->getText(['slug', 'price'])}".PHP_EOL;
421
-        $str .= "{$this->getText(['recognize', 'price'])}".PHP_EOL.PHP_EOL;
422
-        $str .= "###{$this->getText(['slug', 'recognize', 'desc'])}".PHP_EOL;
423
-        $str .= "{$this->getText(['recognize', 'desc'])}".PHP_EOL.PHP_EOL;
424
-        $str .= "###{$this->getText(['example'])}".PHP_EOL;
425
-        $str .= "{$this->viewExamples()}".PHP_EOL.PHP_EOL;
426
-        $str .= "###{$this->getText(['slug', 'fields', 'desc'])}".PHP_EOL;
427
-        $str .= $this->viewFields().PHP_EOL;
414
+        $str = $this->getText(['service', 'name']) . PHP_EOL;
415
+        $str .= '==============' . PHP_EOL;
416
+        $str .= "###{$this->getText(['slug', 'link'])}" . PHP_EOL;
417
+        $str .= "[{$this->getText(['slug', 'link', 'to_service'])} {$this->getText(['service', 'name'])}]({$this->getText(['service', 'href'])})" . PHP_EOL . PHP_EOL;
418
+        $str .= "###{$this->getText(['slug', 'service', 'desc'])}" . PHP_EOL;
419
+        $str .= "{$this->getText(['service', 'desc'])}" . PHP_EOL . PHP_EOL;
420
+        $str .= "###{$this->getText(['slug', 'price'])}" . PHP_EOL;
421
+        $str .= "{$this->getText(['recognize', 'price'])}" . PHP_EOL . PHP_EOL;
422
+        $str .= "###{$this->getText(['slug', 'recognize', 'desc'])}" . PHP_EOL;
423
+        $str .= "{$this->getText(['recognize', 'desc'])}" . PHP_EOL . PHP_EOL;
424
+        $str .= "###{$this->getText(['example'])}" . PHP_EOL;
425
+        $str .= "{$this->viewExamples()}" . PHP_EOL . PHP_EOL;
426
+        $str .= "###{$this->getText(['slug', 'fields', 'desc'])}" . PHP_EOL;
427
+        $str .= $this->viewFields() . PHP_EOL;
428 428
 
429 429
         return $str;
430 430
     }
Please login to merge, or discard this patch.