<?php
/*******************************************************************************
 * Copyright (c) 2011 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Wayne Beaton (Eclipse Foundation)- initial API and implementation
 *******************************************************************************/

function getRandomEdpFaqHtml() {
	return getRandomEdpFaq()->toHtml();
}

function parseEdpPreamble($line, &$entries) {
	if (preg_match('/^=/', $line)) return 'parseEdpContent';
	return 'parseEdpPreamble';
}

function parseEdpContent($line, &$entries) {
	if (trim($line)) $entries[] = $line;
	return 'parseEdpContent';
}

function getrandomEdpFaq() {
	$all = split("\n", file_get_contents("http://wiki.eclipse.org/index.php?title=EDP%20Wisdom&action=raw"));
	
	$entries = array();
	$parse = 'parseEdpPreamble';
	foreach ($all as $line) {
		$parse = $parse($line, $entries); 
	}
	
	return new FAQ($entries[array_rand($entries)]);
}

class FAQ {
	var $text;
	
	function __construct($text) {
		$this->text = $text;
	}
		
	function toHtml() {
		$content = $this->getContent();
		
		return "<div>$content</div>";
	}
		
	/**
	* @internal
	* @return string
	*/
	function getRawContent() {
		return $this->text;
	}
	
	function getContent() {
		$content = $this->getRawContent();
		
		// Double \n is replaced with paragraph tags.
		$content = preg_replace('/(\n+)(\n|$)/', '<p>$1</p>', $content);
		
		$content = preg_replace('/\[\[Category:([^\]]+)\]\]/', '', $content);
		
		// Fix image tags
		$content = preg_replace_callback('/\[\[Image:([^\]]+)\]\]/', 'fixMediaWikiImageUrl', $content);
	
		// Fix link tags
		$content = preg_replace('/\[\[\s*([^\|]+)\s*\|\s*([^\]]+)\]\]/', '<a href="http://wiki.eclipse.org/$1" target=\"_blank\">$2</a>', $content);
		$content = preg_replace('/\[\[([^\]\|]+)\]\]/', '<a href="http://wiki.eclipse.org/$1" target=\"_blank\">$1</a>', $content);
		$content = preg_replace('/\[(https?:\/\/[^\s\]]+)\]/', '<a href="$1" target=\"_blank\">$1</a>', $content);
		$content = preg_replace('/\[(https?:\/\/[^\s\]]+)\s+([^\]]+)\]/', '<a href="$1" target=\"_blank\">$2</a>', $content);
		
		// Get rid of everything else
		$content = preg_replace('/\[\[[^\]]*\]\]/', '', $content);
		
		return trim($content);
	}
}

function fixMediaWikiImageUrl($matches) {
	$name = ucfirst($matches[1]);
	$md5 = md5($name);
	$part1 = substr($md5, 0, 1);
	$part2 = substr($md5, 0, 2);
	return "<img src=\"http://wiki.eclipse.org/images/$part1/$part2/$name\"/>";
}
?>