Skip to content

Commit b9dccc9

Browse files
committed
[FEATURE] make it easier to configure templates.
Extensions providing base templates can now use the `template` function to add extra templates to the config. Templates must be added in the `templates` section of the guides configuration.
1 parent 9fbdcb1 commit b9dccc9

File tree

14 files changed

+394
-363
lines changed

14 files changed

+394
-363
lines changed

guides.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
log-path="php://stder"
1212
>
1313
<project title="phpDocumentor Guides"/>
14-
1514
<extension class="phpDocumentor\Guides\Bootstrap"/>
1615
<extension class="phpDocumentor\Guides\Code"/>
1716
</guides>

packages/guides-cli/resources/schema/guides.xsd

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,10 @@
6060
<xsd:attribute name="name" type="xsd:string" use="required"/>
6161
<xsd:attribute name="path" type="xsd:string" use="required"/>
6262
</xsd:complexType>
63+
64+
<xsd:complexType name="template">
65+
<xsd:attribute name="file" type="xsd:string" use="required"/>
66+
<xsd:attribute name="node" type="xsd:string" use="required"/>
67+
<xsd:attribute name="format" type="xsd:string" default="html"/>
68+
</xsd:complexType>
6369
</xsd:schema>

packages/guides-cli/src/Application.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
use function count;
1313
use function getcwd;
14+
use function is_array;
15+
use function iterator_to_array;
1416

1517
final class Application extends BaseApplication
1618
{
@@ -19,6 +21,7 @@ public function __construct(iterable $commands, string $defaultCommand = 'run')
1921
{
2022
parent::__construct('phpDocumentor guides', '1.0.0');
2123

24+
$commands = is_array($commands) ? $commands : iterator_to_array($commands);
2225
foreach ($commands as $command) {
2326
$this->add($command);
2427
}

packages/guides-restructured-text/src/RestructuredText/DependencyInjection/ReStructuredTextExtension.php

Lines changed: 16 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,34 +4,22 @@
44

55
namespace phpDocumentor\Guides\RestructuredText\DependencyInjection;
66

7-
use phpDocumentor\Guides\NodeRenderers\TemplateNodeRenderer;
87
use phpDocumentor\Guides\RestructuredText\DependencyInjection\Compiler\TextRolePass;
98
use phpDocumentor\Guides\RestructuredText\Nodes\ConfvalNode;
109
use phpDocumentor\Guides\RestructuredText\Nodes\OptionNode;
1110
use phpDocumentor\Guides\RestructuredText\Nodes\VersionChangeNode;
12-
use phpDocumentor\Guides\TemplateRenderer;
1311
use Symfony\Component\Config\FileLocator;
1412
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1513
use Symfony\Component\DependencyInjection\ContainerBuilder;
16-
use Symfony\Component\DependencyInjection\Definition;
1714
use Symfony\Component\DependencyInjection\Extension\Extension;
1815
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
1916
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
20-
use Symfony\Component\DependencyInjection\Reference;
2117

2218
use function dirname;
23-
use function strrchr;
24-
use function substr;
19+
use function phpDocumentor\Guides\DependencyInjection\template;
2520

2621
class ReStructuredTextExtension extends Extension implements PrependExtensionInterface, CompilerPassInterface
2722
{
28-
private const HTML = [
29-
VersionChangeNode::class => 'body/version-change.html.twig',
30-
OptionNode::class => 'body/directive/option.html.twig',
31-
ConfvalNode::class => 'body/directive/confval.html.twig',
32-
];
33-
private const LATEX = [ConfvalNode::class => 'body/directive/confval.tex.twig'];
34-
3523
/** @param mixed[] $configs */
3624
public function load(array $configs, ContainerBuilder $container): void
3725
{
@@ -40,45 +28,27 @@ public function load(array $configs, ContainerBuilder $container): void
4028
new FileLocator(dirname(__DIR__, 3) . '/resources/config'),
4129
);
4230

43-
foreach (self::HTML as $node => $template) {
44-
$definition = new Definition(
45-
TemplateNodeRenderer::class,
46-
[
47-
'$renderer' => new Reference(TemplateRenderer::class),
48-
'$template' => $template,
49-
'$nodeClass' => $node,
50-
],
51-
);
52-
$definition->addTag('phpdoc.guides.noderenderer.html');
53-
54-
$container->setDefinition('phpdoc.guides.rst.html.' . substr(strrchr($node, '\\') ?: '', 1), $definition);
55-
}
56-
57-
foreach (self::LATEX as $node => $template) {
58-
$definition = new Definition(
59-
TemplateNodeRenderer::class,
60-
[
61-
'$renderer' => new Reference(TemplateRenderer::class),
62-
'$template' => $template,
63-
'$nodeClass' => $node,
64-
],
65-
);
66-
$definition->addTag('phpdoc.guides.noderenderer.tex');
67-
68-
$container->setDefinition('phpdoc.guides.rst.tex.' . substr(strrchr($node, '\\') ?: '', 1), $definition);
69-
}
70-
7131
$loader->load('guides-restructured-text.php');
7232
}
7333

7434
public function prepend(ContainerBuilder $container): void
7535
{
76-
$container->prependExtensionConfig('guides', [
77-
'base_template_paths' => [
78-
dirname(__DIR__, 3) . '/resources/template/html',
79-
dirname(__DIR__, 3) . '/resources/template/latex',
36+
$container->prependExtensionConfig(
37+
'guides',
38+
[
39+
'base_template_paths' => [
40+
dirname(__DIR__, 3) . '/resources/template/html',
41+
dirname(__DIR__, 3) . '/resources/template/latex',
42+
],
43+
'templates' => [
44+
template(ConfvalNode::class, 'body/directive/confval.html.twig'),
45+
template(VersionChangeNode::class, 'body/version-change.html.twig'),
46+
template(ConfvalNode::class, 'body/directive/confval.tex.twig', 'tex'),
47+
template(OptionNode::class, 'body/directive/option.html.twig'),
48+
49+
],
8050
],
81-
]);
51+
);
8252
}
8353

8454
public function process(ContainerBuilder $container): void
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use phpDocumentor\Guides\Nodes\AnchorNode;
6+
use phpDocumentor\Guides\Nodes\AnnotationListNode;
7+
use phpDocumentor\Guides\Nodes\CitationNode;
8+
use phpDocumentor\Guides\Nodes\CodeNode;
9+
use phpDocumentor\Guides\Nodes\DefinitionListNode;
10+
use phpDocumentor\Guides\Nodes\DefinitionLists\DefinitionNode;
11+
use phpDocumentor\Guides\Nodes\DocumentNode;
12+
use phpDocumentor\Guides\Nodes\FieldListNode;
13+
use phpDocumentor\Guides\Nodes\FigureNode;
14+
use phpDocumentor\Guides\Nodes\FootnoteNode;
15+
use phpDocumentor\Guides\Nodes\ImageNode;
16+
use phpDocumentor\Guides\Nodes\Inline\AbbreviationInlineNode;
17+
use phpDocumentor\Guides\Nodes\Inline\CitationInlineNode;
18+
use phpDocumentor\Guides\Nodes\Inline\DocReferenceNode;
19+
use phpDocumentor\Guides\Nodes\Inline\EmphasisInlineNode;
20+
use phpDocumentor\Guides\Nodes\Inline\FootnoteInlineNode;
21+
use phpDocumentor\Guides\Nodes\Inline\GenericTextRoleInlineNode;
22+
use phpDocumentor\Guides\Nodes\Inline\HyperLinkNode;
23+
use phpDocumentor\Guides\Nodes\Inline\ImageInlineNode;
24+
use phpDocumentor\Guides\Nodes\Inline\LiteralInlineNode;
25+
use phpDocumentor\Guides\Nodes\Inline\NewlineInlineNode;
26+
use phpDocumentor\Guides\Nodes\Inline\PlainTextInlineNode;
27+
use phpDocumentor\Guides\Nodes\Inline\ReferenceNode;
28+
use phpDocumentor\Guides\Nodes\Inline\StrongInlineNode;
29+
use phpDocumentor\Guides\Nodes\Inline\VariableInlineNode;
30+
use phpDocumentor\Guides\Nodes\Inline\WhitespaceInlineNode;
31+
use phpDocumentor\Guides\Nodes\InlineCompoundNode;
32+
use phpDocumentor\Guides\Nodes\ListItemNode;
33+
use phpDocumentor\Guides\Nodes\ListNode;
34+
use phpDocumentor\Guides\Nodes\LiteralBlockNode;
35+
use phpDocumentor\Guides\Nodes\Metadata\AddressNode;
36+
use phpDocumentor\Guides\Nodes\Metadata\AuthorNode;
37+
use phpDocumentor\Guides\Nodes\Metadata\AuthorsNode;
38+
use phpDocumentor\Guides\Nodes\Metadata\ContactNode;
39+
use phpDocumentor\Guides\Nodes\Metadata\CopyrightNode;
40+
use phpDocumentor\Guides\Nodes\Metadata\DateNode;
41+
use phpDocumentor\Guides\Nodes\Metadata\MetaNode;
42+
use phpDocumentor\Guides\Nodes\Metadata\NoCommentsNode;
43+
use phpDocumentor\Guides\Nodes\Metadata\NoSearchNode;
44+
use phpDocumentor\Guides\Nodes\Metadata\OrganizationNode;
45+
use phpDocumentor\Guides\Nodes\Metadata\OrphanNode;
46+
use phpDocumentor\Guides\Nodes\Metadata\RevisionNode;
47+
use phpDocumentor\Guides\Nodes\Metadata\TocDepthNode;
48+
use phpDocumentor\Guides\Nodes\Metadata\TopicNode;
49+
use phpDocumentor\Guides\Nodes\Metadata\VersionNode;
50+
use phpDocumentor\Guides\Nodes\ParagraphNode;
51+
use phpDocumentor\Guides\Nodes\QuoteNode;
52+
use phpDocumentor\Guides\Nodes\SectionNode;
53+
use phpDocumentor\Guides\Nodes\SeparatorNode;
54+
use phpDocumentor\Guides\Nodes\TitleNode;
55+
56+
return [
57+
AnchorNode::class => 'inline/anchor.html.twig',
58+
FigureNode::class => 'body/figure.html.twig',
59+
MetaNode::class => 'structure/header/meta.html.twig',
60+
ParagraphNode::class => 'body/paragraph.html.twig',
61+
QuoteNode::class => 'body/quote.html.twig',
62+
SeparatorNode::class => 'body/separator.html.twig',
63+
TitleNode::class => 'structure/header-title.html.twig',
64+
SectionNode::class => 'structure/section.html.twig',
65+
DocumentNode::class => 'structure/document.html.twig',
66+
ImageNode::class => 'body/image.html.twig',
67+
CodeNode::class => 'body/code.html.twig',
68+
DefinitionListNode::class => 'body/definition-list.html.twig',
69+
DefinitionNode::class => 'body/definition.html.twig',
70+
FieldListNode::class => 'body/field-list.html.twig',
71+
ListNode::class => 'body/list/list.html.twig',
72+
ListItemNode::class => 'body/list/list-item.html.twig',
73+
LiteralBlockNode::class => 'body/literal-block.html.twig',
74+
CitationNode::class => 'body/citation.html.twig',
75+
FootnoteNode::class => 'body/footnote.html.twig',
76+
AnnotationListNode::class => 'body/annotation-list.html.twig',
77+
// Inline
78+
ImageInlineNode::class => 'inline/image.html.twig',
79+
InlineCompoundNode::class => 'inline/inline-node.html.twig',
80+
AbbreviationInlineNode::class => 'inline/textroles/abbreviation.html.twig',
81+
CitationInlineNode::class => 'inline/citation.html.twig',
82+
DocReferenceNode::class => 'inline/doc.html.twig',
83+
EmphasisInlineNode::class => 'inline/emphasis.html.twig',
84+
FootnoteInlineNode::class => 'inline/footnote.html.twig',
85+
HyperLinkNode::class => 'inline/link.html.twig',
86+
LiteralInlineNode::class => 'inline/literal.html.twig',
87+
NewlineInlineNode::class => 'inline/newline.html.twig',
88+
WhitespaceInlineNode::class => 'inline/nbsp.html.twig',
89+
PlainTextInlineNode::class => 'inline/plain-text.html.twig',
90+
ReferenceNode::class => 'inline/ref.html.twig',
91+
StrongInlineNode::class => 'inline/strong.html.twig',
92+
VariableInlineNode::class => 'inline/variable.html.twig',
93+
GenericTextRoleInlineNode::class => 'inline/textroles/generic.html.twig',
94+
// Output as Metatags
95+
AuthorNode::class => 'structure/header/author.html.twig',
96+
CopyrightNode::class => 'structure/header/copyright.html.twig',
97+
DateNode::class => 'structure/header/date.html.twig',
98+
NoSearchNode::class => 'structure/header/no-search.html.twig',
99+
TopicNode::class => 'structure/header/topic.html.twig',
100+
// No output in page header in HTML - might be output in i.e. LaTex
101+
AddressNode::class => 'structure/header/blank.html.twig',
102+
AuthorsNode::class => 'structure/header/blank.html.twig',
103+
ContactNode::class => 'structure/header/blank.html.twig',
104+
NoCommentsNode::class => 'structure/header/blank.html.twig',
105+
OrganizationNode::class => 'structure/header/blank.html.twig',
106+
OrphanNode::class => 'structure/header/blank.html.twig',
107+
RevisionNode::class => 'structure/header/blank.html.twig',
108+
TocDepthNode::class => 'structure/header/blank.html.twig',
109+
VersionNode::class => 'structure/header/blank.html.twig',
110+
];
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use phpDocumentor\Guides\Nodes\AnchorNode;
6+
use phpDocumentor\Guides\Nodes\AnnotationListNode;
7+
use phpDocumentor\Guides\Nodes\CitationNode;
8+
use phpDocumentor\Guides\Nodes\CodeNode;
9+
use phpDocumentor\Guides\Nodes\DefinitionListNode;
10+
use phpDocumentor\Guides\Nodes\DefinitionLists\DefinitionNode;
11+
use phpDocumentor\Guides\Nodes\DocumentNode;
12+
use phpDocumentor\Guides\Nodes\FieldListNode;
13+
use phpDocumentor\Guides\Nodes\FigureNode;
14+
use phpDocumentor\Guides\Nodes\FootnoteNode;
15+
use phpDocumentor\Guides\Nodes\ImageNode;
16+
use phpDocumentor\Guides\Nodes\Inline\AbbreviationInlineNode;
17+
use phpDocumentor\Guides\Nodes\Inline\CitationInlineNode;
18+
use phpDocumentor\Guides\Nodes\Inline\DocReferenceNode;
19+
use phpDocumentor\Guides\Nodes\Inline\EmphasisInlineNode;
20+
use phpDocumentor\Guides\Nodes\Inline\FootnoteInlineNode;
21+
use phpDocumentor\Guides\Nodes\Inline\GenericTextRoleInlineNode;
22+
use phpDocumentor\Guides\Nodes\Inline\HyperLinkNode;
23+
use phpDocumentor\Guides\Nodes\Inline\ImageInlineNode;
24+
use phpDocumentor\Guides\Nodes\Inline\LiteralInlineNode;
25+
use phpDocumentor\Guides\Nodes\Inline\NewlineInlineNode;
26+
use phpDocumentor\Guides\Nodes\Inline\PlainTextInlineNode;
27+
use phpDocumentor\Guides\Nodes\Inline\ReferenceNode;
28+
use phpDocumentor\Guides\Nodes\Inline\StrongInlineNode;
29+
use phpDocumentor\Guides\Nodes\Inline\VariableInlineNode;
30+
use phpDocumentor\Guides\Nodes\Inline\WhitespaceInlineNode;
31+
use phpDocumentor\Guides\Nodes\InlineCompoundNode;
32+
use phpDocumentor\Guides\Nodes\ListItemNode;
33+
use phpDocumentor\Guides\Nodes\ListNode;
34+
use phpDocumentor\Guides\Nodes\LiteralBlockNode;
35+
use phpDocumentor\Guides\Nodes\Metadata\AddressNode;
36+
use phpDocumentor\Guides\Nodes\Metadata\AuthorNode;
37+
use phpDocumentor\Guides\Nodes\Metadata\AuthorsNode;
38+
use phpDocumentor\Guides\Nodes\Metadata\ContactNode;
39+
use phpDocumentor\Guides\Nodes\Metadata\CopyrightNode;
40+
use phpDocumentor\Guides\Nodes\Metadata\DateNode;
41+
use phpDocumentor\Guides\Nodes\Metadata\MetaNode;
42+
use phpDocumentor\Guides\Nodes\Metadata\NoCommentsNode;
43+
use phpDocumentor\Guides\Nodes\Metadata\NoSearchNode;
44+
use phpDocumentor\Guides\Nodes\Metadata\OrganizationNode;
45+
use phpDocumentor\Guides\Nodes\Metadata\OrphanNode;
46+
use phpDocumentor\Guides\Nodes\Metadata\RevisionNode;
47+
use phpDocumentor\Guides\Nodes\Metadata\TocDepthNode;
48+
use phpDocumentor\Guides\Nodes\Metadata\TopicNode;
49+
use phpDocumentor\Guides\Nodes\Metadata\VersionNode;
50+
use phpDocumentor\Guides\Nodes\ParagraphNode;
51+
use phpDocumentor\Guides\Nodes\QuoteNode;
52+
use phpDocumentor\Guides\Nodes\SectionNode;
53+
use phpDocumentor\Guides\Nodes\SeparatorNode;
54+
use phpDocumentor\Guides\Nodes\TitleNode;
55+
56+
return [
57+
AnchorNode::class => 'inline/anchor.tex.twig',
58+
FigureNode::class => 'body/figure.tex.twig',
59+
MetaNode::class => 'structure/header/meta.tex.twig',
60+
ParagraphNode::class => 'body/paragraph.tex.twig',
61+
QuoteNode::class => 'body/quote.tex.twig',
62+
SeparatorNode::class => 'body/separator.tex.twig',
63+
TitleNode::class => 'structure/header-title.tex.twig',
64+
SectionNode::class => 'structure/section.tex.twig',
65+
DocumentNode::class => 'structure/document.tex.twig',
66+
ImageNode::class => 'body/image.tex.twig',
67+
CodeNode::class => 'body/code.tex.twig',
68+
DefinitionListNode::class => 'body/definition-list.tex.twig',
69+
DefinitionNode::class => 'body/definition.tex.twig',
70+
FieldListNode::class => 'body/field-list.tex.twig',
71+
ListNode::class => 'body/list/list.tex.twig',
72+
ListItemNode::class => 'body/list/list-item.tex.twig',
73+
LiteralBlockNode::class => 'body/literal-block.tex.twig',
74+
CitationNode::class => 'body/citation.tex.twig',
75+
FootnoteNode::class => 'body/footnote.tex.twig',
76+
AnnotationListNode::class => 'body/annotation-list.tex.twig',
77+
// Inline
78+
ImageInlineNode::class => 'inline/image.tex.twig',
79+
InlineCompoundNode::class => 'inline/inline-node.tex.twig',
80+
AbbreviationInlineNode::class => 'inline/textroles/abbreviation.tex.twig',
81+
CitationInlineNode::class => 'inline/citation.tex.twig',
82+
DocReferenceNode::class => 'inline/doc.tex.twig',
83+
EmphasisInlineNode::class => 'inline/emphasis.tex.twig',
84+
FootnoteInlineNode::class => 'inline/footnote.tex.twig',
85+
HyperLinkNode::class => 'inline/link.tex.twig',
86+
LiteralInlineNode::class => 'inline/literal.tex.twig',
87+
NewlineInlineNode::class => 'inline/newline.tex.twig',
88+
WhitespaceInlineNode::class => 'inline/nbsp.tex.twig',
89+
PlainTextInlineNode::class => 'inline/plain-text.tex.twig',
90+
ReferenceNode::class => 'inline/ref.tex.twig',
91+
StrongInlineNode::class => 'inline/strong.tex.twig',
92+
VariableInlineNode::class => 'inline/variable.tex.twig',
93+
GenericTextRoleInlineNode::class => 'inline/textroles/generic.tex.twig',
94+
// Output as Metatags
95+
AuthorNode::class => 'structure/header/author.tex.twig',
96+
CopyrightNode::class => 'structure/header/copyright.tex.twig',
97+
DateNode::class => 'structure/header/date.tex.twig',
98+
NoSearchNode::class => 'structure/header/no-search.tex.twig',
99+
TopicNode::class => 'structure/header/topic.tex.twig',
100+
// No output in page header in tex - might be output in i.e. LaTex
101+
AddressNode::class => 'structure/header/blank.tex.twig',
102+
AuthorsNode::class => 'structure/header/blank.tex.twig',
103+
ContactNode::class => 'structure/header/blank.tex.twig',
104+
NoCommentsNode::class => 'structure/header/blank.tex.twig',
105+
OrganizationNode::class => 'structure/header/blank.tex.twig',
106+
OrphanNode::class => 'structure/header/blank.tex.twig',
107+
RevisionNode::class => 'structure/header/blank.tex.twig',
108+
TocDepthNode::class => 'structure/header/blank.tex.twig',
109+
VersionNode::class => 'structure/header/blank.tex.twig',
110+
];

0 commit comments

Comments
 (0)