+    // Handle warnings and errors when loading invalid HTML.
+    $xml_errors_value = libxml_use_internal_errors(TRUE);
+
+    // If there is a host-specific method to get the XML data, use it!
+    $get_xml_host_method = 'getXml' . Tweeper::toUpperCamelCase($host, '.');
+    if (method_exists($this, $get_xml_host_method)) {
+      $xml_data = call_user_func_array(array($this, $get_xml_host_method), array($html));
+      $xmlDoc->loadXML($xml_data);
+    }
+    else {
+      $xmlDoc->loadHTML($html);
+    }
+
+    foreach (libxml_get_errors() as $xml_error) {
+      Tweeper::logXmlError($xml_error);
+    }
+    libxml_clear_errors();
+    libxml_use_internal_errors($xml_errors_value);
+
+    return $xmlDoc;
+  }
+
+  /**
+   * Load a stylesheet if the web site is supported.
+   */
+  private function loadStylesheet($host) {
+    $stylesheet = "file://" . __DIR__ . "/rss_converter_" . $host . ".xsl";
+    if (FALSE === file_exists($stylesheet)) {
+      trigger_error("Conversion to RSS not supported for $host ($stylesheet not found)", E_USER_ERROR);
+      return NULL;
+    }
+
+    $stylesheet_contents = Tweeper::getUrlContents($stylesheet);
+
+    $xslDoc = new DOMDocument();
+    $xslDoc->loadXML($stylesheet_contents);
+
+    $xsltProcessor = new XSLTProcessor();
+    $xsltProcessor->registerPHPFunctions();
+    $xsltProcessor->setParameter('', 'generate-enclosure', $this->generate_enclosure);
+    $xsltProcessor->importStylesheet($xslDoc);
+
+    return $xsltProcessor;
+  }
+
+  /**
+   * Convert the site content to RSS.
+   */
+  public function tweep($src_url) {
+    $url = parse_url($src_url);
+    if (FALSE === $url || empty($url["host"])) {
+      trigger_error("Invalid URL: $src_url", E_USER_ERROR);
+      return NULL;
+    }
+
+    // Strip the leading www. to be more forgiving on input URLs.
+    $host = preg_replace('/^www\./', '', $url["host"]);
+
+    $xsltProcessor = $this->loadStylesheet($host);
+    if (NULL === $xsltProcessor) {
+      return NULL;
+    }
+
+    $html = Tweeper::getUrlContents($src_url);
+    if (FALSE === $html) {
+      return NULL;
+    }
+
+    $preprocess_html_host_method = 'preprocessHtml' . Tweeper::toUpperCamelCase($host, '.');
+    if (method_exists($this, $preprocess_html_host_method)) {
+      $html = call_user_func_array(array($this, $preprocess_html_host_method), array($html));
+    }
+
+    $xmlDoc = $this->htmlToXml($html, $host);
+    if (NULL === $xmlDoc) {
+      return NULL;
+    }
+
+    $output = $xsltProcessor->transformToXML($xmlDoc);