Posted By

daemondevin on 09/27/19


Tagged

html headers dtd xhtml doctype type xml content media meta accept negotiation


Versions (?)

getDoctype.inc.php


 / Published in: PHP
 

URL: http://portableappz.x10.mx/extras/getDoctype

With this snippet you will have the ability to display the <DOCTYPE> while sending the correct headers with support for content type negotiation.

It also will correct itself for the W3C validator which does not send the correct Accept header for XHTML documents.

Does NOT send XHTML 1.1 to browsers that wont accept application/xhtml+xml because the snippet will make sure the browser groks XML before sending anything. Visit: labs/PHP/DOCTYPE.php#bug-fix for details and a link to the W3C XHTML for more

  1. <?php
  2. /**
  3.  * gaetDoctype
  4.  *
  5.  * Copyright 2016 by demon.devin <[email protected]>
  6.  * Created on 10-07-2016
  7.  *
  8.  * getDoctype is free software; you can redistribute it and/or modify it under the
  9.  * terms of the GNU General Public License as published by the Free Software
  10.  * Foundation; either version 2 of the License, or (at your option) any later
  11.  * version.
  12.  *
  13.  * getDoctype is distributed in the hope that it will be useful, but WITHOUT ANY
  14.  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
  15.  * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License along with
  18.  * getDoctype; if not, write to the Free Software Foundation, Inc., 59 Temple
  19.  * Place, Suite 330, Boston, MA 02111-1307 USA
  20.  *
  21.  * @package getdoctype
  22.  */
  23. /**
  24.  * getDoctype
  25.  *
  26.  * @author daemon.devin
  27.  * @link PortableAppz.x10.mx/
  28.  * @copyright 2016
  29.  * @package getDoctype
  30.  * @version 1.0
  31.  *
  32.  * With this snippet you will have the ability to display the DOCTYPE while sending the
  33.  * correct headers with support for content type negotiation.
  34.  *
  35.  * It also will correct itself for the W3C validator which does not send the correct Accept
  36.  * header for XHTML documents.
  37.  *
  38.  * Does NOT send XHTML 1.1 to browsers that wont accept application/xhtml+xml because the
  39.  * snippet will make sure the browser groks XML before sending anything.
  40.  * visit: labs/PHP/DOCTYPE.php#bug-fix for details and a link to the W3C XHTML for more
  41.  *
  42.  *
  43.  * PROPERTIES
  44.  * $doc string required Defaults: XHTML
  45.  * Either HTML or XHTML
  46.  *
  47.  * $type string optional Defaults: Strict
  48.  * One of three chooses between Strict, Transitional, or Frameset
  49.  *
  50.  * $ver string optional Defaults: 1.1
  51.  * For XHTML: 1.0 or 1.1 | For HTML5: 5
  52.  *
  53.  * $charset string optional
  54.  *
  55.  * $lang string optional
  56.  *
  57.  * $s string optional Defaults: ' '
  58.  * Specify prefered indentation. Either '\t' (tab) or ' ' (whitespace) or any combination
  59.  *
  60.  * USAGE
  61.  * require_once('getDoctype.inc.php');
  62.  *
  63.  * EXAMPLE
  64.  * To specify html5 use the following:
  65.  * $doc='html'
  66.  * $ver='5'
  67.  *
  68.  * Output:
  69.  * <!DOCTYPE html>
  70.  * <html lang="en">
  71.  * <head>
  72.  * <meta charset="UTF-8">
  73.  *
  74.  * To specify XHTML using Strict with version 1.1 use the following:
  75.  * $doc='xhtml'
  76.  * $type='strict'
  77.  * $ver='1.1'
  78.  *
  79.  * NOTE: This sends the XML declaration before the DOCTYPE
  80.  * but this will put IE into quirks mode which we don't
  81.  * want so it omits it for IE
  82.  *
  83.  * Output:
  84.  * <?xml version="1.0" encoding="utf-8"?>
  85.  * <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
  86.  * "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  87.  * <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  88.  *
  89.  */
  90.  
  91. $doc = ''; // html or xhtml
  92. $type = ''; // choose between strict, transitional, or frameset
  93. $ver = ''; // XHTML: 1.0 or 1.1 | HTML: 4.01 or 5
  94. $charset = ''; // Charset (i.e. UTF-8)
  95. $lang = ''; // Language (i.e. en)
  96. $s = ''; // Indentation. Either '\t' (tab) or ' ' (whitespace) or any combination.
  97.  
  98. $output = '';
  99.  
  100. $media = array('HTML' => 'text/html', 'XHTML' => 'application/xhtml+xml');
  101.  
  102. $doc = strtoupper($doc);
  103. $type = strtolower($type);
  104.  
  105. $avail = 'PUBLIC'; // or SYSTEM, but we're not going there yet
  106.  
  107. // begin FPI
  108. $ISO = '-'; // W3C is not ISO registered [or IETF for that matter]
  109. $OID = 'W3C'; // unique owner ID
  110. $PTC = 'DTD'; // the public text class
  111.  
  112. $PTD = '';
  113. $PCL = 'EN'; // as far as I know the PCL is always English
  114. $URI = 'http://www.w3.org/TR/'; // DTDs are all under the Technical Reports (TR) branch @ W3C
  115.  
  116. $doc_top = '<html'; // what comes after the DOCTYPE of course
  117. $meta = '<meta ';
  118.  
  119. if($doc == 'HTML') {
  120.  
  121. if($ver == '5') {
  122.  
  123. $top = 'html';
  124. $media_type = $media['HTML'];
  125. $meta .= 'charset="'.strtoupper($charset).'" />';
  126.  
  127. }
  128. else {
  129.  
  130. $top = $doc;
  131. $media_type = $media[$doc];
  132.  
  133. $PTD = $doc.' 4.01'; // we're only supporting HTML 4.01 here
  134.  
  135. switch ($type) {
  136.  
  137. case 'frameset':
  138.  
  139. $PTD .= ' '.ucfirst($type);
  140. $URI .= 'html4/frameset.dtd';
  141. break;
  142.  
  143. case 'transitional':
  144.  
  145. $PTD .= ' '.ucfirst($type);
  146. $URI .= 'html4/loose.dtd';
  147. break;
  148.  
  149. case 'strict':
  150. default:
  151.  
  152. $URI .= 'html4/strict.dtd';
  153. }
  154. $meta .= "http-equiv=\"Content-Type\" content=\"$media_type; charset=".strtoupper($charset)."\">";
  155. }
  156. $doc_top .= ' lang="'.$lang.'">';
  157.  
  158.  
  159. }
  160. else {
  161.  
  162. // must be xhtml then, but catch typos
  163.  
  164. //if($doc != 'XHTML')
  165. $doc = 'XHTML';
  166.  
  167. $top = 'html'; // remember XML is lowercase
  168. $doc_top .= ' xmlns="http://www.w3.org/1999/xhtml" xml:lang="'.$lang.'"';
  169.  
  170. // return the correct media type header for this document,
  171. // but we should probably make sure the browser groks XML!
  172.  
  173. // the W3C validator does not send the correct Accept header for this family of documents, sigh
  174. if(stristr($_SERVER['HTTP_USER_AGENT'], 'W3C_Validator')) $media_type = $media['XHTML'];
  175. else $media_type = (stristr($_SERVER['HTTP_ACCEPT'], $media['XHTML']))?$media['XHTML']:$media['HTML'];
  176.  
  177. // do NOT send XHTML 1.1 to browsers that don't accept application/xhtml+xml
  178. // see: labs/PHP/DOCTYPE.php#bug-fix for details and a link to the W3C XHTML
  179. // NOTES on this topic
  180.  
  181. if($media_type == $media['HTML'] and $ver == '1.1') $ver = '1.0';
  182.  
  183. if($ver == '1.1') {
  184. $PTD = implode(' ', array($doc, $ver));
  185. $URI .= 'xhtml11/DTD/xhtml11.dtd';
  186. }
  187. else {
  188. $PTD = implode(' ', array(
  189. $doc,
  190. '1.0',
  191. ucfirst($type)));
  192. $URI .= 'xhtml1/DTD/xhtml1-'.$type.'.dtd';
  193.  
  194. // for backwards compatibilty
  195.  
  196. $doc_top .= ' lang="'.$lang.'"';
  197. }
  198.  
  199. $doc_top .= '>'; // close root XHTML tag
  200.  
  201. // send HTTP header
  202. header('Content-type: '.$media_type.'; charset='.$charset);
  203.  
  204. // send the XML declaration before the DOCTYPE, but this
  205. // will put IE into quirks mode which we don't want
  206. if(isset($_SERVER['HTTP_USER_AGENT']) && ((strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') == false) || strpos($_SERVER['HTTP_USER_AGENT'],
  207. 'Trident') == false)) {
  208. $output .= '<?xml version="1.0" encoding="'.$charset.'"?>'.PHP_EOL;
  209. }
  210.  
  211. $meta .= "http-equiv=\"Content-Type\" content=\"$media_type; charset=".strtoupper($charset)."\" />";
  212.  
  213. }
  214.  
  215. $FPI = implode('//', array(
  216. $ISO,
  217. $OID,
  218. $PTC.' '.$PTD,
  219. $PCL));
  220.  
  221. if($doc == 'HTML' && $ver == '5') {
  222. $output .= '<!DOCTYPE '.$top.'>'.PHP_EOL;
  223. $output .= $doc_top.PHP_EOL;
  224. $output .= "$s<head>".PHP_EOL;
  225. $output .= "$s$s$meta".PHP_EOL;
  226. }
  227. else {
  228. $output .= "<!DOCTYPE $top $avail \"$FPI\" ".PHP_EOL."$s\"$URI\">".PHP_EOL."$doc_top".PHP_EOL."$s<head>".PHP_EOL."$s$s".
  229. $meta.PHP_EOL;
  230. }
  231. return $output;

Report this snippet  

You need to login to post a comment.