]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/htmloutputter.php
[XML/HTML Outputter] General improvements and refactoring as well as some bug fixes
[quix0rs-gnu-social.git] / lib / htmloutputter.php
index 5e400379529b1c72e5b8c0631528d9ae78e3c3de..c0c7485c77cab382e5beeed2f70ae3dfc7c91750 100644 (file)
@@ -28,7 +28,9 @@
  * @link      http://status.net/
  */
 
-if (!defined('GNUSOCIAL')) { exit(1); }
+if (!defined('GNUSOCIAL')) {
+    exit(1);
+}
 
 // Can include XHTML options but these are too fragile in practice.
 define('PAGE_TYPE_PREFS', 'text/html');
@@ -51,22 +53,22 @@ define('PAGE_TYPE_PREFS', 'text/html');
  * @see      Action
  * @see      XMLOutputter
  */
-
 class HTMLOutputter extends XMLOutputter
 {
-    protected $DTD = array('doctype' => 'html',
-                           'spec'    => '-//W3C//DTD XHTML 1.0 Strict//EN',
-                           'uri'     => 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd');
+    protected $DTD = ['doctype' => 'html',
+        'spec' => '-//W3C//DTD XHTML 1.0 Strict//EN',
+        'uri' => 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'];
+
     /**
      * Constructor
      *
      * Just wraps the XMLOutputter constructor.
      *
-     * @param string  $output URI to output to, default = stdout
+     * @param string $output URI to output to, default = stdout
      * @param boolean $indent Whether to indent output, default true
      */
 
-    function __construct($output='php://output', $indent=null)
+    public function __construct($output = 'php://output', $indent = null)
     {
         parent::__construct($output, $indent);
     }
@@ -80,16 +82,17 @@ class HTMLOutputter extends XMLOutputter
      *
      * @param string $type MIME type to use; default is to do negotation.
      *
+     * @return void
+     * @throws ClientException
      * @todo extract content negotiation code to an HTTP module or class.
      *
-     * @return void
      */
 
-    function startHTML($type=null)
+    public function startHTML($type = null)
     {
         if (!$type) {
             $httpaccept = isset($_SERVER['HTTP_ACCEPT']) ?
-              $_SERVER['HTTP_ACCEPT'] : null;
+                $_SERVER['HTTP_ACCEPT'] : null;
 
             // XXX: allow content negotiation for RDF, RSS, or XRDS
 
@@ -100,16 +103,16 @@ class HTMLOutputter extends XMLOutputter
 
             if (!$type) {
                 // TRANS: Client exception 406
-                throw new ClientException(_('This page is not available in a '.
-                                            'media type you accept'), 406);
+                throw new ClientException(_('This page is not available in a ' .
+                    'media type you accept'), 406);
             }
         }
 
-        header('Content-Type: '.$type);
+        header('Content-Type: ' . $type);
 
-       // Output anti-framing headers to prevent clickjacking (respected by newer
+        // Output anti-framing headers to prevent clickjacking (respected by newer
         // browsers).
-       if (common_config('javascript', 'bustframes')) {
+        if (common_config('javascript', 'bustframes')) {
             header('X-XSS-Protection: 1; mode=block'); // detect XSS Reflection attacks
             header('X-Frame-Options: SAMEORIGIN'); // no rendering if origin mismatch
         }
@@ -124,55 +127,57 @@ class HTMLOutputter extends XMLOutputter
 
         $language = $this->getLanguage();
 
-        $attrs = array(
+        $attrs = [
             'xmlns' => 'http://www.w3.org/1999/xhtml',
             'xml:lang' => $language,
             'lang' => $language
-        );
+        ];
 
-        if (Event::handle('StartHtmlElement', array($this, &$attrs))) {
+        if (Event::handle('StartHtmlElement', [$this, &$attrs])) {
             $this->elementStart('html', $attrs);
-            Event::handle('EndHtmlElement', array($this, &$attrs));
+            Event::handle('EndHtmlElement', [$this, &$attrs]);
         }
     }
 
-    public function setDTD($doctype, $spec, $uri)
+    /**
+     *  To specify additional HTTP headers for the action
+     *
+     * @return void
+     */
+    public function extraHeaders()
     {
-        $this->DTD = array('doctype' => $doctype, 'spec' => $spec, 'uri' => $uri);
+        // Needs to be overloaded
     }
 
     protected function writeDTD()
     {
-        $this->xw->writeDTD($this->DTD['doctype'],
-                            $this->DTD['spec'],
-                            $this->DTD['uri']);
+        $this->xw->writeDTD(
+            $this->DTD['doctype'],
+            $this->DTD['spec'],
+            $this->DTD['uri']
+        );
     }
 
-    function getLanguage()
+    public function getLanguage()
     {
         // FIXME: correct language for interface
         return common_language();
     }
 
-    /**
-    *  Ends an HTML document
-    *
-    *  @return void
-    */
-    function endHTML()
+    public function setDTD($doctype, $spec, $uri)
     {
-        $this->elementEnd('html');
-        $this->endXML();
+        $this->DTD = ['doctype' => $doctype, 'spec' => $spec, 'uri' => $uri];
     }
 
     /**
-    *  To specify additional HTTP headers for the action
-    *
-     @return void
-    */
-    function extraHeaders()
+     *  Ends an HTML document
+     *
+     * @return void
+     */
+    public function endHTML()
     {
-        // Needs to be overloaded
+        $this->elementEnd('html');
+        $this->endXML();
     }
 
     /**
@@ -185,24 +190,23 @@ class HTMLOutputter extends XMLOutputter
      *
      * If $attrs['type'] does not exist it will be set to 'text'.
      *
-     * @param string $id           element ID, must be unique on page
-     * @param string $label        text of label for the element
-     * @param string $value        value of the element, default null
+     * @param string $id element ID, must be unique on page
+     * @param string $label text of label for the element
+     * @param string $value value of the element, default null
      * @param string $instructions instructions for valid input
-     * @param string $name         name of the element; if null, the id will
-     *                             be used
-     * @param bool   $required     HTML5 required attribute (exclude when false)
-     * @param array  $attrs        Initial attributes manually set in an array (overwritten by previous options)
+     * @param string $name name of the element; if null, the id will be used
+     * @param bool   $required HTML5 required attribute (exclude when false)
+     * @param array  $attrs Initial attributes manually set in an array (overwritten by previous options)
      *
+     * @return void
      * @todo add a $maxLength parameter
      * @todo add a $size parameter
      *
-     * @return void
      */
 
-    function input($id, $label, $value=null, $instructions=null, $name=null, $required=false, array $attrs=array())
+    public function input($id, $label, $value = null, $instructions = null, $name = null, $required = false, array $attrs = [])
     {
-        $this->element('label', array('for' => $id), $label);
+        $this->element('label', ['for' => $id], $label);
         if (!array_key_exists('type', $attrs)) {
             $attrs['type'] = 'text';
         }
@@ -234,25 +238,31 @@ class HTMLOutputter extends XMLOutputter
      * Note that the value is default 'true' (the string), which can
      * be used by Action::boolean()
      *
-     * @param string $id           element ID, must be unique on page
-     * @param string $label        text of label for the element
-     * @param string $checked      if the box is checked, default false
+     * @param string $id element ID, must be unique on page
+     * @param string $label text of label for the element
+     * @param bool   $checked if the box is checked, default false
      * @param string $instructions instructions for valid input
-     * @param string $value        value of the checkbox, default 'true'
-     * @param string $disabled     show the checkbox disabled, default false
+     * @param string $value value of the checkbox, default 'true'
+     * @param bool   $disabled show the checkbox disabled, default false
      *
      * @return void
      *
      * @todo add a $name parameter
      */
 
-    function checkbox($id, $label, $checked=false, $instructions=null,
-                      $value='true', $disabled=false)
+    public function checkbox(
+        $id,
+        $label,
+        $checked = false,
+        $instructions = null,
+        $value = 'true',
+        $disabled = false
+    )
     {
-        $attrs = array('name' => $id,
-                       'type' => 'checkbox',
-                       'class' => 'checkbox',
-                       'id' => $id);
+        $attrs = ['name' => $id,
+            'type' => 'checkbox',
+            'class' => 'checkbox',
+            'id' => $id];
         if ($value) {
             $attrs['value'] = $value;
         }
@@ -264,9 +274,12 @@ class HTMLOutputter extends XMLOutputter
         }
         $this->element('input', $attrs);
         $this->text(' ');
-        $this->element('label', array('class' => 'checkbox',
-                                      'for' => $id),
-                       $label);
+        $this->element(
+            'label',
+            ['class' => 'checkbox',
+                'for' => $id],
+            $label
+        );
         $this->text(' ');
         if ($instructions) {
             $this->element('p', 'form_guide', $instructions);
@@ -280,33 +293,42 @@ class HTMLOutputter extends XMLOutputter
      * the key is the option value attribute and the value is the option
      * text. (Careful on the overuse of 'value' here.)
      *
-     * @param string $id           element ID, must be unique on page
-     * @param string $label        text of label for the element
-     * @param array  $content      options array, value => text
+     * @param string $id element ID, must be unique on page
+     * @param string $label text of label for the element
+     * @param array $content options array, value => text
      * @param string $instructions instructions for valid input
-     * @param string $blank_select whether to have a blank entry, default false
-     * @param string $selected     selected value, default null
+     * @param bool $blank_select whether to have a blank entry, default false
+     * @param string $selected selected value, default null
      *
      * @return void
      *
      * @todo add a $name parameter
      */
 
-    function dropdown($id, $label, $content, $instructions=null,
-                      $blank_select=false, $selected=null)
+    public function dropdown(
+        $id,
+        $label,
+        $content,
+        $instructions = null,
+        $blank_select = false,
+        $selected = null
+    )
     {
-        $this->element('label', array('for' => $id), $label);
-        $this->elementStart('select', array('id' => $id, 'name' => $id));
+        $this->element('label', ['for' => $id], $label);
+        $this->elementStart('select', ['id' => $id, 'name' => $id]);
         if ($blank_select) {
-            $this->element('option', array('value' => ''));
+            $this->element('option', ['value' => '']);
         }
         foreach ($content as $value => $option) {
             if ($value == $selected) {
-                $this->element('option', array('value' => $value,
-                                               'selected' => 'selected'),
-                               $option);
+                $this->element(
+                    'option',
+                    ['value' => $value,
+                        'selected' => 'selected'],
+                    $option
+                );
             } else {
-                $this->element('option', array('value' => $value), $option);
+                $this->element('option', ['value' => $value], $option);
             }
         }
         $this->elementEnd('select');
@@ -320,26 +342,26 @@ class HTMLOutputter extends XMLOutputter
      *
      * $id is re-used as name
      *
-     * @param string $id    element ID, must be unique on page
+     * @param string $id element ID, must be unique on page
      * @param string $value hidden element value, default null
-     * @param string $name  name, if different than ID
+     * @param string $name name, if different than ID
      *
      * @return void
      */
 
-    function hidden($id, $value, $name=null)
+    public function hidden($id, $value, $name = null)
     {
-        $this->element('input', array('name' => $name ?: $id,
-                                      'type' => 'hidden',
-                                      'id' => $id,
-                                      'value' => $value));
+        $this->element('input', ['name' => $name ?: $id,
+            'type' => 'hidden',
+            'id' => $id,
+            'value' => $value]);
     }
 
     /**
      * output an HTML password input and associated elements
      *
-     * @param string $id           element ID, must be unique on page
-     * @param string $label        text of label for the element
+     * @param string $id element ID, must be unique on page
+     * @param string $label text of label for the element
      * @param string $instructions instructions for valid input
      *
      * @return void
@@ -347,13 +369,13 @@ class HTMLOutputter extends XMLOutputter
      * @todo add a $name parameter
      */
 
-    function password($id, $label, $instructions=null)
+    public function password($id, $label, $instructions = null)
     {
-        $this->element('label', array('for' => $id), $label);
-        $attrs = array('name' => $id,
-                       'type' => 'password',
-                       'class' => 'password',
-                       'id' => $id);
+        $this->element('label', ['for' => $id], $label);
+        $attrs = ['name' => $id,
+            'type' => 'password',
+            'class' => 'password',
+            'id' => $id];
         $this->element('input', $attrs);
         if ($instructions) {
             $this->element('p', 'form_guide', $instructions);
@@ -363,39 +385,38 @@ class HTMLOutputter extends XMLOutputter
     /**
      * output an HTML submit input and associated elements
      *
-     * @param string $id    element ID, must be unique on page
+     * @param string $id element ID, must be unique on page
      * @param string $label text of the button
-     * @param string $cls   class of the button, default 'submit'
-     * @param string $name  name, if different than ID
-     * @param string $title  title text for the submit button
+     * @param string $cls class of the button, default 'submit'
+     * @param string $name name, if different than ID
+     * @param string $title title text for the submit button
      *
      * @return void
      *
      * @todo add a $name parameter
      */
 
-    function submit($id, $label, $cls='submit', $name=null, $title=null)
+    public function submit($id, $label, $cls = 'submit', $name = null, $title = null)
     {
-        $this->element('input', array('type' => 'submit',
-                                      'id' => $id,
-                                      'name'  => $name ?: $id,
-                                      'class' => $cls,
-                                      'value' => $label,
-                                      'title' => $title));
+        $this->element('input', ['type' => 'submit',
+            'id' => $id,
+            'name' => $name ?: $id,
+            'class' => $cls,
+            'value' => $label,
+            'title' => $title]);
     }
 
     /**
      * output a script (almost always javascript) tag
      *
-     * @param string $src          relative or absolute script path
-     * @param string $type         'type' attribute value of the tag
+     * @param string $src relative or absolute script path
+     * @param string $type 'type' attribute value of the tag
      *
      * @return void
      */
-    function script($src, $type='text/javascript')
+    public function script($src, $type = 'text/javascript')
     {
-        if (Event::handle('StartScriptElement', array($this,&$src,&$type))) {
-
+        if (Event::handle('StartScriptElement', [$this, &$src, &$type])) {
             $url = parse_url($src);
 
             if (empty($url['scheme']) && empty($url['host']) && empty($url['query']) && empty($url['fragment'])) {
@@ -403,35 +424,28 @@ class HTMLOutputter extends XMLOutputter
                 // XXX: this seems like a big assumption
 
                 if (strpos($src, 'plugins/') === 0 || strpos($src, 'local/') === 0) {
-
                     $src = common_path($src, GNUsocial::isHTTPS()) . '?version=' . GNUSOCIAL_VERSION;
-
                 } else {
-
                     if (GNUsocial::isHTTPS()) {
+                        $server = common_config('javascript', 'sslserver');
 
-                        $sslserver = common_config('javascript', 'sslserver');
-
-                        if (empty($sslserver)) {
+                        if (empty($server)) {
                             if (is_string(common_config('site', 'sslserver')) &&
                                 mb_strlen(common_config('site', 'sslserver')) > 0) {
                                 $server = common_config('site', 'sslserver');
-                            } else if (common_config('site', 'server')) {
+                            } elseif (common_config('site', 'server')) {
                                 $server = common_config('site', 'server');
                             }
-                            $path   = common_config('site', 'path') . '/js/';
+                            $path = common_config('site', 'path') . '/js/';
                         } else {
-                            $server = $sslserver;
-                            $path   = common_config('javascript', 'sslpath');
+                            $path = common_config('javascript', 'sslpath');
                             if (empty($path)) {
                                 $path = common_config('javascript', 'path');
                             }
                         }
 
                         $protocol = 'https';
-
                     } else {
-
                         $path = common_config('javascript', 'path');
 
                         if (empty($path)) {
@@ -447,79 +461,55 @@ class HTMLOutputter extends XMLOutputter
                         $protocol = 'http';
                     }
 
-                    if ($path[strlen($path)-1] != '/') {
+                    if ($path[strlen($path) - 1] != '/') {
                         $path .= '/';
                     }
 
                     if ($path[0] != '/') {
-                        $path = '/'.$path;
+                        $path = '/' . $path;
                     }
 
-                    $src = $protocol.'://'.$server.$path.$src . '?version=' . GNUSOCIAL_VERSION;
+                    $src = $protocol . '://' . $server . $path . $src . '?version=' . GNUSOCIAL_VERSION;
                 }
             }
 
-            $this->element('script', array('type' => $type,
-                                           'src' => $src),
-                           ' ');
+            $this->element(
+                'script',
+                ['type' => $type,
+                    'src' => $src],
+                ' '
+            );
 
-            Event::handle('EndScriptElement', array($this,$src,$type));
-        }
-    }
-
-    /**
-     * output a script (almost always javascript) tag with inline
-     * code.
-     *
-     * @param string $code         code to put in the script tag
-     * @param string $type         'type' attribute value of the tag
-     *
-     * @return void
-     */
-
-    function inlineScript($code, $type='text/javascript')
-    {
-        if(Event::handle('StartInlineScriptElement', array($this,&$code,&$type))) {
-            $this->elementStart('script', array('type' => $type));
-            if($type == 'text/javascript') {
-                $this->raw('/*<![CDATA[*/ '); // XHTML compat
-            }
-            $this->raw($code);
-            if($type == 'text/javascript') {
-                $this->raw(' /*]]>*/'); // XHTML compat
-            }
-            $this->elementEnd('script');
-            Event::handle('EndInlineScriptElement', array($this,$code,$type));
+            Event::handle('EndScriptElement', [$this, $src, $type]);
         }
     }
 
     /**
      * output a css link
      *
-     * @param string $src     relative path within the theme directory, or an absolute path
-     * @param string $theme        'theme' that contains the stylesheet
+     * @param string $src relative path within the theme directory, or an absolute path
+     * @param string $theme 'theme' that contains the stylesheet
      * @param string media         'media' attribute of the tag
      *
      * @return void
      */
-    function cssLink($src,$theme=null,$media=null)
+    public function cssLink($src, $theme = null, $media = null)
     {
-        if(Event::handle('StartCssLinkElement', array($this,&$src,&$theme,&$media))) {
+        if (Event::handle('StartCssLinkElement', [$this, &$src, &$theme, &$media])) {
             $url = parse_url($src);
-            if( empty($url['scheme']) && empty($url['host']) && empty($url['query']) && empty($url['fragment']))
-            {
-                if(file_exists(Theme::file($src,$theme))){
-                   $src = Theme::path($src, $theme);
-                }else{
+            if (empty($url['scheme']) && empty($url['host']) && empty($url['query']) && empty($url['fragment'])) {
+                if (file_exists(Theme::file($src, $theme))) {
+                    $src = Theme::path($src, $theme);
+                } else {
                     $src = common_path($src, GNUsocial::isHTTPS());
                 }
-                $src.= '?version=' . GNUSOCIAL_VERSION;
+                $src .= '?version=' . GNUSOCIAL_VERSION;
             }
-            $this->element('link', array('rel' => 'stylesheet',
-                                    'type' => 'text/css',
-                                    'href' => $src,
-                                    'media' => $media));
-            Event::handle('EndCssLinkElement', array($this,$src,$theme,$media));
+            $this->element('link', ['rel' => 'stylesheet',
+                'type' => 'text/css',
+                'href' => $src,
+                'media' => $media]);
+            Event::handle('EndCssLinkElement', [$this, $src, $theme, $media]);
         }
     }
 
@@ -527,87 +517,119 @@ class HTMLOutputter extends XMLOutputter
      * output a style (almost always css) tag with inline
      * code.
      *
-     * @param string $code         code to put in the style tag
-     * @param string $type         'type' attribute value of the tag
-     * @param string $media        'media' attribute value of the tag
+     * @param string $code code to put in the style tag
+     * @param string $type 'type' attribute value of the tag
+     * @param string $media 'media' attribute value of the tag
      *
      * @return void
      */
 
-    function style($code, $type = 'text/css', $media = null)
+    public function style($code, $type = 'text/css', $media = null)
     {
-        if(Event::handle('StartStyleElement', array($this,&$code,&$type,&$media))) {
-            $this->elementStart('style', array('type' => $type, 'media' => $media));
+        if (Event::handle('StartStyleElement', [$this, &$code, &$type, &$media])) {
+            $this->elementStart('style', ['type' => $type, 'media' => $media]);
             $this->raw($code);
             $this->elementEnd('style');
-            Event::handle('EndStyleElement', array($this,$code,$type,$media));
+            Event::handle('EndStyleElement', [$this, $code, $type, $media]);
         }
     }
 
     /**
      * output an HTML textarea and associated elements
      *
-     * @param string $id           element ID, must be unique on page
-     * @param string $label        text of label for the element
-     * @param string $content      content of the textarea, default none
+     * @param string $id element ID, must be unique on page
+     * @param string $label text of label for the element
+     * @param string $content content of the textarea, default none
      * @param string $instructions instructions for valid input
-     * @param string $name         name of textarea; if null, $id will be used
-     * @param int    $cols         number of columns
-     * @param int    $rows         number of rows
-     * @param bool   $required     HTML5 required attribute (exclude when false)
+     * @param string $name name of textarea; if null, $id will be used
+     * @param int $cols number of columns
+     * @param int $rows number of rows
+     * @param bool $required HTML5 required attribute (exclude when false)
      *
      * @return void
      */
 
-    function textarea(
+    public function textarea(
         $id,
         $label,
-        $content      = null,
+        $content = null,
         $instructions = null,
-        $name         = null,
-        $cols         = null,
-        $rows         = null,
-        $required     = false
-    ) {
-        $this->element('label', array('for' => $id), $label);
-        $attrs = array(
+        $name = null,
+        $cols = null,
+        $rows = null,
+        $required = false
+    )
+    {
+        $this->element('label', ['for' => $id], $label);
+        $attrs = [
             'rows' => 3,
             'cols' => 40,
             'id' => $id
-        );
+        ];
         $attrs['name'] = is_null($name) ? $id : $name;
 
         if ($cols != null) {
             $attrs['cols'] = $cols;
-
         }
         if ($rows != null) {
             $attrs['rows'] = $rows;
         }
+
+        if (!empty($required)) {
+            $attrs['required'] = 'required';
+        }
+
         $this->element(
             'textarea',
             $attrs,
-            is_null($content) ? '' : $content
+            $content
         );
         if ($instructions) {
             $this->element('p', 'form_guide', $instructions);
         }
     }
 
-   /**
-    * Internal script to autofocus the given element on page onload.
-    *
-    * @param string $id element ID, must refer to an existing element
-    *
-    * @return void
-    *
-    */
-    function autofocus($id)
+    /**
+     * Internal script to autofocus the given element on page onload.
+     *
+     * @param string $id element ID, must refer to an existing element
+     *
+     * @return void
+     *
+     */
+    public function autofocus($id)
     {
         $this->inlineScript(
-                   ' $(document).ready(function() {'.
-                   ' var el = $("#' . $id . '");'.
-                   ' if (el.length) { el.focus(); }'.
-                   ' });');
+            ' $(document).ready(function() {' .
+            ' var el = $("#' . $id . '");' .
+            ' if (el.length) { el.focus(); }' .
+            ' });'
+        );
+    }
+
+    /**
+     * output a script (almost always javascript) tag with inline
+     * code.
+     *
+     * @param string $code code to put in the script tag
+     * @param string $type 'type' attribute value of the tag
+     *
+     * @return void
+     */
+
+    public function inlineScript($code, $type = 'text/javascript')
+    {
+        if (Event::handle('StartInlineScriptElement', [$this, &$code, &$type])) {
+            $this->elementStart('script', ['type' => $type]);
+            if ($type == 'text/javascript') {
+                $this->raw('/*<![CDATA[*/ '); // XHTML compat
+            }
+            $this->raw($code);
+            if ($type == 'text/javascript') {
+                $this->raw(' /*]]>*/'); // XHTML compat
+            }
+            $this->elementEnd('script');
+            Event::handle('EndInlineScriptElement', [$this, $code, $type]);
+        }
     }
 }