Skip to content

Commit b2e2744

Browse files
authored
Merge pull request #534 from phpDocumentor/feature-highlight-directive
[FEATURE] introduce highlight directive
2 parents 6b25d9b + 6c2cbb2 commit b2e2744

File tree

8 files changed

+106
-5
lines changed

8 files changed

+106
-5
lines changed

packages/guides-restructured-text/resources/config/guides-restructured-text.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use phpDocumentor\Guides\RestructuredText\Directives\DocumentBlockDirective;
1919
use phpDocumentor\Guides\RestructuredText\Directives\ErrorDirective;
2020
use phpDocumentor\Guides\RestructuredText\Directives\FigureDirective;
21+
use phpDocumentor\Guides\RestructuredText\Directives\HighlightDirective;
2122
use phpDocumentor\Guides\RestructuredText\Directives\HintDirective;
2223
use phpDocumentor\Guides\RestructuredText\Directives\ImageDirective;
2324
use phpDocumentor\Guides\RestructuredText\Directives\ImportantDirective;
@@ -158,6 +159,7 @@
158159
->set(DocumentBlockDirective::class)
159160
->set(ErrorDirective::class)
160161
->set(FigureDirective::class)
162+
->set(HighlightDirective::class)
161163
->set(HintDirective::class)
162164
->set(ImageDirective::class)
163165
->set(ImportantDirective::class)

packages/guides-restructured-text/src/RestructuredText/Directives/CodeBlockDirective.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,12 @@ public function process(
5050
$blockContext->getDocumentIterator()->toArray(),
5151
);
5252

53-
$node->setLanguage(trim($directive->getData()));
53+
if (trim($directive->getData()) !== '') {
54+
$node->setLanguage(trim($directive->getData()));
55+
} else {
56+
$node->setLanguage($blockContext->getDocumentParserContext()->getCodeBlockDefaultLanguage());
57+
}
58+
5459
$this->setStartingLineNumberBasedOnOptions($directive->getOptions(), $node);
5560
$this->setCaptionBasedOnOptions($directive->getOptions(), $node);
5661
$this->codeNodeOptionMapper->apply($node, $directive->getOptions());
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace phpDocumentor\Guides\RestructuredText\Directives;
6+
7+
use phpDocumentor\Guides\RestructuredText\Parser\BlockContext;
8+
use phpDocumentor\Guides\RestructuredText\Parser\Directive;
9+
10+
use function trim;
11+
12+
/**
13+
* https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-highlight
14+
*/
15+
class HighlightDirective extends ActionDirective
16+
{
17+
public function getName(): string
18+
{
19+
return 'highlight';
20+
}
21+
22+
public function processAction(
23+
BlockContext $blockContext,
24+
Directive $directive,
25+
): void {
26+
$blockContext->getDocumentParserContext()->setCodeBlockDefaultLanguage(trim($directive->getData()));
27+
}
28+
}

packages/guides-restructured-text/src/RestructuredText/Parser/DocumentParserContext.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ class DocumentParserContext
3434
/* Each Document has its own text role factory as text roles can be changed on a per document base
3535
by directives */
3636
private TextRoleFactory $textRoleFactoryForDocument;
37+
38+
private string $codeBlockDefaultLanguage = '';
3739

3840
/** @var string[] */
3941
private array $titleLetters = [];
@@ -95,4 +97,14 @@ public function getTextRoleFactoryForDocument(): TextRoleFactory
9597
{
9698
return $this->textRoleFactoryForDocument;
9799
}
100+
101+
public function getCodeBlockDefaultLanguage(): string
102+
{
103+
return $this->codeBlockDefaultLanguage;
104+
}
105+
106+
public function setCodeBlockDefaultLanguage(string $codeBlockDefaultLanguage): void
107+
{
108+
$this->codeBlockDefaultLanguage = $codeBlockDefaultLanguage;
109+
}
98110
}

packages/guides-restructured-text/src/RestructuredText/Parser/Productions/LiteralBlockRule.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public function apply(BlockContext $blockContext, CompoundNode|null $on = null):
6363
}
6464

6565
//TODO this is a bug, we need LiteralBlockNode here
66-
return new CodeNode($lines);
66+
return new CodeNode($lines, $blockContext->getDocumentParserContext()->getCodeBlockDefaultLanguage());
6767
}
6868

6969
private function isBlockLine(string|null $line): bool

packages/guides/src/Nodes/CodeNode.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,13 @@
1717

1818
class CodeNode extends TextNode
1919
{
20-
protected string|null $language = null;
21-
2220
/** @var int|null The line number to start counting from and display, or null to hide line numbers */
2321
private int|null $startingLineNumber = null;
2422

2523
private string|null $caption = null;
2624

2725
/** @param string[] $lines */
28-
public function __construct(array $lines)
26+
public function __construct(array $lines, protected string|null $language = null)
2927
{
3028
parent::__construct(implode("\n", $lines));
3129
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<title>Title</title>
5+
6+
</head>
7+
<body>
8+
<div class="section" id="title">
9+
<h1>Title</h1>
10+
11+
<p>The default language is empty:</p>
12+
<pre><code class="language-"> Some plain text
13+
</code></pre>
14+
<p>Also in explicit code-blocks without language:</p>
15+
<pre><code class="language-">Some plain text</code></pre>
16+
<p>Now the default language is JavaScript:</p>
17+
<pre><code class="language-javascript"> var language = &#039;JavaScript&#039;;
18+
</code></pre>
19+
<p>Also in explicit code-blocks without language:</p>
20+
<pre><code class="language-javascript">var language = &#039;JavaScript&#039;;</code></pre>
21+
<p>However explicit languages take precedence</p>
22+
<pre><code class="language-xml">&lt;language&gt;XML&lt;/language&gt;</code></pre>
23+
</div>
24+
25+
</body>
26+
</html>
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
Title
2+
=====
3+
4+
The default language is empty::
5+
6+
Some plain text
7+
8+
Also in explicit code-blocks without language:
9+
10+
.. code-block::
11+
12+
Some plain text
13+
14+
.. highlight:: javascript
15+
16+
Now the default language is JavaScript::
17+
18+
var language = 'JavaScript';
19+
20+
Also in explicit code-blocks without language:
21+
22+
.. code-block::
23+
24+
var language = 'JavaScript';
25+
26+
However explicit languages take precedence
27+
28+
.. code-block:: xml
29+
30+
<language>XML</language>

0 commit comments

Comments
 (0)