Skip to content
Open
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
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,11 @@ Testing in dummy IDE
```$xslt
$ ./gradlew runide
```

Generating config from PHP sources
------------
To generate config of this plugin with custom filters, functions and tags from your Latte extensions, use [contrib/CustomSources](contrib/CustomSources/).

* In `contrib/CustomSources/`, run `composer i`.
* Edit `generate.php` to use your Latte extensions and run it.
* It will generate `latte.xml` which you can store in the `.idea/` directory of your project.
2 changes: 2 additions & 0 deletions contrib/CustomSources/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
vendor/
composer.lock
10 changes: 10 additions & 0 deletions contrib/CustomSources/composer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"autoload": {
"psr-4": {
"IdeaLatteSupport\\": ["src/"]
}
},
"require": {
"latte/latte": "^3.0"
}
}
11 changes: 11 additions & 0 deletions contrib/CustomSources/generate.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/usr/bin/env php
<?php declare(strict_types=1);

namespace IdeaLatteSupport;

require_once __DIR__ . '/vendor/autoload.php';

$extensions = [new MyLatteExtension()];

file_put_contents('latte.xml', Generator::generate(...$extensions));
echo "latte.xml saved.\n";
59 changes: 59 additions & 0 deletions contrib/CustomSources/src/Generator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php declare(strict_types=1);

namespace IdeaLatteSupport;

final class Generator
{

public static function generate(\Latte\Extension ...$extensions): string
{
$filters = [];
$functions = [];
$tags = [];

foreach ($extensions as $extension) {
$filters += $extension->getFilters();
$functions += $extension->getFunctions();
$tags += $extension->getTags();
}

$params = [
'filters' => self::getCallables($filters),
'functions' => self::getCallables($functions),
'macros' => [],
];

foreach ($tags as $name => $tag) {
$name = preg_replace('~^n:~', '', $name, count: $count) ?? $name;
$pair = null;
if (is_callable($tag)) {
$r = new \ReflectionFunction(\Closure::fromCallable($tag));
$pair = (string) $r->getReturnType() === 'Generator' ? 'PAIR' : null;
}
$params['macros'][$name] = $count === 1 ? 'ATTR_ONLY' : $pair;
}

$latte = new \Latte\Engine();
return $latte->renderToString(__DIR__ . '/idea.latte', $params);
}

/**
* @param array<callable(): mixed> $callables
* @return array<array{returns: string, params: string}>
*/
private static function getCallables(array $callables): array
{
$return = [];

foreach ($callables as $name => $callable) {
$r = new \ReflectionFunction(\Closure::fromCallable($callable));
$return[$name] = [
'returns' => (string) $r->getReturnType(),
'params' => implode(', ', array_column($r->getParameters(), 'name')),
];
}

return $return;
}

}
34 changes: 34 additions & 0 deletions contrib/CustomSources/src/MyLatteExtension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php declare(strict_types=1);

namespace IdeaLatteSupport;

class MyLatteExtension extends \Latte\Extension
{

/** @inheritdoc */
public function getTags(): array
{
return [
'normal' => function () {},
'n:attrOnly' => function () {},
'pair' => function (): \Generator {},
];
}

/** @inheritdoc */
public function getFilters(): array
{
return [
'myFilter' => function ($param) {},
];
}

/** @inheritdoc */
public function getFunctions(): array
{
return [
'myFunction' => function ($param): bool {},
];
}

}
21 changes: 21 additions & 0 deletions contrib/CustomSources/src/idea.latte
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{contentType xml}
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="LattePluginSettings">
<customMacroSettings>
<list>
<LatteTagSettings n:foreach="$macros as $name => $type" n:attr="MacroType: $type" MacroName="{$name}" />
</list>
</customMacroSettings>
<customModifierSettings>
<list>
<LatteFilterSettings n:foreach="$filters as $name => $info" ModifierName="{$name}" ModifierHelp="{$info[params]}" />
</list>
</customModifierSettings>
<customFunctionSettings>
<list>
<LatteFunctionSettings n:foreach="$functions as $name => $info" FunctionReturnType="{$info[returns]}" FunctionName="{$name}" FunctionHelp="({$info[params]})" />
</list>
</customFunctionSettings>
</component>
</project>