# HG changeset patch # User Dan # Date 1224686955 14400 # Node ID 236360cf79a0c3870f4a024942514f969d1fe8b6 # Parent d9533bb07563a6c7ddbb016e9bacc32b99cc3ced Made template inclusion wikisyntax fully MediaWiki-compatible diff -r d9533bb07563 -r 236360cf79a0 includes/render.php --- a/includes/render.php Fri Oct 17 21:21:55 2008 -0400 +++ b/includes/render.php Wed Oct 22 10:49:15 2008 -0400 @@ -145,6 +145,7 @@ $p = 'Notice: RenderMan::getTemplate(): Parameter '.$m.' is not set'; } $text = str_replace('(_'.$m.'_)', $p, $text); + $text = str_replace('{{' . ( $m + 1 ) . '}}', $p, $text); } $text = RenderMan::include_templates($text); return $text; @@ -252,7 +253,7 @@ $text = preg_replace('/(.*?)<\/nodisplay>/is', '', $text); } - preg_match_all('/([\w\W]+?)<\/lang>/', $text, $langmatch); + preg_match_all('/([\w\W]+?)<\/lang>/', $text, $langmatch); foreach ( $langmatch[0] as $i => $match ) { if ( $langmatch[1][$i] == $lang->lang_code ) @@ -573,54 +574,43 @@ * [bar] => dolor sit amet */ - public static function parse_template_vars($input) + public static function parse_template_vars($input, $newlinemode = true) { - if ( !preg_match('/^(\|[ ]*([A-z0-9_]+)([ ]*)=([ ]*)(.+?))*$/is', trim($input)) ) + $parms = array(); + $input = trim($input); + if ( $newlinemode ) { - $using_pipes = false; - $input = explode("\n", trim( $input )); + $result = preg_match_all('/ + (?:^|[\s]*)\|? # start of parameter - string start or series of spaces + [ ]* + (?: + ([A-z0-9_]+) # variable name + [ ]* = [ ]* # assignment + )? # this is optional - if the parameter name is not given, a numerical index is assigned + (.+) # value + /x', trim($input), $matches); } else { - $using_pipes = true; - $input = substr($input, 1); - $input = explode("|", trim( $input )); - } - $parms = Array(); - $current_line = ''; - $current_parm = ''; - foreach ( $input as $num => $line ) + $result = preg_match_all('/ + (?:^|[ ]*)\| # start of parameter - string start or series of spaces + [ ]* + (?: + ([A-z0-9_]+) # variable name + [ ]* = [ ]* # assignment + )? # name section is optional - if the parameter name is not given, a numerical index is assigned + ([^\|]+|.+?\n[ ]*\|) # value + /x', trim($input), $matches); + } + if ( $result ) { - if ( preg_match('/^[ ]*([A-z0-9_]+)([ ]*)=([ ]*)(.+?)$/is', $line, $matches) ) + $pi = 0; + for ( $i = 0; $i < count($matches[0]); $i++ ) { - $parm =& $matches[1]; - $text =& $matches[4]; - if ( $parm == $current_parm ) - { - $current_line .= $text; - } - else - { - // New parameter - if ( $current_parm != '' ) - $parms[$current_parm] = $current_line; - $current_line = $text; - $current_parm = $parm; - } + $matches[1][$i] = trim($matches[1][$i]); + $parmname = !empty($matches[1][$i]) ? $matches[1][$i] : strval(++$pi); + $parms[ $parmname ] = $matches[2][$i]; } - else if ( $num == 0 ) - { - // Syntax error - return false; - } - else - { - $current_line .= "\n$line"; - } - } - if ( !empty($current_parm) && !empty($current_line) ) - { - $parms[$current_parm] = $current_line; } return $parms; } @@ -633,8 +623,8 @@ * @example * $text = '{{Template - parm1 = Foo - parm2 = Bar + | parm1 = Foo + | parm2 = Bar }}'; $text = RenderMan::include_templates($text); * @@ -644,17 +634,26 @@ { global $db, $session, $paths, $template, $plugins; // Common objects // $template_regex = "/\{\{([^\]]+?)((\n([ ]*?)[A-z0-9]+([ ]*?)=([ ]*?)(.+?))*)\}\}/is"; - $template_regex = "/\{\{(.+)(((\n|[ ]*\|)[ ]*([A-z0-9]+)[ ]*=[ ]*(.+))*)\}\}/isU"; + // matches: + // 1 - template name + // 2 - parameter section + $template_regex = "/ + \{\{ # opening + ([^\n\t\a\r]+) # template name + ((?:(?:[\s]+\|?)[ ]*(?:[A-z0-9_]+)[ ]*=[ ]*?(?:.+))*) # parameters + \}\} # closing + /isxU"; if ( $count = preg_match_all($template_regex, $text, $matches) ) { //die('
' . print_r($matches, true) . '
'); for ( $i = 0; $i < $count; $i++ ) { $matches[1][$i] = sanitize_page_id($matches[1][$i]); + $newlinemode = ( substr($matches[2][$i], 0, 1) == "\n" ); $parmsection = trim($matches[2][$i]); if ( !empty($parmsection) ) { - $parms = RenderMan::parse_template_vars($parmsection); + $parms = RenderMan::parse_template_vars($parmsection, $newlinemode); if ( !is_array($parms) ) // Syntax error $parms = array();