<?

/*
    omlsettings.php
    Copyright 2004 by Sylvester Hesp, s.hesp@xs4all.nl
    
    LICENSE INFO
    You can use this source freely for non-commercial purposes, be sure to include this copyright notice if you use
    the source or parts thereof.
    For commercial purposes, mail me, we can probably work something out.
*/

include ("oml.php");

if (!
extension_loaded ("React Code-Highlighter by .oisyn"))
{
    if (
strtoupper (substr (PHP_OS03)) == "WIN")
        
dl ("php_highlight.dll");
    else
    {
        
$cwd getcwd();
        
chdir("/home/oisyn/domains/oisyn.nl/public_html/highlighter";
        
dl ("highlighter.so");
        
chdir($cwd);
    }
}

$smile_replace = array ();
$smile_regex "";

$fd = @fopen (dirname (realpath (__FILE__)) . "/smiles.ini""r");
if (
$fd)
{
    while (!
feof ($fd))
    {
        
$s chop (fgets ($fd80));
        if (
$s == "")
            continue;
        
$s explode (" "$s);
        if (
count ($s) != 2)
            continue;
        
$smile_replace[$s[0]] = "<img src=\"" $s[1] . "\">";
    }
    
    if (
count ($smile_replace) > 0)
    {
        
$smile_regex preg_quote (implode ("OR"array_keys ($smile_replace)), "/");
        
$smile_regex "/(.*)(" str_replace ("OR""|"$smile_regex) . "|$)/sUD";
    }
}
unset (
$fd);


function 
tag_handler ($tag$options$text$type, &$state)
{
    global 
$db$template$smile_replace$smile_regex;

    if (
$type == OML_FLAG_PRE)
    {
        if (
count ($smile_replace) > && isset ($state["nosmile"]) && !$state["nosmile"] && (!isset ($state["issignature"]) || !$state["issignature"]))
        {
            if (
$state["html"] && $state["dohtml"])
            {
                foreach (
$smile_replace as $k => $v)
                    
$text str_replace ($k$v$text);
            }
            else
            {
                
preg_match_all ($smile_regex$text$matchesPREG_SET_ORDER);
                
                
$text "";
                foreach (
$matches as $m)
                {
                    if (
$m[1] != "")
                        
$text .= htmlentities ($m[1]);
                    if (isset (
$m[2]) && $m[2] != "")
                        
$text .= $smile_replace[$m[2]];
                }
            }
        }
        else if (!
$state["html"] || !$state["dohtml"])
            
$text htmlentities ($text);

        return 
nl2br ($text);
    }

    switch (
$tag)
    {
    case 
"br":
        return 
"<br>";
        
    case 
"hr":
        return 
"<hr>";
    
    case 
"b":
        return 
"<b>" $text "</b>";
        
    case 
"i":
        return 
"<i>" $text "</i>";
        
    case 
"u":
        return 
"<u>" $text "</u>";
        
    case 
"s":
        return 
"<strike>" $text "</strike>";
    
    case 
"sub":
        return 
"<sub>" $text "</sub>";
        
    case 
"sup":
        return 
"<sup>" $text "</sup>";
        
    case 
"small":
        return 
"<span class=\"smaller\">" $text "</span>";
        
    case 
"url":
        if (
$state["url"] > 1)
            return 
$options[0] . $text $options[1];
    
        
$url = isset ($options["href"]) ? $options["href"] : strip_tags (trim ($text));
        if (!
preg_match ("/^(\w+:\\/\\/|mailto:)/i"$url))
            
$url "http://" $url;
        return 
"<a href=\"" $url "\" target=\"_blank\">" $text "</a>";
        
    case 
"google":
        if (!isset (
$options["words"]))
            return 
$options[0] . $text $options[1];

        if (
$type == OML_FLAG_NOINNERTEXT)
            
$t "Zoeken met google naar '" .  htmlentities ($options["words"]) . "'";
        else
            
$t $text;

        return 
"<a href=\"http://www.google.com/search?q=" urlencode ($options["words"]) . "\" target=\"_blank\">" $t "</a>";
        
    case 
"img":
        
$r "<img";
        if (isset (
$options["width"]))
            
$r .= " width=\"" $options["width"] . '"';
        if (isset (
$options["height"]))
            
$r .= " height=\"" $options["height"] . '"';
        
$src trim (htmlentities ($text));
        if (!
preg_match ("/^\w+:\\/\\//i"$src))
            
$src "http://" $src;
        
$r .= " src=\"" $src "\">";
        return 
$r;
    
    case 
"list":
        
$s = isset ($options["start"]) ? " start=\"" $options["start"] . "\"" "";
        if (isset (
$options["type"]))
        {
            
$types = array ("X" => "square""O" => "circle""*" => "disk");
            if (isset (
$types[strtoupper ($options["type"])]))
            {
                return 
"<ul type=\"" $types[strtoupper ($options["type"])] . "\">" $text "</ul>";
            }
            return 
"<ol type=\"" htmlentities ($options["type"]) . "\"" $s ">" $text "</ol>";
        }
        return 
"<ul>" $text "</ul>";
        
    case 
"li":
        return 
"<li>";
    
    case 
"me":
        return 
"<span class=\"post_me\">* " . (isset ($options["name"]) ? htmlentities ($options["name"]) : "") . " " $text "</span>";
        
    case 
"code":
        
$c = isset ($options["lang"]) ? $options["lang"] : "Code";
        
$l = isset ($options["line"]) ? $options["line"] : 1;
        return 
code_highlight (trim ($text), $c$l);
        
    case 
"quote":
        if (
$state["quote"] > 1)
            return 
"<p>[...]</p>";
        
        
$r "";
        if (isset (
$options["url"]))
        {
            
$url htmlentities ($options["url"]);
            
$name = isset ($options["name"]) ? htmlentities ($options["name"]) : $url;
            if (!
preg_match ("/^(\w+:\\/\\/)/i"$url))
                
$url "http://" $url;
            
$r "<a href=\"" $url "\" target=\"_blank\">" $name "</a>";
        }
        else if (isset (
$options["name"]))
            
$r htmlentities ($options["name"]);
        
        return 
"<div class=\"quoteouter\">quote: " $r "<div class=\"quoteinner\">" trim ($text) . "</div></div>";
    }
    
    return 
$text;
}

function 
tag_handler_pre ($tag$options$text$type, &$state)
{
    global 
$db$template$auth_user;
    
    if (
$type == OML_FLAG_PRE)
    {
        if (
$state["url"] == 0)
        {
            
$f = array
            (
                
"/\\b((?:http|ftp):\\/\\/[a-zA-Z0-9._$\\-+\\/?&:@=%!'#]+)/i",
                
"/(?<!:\\/\\/)\\b(www\\.[a-zA-Z0-9._$\\-+\\/?&:@=%!'#]+)/i",
                
"/(?<!:\\/\\/)\\b(ftp\\.[a-zA-Z0-9._$\\-+\\/?&:@=%!'#]+)/i"
            
);            
            
$r = array
            (
                
"[url]\\1[/url]",
                
"[url]\\1[/url]",
                
"[url=\"ftp://\\1\"]\\1[/url]"
            
);
            return 
preg_replace ($f$r$text);
        }
        return 
$text;
    }
    else if (
$tag == "me")
    {
        if (!isset (
$options["name"]))
            return 
"[me=anonymous]" $text $options[1];
        else
            return 
$options[0] . $text $options[1];
    }
    else if (
$tag == "quote" && $state["quote"] > 1)
    {
        return 
"[...]";
    }
    else
    {
        
$r = isset ($options[0]) ? $options[0] : "";
        
$r .= $text;
        if (isset (
$options[1]))
        
$r .= $options[1];
        return 
$r;
    }
}



$oml_settings = array
(
    
OML_PLAIN_TAG => array ("tag_handler"OML_FLAG_PRE OML_FLAG_SUBTAGS, array ()),
    
"html" => array ("tag_handler"OML_FLAG_PRE OML_FLAG_SUBTAGS, array ()),
    
"nosmile" => array ("tag_handler"OML_FLAG_PRE OML_FLAG_SUBTAGS, array ()),
    
"plain" => array ("tag_handler"OML_FLAG_PRE, array ()),
    
"br" => array ("tag_handler"OML_FLAG_POST OML_FLAG_NOINNERTEXT, array ()),
    
"hr" => array ("tag_handler"OML_FLAG_POST OML_FLAG_NOINNERTEXT OML_FLAG_REMOVECLOSEBR, array ()),
    
"b" => array ("tag_handler"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ()),
    
"i" => array ("tag_handler"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ()),
    
"u" => array ("tag_handler"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ()),
    
"s" => array ("tag_handler"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ()),
    
"sup" => array ("tag_handler"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ()),
    
"sub" => array ("tag_handler"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ()),
    
"small" => array ("tag_handler"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ()),
    
"url" => array ("tag_handler"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ("href")),
    
"google" => array ("tag_handler"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS OML_FLAG_CLOSEOPTIONAL, array ("words")),
    
"img" => array ("tag_handler"OML_FLAG_POST, array ("width""height")),
    
"list" => array ("tag_handler"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS OML_FLAG_REMOVEOPENBR OML_FLAG_REMOVECLOSEBR, array ("type""start")),
    
"li" => array ("tag_handler"OML_FLAG_POST OML_FLAG_NOINNERTEXT, array ()),
    
"*" => array ("li"OML_FLAG_ALIAS, array ()),
    
"me" => array ("tag_handler"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ("name")),
    
"quote" => array ("tag_handler"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS OML_FLAG_REMOVEOPENBR OML_FLAG_REMOVECLOSEBR, array ("url""name")),
    
"q" => array ("quote"OML_FLAG_ALIAS, array ()),    
    
"code" => array ("tag_handler"OML_FLAG_POST OML_FLAG_REMOVECLOSEBR, array ("lang""line")),
);

$oml_settings_pre = array
(
    
OML_PLAIN_TAG => array ("tag_handler_pre"OML_FLAG_PRE OML_FLAG_SUBTAGS, array ()),
    
"html" => array ("tag_handler_pre"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ()),
    
"nosmile" => array ("tag_handler_pre"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ()),
    
"plain" => array ("tag_handler_pre"OML_FLAG_POST, array ()),
    
"b" => array ("tag_handler_pre"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ()),
    
"i" => array ("tag_handler_pre"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ()),
    
"u" => array ("tag_handler_pre"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ()),
    
"s" => array ("tag_handler_pre"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ()),
    
"sup" => array ("tag_handler_pre"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ()),
    
"sub" => array ("tag_handler_pre"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ()),
    
"small" => array ("tag_handler_pre"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ()),
    
"url" => array ("tag_handler_pre"OML_FLAG_POST OML_FLAG_SUBTAGS, array ("href")),
    
"google" => array ("tag_handler_pre"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS OML_FLAG_CLOSEOPTIONAL, array ("words")),
    
"img" => array ("tag_handler_pre"OML_FLAG_POST, array ("width""height")),
    
"list" => array ("tag_handler_pre"OML_FLAG_POST OML_FLAG_SUBTAGS, array ("type""start")),
    
"me" => array ("tag_handler_pre"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ("name")),
    
"quote" => array ("tag_handler_pre"OML_FLAG_PRE OML_FLAG_POST OML_FLAG_SUBTAGS, array ("url""name")),
    
"q" => array ("quote"OML_FLAG_ALIAS, array ()),    
    
"code" => array ("tag_handler_pre"OML_FLAG_POST, array ("lang""line")),
);

function 
oml_pre_convert ($text)
{
    global 
$oml_settings_pre$auth_user;
    
    
$find = array
    (
        
"/(\r?\n){3,}/",
        
"/\\/me\\s([^\r\n]*)\r?/"
    
);
    
    
$replace = array
    (
        
"\r\n\r\n",
        
"[me]\\1[/me]"
    
);
    
    
$text strtr ($text, array ("[\[]" => "[\[]\[\[][\]]""[\]]" => "[\[]\[\]][\]]"));
    
$text preg_replace ($find$replace$text);
    return 
oml_parse ($text$oml_settings_pre);
}

function 
oml_convert ($text$html false)
{
    global 
$oml_settings;
    
$state = array ("dohtml" => $html);
    return 
oml_parse ($text$oml_settings, &$state);
}

?>