From: <de...@de...> - 2007-10-19 23:52:03
|
Author: ArthurClemens Date: 2007-10-19 18:52:03 -0500 (Fri, 19 Oct 2007) New Revision: 15354 Modified: twiki/branches/MAIN/twikiplugins/EditTablePlugin/lib/TWiki/Plugins/EditTablePlugin/Core.pm twiki/branches/MAIN/twikiplugins/EditTablePlugin/test/unit/EditTablePlugin/EditTablePluginTests.pm Log: Item3890: do not expand escaped variables on edit or save, only on view Modified: twiki/branches/MAIN/twikiplugins/EditTablePlugin/lib/TWiki/Plugins/EditTablePlugin/Core.pm =================================================================== --- twiki/branches/MAIN/twikiplugins/EditTablePlugin/lib/TWiki/Plugins/EditTablePlugin/Core.pm 2007-10-19 23:51:57 UTC (rev 15353) +++ twiki/branches/MAIN/twikiplugins/EditTablePlugin/lib/TWiki/Plugins/EditTablePlugin/Core.pm 2007-10-19 23:52:03 UTC (rev 15354) @@ -36,7 +36,8 @@ $regex{table_row_full} = '^(\s*)\|.*\|\s*$'; $regex{table_row} = '^(\s*)\|(.*)'; -my $renderHack = "\n<nop>\n"; +my $RENDER_HACK = "\n<nop>\n"; +my $DEFAULT_FIELD_SIZE = 16; =pod @@ -131,7 +132,7 @@ $theText =~ s/\r//go; # strip out all \r chars (may be pasted into a table cell) $theText =~ s/\\\n//go; # Join lines ending in "\" - $theText .= $renderHack + $theText .= $RENDER_HACK ; # appended stuff is a hack to handle EDITTABLE correctly if at end my @lines = split( /\n/, $theText ); @@ -316,10 +317,9 @@ } # clean up hack that handles EDITTABLE correctly if at end - $result =~ s/($renderHack)+$//go; + $result =~ s/($RENDER_HACK)+$//go; if ($doSave) { - my $error = TWiki::Func::saveTopicText( $theWeb, $theTopic, $result, '', $doSaveQuiet ); @@ -377,10 +377,11 @@ sub parseFormat { my ( $theFormat, $theTopic, $theWeb, $doExpand ) = @_; - $theFormat =~ s/\$nop(\(\))?//gos; # remove filler - $theFormat =~ s/\$quot(\(\))?/\"/gos; # expand double quote - $theFormat =~ s/\$percnt(\(\))?/\%/gos; # expand percent - $theFormat =~ s/\$dollar(\(\))?/\$/gos; # expand dollar + + #$theFormat =~ s/\$nop(\(\))?//gos; # remove filler + #$theFormat =~ s/\$quot(\(\))?/\"/gos; # expand double quote + #$theFormat =~ s/\$percnt(\(\))?/\%/gos; # expand percent + #$theFormat =~ s/\$dollar(\(\))?/\$/gos; # expand dollar if ($doExpand) { # expanded form to be able to use %-vars in format @@ -389,7 +390,7 @@ TWiki::Func::expandCommonVariables( $theFormat, $theTopic, $theWeb ); } my @aFormat = split( /\s*\|\s*/, $theFormat ); - $aFormat[0] = "text,16" unless @aFormat; + $aFormat[0] = "text,$DEFAULT_FIELD_SIZE" unless @aFormat; return @aFormat; } @@ -398,6 +399,31 @@ =cut +sub unProtectVariablePlaceholders { + return if ( !$_[0] ); + $_[0] =~ s/\$nop//go; + $_[0] =~ s/\$n/\n/go; + $_[0] =~ s/\$dollarpercnt/%/go; + $_[0] =~ s/\$dollar/\$/go; + $_[0] =~ s/\$percnt/%/go; + $_[0] =~ s/\$quot/\"/go; +} + +=pod + +=cut + +sub protectVariablePlaceholders { + return if ( !$_[0] ); + $_[0] =~ s/%/\$percnt/go; + $_[0] =~ s/\$/\$dollar/go; + $_[0] =~ s/\"/\$quot/go; +} + +=pod + +=cut + sub handleEditTableTag { my ( $theWeb, $theTopic, $thePreSpace, $theArgs ) = @_; @@ -874,7 +900,7 @@ } else { # if( $type eq 'text') - $size = 16 if $size < 1; + $size = $DEFAULT_FIELD_SIZE if $size < 1; $theValue = TWiki::Plugins::EditTablePlugin::encodeValue($theValue) unless ( $theValue eq '' ); $text = @@ -913,6 +939,7 @@ $col += 1; $cellDefined = 0; $val = $isNewRow ? undef : $query->param("etcell${rowID}x$col"); + if ( $val && $val =~ /^Chkbx: (etcell.*)/ ) { # Multiple checkboxes, val has format "Chkbx: etcell4x2x2 etcell4x2x3 ..." @@ -1013,6 +1040,10 @@ $theRow =~ s/%EDITCELL{(.*?)}%/viewEditCell($1)/geo; $text .= $theRow; } + + # render final value in view mode (not edit or save) + unProtectVariablePlaceholders($text) if ( !$doSave && !$doEdit ); + return $text; } Modified: twiki/branches/MAIN/twikiplugins/EditTablePlugin/test/unit/EditTablePlugin/EditTablePluginTests.pm =================================================================== --- twiki/branches/MAIN/twikiplugins/EditTablePlugin/test/unit/EditTablePlugin/EditTablePluginTests.pm 2007-10-19 23:51:57 UTC (rev 15353) +++ twiki/branches/MAIN/twikiplugins/EditTablePlugin/test/unit/EditTablePlugin/EditTablePluginTests.pm 2007-10-19 23:52:03 UTC (rev 15354) @@ -55,7 +55,8 @@ my $topicName = $this->{test_topic}; my $webName = $this->{test_web}; - my $viewUrl = TWiki::Func::getScriptUrl( $webName, $topicName, 'viewauth' ); + my $viewUrlAuth = + TWiki::Func::getScriptUrl( $webName, $topicName, 'viewauth' ); my $pubUrlTWikiWeb = TWiki::Func::getUrlHost() . TWiki::Func::getPubUrlPath() . '/TWiki'; @@ -65,7 +66,7 @@ my $raw_tag = 'SOMETHING %EDITTABLE{}%'; my $expected = <<END; SOMETHING <a name="edittable1"></a> -<div class="editTable"><form name="edittable1" action="$viewUrl#edittable1" method="post"> +<div class="editTable"><form name="edittable1" action="$viewUrlAuth#edittable1" method="post"> <input class="twikiInputField" type="hidden" name="ettablenr" value="1" /> <input type="hidden" name="etedit" value="on" /> <input type="hidden" name="etrows" value="0" /> @@ -87,7 +88,8 @@ my $topicName = $this->{test_topic}; my $webName = $this->{test_web}; - my $viewUrl = TWiki::Func::getScriptUrl( $webName, $topicName, 'viewauth' ); + my $viewUrlAuth = + TWiki::Func::getScriptUrl( $webName, $topicName, 'viewauth' ); my $pubUrlTWikiWeb = TWiki::Func::getUrlHost() . TWiki::Func::getPubUrlPath() . '/TWiki'; @@ -97,7 +99,7 @@ my $raw_tag = '%EDITTABLE{editbutton="Edit me"}%'; my $expected = <<END; <a name="edittable1"></a> -<div class="editTable"><form name="edittable1" action="$viewUrl#edittable1" method="post"> +<div class="editTable"><form name="edittable1" action="$viewUrlAuth#edittable1" method="post"> <input class="twikiInputField" type="hidden" name="ettablenr" value="1" /> <input type="hidden" name="etedit" value="on" /> <input type="hidden" name="etrows" value="0" /> @@ -119,7 +121,8 @@ my $topicName = $this->{test_topic}; my $webName = $this->{test_web}; - my $viewUrl = TWiki::Func::getScriptUrl( $webName, $topicName, 'viewauth' ); + my $viewUrlAuth = + TWiki::Func::getScriptUrl( $webName, $topicName, 'viewauth' ); my $pubUrlTWikiWeb = TWiki::Func::getUrlHost() . TWiki::Func::getPubUrlPath() . '/TWiki'; @@ -141,7 +144,7 @@ my $expected = <<EXPECTED; SOMETHING <a name="edittable1"></a> -<div class="editTable"><form name="edittable1" action="$viewUrl#edittable1" method="post"> +<div class="editTable"><form name="edittable1" action="$viewUrlAuth#edittable1" method="post"> <input class="twikiInputField" type="hidden" name="ettablenr" value="1" /> <input type="hidden" name="etedit" value="on" /> <input type="hidden" name="etrows" value="0" /> @@ -162,7 +165,8 @@ my $topicName = $this->{test_topic}; my $webName = $this->{test_web}; - my $viewUrl = TWiki::Func::getScriptUrl( $webName, $topicName, 'viewauth' ); + my $viewUrlAuth = + TWiki::Func::getScriptUrl( $webName, $topicName, 'viewauth' ); my $pubUrlTWikiWeb = TWiki::Func::getPubUrlPath() . '/TWiki'; my $input = <<INPUT; @@ -188,7 +192,7 @@ my $expected = <<EXPECTED; SOMETHING <noautolink> <a name="edittable1"></a> -<div class="editTable editTableEdit"><form name="edittable1" action="$viewUrl#edittable1" method="post"> +<div class="editTable editTableEdit"><form name="edittable1" action="$viewUrlAuth#edittable1" method="post"> <input class="twikiInputField" type="hidden" name="ettablenr" value="1" /> |<div class="et_rowlabel">0<input type="hidden" name="etcell1x1" value="0" /></div> |<input class="twikiInputField editTableInput" type="text" name="etcell1x2" size="10" value="--EditTableEncodeStart--.i.n.i.t--EditTableEncodeEnd--" /> |<textarea class="twikiTextarea editTableTextarea" rows="3" cols="10" name="etcell1x3">--EditTableEncodeStart--.i.n.i.t--EditTableEncodeEnd--</textarea> |<select class="twikiSelect" name="etcell1x4" size="3"> <option selected="selected">option 1</option> <option>option 2</option> <option>option 3</option></select> |<table class="editTableInnerTable"><tr><td valign="top"> <input type="radio" name="etcell1x5" value="A" /> A <br /> <input type="radio" name="etcell1x5" value="B" /> B </td><td valign="top"> <input type="radio" name="etcell1x5" value="C" /> C <br /> <input type="radio" name="etcell1x5" value="D" /> D </td><td valign="top"> <input type="radio" name="etcell1x5" value="E" /> E <br /></td></tr></table> |<table class="editTableInnerTable"><tr><td valign="top"> <input type="checkbox" name="etcell1x6x2" value="A" checked="checked" /> A <br /> <input type="checkbox" name="etcell1x6x3" value="B" checked="checked" /> B </td><td valign="top"> <input type="checkbox" name="etcell1x6x4" value="C" checked="checked" /> C <br /> <input type="checkbox" name="etcell1x6x5" value="D" checked="checked" /> D </td><td valign="top"> <input type="checkbox" name="etcell1x6x6" value="E" checked="checked" /> E <br /></td></tr></table> <input type="hidden" name="etcell1x6" value="Chkbx: etcell1x6x2 etcell1x6x3 etcell1x6x4 etcell1x6x5 etcell1x6x6" /> |LABEL<input type="hidden" name="etcell1x7" value="--EditTableEncodeStart--.L.A.B.E.L--EditTableEncodeEnd--" /> |<input type="text" name="etcell1x8" size="11" class="twikiInputField editTableInput" id="idetcell1x8" /><span class="twikiMakeVisible"><input type="image" name="calendar" src="$pubUrlTWikiWeb/JSCalendarContrib/img.gif" align="middle" alt="Calendar" onclick="return showCalendar('idetcell1x8','%d %b %Y')" class="editTableCalendarButton" /></span> | <input type="hidden" name="etrows" value="1" /> @@ -209,7 +213,8 @@ my $topicName = $this->{test_topic}; my $webName = $this->{test_web}; - my $viewUrl = TWiki::Func::getScriptUrl( $webName, $topicName, 'viewauth' ); + my $viewUrlAuth = + TWiki::Func::getScriptUrl( $webName, $topicName, 'viewauth' ); my $pubUrlTWikiWeb = TWiki::Func::getUrlHost() . TWiki::Func::getPubUrlPath() . '/TWiki'; @@ -237,7 +242,7 @@ my $expected = <<EXPECTED; <noautolink> <a name="edittable1"></a> -<div class="editTable editTableEdit"><form name="edittable1" action="$viewUrl#edittable1" method="post"> +<div class="editTable editTableEdit"><form name="edittable1" action="$viewUrlAuth#edittable1" method="post"> <input class="twikiInputField" type="hidden" name="ettablenr" value="1" /> |<div class="et_rowlabel">0<input type="hidden" name="etcell1x1" value="0" /></div> |<input class="twikiInputField editTableInput" type="text" name="etcell1x2" size="10" value="--EditTableEncodeStart--.i.n.i.t--EditTableEncodeEnd--" /> | <input type="hidden" name="etrows" value="1" /> @@ -276,7 +281,7 @@ $expected = <<EXPECTED; <noautolink> <a name="edittable1"></a> -<div class="editTable editTableEdit"><form name="edittable1" action="$viewUrl#edittable1" method="post"> +<div class="editTable editTableEdit"><form name="edittable1" action="$viewUrlAuth#edittable1" method="post"> <input class="twikiInputField" type="hidden" name="ettablenr" value="1" /> <nop> <nop> @@ -361,7 +366,8 @@ my $topicName = $this->{test_topic}; my $webName = $this->{test_web}; - my $viewUrl = TWiki::Func::getScriptUrl( $webName, $topicName, 'viewauth' ); + my $viewUrlAuth = + TWiki::Func::getScriptUrl( $webName, $topicName, 'viewauth' ); my $pubUrlTWikiWeb = TWiki::Func::getUrlHost() . TWiki::Func::getPubUrlPath() . '/TWiki'; @@ -371,12 +377,9 @@ ettablenr => ['1'], } ); - $query->path_info("/$webName/$topicName"); + $query->path_info("/$webName/$topicName"); - #TWiki::Func::saveTopic( $this->{test_web}, $this->{test_topic}, undef, - # $input ); - - my $text = <<INPUT; + my $text = <<INPUT; %EDITTABLE{format="|select, 1, a, b, c, d|select,1,a,b,c,d|select,1 ,a , b, c, d|select, 1 , a , b , c , d |" }% | c | c | c | c | INPUT @@ -389,7 +392,7 @@ my $expected = <<END; <noautolink> <a name="edittable1"></a> -<div class="editTable editTableEdit"><form name="edittable1" action="$viewUrl#edittable1" method="post"> +<div class="editTable editTableEdit"><form name="edittable1" action="$viewUrlAuth#edittable1" method="post"> <input class="twikiInputField" type="hidden" name="ettablenr" value="1" /> <nop> <table cellspacing="0" id="default" cellpadding="0" class="twikiTable" rules="rows" border="1"> @@ -424,7 +427,8 @@ my $topicName = $this->{test_topic}; my $webName = $this->{test_web}; - my $viewUrl = TWiki::Func::getScriptUrl( $webName, $topicName, 'viewauth' ); + my $viewUrlAuth = + TWiki::Func::getScriptUrl( $webName, $topicName, 'viewauth' ); my $pubUrlTWikiWeb = TWiki::Func::getUrlHost() . TWiki::Func::getPubUrlPath() . '/TWiki'; @@ -434,12 +438,9 @@ ettablenr => ['1'], } ); - $query->path_info("/$webName/$topicName"); + $query->path_info("/$webName/$topicName"); - #TWiki::Func::saveTopic( $this->{test_web}, $this->{test_topic}, undef, - # $input ); - - my $text = <<INPUT; + my $text = <<INPUT; %EDITTABLE{format="| radio, 1, :skull:, :cool: | checkbox, 1, :skull:, :cool: |"}% INPUT @@ -452,7 +453,7 @@ <noautolink> <a name="edittable1"></a> -<div class="editTable editTableEdit"><form name="edittable1" action="$viewUrl#edittable1" method="post"> +<div class="editTable editTableEdit"><form name="edittable1" action="$viewUrlAuth#edittable1" method="post"> <input class="twikiInputField" type="hidden" name="ettablenr" value="1" /> <nop> <table cellspacing="0" id="default" cellpadding="0" class="twikiTable" rules="rows" border="1"> @@ -474,4 +475,109 @@ $twiki->finish(); } +=pod + +Test variable placeholders like $percnt and $nop + +=cut + +sub test_VariablePlaveholdersView { + my $this = shift; + + my $topicName = $this->{test_topic}; + my $webName = $this->{test_web}; + my $viewUrlAuth = + TWiki::Func::getScriptUrl( $webName, $topicName, 'viewauth' ); + my $viewUrl = TWiki::Func::getScriptUrlPath() + . "/view/$webName/$topicName" + ; # heck, how can I do this otherwise? I need the relative path + my $pubUrlTWikiWeb = + TWiki::Func::getUrlHost() . TWiki::Func::getPubUrlPath() . '/TWiki'; + + my $text = <<INPUT; +%EDITTABLE{format="| text, 30, \$percntY\$percnt | text, 30, %TOPIC% | text, 30, %\$nopTOPIC% |"}% +| \$percntY\$percnt | $topicName | %\$nopTOPIC% | +INPUT + + my $result = + TWiki::Func::expandCommonVariables( $text, $topicName, $webName, undef ); + + my $expected = <<END; +<a name="edittable1"></a> +<div class="editTable"><form name="edittable1" action="$viewUrlAuth#edittable1" method="post"> +<input class="twikiInputField" type="hidden" name="ettablenr" value="1" /> +<input type="hidden" name="etedit" value="on" /> +<nop> +<table cellspacing="0" id="default" cellpadding="0" class="twikiTable" rules="rows" border="1"> + <tr class="twikiTableEven twikiTableRowdataBgSorted0 twikiTableRowdataBg0"> + <td bgcolor="#ffffff" valign="top" class="twikiTableCol0 twikiFirstCol twikiLast"> <img src="%PUBURLPATH%/%SYSTEMWEB%/TWikiDocGraphics/choice-yes.gif" alt="DONE" title="DONE" width="16" height="16" border="0" /> </td> + <td bgcolor="#ffffff" valign="top" class="twikiTableCol1 twikiLast"> <a href="$viewUrl" class="twikiCurrentTopicLink twikiLink">$topicName</a> </td> + <td bgcolor="#ffffff" valign="top" class="twikiTableCol2 twikiLastCol twikiLast"> <a href="$viewUrl" class="twikiCurrentTopicLink twikiLink">$topicName</a> </td> + </tr></table> +<input type="hidden" name="etrows" value="1" /> +<input class="editTableEditImageButton" type="image" src="$pubUrlTWikiWeb/EditTablePlugin/edittable.gif" alt="Edit this table" /></form> +</div><!-- /editTable --> +END + + $expected =~ s/%PUBURLPATH%/$TWiki::cfg{PubUrlPath}/e; + $expected =~ s/%SYSTEMWEB%/TWiki/g; + + $this->do_testHtmlOutput( $expected, $result, 1 ); +} + +sub test_VariablePlaveholdersEdit { + my $this = shift; + + my $topicName = $this->{test_topic}; + my $webName = $this->{test_web}; + my $viewUrlAuth = + TWiki::Func::getScriptUrl( $webName, $topicName, 'viewauth' ); + my $pubUrlTWikiWeb = + TWiki::Func::getUrlHost() . TWiki::Func::getPubUrlPath() . '/TWiki'; + my $userName = $this->{users_web} . '.' . 'TWikiGuest'; + + my $text = <<INPUT; +%EDITTABLE{format="| text, 30, \$percntY\$percnt | text, 30, %HOMETOPIC% | text, 30, %\$nopHOMETOPIC% |"}% +INPUT + + my $query = new CGI( + { + etedit => ['on'], + ettablenr => ['1'], + } + ); + $query->path_info("/$webName/$topicName"); + + my $twiki = new TWiki( undef, $query ); + $TWiki::Plugins::SESSION = $twiki; + my $result = + TWiki::Func::expandCommonVariables( $text, $topicName, $webName, undef ); + + my $expected = <<END; +<noautolink> +<a name="edittable1"></a> +<div class="editTable editTableEdit"><form name="edittable1" action="$viewUrlAuth#edittable1" method="post"> +<input class="twikiInputField" type="hidden" name="ettablenr" value="1" /> +<nop> +<table cellspacing="0" id="default" cellpadding="0" class="twikiTable" rules="rows" border="1"> + <tr class="twikiTableEven twikiTableRowdataBgSorted0 twikiTableRowdataBg0"> + <td bgcolor="#ffffff" valign="top" class="twikiTableCol0 twikiFirstCol twikiLast"> <input class="twikiInputField editTableInput" type="text" name="etcell1x1" size="30" value="\$percntY\$percnt" /> </td> + <td bgcolor="#ffffff" valign="top" class="twikiTableCol1 twikiLast"> <input class="twikiInputField editTableInput" type="text" name="etcell1x2" size="30" value="WebHome" /> </td> + <td bgcolor="#ffffff" valign="top" class="twikiTableCol2 twikiLastCol twikiLast"> <input class="twikiInputField editTableInput" type="text" name="etcell1x3" size="30" value="%\$nopHOMETOPIC%" /> </td> + </tr></table> +<input type="hidden" name="etrows" value="1" /> +<input type="submit" name="etsave" id="etsave" value="Save table" class="twikiSubmit" /> +<input type="submit" name="etqsave" id="etqsave" value="Quiet save" class="twikiButton" /> +<input type="submit" name="etaddrow" id="etaddrow" value="Add row" class="twikiButton" /> +<input type="submit" name="etdelrow" id="etdelrow" value="Delete last row" class="twikiButton" /> +<input type="submit" name="etcancel" id="etcancel" value="Cancel" class="twikiButton twikiButtonCancel" /> +</form> +</div><!-- /editTable --></noautolink> +END + + $this->do_testHtmlOutput( $expected, $result, 1 ); + + $twiki->finish(); +} + 1; |