"); SDV($InputTags['text']['class'], 'inputbox'); SDV($InputTags['password']['class'], 'inputbox'); SDV($InputTags['submit']['class'], 'inputbutton'); SDV($InputTags['reset']['class'], 'inputbutton'); SDV($InputTags['radio'][':checked'], 'checked'); SDV($InputTags['checkbox'][':checked'], 'checked'); # (:input form:) SDVA($InputTags['form'], array( ':args' => array('action', 'method'), ':html' => "
'); # (:input textarea:) SDVA($InputTags['textarea'], array( ':content' => array('value'), ':attr' => array_diff($InputAttrs, array('value')), ':html' => "")); # (:input image:) SDV($InputTags['image'][':args'], array('name', 'src', 'alt')); # (:input select:) SDVA($InputTags['select-option'], array( ':args' => array('name', 'value', 'label'), ':content' => array('label', 'value', 'name'), ':attr' => array('value', 'selected'), ':checked' => 'selected', ':html' => "")); SDVA($InputTags['select'], array( 'class' => 'inputbox', ':html' => "")); # (:input defaults?:) SDVA($InputTags['default'], array(':fn' => 'InputDefault')); SDVA($InputTags['defaults'], array(':fn' => 'InputDefault')); ## (:input ...:) directives Markup('input', 'directives', '/\\(:input\\s+(\\w+)(.*?):\\)/ei', "InputMarkup(\$pagename, '$1', PSS('$2'))"); ## (:input select:) has its own markup processing Markup('input-select', '.*?:\\)))\\s+(?=\\(:input\\s)/', '$1'); SDV($InputFocusFmt, ""); ## InputToHTML performs standard processing on (:input ...:) arguments, ## and returns the formatted HTML string. function InputToHTML($pagename, $type, $args, &$opt) { global $InputTags, $InputAttrs, $InputValues, $FmtV, $InputFocusLevel, $InputFocusId, $InputFocusFmt, $HTMLFooterFmt; if (!@$InputTags[$type]) return "(:input $type $args:)"; ## get input arguments if (!is_array($args)) $args = ParseArgs($args); ## convert any positional arguments to named arguments $posnames = @$InputTags[$type][':args']; if (!$posnames) $posnames = array('name', 'value'); while (count($posnames) > 0 && count(@$args['']) > 0) { $n = array_shift($posnames); if (!isset($args[$n])) $args[$n] = array_shift($args['']); } ## merge defaults for input type with arguments $opt = array_merge($InputTags[$type], $args); ## convert any remaining positional args to flags foreach ((array)@$opt[''] as $a) { $a = strtolower($a); if (!isset($opt[$a])) $opt[$a] = $a; } if (isset($opt['name'])) { $opt['name'] = preg_replace('/^\\$:/', 'ptv_', @$opt['name']); $name = $opt['name']; ## set control values from $InputValues array ## radio, checkbox, select, etc. require a flag of some sort, ## others just set 'value' if (isset($InputValues[$name])) { $checked = @$opt[':checked']; if ($checked) { $opt[$checked] = in_array(@$opt['value'], (array)$InputValues[$name]) ? $checked : false; } else if (!isset($opt['value'])) $opt['value'] = $InputValues[$name]; } } ## build $InputFormContent $FmtV['$InputFormContent'] = ''; foreach((array)@$opt[':content'] as $a) if (isset($opt[$a])) { $FmtV['$InputFormContent'] = $opt[$a]; break; } ## hash and store any "secure" values if (@$opt['secure'] == '#') $opt['secure'] = rand(); if (@$opt['secure'] > '') { $md5 = md5($opt['secure'] . $opt['value']); @session_start(); $_SESSION['forms'][$md5] = $opt['value']; $opt['value'] = $md5; } ## handle focus=# option $focus = @$opt['focus']; if (isset($focus) && (!isset($InputFocusLevel) || $focus < $InputFocusLevel)) { if (!isset($opt['id'])) $opt['id'] = "wikifocus$focus"; $InputFocusLevel = $focus; $InputFocusId = $opt['id']; $HTMLFooterFmt['inputfocus'] = $InputFocusFmt; } ## build $InputFormArgs from $opt $attrlist = (isset($opt[':attr'])) ? $opt[':attr'] : $InputAttrs; $attr = array(); foreach ($attrlist as $a) { if (!isset($opt[$a]) || $opt[$a]===false) continue; $attr[] = "$a='".str_replace("'", ''', $opt[$a])."'"; } $FmtV['$InputFormArgs'] = implode(' ', $attr); return FmtPageName($opt[':html'], $pagename); } ## InputMarkup handles the (:input ...:) directive. It either ## calls any function given by the :fn element of the corresponding ## tag, or else just returns the result of InputToHTML(). function InputMarkup($pagename, $type, $args) { global $InputTags; $fn = @$InputTags[$type][':fn']; if ($fn) return $fn($pagename, $type, $args); return Keep(InputToHTML($pagename, $type, $args, $opt)); } ## (:input default:) directive. function InputDefault($pagename, $type, $args) { global $InputValues, $PageTextVarPatterns; $args = ParseArgs($args); $args[''] = (array)@$args['']; $name = (isset($args['name'])) ? $args['name'] : array_shift($args['']); $name = preg_replace('/^\\$:/', 'ptv_', $name); $value = (isset($args['value'])) ? $args['value'] : array_shift($args['']); if (!isset($InputValues[$name])) $InputValues[$name] = $value; $source = @$args['source']; if ($source) { $source = MakePageName($pagename, $source); $page = RetrieveAuthPage($source, 'read', false, READPAGE_CURRENT); if ($page) { foreach((array)$PageTextVarPatterns as $pat) if (preg_match_all($pat, $page['text'], $match, PREG_SET_ORDER)) foreach($match as $m) if (!isset($InputValues['ptv_'.$m[2]])) $InputValues['ptv_'.$m[2]] = htmlspecialchars(Qualify($source, $m[3]), ENT_NOQUOTES); } } if (@$args['request']) { $req = array_merge($_GET, $_POST); foreach($req as $k => $v){ if (isset($InputValues[$k])) $InputValues[$k] = htmlspecialchars(stripmagic($v), ENT_NOQUOTES); } } return ''; } ## (:input select ...:) is special, because we need to process a bunch of ## them as a single unit. function InputSelect($pagename, $type, $markup) { global $InputTags, $InputAttrs, $FmtV; preg_match_all('/\\(:input\\s+\\S+\\s+(.*?):\\)/', $markup, $match); $selectopt = (array)$InputTags[$type]; $opt = $selectopt; $optionshtml = ''; $optiontype = isset($InputTags["$type-option"]) ? "$type-option" : "select-option"; foreach($match[1] as $args) { $optionshtml .= InputToHTML($pagename, $optiontype, $args, $oo); $opt = array_merge($opt, $oo); } $attrlist = array_diff($InputAttrs, array('value')); $attr = array(); foreach($attrlist as $a) { if (!isset($opt[$a]) || $opt[$a]===false) continue; $attr[] = "$a='".str_replace("'", ''', $opt[$a])."'"; } $FmtV['$InputSelectArgs'] = implode(' ', $attr); $FmtV['$InputSelectOptions'] = $optionshtml; return Keep(FmtPageName($selectopt[':html'], $pagename)); } function InputActionForm($pagename, $type, $args) { global $InputAttrs; $args = ParseArgs($args); if (@$args['pagename']) $pagename = $args['pagename']; $opt = NULL; $html = InputToHTML($pagename, $type, $args, $opt); foreach(preg_grep('/^[\\w$]/', array_keys($args)) as $k) { if (is_array($args[$k]) || in_array($k, $InputAttrs)) continue; if ($k == 'n' || $k == 'pagename') continue; $html .= ""; } return Keep($html); } ## RequestArgs is used to extract values from controls (typically ## in $_GET and $_POST). function RequestArgs($req = NULL) { if (is_null($req)) $req = array_merge($_GET, $_POST); foreach ($req as $k => $v) $req[$k] = stripmagic($req[$k]); return $req; } ## Form-based authorization prompts (for use with PmWikiAuth) $r = str_replace("'", '%37', stripmagic($_SERVER['REQUEST_URI'])); SDVA($InputTags['auth_form'], array( ':html' => "