<?php 
namespace Aws\Api; 
 
/** 
 * Encapsulates the documentation strings for a given service-version and 
 * provides methods for extracting the desired parts related to a service, 
 * operation, error, or shape (i.e., parameter). 
 */ 
class DocModel 
{ 
    /** @var array */ 
    private $docs; 
 
    /** 
     * @param array $docs 
     * 
     * @throws \RuntimeException 
     */ 
    public function __construct(array $docs) 
    { 
        if (!extension_loaded('tidy')) { 
            throw new \RuntimeException('The "tidy" PHP extension is required.'); 
        } 
 
        $this->docs = $docs; 
    } 
 
    /** 
     * Convert the doc model to an array. 
     * 
     * @return array 
     */ 
    public function toArray() 
    { 
        return $this->docs; 
    } 
 
    /** 
     * Retrieves documentation about the service. 
     * 
     * @return null|string 
     */ 
    public function getServiceDocs() 
    { 
        return isset($this->docs['service']) ? $this->docs['service'] : null; 
    } 
 
    /** 
     * Retrieves documentation about an operation. 
     * 
     * @param string $operation Name of the operation 
     * 
     * @return null|string 
     */ 
    public function getOperationDocs($operation) 
    { 
        return isset($this->docs['operations'][$operation]) 
            ? $this->docs['operations'][$operation] 
            : null; 
    } 
 
    /** 
     * Retrieves documentation about an error. 
     * 
     * @param string $error Name of the error 
     * 
     * @return null|string 
     */ 
    public function getErrorDocs($error) 
    { 
        return isset($this->docs['shapes'][$error]['base']) 
            ? $this->docs['shapes'][$error]['base'] 
            : null; 
    } 
 
    /** 
     * Retrieves documentation about a shape, specific to the context. 
     * 
     * @param string $shapeName  Name of the shape. 
     * @param string $parentName Name of the parent/context shape. 
     * @param string $ref        Name used by the context to reference the shape. 
     * 
     * @return null|string 
     */ 
    public function getShapeDocs($shapeName, $parentName, $ref) 
    { 
        if (!isset($this->docs['shapes'][$shapeName])) { 
            return ''; 
        } 
 
        $result = ''; 
        $d = $this->docs['shapes'][$shapeName]; 
        if (isset($d['refs']["{$parentName}\$${ref}"])) { 
            $result = $d['refs']["{$parentName}\$${ref}"]; 
        } elseif (isset($d['base'])) { 
            $result = $d['base']; 
        } 
 
        if (isset($d['append'])) { 
            $result .= $d['append']; 
        } 
 
        return $this->clean($result); 
    } 
 
    private function clean($content) 
    { 
        if (!$content) { 
            return ''; 
        } 
 
        $tidy = new \Tidy(); 
        $tidy->parseString($content, [ 
            'indent' => true, 
            'doctype' => 'omit', 
            'output-html' => true, 
            'show-body-only' => true, 
            'drop-empty-paras' => true, 
            'drop-font-tags' => true, 
            'drop-proprietary-attributes' => true, 
            'hide-comments' => true, 
            'logical-emphasis' => true 
        ]); 
        $tidy->cleanRepair(); 
 
        return (string) $content; 
    } 
} 
 
 |