summaryrefslogtreecommitdiff
path: root/forum/utils/parser.php
blob: 58647532a4ad7558a92c5db884a00432a498a701 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?php /* -*- Mode: php; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
include_once($UTIL_DIR . "/convert.php");
include_once($UTIL_DIR . "/smileys.php");

//
// preg_replace
// strtr
// ereg_replace
// str_replace
// error_reporting
//

function parse($input, $indent = "")
{
  global $testing;
	// Remove all tags from input (convert to xml)
	$output = convert_xml($input);

	// Replace newlines with '\n' and indent code.
	$nls = array("\n\r", "\n\c", "\n");
	$nls = str_replace($nls, "\n" . $indent, $indent . $output);
	$output = $nls;

	// Put in the smileys
	global $smileys;
	foreach($smileys as $smiley) {
	  $smile = $smiley[0];
	  $smile = str_replace($smile, "<img alt=\"\" src=\"gfx/smileys/" . $smiley[1] . "\"></img>", $output);
	  $output = $smile;
	}

  // Find a unique symbols for image start and end markers
  $imgstartsymbol = "A";
  $imgstartmarker = $imgstartsymbol;
  while(strpos($output, $imgstartmarker)) $imgstartmarker .= $imgstartsymbol;

  $imgendsymbol = "B";
  $imgendmarker = $imgendsymbol;
  while(strpos($output, $imgendmarker)) $imgendmarker .= $imgendsymbol;

  // Find and mark image URLs (so that they don't get converted into normal <a/> links)
  $output = preg_replace("/http:\/\/(.*?\.jpg|.*?\.gif|.*?\.png|.*?\.jpeg)/", $imgstartmarker."$1".$imgendmarker, $output);

	// Replace URLs with <a></a> tags
  $output = preg_replace("/http:\/\/(.*?)([\n ])/s", "<a href=\"http://$1\">$1</a>$2", $output);

  // Convert marked images to img tags and links
  $output = preg_replace("/".$imgstartmarker."(.*?)".$imgendmarker."/s", "<a href=\"http://$1\"><img alt=\"$1\" src=\"?mode=imagecache&amp;uri=http://$1\"/></a>", $output);

	// Replace URLs with <a></a> tags
  $output = preg_replace("/\{\{([0-9]*?)\}\}/s", "<a href=\"?mode=file&amp;fid=$1\"><img src=\"?mode=file&amp;preview=1&amp;fid=$1\"/></a>", $output);

	// Replace [quote title=...]...[/quote]
  $urls = "";
	while(($start = strpos($output, "[quote"))) {
    $pre = substr($output, 0, $start);
    $url = substr($output, $start);
    $end = strpos($url, "[/quote]") + strlen("[/quote]");
    $url = substr($url, 0, $end - strlen("[/quote]"));
    $post = substr($output, $start + $end + strlen("[/quote]") );

		$header = substr($url, 0, strpos($url, "]") + 1);
		$body = substr($url, strpos($url, "]") + 1);

		$header = str_replace(array("title"), "", $header);
		$header = str_replace(array("="), "<div class=\"title\">", $header);
		$header = str_replace(array("[quote"), "<div class=\"quote\">", $header);
		$header = str_replace(array("]"), "  </div>", $header);

    $urls .= $pre . $header . $body . "</div>";
    $output = $post;
	}
  $urls .= $output;
  $output = $urls;
	
	//
	// Hack to make quotes two levels deep.
	//
	// Replace [quote title=...]...[/quote]
  $urls = "";
	while(($start = strpos($output, "[quote"))) {
                $pre = substr($output, 0, $start);
                $url = substr($output, $start);
                $end = strpos($url, "[/quote]") + strlen("[/quote]");
                $url = substr($url, 0, $end - strlen("[/quote]"));
                $post = substr($output, $start + $end + strlen("[/quote]") );

		$header = substr($url, 0, strpos($url, "]") + 1);
		$body = substr($url, strpos($url, "]") + 1);

		$header = str_replace(array("title"), "", $header);
		$header = str_replace(array("="), "<div class=\"title\">", $header);
		$header = str_replace(array("[quote"), "<div class=\"quote\">", $header);
		$header = str_replace(array("]"), "  </div>", $header);

                $urls .= $pre . $header . $body . "</div>";
                $output = $post;
	}
  $urls .= $output;
  $output = $urls;

  $search = array('/\[b\](.*?)\[\/b\]/is',
                  '/\[i\](.*?)\[\/i\]/is',
                  '/\[u\](.*?)\[\/u\]/is');

  $replace = array('<strong>$1</strong>',
                   '<em>$1</em>',
                   '<u>$1</u>');

  $output = preg_replace ($search, $replace, $output);
  
	// Replace newlines with <br/> tags
	$nls = array("\n");
	$nls = str_replace($nls, "<br/>\n", $output);
	$output = $nls;

	return $output;
}

?>