Skip to content

Commit dda1da7

Browse files
committed
highlighter tmp commit
1 parent 767bb5c commit dda1da7

File tree

112 files changed

+4343
-11
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

112 files changed

+4343
-11
lines changed

app/Docs.php

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
use Illuminate\Support\Facades\Http;
1212
use Illuminate\Support\Facades\Storage;
1313
use Illuminate\Support\Str;
14-
use Laravel\Unfenced\UnfencedExtension;
1514
use Symfony\Component\DomCrawler\Crawler;
1615
use Symfony\Component\Yaml\Yaml;
16+
use App\Markdown\GitHubMarkdownConverter;
1717

1818
class Docs
1919
{
@@ -126,16 +126,12 @@ public function variables(?string $key = null): mixed
126126
*/
127127
public function content(): ?string
128128
{
129-
return once(function () {
130-
return Str::of($this->raw())
129+
$content = Str::of($this->raw())
131130
->replace('{{version}}', $this->version)
132131
->after('---')
133-
->after('---')
134-
->markdown(extensions: [
135-
new UnfencedExtension,
136-
])
137-
->toString();
138-
});
132+
->after('---');
133+
134+
return (new GitHubMarkdownConverter)->convert($content);
139135
}
140136

141137
/**
@@ -149,11 +145,18 @@ public function content(): ?string
149145
*/
150146
public function view(string $view)
151147
{
152-
$data = Cache::remember('doc-file-view-data'.$this->path, now()->addMinutes(30), fn () => collect()->merge($this->variables())->merge([
148+
// Cache во время разработки не нужен
149+
//$data = Cache::remember('doc-file-view-data'.$this->path, now()->addMinutes(30), fn () => collect()->merge($this->variables())->merge([
150+
// 'docs' => $this,
151+
// 'content' => $this->content(),
152+
// 'edit' => $this->getEditUrl(),
153+
//]));
154+
155+
$data = collect()->merge($this->variables())->merge([
153156
'docs' => $this,
154157
'content' => $this->content(),
155158
'edit' => $this->getEditUrl(),
156-
]));
159+
]);
157160

158161
return view($view, $data);
159162
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\MarkDown\CustomHL\CommonMark;
6+
7+
use League\CommonMark\Environment\EnvironmentBuilderInterface;
8+
use League\CommonMark\Extension\CommonMark\Node\Block\FencedCode;
9+
use League\CommonMark\Extension\CommonMark\Node\Block\IndentedCode;
10+
use League\CommonMark\Extension\CommonMark\Node\Inline\Code;
11+
use League\CommonMark\Extension\ExtensionInterface;
12+
use Tempest\Highlight\Highlighter;
13+
use Tempest\Highlight\Themes\InlineTheme;
14+
use Tempest\Highlight\CommonMark\CodeBlockRenderer;
15+
use Tempest\Highlight\CommonMark\InlineCodeBlockRenderer;
16+
use App\MarkDown\CustomHL\Languages\Php\PhpLanguage;
17+
use App\MarkDown\CustomHL\Languages\Shell\ShellLanguage;
18+
use App\MarkDown\CustomHL\Languages\Bash\BashLanguage;
19+
use App\MarkDown\CustomHL\Languages\Ini\IniLanguage;
20+
use App\MarkDown\CustomHL\Languages\Blade\BladeLanguage;
21+
use App\MarkDown\CustomHL\Languages\Vue\VueLanguage;
22+
use App\MarkDown\CustomHL\Languages\Nginx\NginxLanguage;
23+
use App\MarkDown\CustomHL\Languages\JavaScript\JavaScriptLanguage;
24+
//use App\MarkDown\CustomHL\Languages\Html\HtmlLanguage;
25+
use App\MarkDown\CustomHL\Languages\Xml\XmlLanguage;
26+
27+
final class CustomHighlightExtension implements ExtensionInterface
28+
{
29+
public function __construct(
30+
private ?Highlighter $highlighter = new Highlighter(new InlineTheme(__DIR__ . '/../style.css')),
31+
) {
32+
$this->highlighter->addLanguage(new PhpLanguage());
33+
$this->highlighter->addLanguage(new ShellLanguage());
34+
$this->highlighter->addLanguage(new BashLanguage());
35+
$this->highlighter->addLanguage(new IniLanguage());
36+
$this->highlighter->addLanguage(new BladeLanguage());
37+
$this->highlighter->addLanguage(new VueLanguage());
38+
$this->highlighter->addLanguage(new NginxLanguage());
39+
$this->highlighter->addLanguage(new JavaScriptLanguage());
40+
// $this->highlighter->addLanguage(new HtmlLanguage());
41+
$this->highlighter->addLanguage(new XmlLanguage());
42+
}
43+
44+
public function register(EnvironmentBuilderInterface $environment): void
45+
{
46+
$environment
47+
->addRenderer(FencedCode::class, new CodeBlockRenderer($this->highlighter), 10)
48+
->addRenderer(IndentedCode::class, new IndentedCodeBlockRenderer($this->highlighter), 10)
49+
//->addRenderer(Code::class, new InlineCodeBlockRenderer($this->highlighter), 10)
50+
;
51+
}
52+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\MarkDown\CustomHL\CommonMark;
6+
7+
use InvalidArgumentException;
8+
use League\CommonMark\Extension\CommonMark\Node\Block\IndentedCode;
9+
use League\CommonMark\Node\Node;
10+
use League\CommonMark\Renderer\ChildNodeRendererInterface;
11+
use League\CommonMark\Renderer\NodeRendererInterface;
12+
use Tempest\Highlight\Highlighter;
13+
use Tempest\Highlight\WebTheme;
14+
15+
final class IndentedCodeBlockRenderer implements NodeRendererInterface
16+
{
17+
public function __construct(
18+
private Highlighter $highlighter = new Highlighter(),
19+
) {
20+
}
21+
22+
public function render(Node $node, ChildNodeRendererInterface $childRenderer)
23+
{
24+
//dd($node); //print_r($node);
25+
if (! $node instanceof IndentedCode) {
26+
//dd($node);
27+
throw new InvalidArgumentException('Block must be instance of ' . IndentedCode::class);
28+
}
29+
//dd($node);
30+
31+
//preg_match('/^(?<language>[\w]+)(\{(?<startAt>[\d]+)\})?/', $node->getInfoWords()[0] ?? 'php', $matches);
32+
33+
$highlighter = $this->highlighter;
34+
35+
//if ($startAt = ($matches['startAt']) ?? null) {
36+
// $highlighter = $highlighter->withGutter((int)$startAt);
37+
//}
38+
39+
//$language = $matches['language'] ?? 'php';
40+
$language = 'php';
41+
42+
$parsed = $highlighter->parse($node->getLiteral(), $language);
43+
44+
$theme = $highlighter->getTheme();
45+
46+
if ($theme instanceof WebTheme) {
47+
return $theme->preBefore($highlighter) . $parsed . $theme->preAfter($highlighter);
48+
} else {
49+
return '<pre data-lang="' . $language . '" class="notranslate">' . $parsed . '</pre>';
50+
}
51+
}
52+
}

app/MarkDown/CustomHL/IsInjection.php

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\MarkDown\CustomHL;
6+
7+
use Tempest\Highlight\Highlighter;
8+
use Tempest\Highlight\ParsedInjection;
9+
10+
trait IsInjection
11+
{
12+
abstract public function getPattern(): string;
13+
14+
abstract public function parseContent(string $content, Highlighter $highlighter): string;
15+
16+
private function clearContent(string $input):string
17+
{
18+
return preg_replace(
19+
['/❿(.*?)❿/', '/❷span(.*?)span❸/'],
20+
'',
21+
$input,
22+
);
23+
}
24+
25+
public function parse(string $content, Highlighter $highlighter): ParsedInjection
26+
{
27+
$pattern = $this->getPattern();
28+
29+
if (! str_starts_with($pattern, '/')) {
30+
$pattern = "/{$pattern}/";
31+
}
32+
33+
$cc = $this->clearContent($content);
34+
$result = preg_replace_callback(
35+
pattern: $pattern,
36+
callback: function ($matches) use ($highlighter) {
37+
$content = $matches['match'] ?? '';
38+
39+
if (! $content) {
40+
return $matches[0];
41+
}
42+
43+
return str_replace(
44+
search: $content,
45+
replace: $this->parseContent($content, $highlighter),
46+
subject: $matches[0],
47+
);
48+
},
49+
subject: $cc, //$content,
50+
);
51+
52+
return new ParsedInjection($result ?? $content);
53+
}
54+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\MarkDown\CustomHL\Languages\Bash;
6+
7+
use App\MarkDown\CustomHL\Languages\Shell\ShellLanguage;
8+
//use App\MarkDown\CustomHL\Languages\Bash\Patterns\BashKeyPattern;
9+
//use App\MarkDown\CustomHL\Languages\Bash\Patterns\DoubleQuoteValuePattern;
10+
11+
class BashLanguage extends ShellLanguage
12+
{
13+
public function getName(): string
14+
{
15+
return 'bash';
16+
}
17+
18+
public function getInjections(): array
19+
{
20+
return [
21+
...parent::getInjections(),
22+
];
23+
}
24+
25+
public function getPatterns(): array
26+
{
27+
return [
28+
...parent::getPatterns(),
29+
//new BashKeyPattern(),
30+
//new DoubleQuoteValuePattern(),
31+
];
32+
}
33+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\MarkDown\CustomHL\Languages\Blade;
6+
7+
use App\MarkDown\CustomHL\Languages\Blade\Injections\BladeEchoInjection;
8+
//use App\Tempest\Highlight\Languages\Blade\Injections\BladeKeywordInjection;
9+
use App\MarkDown\CustomHL\Languages\Blade\Injections\BladePhpInjection;
10+
use App\MarkDown\CustomHL\Languages\Blade\Injections\BladeRawEchoInjection;
11+
use App\MarkDown\CustomHL\Languages\Blade\Patterns\BladeCommentPattern;
12+
use App\MarkDown\CustomHL\Languages\Blade\Patterns\BladeComponentCloseTagPattern;
13+
use App\MarkDown\CustomHL\Languages\Blade\Patterns\BladeComponentOpenTagPattern;
14+
use App\MarkDown\CustomHL\Languages\Blade\Patterns\BladeKeywordPattern;
15+
use App\MarkDown\CustomHL\Languages\Html\HtmlLanguage;
16+
use App\MarkDown\CustomHL\Languages\Blade\Patterns\DelimeterPattern;
17+
use App\MarkDown\CustomHL\Languages\Blade\Patterns\KeywordPattern;
18+
use App\MarkDown\CustomHL\Languages\Blade\Injections\SingleQuoteValueInjection;
19+
use App\MarkDown\CustomHL\Languages\Blade\Patterns\GenericPattern;
20+
use App\MarkDown\CustomHL\Languages\Blade\Patterns\EscapeSymbolPattern;
21+
use App\MarkDown\CustomHL\Languages\Blade\Injections\BladeKeywordParametersInjection;
22+
23+
class BladeLanguage extends HtmlLanguage
24+
{
25+
public function getName(): string
26+
{
27+
return 'blade';
28+
}
29+
30+
public function getAliases(): array
31+
{
32+
return ['html'];
33+
}
34+
35+
public function getInjections(): array
36+
{
37+
return [
38+
...parent::getInjections(),
39+
//new BladeKeywordInjection(),
40+
new BladePhpInjection(),
41+
new BladeKeywordParametersInjection(),
42+
new BladeEchoInjection(),
43+
new BladeRawEchoInjection(),
44+
new SingleQuoteValueInjection(),
45+
];
46+
}
47+
48+
public function getPatterns(): array
49+
{
50+
return [
51+
...parent::getPatterns(),
52+
//new BladeComponentOpenTagPattern(),
53+
//new BladeComponentCloseTagPattern(),
54+
new BladeKeywordPattern(),
55+
new BladeCommentPattern(),
56+
57+
new DelimeterPattern('({!!|!!}|=\>)'), // {{|}}| // /(?<match>({!!|!!}|\<[^!](\/)?|\<(?!\!\--)|\>|=\>))/
58+
new GenericPattern('/(?<match>({{(?!\-\-)))/', 'hl-blade-delimeter'), // /(?<match>({{(?!\-\-)|[^\-]}}|{!!|!!}))/
59+
new GenericPattern('/[^\-](?<match>(}}))/', 'hl-blade-delimeter'), // /(?<match>({{(?!\-\-)|[^\-]}}|{!!|!!}))/
60+
new GenericPattern('/(?<match>(\<(\/)?))[^!]/', 'hl-blade-delimeter'), // /(?<match>({{(?!\-\-)|[^\-]}}|{!!|!!}))/
61+
new GenericPattern('/[^\-](?<match>(\>))/', 'hl-blade-delimeter'), // /(?<match>({{(?!\-\-)|[^\-]}}|{!!|!!}))/
62+
new EscapeSymbolPattern(),
63+
64+
new KeywordPattern('as'),
65+
];
66+
}
67+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\MarkDown\CustomHL\Languages\Blade\Injections;
6+
7+
use Tempest\Highlight\Highlighter;
8+
use Tempest\Highlight\Injection;
9+
use Tempest\Highlight\IsInjection;
10+
use Tempest\Highlight\Escape;
11+
use Tempest\Highlight\Tokens\DynamicTokenType;
12+
13+
final readonly class BladeEchoInjection implements Injection
14+
{
15+
use IsInjection;
16+
17+
public function getPattern(): string
18+
{
19+
return '({{(?!--))(?<match>.*)(}})';
20+
}
21+
22+
public function parseContent(string $content, Highlighter $highlighter): string
23+
{
24+
return $highlighter->parse($content, 'php');
25+
}
26+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\MarkDown\CustomHL\Languages\Blade\Injections;
6+
7+
use Tempest\Highlight\Highlighter;
8+
use Tempest\Highlight\Injection;
9+
use Tempest\Highlight\IsInjection;
10+
11+
final readonly class BladeKeywordParametersInjection implements Injection
12+
{
13+
use IsInjection;
14+
15+
public function getPattern(): string
16+
{
17+
return '/\@[\w]+\b(\s)*\((?<match>.*)\)/';
18+
}
19+
20+
public function parseContent(string $content, Highlighter $highlighter): string
21+
{
22+
return $highlighter->parse($content, 'php');
23+
}
24+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\MarkDown\CustomHL\Languages\Blade\Injections;
6+
7+
use Tempest\Highlight\Highlighter;
8+
use Tempest\Highlight\Injection;
9+
use Tempest\Highlight\IsInjection;
10+
11+
final readonly class BladePhpInjection implements Injection
12+
{
13+
use IsInjection;
14+
15+
public function getPattern(): string
16+
{
17+
return '/(?<match>(\@php|<\?php)(.|\n)*?(\@endphp|\?>))/';
18+
}
19+
20+
public function parseContent(string $content, Highlighter $highlighter): string
21+
{
22+
return $highlighter->parse($content, 'php');
23+
}
24+
}

0 commit comments

Comments
 (0)