Skip to content

[FEATURE] make it easier to configure templates. #663

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion guides.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
log-path="php://stder"
>
<project title="phpDocumentor Guides"/>

<extension class="phpDocumentor\Guides\Bootstrap"/>
<extension class="phpDocumentor\Guides\Code"/>
</guides>
6 changes: 6 additions & 0 deletions packages/guides-cli/resources/schema/guides.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,10 @@
<xsd:attribute name="name" type="xsd:string" use="required"/>
<xsd:attribute name="path" type="xsd:string" use="required"/>
</xsd:complexType>

<xsd:complexType name="template">
<xsd:attribute name="file" type="xsd:string" use="required"/>
<xsd:attribute name="node" type="xsd:string" use="required"/>
<xsd:attribute name="format" type="xsd:string" default="html"/>
</xsd:complexType>
</xsd:schema>
3 changes: 3 additions & 0 deletions packages/guides-cli/src/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@

use function count;
use function getcwd;
use function is_array;
use function iterator_to_array;

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

$commands = is_array($commands) ? $commands : iterator_to_array($commands);
foreach ($commands as $command) {
$this->add($command);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,22 @@

namespace phpDocumentor\Guides\RestructuredText\DependencyInjection;

use phpDocumentor\Guides\NodeRenderers\TemplateNodeRenderer;
use phpDocumentor\Guides\RestructuredText\DependencyInjection\Compiler\TextRolePass;
use phpDocumentor\Guides\RestructuredText\Nodes\ConfvalNode;
use phpDocumentor\Guides\RestructuredText\Nodes\OptionNode;
use phpDocumentor\Guides\RestructuredText\Nodes\VersionChangeNode;
use phpDocumentor\Guides\TemplateRenderer;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
use Symfony\Component\DependencyInjection\Reference;

use function dirname;
use function strrchr;
use function substr;
use function phpDocumentor\Guides\DependencyInjection\template;

class ReStructuredTextExtension extends Extension implements PrependExtensionInterface, CompilerPassInterface
{
private const HTML = [
VersionChangeNode::class => 'body/version-change.html.twig',
OptionNode::class => 'body/directive/option.html.twig',
ConfvalNode::class => 'body/directive/confval.html.twig',
];
private const LATEX = [ConfvalNode::class => 'body/directive/confval.tex.twig'];

/** @param mixed[] $configs */
public function load(array $configs, ContainerBuilder $container): void
{
Expand All @@ -40,45 +28,27 @@ public function load(array $configs, ContainerBuilder $container): void
new FileLocator(dirname(__DIR__, 3) . '/resources/config'),
);

foreach (self::HTML as $node => $template) {
$definition = new Definition(
TemplateNodeRenderer::class,
[
'$renderer' => new Reference(TemplateRenderer::class),
'$template' => $template,
'$nodeClass' => $node,
],
);
$definition->addTag('phpdoc.guides.noderenderer.html');

$container->setDefinition('phpdoc.guides.rst.html.' . substr(strrchr($node, '\\') ?: '', 1), $definition);
}

foreach (self::LATEX as $node => $template) {
$definition = new Definition(
TemplateNodeRenderer::class,
[
'$renderer' => new Reference(TemplateRenderer::class),
'$template' => $template,
'$nodeClass' => $node,
],
);
$definition->addTag('phpdoc.guides.noderenderer.tex');

$container->setDefinition('phpdoc.guides.rst.tex.' . substr(strrchr($node, '\\') ?: '', 1), $definition);
}

$loader->load('guides-restructured-text.php');
}

public function prepend(ContainerBuilder $container): void
{
$container->prependExtensionConfig('guides', [
'base_template_paths' => [
dirname(__DIR__, 3) . '/resources/template/html',
dirname(__DIR__, 3) . '/resources/template/latex',
$container->prependExtensionConfig(
'guides',
[
'base_template_paths' => [
dirname(__DIR__, 3) . '/resources/template/html',
dirname(__DIR__, 3) . '/resources/template/latex',
],
'templates' => [
template(ConfvalNode::class, 'body/directive/confval.html.twig'),
template(VersionChangeNode::class, 'body/version-change.html.twig'),
template(ConfvalNode::class, 'body/directive/confval.tex.twig', 'tex'),
template(OptionNode::class, 'body/directive/option.html.twig'),

],
],
]);
);
}

public function process(ContainerBuilder $container): void
Expand Down
110 changes: 110 additions & 0 deletions packages/guides/resources/template/html/template.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
<?php

declare(strict_types=1);

use phpDocumentor\Guides\Nodes\AnchorNode;
use phpDocumentor\Guides\Nodes\AnnotationListNode;
use phpDocumentor\Guides\Nodes\CitationNode;
use phpDocumentor\Guides\Nodes\CodeNode;
use phpDocumentor\Guides\Nodes\DefinitionListNode;
use phpDocumentor\Guides\Nodes\DefinitionLists\DefinitionNode;
use phpDocumentor\Guides\Nodes\DocumentNode;
use phpDocumentor\Guides\Nodes\FieldListNode;
use phpDocumentor\Guides\Nodes\FigureNode;
use phpDocumentor\Guides\Nodes\FootnoteNode;
use phpDocumentor\Guides\Nodes\ImageNode;
use phpDocumentor\Guides\Nodes\Inline\AbbreviationInlineNode;
use phpDocumentor\Guides\Nodes\Inline\CitationInlineNode;
use phpDocumentor\Guides\Nodes\Inline\DocReferenceNode;
use phpDocumentor\Guides\Nodes\Inline\EmphasisInlineNode;
use phpDocumentor\Guides\Nodes\Inline\FootnoteInlineNode;
use phpDocumentor\Guides\Nodes\Inline\GenericTextRoleInlineNode;
use phpDocumentor\Guides\Nodes\Inline\HyperLinkNode;
use phpDocumentor\Guides\Nodes\Inline\ImageInlineNode;
use phpDocumentor\Guides\Nodes\Inline\LiteralInlineNode;
use phpDocumentor\Guides\Nodes\Inline\NewlineInlineNode;
use phpDocumentor\Guides\Nodes\Inline\PlainTextInlineNode;
use phpDocumentor\Guides\Nodes\Inline\ReferenceNode;
use phpDocumentor\Guides\Nodes\Inline\StrongInlineNode;
use phpDocumentor\Guides\Nodes\Inline\VariableInlineNode;
use phpDocumentor\Guides\Nodes\Inline\WhitespaceInlineNode;
use phpDocumentor\Guides\Nodes\InlineCompoundNode;
use phpDocumentor\Guides\Nodes\ListItemNode;
use phpDocumentor\Guides\Nodes\ListNode;
use phpDocumentor\Guides\Nodes\LiteralBlockNode;
use phpDocumentor\Guides\Nodes\Metadata\AddressNode;
use phpDocumentor\Guides\Nodes\Metadata\AuthorNode;
use phpDocumentor\Guides\Nodes\Metadata\AuthorsNode;
use phpDocumentor\Guides\Nodes\Metadata\ContactNode;
use phpDocumentor\Guides\Nodes\Metadata\CopyrightNode;
use phpDocumentor\Guides\Nodes\Metadata\DateNode;
use phpDocumentor\Guides\Nodes\Metadata\MetaNode;
use phpDocumentor\Guides\Nodes\Metadata\NoCommentsNode;
use phpDocumentor\Guides\Nodes\Metadata\NoSearchNode;
use phpDocumentor\Guides\Nodes\Metadata\OrganizationNode;
use phpDocumentor\Guides\Nodes\Metadata\OrphanNode;
use phpDocumentor\Guides\Nodes\Metadata\RevisionNode;
use phpDocumentor\Guides\Nodes\Metadata\TocDepthNode;
use phpDocumentor\Guides\Nodes\Metadata\TopicNode;
use phpDocumentor\Guides\Nodes\Metadata\VersionNode;
use phpDocumentor\Guides\Nodes\ParagraphNode;
use phpDocumentor\Guides\Nodes\QuoteNode;
use phpDocumentor\Guides\Nodes\SectionNode;
use phpDocumentor\Guides\Nodes\SeparatorNode;
use phpDocumentor\Guides\Nodes\TitleNode;

return [
AnchorNode::class => 'inline/anchor.html.twig',
FigureNode::class => 'body/figure.html.twig',
MetaNode::class => 'structure/header/meta.html.twig',
ParagraphNode::class => 'body/paragraph.html.twig',
QuoteNode::class => 'body/quote.html.twig',
SeparatorNode::class => 'body/separator.html.twig',
TitleNode::class => 'structure/header-title.html.twig',
SectionNode::class => 'structure/section.html.twig',
DocumentNode::class => 'structure/document.html.twig',
ImageNode::class => 'body/image.html.twig',
CodeNode::class => 'body/code.html.twig',
DefinitionListNode::class => 'body/definition-list.html.twig',
DefinitionNode::class => 'body/definition.html.twig',
FieldListNode::class => 'body/field-list.html.twig',
ListNode::class => 'body/list/list.html.twig',
ListItemNode::class => 'body/list/list-item.html.twig',
LiteralBlockNode::class => 'body/literal-block.html.twig',
CitationNode::class => 'body/citation.html.twig',
FootnoteNode::class => 'body/footnote.html.twig',
AnnotationListNode::class => 'body/annotation-list.html.twig',
// Inline
ImageInlineNode::class => 'inline/image.html.twig',
InlineCompoundNode::class => 'inline/inline-node.html.twig',
AbbreviationInlineNode::class => 'inline/textroles/abbreviation.html.twig',
CitationInlineNode::class => 'inline/citation.html.twig',
DocReferenceNode::class => 'inline/doc.html.twig',
EmphasisInlineNode::class => 'inline/emphasis.html.twig',
FootnoteInlineNode::class => 'inline/footnote.html.twig',
HyperLinkNode::class => 'inline/link.html.twig',
LiteralInlineNode::class => 'inline/literal.html.twig',
NewlineInlineNode::class => 'inline/newline.html.twig',
WhitespaceInlineNode::class => 'inline/nbsp.html.twig',
PlainTextInlineNode::class => 'inline/plain-text.html.twig',
ReferenceNode::class => 'inline/ref.html.twig',
StrongInlineNode::class => 'inline/strong.html.twig',
VariableInlineNode::class => 'inline/variable.html.twig',
GenericTextRoleInlineNode::class => 'inline/textroles/generic.html.twig',
// Output as Metatags
AuthorNode::class => 'structure/header/author.html.twig',
CopyrightNode::class => 'structure/header/copyright.html.twig',
DateNode::class => 'structure/header/date.html.twig',
NoSearchNode::class => 'structure/header/no-search.html.twig',
TopicNode::class => 'structure/header/topic.html.twig',
// No output in page header in HTML - might be output in i.e. LaTex
AddressNode::class => 'structure/header/blank.html.twig',
AuthorsNode::class => 'structure/header/blank.html.twig',
ContactNode::class => 'structure/header/blank.html.twig',
NoCommentsNode::class => 'structure/header/blank.html.twig',
OrganizationNode::class => 'structure/header/blank.html.twig',
OrphanNode::class => 'structure/header/blank.html.twig',
RevisionNode::class => 'structure/header/blank.html.twig',
TocDepthNode::class => 'structure/header/blank.html.twig',
VersionNode::class => 'structure/header/blank.html.twig',
];
110 changes: 110 additions & 0 deletions packages/guides/resources/template/tex/template.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
<?php

declare(strict_types=1);

use phpDocumentor\Guides\Nodes\AnchorNode;
use phpDocumentor\Guides\Nodes\AnnotationListNode;
use phpDocumentor\Guides\Nodes\CitationNode;
use phpDocumentor\Guides\Nodes\CodeNode;
use phpDocumentor\Guides\Nodes\DefinitionListNode;
use phpDocumentor\Guides\Nodes\DefinitionLists\DefinitionNode;
use phpDocumentor\Guides\Nodes\DocumentNode;
use phpDocumentor\Guides\Nodes\FieldListNode;
use phpDocumentor\Guides\Nodes\FigureNode;
use phpDocumentor\Guides\Nodes\FootnoteNode;
use phpDocumentor\Guides\Nodes\ImageNode;
use phpDocumentor\Guides\Nodes\Inline\AbbreviationInlineNode;
use phpDocumentor\Guides\Nodes\Inline\CitationInlineNode;
use phpDocumentor\Guides\Nodes\Inline\DocReferenceNode;
use phpDocumentor\Guides\Nodes\Inline\EmphasisInlineNode;
use phpDocumentor\Guides\Nodes\Inline\FootnoteInlineNode;
use phpDocumentor\Guides\Nodes\Inline\GenericTextRoleInlineNode;
use phpDocumentor\Guides\Nodes\Inline\HyperLinkNode;
use phpDocumentor\Guides\Nodes\Inline\ImageInlineNode;
use phpDocumentor\Guides\Nodes\Inline\LiteralInlineNode;
use phpDocumentor\Guides\Nodes\Inline\NewlineInlineNode;
use phpDocumentor\Guides\Nodes\Inline\PlainTextInlineNode;
use phpDocumentor\Guides\Nodes\Inline\ReferenceNode;
use phpDocumentor\Guides\Nodes\Inline\StrongInlineNode;
use phpDocumentor\Guides\Nodes\Inline\VariableInlineNode;
use phpDocumentor\Guides\Nodes\Inline\WhitespaceInlineNode;
use phpDocumentor\Guides\Nodes\InlineCompoundNode;
use phpDocumentor\Guides\Nodes\ListItemNode;
use phpDocumentor\Guides\Nodes\ListNode;
use phpDocumentor\Guides\Nodes\LiteralBlockNode;
use phpDocumentor\Guides\Nodes\Metadata\AddressNode;
use phpDocumentor\Guides\Nodes\Metadata\AuthorNode;
use phpDocumentor\Guides\Nodes\Metadata\AuthorsNode;
use phpDocumentor\Guides\Nodes\Metadata\ContactNode;
use phpDocumentor\Guides\Nodes\Metadata\CopyrightNode;
use phpDocumentor\Guides\Nodes\Metadata\DateNode;
use phpDocumentor\Guides\Nodes\Metadata\MetaNode;
use phpDocumentor\Guides\Nodes\Metadata\NoCommentsNode;
use phpDocumentor\Guides\Nodes\Metadata\NoSearchNode;
use phpDocumentor\Guides\Nodes\Metadata\OrganizationNode;
use phpDocumentor\Guides\Nodes\Metadata\OrphanNode;
use phpDocumentor\Guides\Nodes\Metadata\RevisionNode;
use phpDocumentor\Guides\Nodes\Metadata\TocDepthNode;
use phpDocumentor\Guides\Nodes\Metadata\TopicNode;
use phpDocumentor\Guides\Nodes\Metadata\VersionNode;
use phpDocumentor\Guides\Nodes\ParagraphNode;
use phpDocumentor\Guides\Nodes\QuoteNode;
use phpDocumentor\Guides\Nodes\SectionNode;
use phpDocumentor\Guides\Nodes\SeparatorNode;
use phpDocumentor\Guides\Nodes\TitleNode;

return [
AnchorNode::class => 'inline/anchor.tex.twig',
FigureNode::class => 'body/figure.tex.twig',
MetaNode::class => 'structure/header/meta.tex.twig',
ParagraphNode::class => 'body/paragraph.tex.twig',
QuoteNode::class => 'body/quote.tex.twig',
SeparatorNode::class => 'body/separator.tex.twig',
TitleNode::class => 'structure/header-title.tex.twig',
SectionNode::class => 'structure/section.tex.twig',
DocumentNode::class => 'structure/document.tex.twig',
ImageNode::class => 'body/image.tex.twig',
CodeNode::class => 'body/code.tex.twig',
DefinitionListNode::class => 'body/definition-list.tex.twig',
DefinitionNode::class => 'body/definition.tex.twig',
FieldListNode::class => 'body/field-list.tex.twig',
ListNode::class => 'body/list/list.tex.twig',
ListItemNode::class => 'body/list/list-item.tex.twig',
LiteralBlockNode::class => 'body/literal-block.tex.twig',
CitationNode::class => 'body/citation.tex.twig',
FootnoteNode::class => 'body/footnote.tex.twig',
AnnotationListNode::class => 'body/annotation-list.tex.twig',
// Inline
ImageInlineNode::class => 'inline/image.tex.twig',
InlineCompoundNode::class => 'inline/inline-node.tex.twig',
AbbreviationInlineNode::class => 'inline/textroles/abbreviation.tex.twig',
CitationInlineNode::class => 'inline/citation.tex.twig',
DocReferenceNode::class => 'inline/doc.tex.twig',
EmphasisInlineNode::class => 'inline/emphasis.tex.twig',
FootnoteInlineNode::class => 'inline/footnote.tex.twig',
HyperLinkNode::class => 'inline/link.tex.twig',
LiteralInlineNode::class => 'inline/literal.tex.twig',
NewlineInlineNode::class => 'inline/newline.tex.twig',
WhitespaceInlineNode::class => 'inline/nbsp.tex.twig',
PlainTextInlineNode::class => 'inline/plain-text.tex.twig',
ReferenceNode::class => 'inline/ref.tex.twig',
StrongInlineNode::class => 'inline/strong.tex.twig',
VariableInlineNode::class => 'inline/variable.tex.twig',
GenericTextRoleInlineNode::class => 'inline/textroles/generic.tex.twig',
// Output as Metatags
AuthorNode::class => 'structure/header/author.tex.twig',
CopyrightNode::class => 'structure/header/copyright.tex.twig',
DateNode::class => 'structure/header/date.tex.twig',
NoSearchNode::class => 'structure/header/no-search.tex.twig',
TopicNode::class => 'structure/header/topic.tex.twig',
// No output in page header in tex - might be output in i.e. LaTex
AddressNode::class => 'structure/header/blank.tex.twig',
AuthorsNode::class => 'structure/header/blank.tex.twig',
ContactNode::class => 'structure/header/blank.tex.twig',
NoCommentsNode::class => 'structure/header/blank.tex.twig',
OrganizationNode::class => 'structure/header/blank.tex.twig',
OrphanNode::class => 'structure/header/blank.tex.twig',
RevisionNode::class => 'structure/header/blank.tex.twig',
TocDepthNode::class => 'structure/header/blank.tex.twig',
VersionNode::class => 'structure/header/blank.tex.twig',
];
Loading