"); 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' => "
", 'method' => 'post')); # (:input end:) SDV($InputTags['end'][':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' => "
\$PostVars")); SDV($AuthPromptFmt, array(&$PageStartFmt, 'page:$SiteGroup.AuthForm', "", &$PageEndFmt)); ## The section below handles specialized EditForm pages. ## We don't bother to load it if we're not editing. if ($action != 'edit') return; SDV($PageEditForm, '$SiteGroup.EditForm'); SDV($PageEditFmt, '$EditForm'); if (@$_REQUEST['editform']) { $PageEditForm=$_REQUEST['editform']; $PageEditFmt='$EditForm'; } $Conditions['e_preview'] = '(boolean)$_POST["preview"]'; XLSDV('en', array( 'ak_save' => 's', 'ak_saveedit' => 'u', 'ak_preview' => 'p', 'ak_textedit' => ',', 'e_rows' => '23', 'e_cols' => '60')); # (:e_preview:) displays the preview of formatted text. Markup('e_preview', 'directives', '/^\\(:e_preview:\\)/e', "Keep(\$GLOBALS['FmtV']['\$PreviewText'])"); # If we didn't load guiedit.php, then set (:e_guibuttons:) to # simply be empty. Markup('e_guibuttons', 'directives', '/\\(:e_guibuttons:\\)/', ''); # Prevent (:e_preview:) and (:e_guibuttons:) from # participating in text rendering step. SDV($SaveAttrPatterns['/\\(:e_(preview|guibuttons):\\)/'], ' '); SDVA($InputTags['e_form'], array( ':html' => "")); SDVA($InputTags['e_textarea'], array( ':html' => "", 'name' => 'text', 'id' => 'text', 'accesskey' => XL('ak_textedit'), 'rows' => XL('e_rows'), 'cols' => XL('e_cols'))); SDVA($InputTags['e_author'], array( ':html' => "", 'name' => 'author', 'value' => $Author)); SDVA($InputTags['e_changesummary'], array( ':html' => "", 'name' => 'csum', 'size' => '60', 'maxlength' => '100', 'value' => htmlspecialchars(stripmagic(@$_POST['csum']), ENT_QUOTES))); SDVA($InputTags['e_minorcheckbox'], array( ':html' => "", 'name' => 'diffclass', 'value' => 'minor')); if (@$_POST['diffclass']=='minor') SDV($InputTags['e_minorcheckbox']['checked'], 'checked'); SDVA($InputTags['e_savebutton'], array( ':html' => "", 'name' => 'post', 'value' => ' '.XL('Save').' ', 'accesskey' => XL('ak_save'))); SDVA($InputTags['e_saveeditbutton'], array( ':html' => "", 'name' => 'postedit', 'value' => ' '.XL('Save and edit').' ', 'accesskey' => XL('ak_saveedit'))); SDVA($InputTags['e_savedraftbutton'], array(':html' => '')); SDVA($InputTags['e_previewbutton'], array( ':html' => "", 'name' => 'preview', 'value' => ' '.XL('Preview').' ', 'accesskey' => XL('ak_preview'))); SDVA($InputTags['e_cancelbutton'], array( ':html' => "", 'name' => 'cancel', 'value' => ' '.XL('Cancel').' ' )); SDVA($InputTags['e_resetbutton'], array( ':html' => "", 'value' => ' '.XL('Reset').' '));