<?php

require_once $_SERVER['DOCUMENT_ROOT'] . '/rap/developers-guide/DevGuideUtils.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/rap/_lib/urlnormalizer/URLNormalizer.php';

class ContentView {

  private static $htmlFile;
  private static $path;
  private static $paths;
  private static $version;

  private function __construct() {}

  public static function create( $htmlFilePath, $version ) {
    self::$path = substr( $htmlFilePath, 0, strpos( $htmlFilePath, "/" ) );
    if( self::$path == '' ) {
      self::$path = '.';
    }
    self::$version = $version;
    self::$paths = DevGuideUtils::$versions[ self::$version ];
    self::$htmlFile = new SplFileObject( self::$paths[ 'rootUrl' ] . self::$paths[ 'topicPath' ] . $htmlFilePath );
    return self::processHtmlFileContent();
  }

  private static function processHtmlFileContent() {
    $result = '';
    $htmlDocument = new DOMDocument();
    $htmlDocument -> loadHTMLFile( self::$htmlFile -> getPathname() );
    self::rewriteLinkUrls( $htmlDocument );
    self::rewriteImageUrls( $htmlDocument );
    $bodyChildNodes = $htmlDocument -> getElementsByTagName( 'body' ) -> item( 0 ) -> childNodes;
    for( $i = 0; $i < $bodyChildNodes -> length; $i++ ) {
      $result .= $htmlDocument -> saveXML( $bodyChildNodes -> item( $i ), LIBXML_NOEMPTYTAG );
    }
    return $result;
  }

  private static function rewriteLinkUrls( $htmlDocument ) {
    $links = $htmlDocument -> getElementsByTagName( 'a' );
    foreach( $links as $link ) {
      if( $link -> hasAttribute( 'href' ) ) {
        $url = $link -> getAttribute( 'href' );
        if( !containsString( $url, 'http://' ) && !self::isBookmark( $url ) ) {
          $link -> setAttribute( 'href', self::rewriteLinkUrl( $url ) );
        }
      }
    }
  }

  private static function isBookmark( $url ) {
    return preg_match( '|^#.*|', $url ) === 1 ? true : false;
  }

  private static function rewriteLinkUrl( $url ) {
    $result = '';
    $split = explode( "#", $url );
    $path = $split[ 0 ];
    if( self::startsWith( $path, '/help' ) ) {
      $result = str_replace( '/help', 'http://help.eclipse.org', $path );
    } else if( self::startsWith( $path, '../reference' ) ) {
      $result = self::$paths[ 'apiUrl' ] .  substr ( $path, 13 );
    } else if( containsString( $path, '.html' ) ) {
      $normalizedUrl = self::normalizeUrl( '/' . self::$path . '/' . $path );
      $result = '?topic=' . trim( $normalizedUrl, "/" ) . '&version=' . self::$version;
    } else {
      $result = $path;
    }
    if( count( $split ) > 1 ) {
      $result .= '#' . $split[ 1 ];
    }
    return $result;
  }

  private static function rewriteImageUrls( $htmlDocument ) {
    $images = $htmlDocument -> getElementsByTagName( 'img' );
    foreach( $images as $image ) {
      $url = $image -> getAttribute( 'src' );
      if( !containsString( $url, 'http://' ) ) {
        $image -> setAttribute( 'src', self::$paths[ 'rootUrl' ] . self::$paths[ 'topicPath' ] . self::$path . '/' . $url );
      }
    }
  }

  private static function normalizeUrl( $url ) {
    $normalizer = new URLNormalizer( $url );
    return $normalizer -> normalize();
  }

  private static function startsWith( $haystack, $needle ) {
    return !strncmp( $haystack, $needle, strlen( $needle ) );
  }

}

?>
