Liaison-Package.md.php

<?php
/** @var \Lia $lia */
$lia = $args['lia'];
/** @var string $base_dir */
$base_dir = realpath($args['base_dir']);
/** @var \Lia\Package $package */
$package = $args['package'];
/** @var \Tlf\Scrawl $scrawl */  
$scrawl = $this;
/** @var \Lia\Ext\Scrawl $ext */
$ext = $args['scrawl_ext'];


    $abs_dir = realpath($package->dir);
    $rel_dir = null;
    if (substr($abs_dir,0,strlen($base_dir))!=$base_dir){
        $rel_dir = '(error)';
    } else {
        $rel_dir = substr($abs_dir, strlen($base_dir));
    }

    $class_path = $ext->get_rel_class_file($package, $base_dir);


?># Package `<?=$package->fqn?>`
- Class: `<?=get_class($package)?>`  
- Class File: <?=$class_path?>  
- FQN: `<?=$package->fqn?>`  
- Package Directory: <?=$rel_dir?>


### Addons  
Addons are loaded by calling `Addon\\ClassName::from(\Lia $lia)`

Configurable properties are set by calling `$lia->configure(array $configs)` before instantiating any packages. See [Liaison Documentation](https://taeluf.com/docs/Liaison) for more information.

<?php
    if (count($package->addons)==0){
        echo "This Package contains no addons";
        goto end_of_addons;
    }
    echo "This package contains the following addons.  ";

    foreach($package->addons as $name=>$addon): 

    ob_start();
    $ast = $scrawl->get_class_ast(get_class($addon));
    $output = ob_get_clean();

    if ($ast==null){
        echo "\n".get_class($addon).": AST not available. Cannot generate documentation.  ";
        continue;
    }
?>


#### `<?=get_class($addon)?>`
<?=$ast['docblock']['description']??'--no description--'?>  

Addon Name: <?=$name?>  
Class File: <?=$ext->get_rel_class_file($addon, $base_dir);?>  
**Configurable Properties:**<?php 


foreach ($ast['properties'] as $property){
    if (!in_array('public', $property['modifiers'])){
        continue;
    } 
    $attributes = $property['docblock']['attribute'] ?? [];
    foreach ($attributes as $attr){
        if ($attr['name'] == 'configurable'){
            echo "\n- `$".$property['name']."`: ".$attr['description'];
            break;
        }
    }
}

echo "\n\n**Public Methods:**";
foreach ($ast['methods'] as $method){
    if (!in_array('public', $property['modifiers'])){
        continue;
    } 
    $description = trim($method['docblock']['description']??'');
    if ($description=='')$description = 'no-description';

    $pos = strpos($description,"\n");
    if ($pos!==false)$description = substr($description,0,$pos).'...';

    echo "\n- `".$method['declaration']."`: ".$description;

}
//print_r($ast);

endforeach; // foreach package->addons

end_of_addons: