From: <de...@de...> - 2007-06-30 08:53:50
|
Author: CrawfordCurrie Date: 2007-06-30 03:53:45 -0500 (Sat, 30 Jun 2007) New Revision: 14310 Modified: twiki/branches/MAIN/data/TWiki/TWikiForms.txt twiki/branches/MAIN/lib/TWiki/Form.pm twiki/branches/MAIN/twikiplugins/UnitTestContrib/test/unit/FormDefTests.pm Log: Item4250: support \| to escape | in form definitions. \| really ought to be supported generally to allow | in tables (| is the current workaround) Modified: twiki/branches/MAIN/data/TWiki/TWikiForms.txt =================================================================== --- twiki/branches/MAIN/data/TWiki/TWikiForms.txt 2007-06-29 17:49:49 UTC (rev 14309) +++ twiki/branches/MAIN/data/TWiki/TWikiForms.txt 2007-06-30 08:53:45 UTC (rev 14310) @@ -64,13 +64,13 @@ | Public FAQ | </blockquote> -Field values can also be obtained as the result of a %TWIKIWEB%.FormattedSearch. For example, +Field values can also be set using the result of expanding other TWiki variables. For example, <blockquote> =%<nop>SEARCH{"Office$" scope="topic" web="%<nop>MAINWEB%" nonoise="on" type="regex" format="$web.$topic" separator=", " }%= </blockquote> -when used in the value field of the form definition, this will find all topic names in the Main web which end in "Office" and use them as the legal field values. +When used in the value field of the form definition, this will find all topic names in the Main web which end in "Office" and use them as the legal field values. #EnablingForms ---++ Enabling Forms by Web @@ -101,7 +101,7 @@ </verbatim> * __%T% Tip:__ For TWiki applications you can [[TWikiTemplates#AutomaticallyGeneratedTopicname][automatically generate unique topicnames]]. - * __%X% Note:__ Initial values will not be submitted to the form of a new topic if you only use the formtemplate parameter. + * __%X% Note:__ Initial values will *not* be set in the form of a new topic if you _only_ use the formtemplate parameter. ---++ Changing a form * You can change a form definition, and TWiki will try to make sure you don't lose any data from the topics that use that form. @@ -163,7 +163,10 @@ * The field value will be used to initialize a field when a form is created, unless specific values are given by the topic template or query parameters. The first item in the list for a select or radio type is the default item. For =label=, =text=, and =textarea= fields the value may also contain commas. =checkbox= fields cannot be initialized through the form template. * Leading and trailing spaces are _not_ significant. * Field values can also be generated through a %TWIKIWEB%.FormattedSearch, which must yield a suitable table as the result. - * Variables in the initial values of a form definition get expanded when form values are initialized from the form definition. The FormatTokens can be used to prevent expansion. + * Variables in the initial values of a form definition get expanded when the form definition is loaded. + * If you want to use a =|= character in the initial values field, you have to precede it with a backslash, thus: =\|=. + * You can use =<nop>= to prevent TWiki variables from being expanded. + * The FormatTokens can be used to prevent expansion of other characters. *General Notes:* * The topic definition is not read when a topic is viewed. * Form definition topics can be protected in the usual manner, using TWikiAccessControl, to limit who can change the form template and/or individual value lists. Note that view access is required to be able to edit topics that use the form definition, though view access to the form definition is _not_ required to view a topic where the form has been used. Modified: twiki/branches/MAIN/lib/TWiki/Form.pm =================================================================== --- twiki/branches/MAIN/lib/TWiki/Form.pm 2007-06-29 17:49:49 UTC (rev 14309) +++ twiki/branches/MAIN/lib/TWiki/Form.pm 2007-06-30 08:53:45 UTC (rev 14310) @@ -145,50 +145,55 @@ my $store = $this->{session}->{store}; my @fields = (); my $inBlock = 0; - $text =~ s/\\\r?\n//go; # remove trailing '\' and join continuation lines + $text =~ s/\r//g; + $text =~ s/\\\n//g; # remove trailing '\' and join continuation lines # | *Name:* | *Type:* | *Size:* | *Value:* | *Tooltip message:* | *Attributes:* | # Tooltip and attributes are optional - foreach( split( /\r?\n/, $text ) ) { - if( /^\s*\|.*Name[^|]*\|.*Type[^|]*\|.*Size[^|]*\|/ ) { + foreach my $line ( split( /\n/, $text ) ) { + if( $line =~ /^\s*\|.*Name[^|]*\|.*Type[^|]*\|.*Size[^|]*\|/ ) { $inBlock = 1; next; } # Only insist on first field being present FIXME - use oops page instead? - if( $inBlock && s/^\s*\|//o ) { - my( $title, $type, $size, $vals, $tooltip, $attributes ) = split( /\|/ ); + if( $inBlock && $line =~ s/^\s*\|\s*// ) { + $line =~ s/\\\|/\007/g; # protect \| from split + my( $title, $type, $size, $vals, $tooltip, $attributes ) = + map { s/\007/|/g; $_ } split( /\s*\|\s*/, $line ); + $title ||= ''; - $title =~ s/^\s*//go; - $title =~ s/\s*$//go; - $attributes ||= ''; - $attributes =~ s/\s*//go; - $attributes = '' if( ! $attributes ); - $type ||= ''; $type = lc $type; $type =~ s/^\s*//go; $type =~ s/\s*$//go; $type = 'text' if( ! $type ); + $size ||= ''; + $vals ||= ''; $vals = $this->{session}->handleCommonTags( $vals, $this->{web}, $this->{topic}, $meta); $vals =~ s/<\/?(nop|noautolink)\/?>//go; - $vals =~ s/^\s*//go; - $vals =~ s/\s*$//go; + $vals =~ s/^\s+//g; + $vals =~ s/\s+$//g; - # SMELL: What is this??? This looks like a hack! - if( $vals eq '$users' ) { - $vals = $TWiki::cfg{UsersWebName} . '.' . - join( ", ${TWiki::cfg{UsersWebName}}.", - ( $store->getTopicNames( $TWiki::cfg{UsersWebName} ) ) ); - } + # SMELL: This expansion of $users is undocumented, AFAICT not + # used, and downright *dangerous* (it won't work with a non-TWiki + # user mapping for example) so in the interests of good hygiene, + # I have removed it (CC, 30 Jun 07). + #if( $vals eq '$users' ) { + # $vals = $TWiki::cfg{UsersWebName} . '.' . + # join( ", ${TWiki::cfg{UsersWebName}}.", + # ( $store->getTopicNames( $TWiki::cfg{UsersWebName} ))); + #} $tooltip ||= ''; - $tooltip =~ s/^\s*//go; - $tooltip =~ s/\s*$//go; + $attributes ||= ''; + $attributes =~ s/\s*//go; + $attributes = '' if( ! $attributes ); + my $definingTopic = ""; if( $title =~ /\[\[(.+)\]\[(.+)\]\]/ ) { # use common defining topics with different field titles Modified: twiki/branches/MAIN/twikiplugins/UnitTestContrib/test/unit/FormDefTests.pm =================================================================== --- twiki/branches/MAIN/twikiplugins/UnitTestContrib/test/unit/FormDefTests.pm 2007-06-29 17:49:49 UTC (rev 14309) +++ twiki/branches/MAIN/twikiplugins/UnitTestContrib/test/unit/FormDefTests.pm 2007-06-30 08:53:45 UTC (rev 14310) @@ -1,57 +1,24 @@ # Copyright (C) 2006 WikiRing http://wikiring.com # Tests for form def parser -require 5.006; package FormDefTests; -use base qw(TWikiTestCase); +use base qw(TWikiFnTestCase); use TWiki; -use TWiki::Prefs; use TWiki::Form; use strict; use Assert; use Error qw( :try ); -sub new { - my $self = shift()->SUPER::new(@_); - return $self; -} - -my $prefix = 'TemporaryTestFormDefs'; -my $testSysWeb = $prefix.'SystemWeb'; -my $testNormalWeb = $prefix.'NormalWeb'; -my $testUsersWeb = $prefix.'UsersWeb'; -my $testTopic = $prefix.'TestTopic'; -my $testUser; - -my $twiki; - -sub set_up { - my $this = shift; - - $this->SUPER::set_up(); - - $twiki = new TWiki(); - $twiki->{store}->createWeb($twiki->{user}, $testNormalWeb); -} - -sub tear_down { - my $this = shift; - - $this->removeWebFixture($twiki, $testNormalWeb); - eval {$twiki->finish()}; - $this->SUPER::tear_down(); -} - sub test_minimalForm { my $this = shift; - $twiki->{store}->saveTopic( - $twiki->{user}, $testNormalWeb, 'TestForm', <<FORM); + $this->{twiki}->{store}->saveTopic( + $this->{twiki}->{user}, $this->{test_web}, 'TestForm', <<FORM); | *Name* | *Type* | *Size* | | Date | date | 30 | FORM - my $def = TWiki::Form->new($twiki, $testNormalWeb, 'TestForm'); + my $def = TWiki::Form->new($this->{twiki}, $this->{test_web}, 'TestForm'); $this->assert_equals(1, scalar @{$def->getFields()}); my $f = $def->getField('Date'); @@ -68,13 +35,13 @@ sub test_allCols { my $this = shift; - $twiki->{store}->saveTopic( - $twiki->{user}, $testNormalWeb, 'TestForm', <<FORM); + $this->{twiki}->{store}->saveTopic( + $this->{twiki}->{user}, $this->{test_web}, 'TestForm', <<FORM); | *Name* | *Type* | *Size* | *Value* | *Tooltip* | *Attributes* | | Select | select | 2..4 | a,b,c | Tippity | M | | Checky Egg | checkbox | 1 | 1,2,3,4 | Blip | | FORM - my $def = new TWiki::Form($twiki, $testNormalWeb, 'TestForm'); + my $def = new TWiki::Form($this->{twiki}, $this->{test_web}, 'TestForm'); $this->assert_equals(2, scalar @{$def->getFields()}); my $f = $def->getField('Select'); @@ -102,19 +69,19 @@ sub test_valsFromOtherTopic { my $this = shift; - $twiki->{store}->saveTopic( - $twiki->{user}, $testNormalWeb, 'TestForm', <<FORM); + $this->{twiki}->{store}->saveTopic( + $this->{twiki}->{user}, $this->{test_web}, 'TestForm', <<FORM); | *Name* | *Type* | *Size* | *Value* | | Vals Elsewhere | select | | | FORM - $twiki->{store}->saveTopic( - $twiki->{user}, $testNormalWeb, 'ValsElsewhere', <<FORM); + $this->{twiki}->{store}->saveTopic( + $this->{twiki}->{user}, $this->{test_web}, 'ValsElsewhere', <<FORM); | *Name* | | ValOne | | RowName | | Age | FORM - my $def = new TWiki::Form($twiki, $testNormalWeb, 'TestForm'); + my $def = new TWiki::Form($this->{twiki}, $this->{test_web}, 'TestForm'); $this->assert_equals(1, scalar @{$def->getFields()}); my $f = $def->getField('ValsElsewhere'); @@ -131,19 +98,19 @@ sub test_squabValRef { my $this = shift; - $twiki->{store}->saveTopic( - $twiki->{user}, $testNormalWeb, 'TestForm', <<FORM); + $this->{twiki}->{store}->saveTopic( + $this->{twiki}->{user}, $this->{test_web}, 'TestForm', <<FORM); | *Name* | *Type* | *Size* | *Value* | -| [[$testNormalWeb.Splodge][Vals Elsewhere]] | select | | | +| [[$this->{test_web}.Splodge][Vals Elsewhere]] | select | | | FORM - $twiki->{store}->saveTopic( - $twiki->{user}, $testNormalWeb, 'Splodge', <<FORM); + $this->{twiki}->{store}->saveTopic( + $this->{twiki}->{user}, $this->{test_web}, 'Splodge', <<FORM); | *Name* | | ValOne | | RowName | | Age | FORM - my $def = new TWiki::Form($twiki, $testNormalWeb, 'TestForm'); + my $def = new TWiki::Form($this->{twiki}, $this->{test_web}, 'TestForm'); $this->assert_equals(1, scalar @{$def->getFields()}); my $f = $def->getField('ValsElsewhere'); @@ -152,7 +119,32 @@ $this->assert_str_equals('Vals Elsewhere', $f->{title}); $this->assert_str_equals('ValOne,RowName,Age', join(',', @{$f->getOptions()})); - $this->assert_str_equals($testNormalWeb.'.Splodge', $f->{definingTopic}); + $this->assert_str_equals($this->{test_web}.'.Splodge', $f->{definingTopic}); } +sub test_searchForOptions { + my $this = shift; + + $this->{twiki}->{store}->saveTopic( + $this->{twiki}->{user}, $this->{test_web}, 'TestForm', <<'FORM'); +| *Name* | *Type* | *Size* | *Value* | +| Ecks | select | 1 | %SEARCH{"^\\| (Age\|Beauty)" type="regex" nonoise="on" separator="," format="$topic"}% | +FORM + $this->{twiki}->{store}->saveTopic( + $this->{twiki}->{user}, $this->{test_web}, 'SplodgeOne', <<FORM); +| Age | +FORM + $this->{twiki}->{store}->saveTopic( + $this->{twiki}->{user}, $this->{test_web}, 'SplodgeTwo', <<FORM); +| Beauty | +FORM + my $def = new TWiki::Form($this->{twiki}, $this->{test_web}, 'TestForm'); + + $this->assert_equals(1, scalar @{$def->getFields()}); + my $f = $def->getField('Ecks'); + $this->assert_str_equals( + 'SplodgeOne,SplodgeTwo', + join(',', sort @{$f->getOptions()})); +} + 1; |