Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

Customising the CMS

Cleaning up the output with HTMLTidy


Reply

2 Posts   1422 Views

Avatar
John Silver

18 September 2009 at 9:14pm Community Member, 10 Posts

I'd like to clean the output of my templates using HTMLTidy.
I tried several approaches but I just can't get it right. With the help of this recipe: http://doc.silverstripe.org/doku.php?id=recipes:syntax-highlighting I managed to clean single pieces of the output, but not the whole document.

My idea would be to take the output from SSViewer::process(), run it through tidy->parseString and return it.
I think I need to overwrite the call for ViewableData::renderWith() (not overwrite the function itself) with my own and insert my extension class to SSViewer there.

Roughly like this:

class SSViewerTidy extends SSViewer {
   public function process($item) {
      $tidy = new tidy;
      $tidy->parseString(parent::process($item));
      return tidy_get_output($tidy);
   }
}

somewhere else:

renderWith(new SSViewerTidy($template))

But I can't find where renderWith() is called when a request is made.
Where is my "somewhere else"?

Any help would be appreciated.

Avatar
John Silver

22 September 2009 at 4:39am Community Member, 10 Posts

Sooo.. I got it to work. It's not pretty, but maybe it will help others.

Created a class SSViewerTidy:

class SSViewerTidy extends SSViewer {
   public function process($item) {
      //return(parent::process($item));
      $config = array   (
       'indent-spaces' => 2,
       'wrap' => 160
      );
      $tidy = new tidy;
      $tidy->parseString(parent::process($item), $config, 'UTF8');
      return tidy_get_output($tidy);
   }
}

And added this to my Page_Controller class:

   function getViewer($action) {
      // Hard-coded templates
      if($this->templates[$action]) {
         $templates = $this->templates[$action];
      }   else if($this->templates['index']) {
         $templates = $this->templates['index'];
      }   else if($this->template) {
         $templates = $this->template;
      } else {
         // Add action-specific templates for inheritance chain
         $parentClass = $this->class;
         if($action && $action != 'index') {
            $parentClass = $this->class;
            while($parentClass != "Controller") {
               $templates[] = strtok($parentClass,'_') . '_' . $action;
               $parentClass = get_parent_class($parentClass);
            }
         }
         // Add controller templates for inheritance chain
         $parentClass = $this->class;
         while($parentClass != "Controller") {
            $templates[] = strtok($parentClass,'_');
            $parentClass = get_parent_class($parentClass);
         }

         // remove duplicates
         $templates = array_unique($templates);
      }
      return new SSViewerTidy($templates);
   }   

The content is completely copied from Cotroller.php (which is extended by Page_controller) - only the last line is altered to use the new SSViewer.
Yeah...ugly. I know.