Per Jessen wrote:
Michael A. Peters wrote:

[anip]
and you can use DOMDocument to completely
construct the page before sending it to the browser - allowing you to
translate xhtml to html for browsers that don't properly support
xhtml+xml.

I suspect you meant "translate xml to html"?  I publish everything in
xhtml, no browser has had a problem with that yet.



IE 6 does not accept the xml+html mime type. I don't believe IE7 does either, I think IE 8 beta does but I'm not sure.

If you are sending xhtml with an html mime type you are breaking a standard, even if it seems to work. xhtml is suppose to be sent with the xml+xhtml mime type.

by translating from xhtml to html 4.01 you can send the text/html mime type to browsers that don't report they accept applicatoiion/xml+xhtml and send them standards compliant html.

By using DOMDocument it is really easy to do.

Standards compliance is important, and it isn't hard to achieve.

The following is the filter I use for browsers that don't accept xml+html:

function HTMLify($buffer) {
/* based on http://www.kilroyjames.co.uk/2008/09/xhtml-to-html-wordpress-plugin */
   $xhtml[] = '/<script([^<]*)\/>/';
   $html[]  = '<script\\1></script>';

   $xhtml[] = '/<div([^<]*)\/>/';
   $html[]  = '<div\\1></div>';

   $xhtml[] = '/<a([^<]*)\/>/';
   $html[]  = '<a\\1></a>';

   $xhtml[] = '/\/>/';
   $html[]  = '>';

   return preg_replace($xhtml, $html, $buffer);
   }

That's only part of the work, but it is the most important part.
Note that that doesn't translate all valid xhtml - it doesn't for example take into account legal whitespace that DOMDocument doesn't produce. If you want more robust translator, use an xslt filter, but this function is simple and doesn't require the various xslt parameters and libraries at php compile time.

When I create a new DOMDocument class instance -

$myxhtml = new DOMDocument("1.0","UTF-8");
$myxhtml->preserveWhiteSpace = false;
$myxhtml->formatOutput = true;
$xmlHtml = $myxhtml->createElement("html");
if ($usexml == 1) {
   $xmlHtml->setAttribute("xmlns","http://www.w3.org/1999/xhtml";);
   $xmlHtml->setAttribute("xml:lang","en");
   }

when the document is created - instead of printing the output I save it as a variable and then add the proper DTD:

function sendpage($page,$usexml) {
$xhtmldtd="\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\";>\n"; $htmldtd="<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\";>";

   if ($usexml == 0) {
$bar=preg_replace('/<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>/',$htmldtd,$page,1);
      $bar = HTMLify($bar);
      } else {
      $bar=preg_replace('/\n/',$xhtmldtd,$page,1);
      }
   sendxhtmlheader($usexml);
   print($bar);
   }

I add the DTD there with preg_replace because I haven't yet found a DOMDocument way to add it, which is how it should be done - someone told me the DTD is currently read only in DOMDocument and that in the future, I'll be able to add it when a new DOMDocument class is created, so for now, the preg_replace hack works, and I might keep it that for some time.

To determine whether or not to send xhtml - when the page is requested (before any of that other code is executed) the following code is run:

if (! isset($usexml)) {
   $usexml=1;
   }
if ($usexml == 1) {
   if (isset( $_SERVER['HTTP_ACCEPT'] )) {
      if(! strpos( $_SERVER['HTTP_ACCEPT'], "application/xhtml+xml" ) ) {
         $usexml=0;
         }
      } else {
      $usexml=0;
      }
   }

The sendxhtmlheader function:

function sendxhtmlheader($usexml) {
   if ($usexml == 1) {
      header("Content-Type: application/xhtml+xml; charset=utf-8");
      } else {
      header("Content-type: text/html; charset=utf-8");
      }
   }

Anyway - all that is in a file I call "xhtml.inc" that I include in all my pages, then to build the document, I use the $myxhtml object that include creates. To send the document to the browser -

$foo=$myxhtml->saveXML();
sendpage($foo,$usexml);

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to