[wellwell-devel] [SCM] Interchange wellwell catalog branch, master, updated. 7320a8ecc7bf546d32e68df1c180557c9eb096fc

Stefan Hornburg racke at rt.icdevgroup.org
Sat Dec 26 08:25:20 UTC 2009


       via  7320a8ecc7bf546d32e68df1c180557c9eb096fc (commit)
      from  a2eaae4669a0a3eb6ab459b28403abf77a511159 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 7320a8ecc7bf546d32e68df1c180557c9eb096fc
Author: Stefan Hornburg (Racke) <racke at linuxia.de>
Date:   Sat Dec 26 09:24:52 2009 +0100

    support for Wiki metadata added

-----------------------------------------------------------------------

Summary of changes and diff:
 lib/Vend/Wiki.pm             |  108 ++++++++++++++++++++++++++++++++++++------
 plugins/wiki/components/wiki |   34 +++++++++++--
 2 files changed, 121 insertions(+), 21 deletions(-)

diff --git a/lib/Vend/Wiki.pm b/lib/Vend/Wiki.pm
index 5b45ea0..f597402 100644
--- a/lib/Vend/Wiki.pm
+++ b/lib/Vend/Wiki.pm
@@ -31,7 +31,7 @@ use Wiki::Toolkit;
 Vend::Config::parse_directive('Wiki', 'Wiki wiki');
 
 # define [wiki] tag
-Vend::Config::parse_tag('UserTag', 'wiki Order function');
+Vend::Config::parse_tag('UserTag', 'wiki Order function page subject');
 Vend::Config::parse_tag('UserTag', 'wiki HasEndTag');
 Vend::Config::parse_tag('UserTag', 'wiki AddAttr');
 Vend::Config::parse_tag('UserTag', 'wiki MapRoutine Vend::Wiki::wiki');
@@ -100,7 +100,7 @@ sub new {
 }
 	
 sub wiki {
-	my ($function, $opt, $body) = @_;
+	my ($function, $page, $subject, $opt, $body) = @_;
 	my ($ret, $name);
 
 	# default name for the wiki is just wiki
@@ -117,12 +117,18 @@ sub wiki {
 	}
 
 	if ($function eq 'create_page') {
-		$ret = $wiki{$name}->create_page($opt->{page}, $opt->{content});
+		my $metadata = $wiki{$name}->metadata_from_form();
+
+		$ret = $wiki{$name}->create_page($opt->{page}, $opt->{content}, $metadata);
+
 		return $ret;
 	}
 
 	if ($function eq 'modify' || $function eq 'modify_page') {
-		$ret = $wiki{$name}->modify_page($opt->{page}, $opt->{content}, $opt->{checksum});
+		my $metadata = $wiki{$name}->metadata_from_form();
+
+		$ret = $wiki{$name}->modify_page($opt->{page}, $opt->{content}, $opt->{checksum},
+										 $metadata);
 		return $ret;
 	}
 	
@@ -139,9 +145,45 @@ sub wiki {
 			return $wiki{$name}->display_page($opt->{page});
 		}
 	}
+
+	if ($function eq 'form') {
+		if ($subject eq 'metadata') {
+			my ($mdlist, @out, %node, $mdref, $label, $el);
+
+			if ($page) {
+				%node = $wiki{$name}->retrieve_page($page);
+			}
+
+			# present form (elements) for adding/editing metadata
+			$mdlist = $wiki{$name}->{metadata}->{array};
+
+			for (@$mdlist) {
+				$mdref = $wiki{$name}->{metadata}->{hash}->{$_};
+
+				# preseed with current value of metadata
+				$mdref->{value} = $node{metadata}->{$_}->[0];
+
+				$label = qq{<label for="$_">$mdref->{label}</label>};
+				$el = Vend::Tags->display($mdref);
+				push (@out, "$label$el");
+			}
+
+			return join(',', @out);
+		}
+	}
 	
 	if ($function eq 'list') {
-		 my @nodes = $wiki{$name}->list_pages();
+		 my @nodes;
+
+		 if ($opt->{metadata}) {
+			 my ($key, $value) = split(/=/, $opt->{metadata}, 2);
+
+			 @nodes = $wiki{$name}->list_pages({metadata_type => $key,
+												metadata_value => $value});
+		 }
+		 else {
+			 @nodes = $wiki{$name}->list_pages();
+		 }
 
 		 if ($body) {
 			 # run templating on page list
@@ -165,10 +207,10 @@ sub wiki {
 # @param content page content
 
 sub create_page {
-	my ($self, $name, $content) = @_;
+	my ($self, $name, $content, $metadata) = @_;
 	my ($ret);
 	
-	$ret = $self->{object}->write_node($name, $content);
+	$ret = $self->{object}->write_node($name, $content, undef, $metadata);
 
 	unless ($ret) {
 		::logError("Failed to create page $name.");
@@ -179,10 +221,10 @@ sub create_page {
 
 # modify Wiki page
 sub modify_page {
-	my ($self, $name, $content, $checksum) = @_;
+	my ($self, $name, $content, $checksum, $metadata) = @_;
 	my ($ret);
 	
-	$ret = $self->{object}->write_node($name, $content, $checksum);
+	$ret = $self->{object}->write_node($name, $content, $checksum, $metadata);
 
 	unless ($ret) {
 		die "Page modification failed.";
@@ -233,7 +275,15 @@ sub display_page {
 		}
 
 		if ($format ne 'raw') {
-			return $self->{object}->format($node{content}, $node{metadata});
+			my @out;
+
+			push (@out, $self->{object}->format($node{content}, $node{metadata}));
+
+			for (keys %{$node{metadata}}) {
+				push (@out, "$_: " . join(', ', @{$node{metadata}->{$_}}));
+			}
+
+			return join("\n", @out);
 		}
 
 		return %node;
@@ -246,13 +296,31 @@ sub display_page {
 
 # list Wiki pages
 sub list_pages {
-	my ($self) = @_;
+	my ($self, $metadata) = @_;
 	my (@pages);
 
-	@pages = $self->{object}->list_all_nodes();
+	if ($metadata) {
+		@pages = $self->{object}->list_nodes_by_metadata(%$metadata);
+	}
+	else {
+		@pages = $self->{object}->list_all_nodes();
+	}
+	
 	return @pages;
 }
 
+# retrieve metadata from from parameters
+sub metadata_from_form {
+	my ($self) = @_;
+	my (%metadata);
+	
+	for (@{$self->{metadata}->{array}}) {
+		$metadata{$_} = $CGI::values{"metadata_$_"};
+	}
+
+	return \%metadata;
+}
+
 # load store
 sub load_store {
 	my ($self, $store) = @_;
@@ -269,7 +337,7 @@ sub load_store {
 	}
 
 	eval "require $class";
-	if ($@) {
+ 	if ($@) {
 		die "Failed to load $class: $@\n";
 	}
 	eval {
@@ -341,7 +409,7 @@ sub parse_wiki {
 	# directives
 	return {} unless $settings;
 
-	my ($name, $param, $value) = split(/\s+/, $settings);
+	my ($name, $param, $value, @args) = split(/\s+/, $settings);
 
 	if ($param eq 'url') {
 		# add pointer for our ActionMap
@@ -363,11 +431,21 @@ sub parse_wiki {
 		
 		$C->{$item}->{$name}->{formatter}->{$value} = {class => $class};
 	}
+	elsif ($param eq 'metadata') {
+		unless (exists $C->{$item}->{$name}->{$param}->{hash}->{$value}) {
+			push(@{$C->{$item}->{$name}->{$param}->{array}}, $value);
+			$C->{$item}->{$name}->{$param}->{hash}->{$value} = {name => "metadata_$value"};
+		}
+			
+		if (@args) {
+			$C->{$item}->{$name}->{$param}->{hash}->{$value}->{$args[0]} = $args[1];
+		}
+	}
 	elsif ($param eq 'backend' || $wiki_config_params{$param}) {
 		$C->{$item}->{$name}->{$param} = $value;
 	}
 	else {
-		config_error("Unknown wiki parameter %s with value %s.", $param, $value);
+		config_error("Unknown wiki parameter %s with value %s and args %s.", $param, $value, join(',', @args));
 	}
 	
 	return $C->{$item};
diff --git a/plugins/wiki/components/wiki b/plugins/wiki/components/wiki
index 877dc7a..57f2b0e 100644
--- a/plugins/wiki/components/wiki
+++ b/plugins/wiki/components/wiki
@@ -20,6 +20,8 @@ CREATING
 [value content]
 </textarea>
 <br>
+[wiki name="__NAME__" function="form" page="__PAGE__" subject="metadata"/]
+<br>
 <input type="submit" value="OK">
 <br>
 </fieldset>
@@ -40,24 +42,44 @@ CREATING
 <textarea name="content" cols="60" rows="20">
 {CONTENT}
 </textarea>
+[/wiki]
+<br>
+[wiki name="__NAME__" function="form" page="__PAGE__" subject="metadata"/]
 <br>
 <input type="submit" value="OK">
 <br>
 </fieldset>
 </form>
+[/else]
+[/if]
+[/elsif]
+[elsif cgi action eq list]
+[if cgi metadata]
+[wiki name="__NAME__" function="list" metadata=`$CGI->{metadata}`]
+<a href="[area href="wiki/{PAGE}"]">{PAGE}</a><br>
+[/wiki]
+[else]
+<h2>[L]List of Wiki Pages[/L]</h2>
+[wiki name="__NAME__" function="list"]
+<a href="[area href="wiki/{PAGE}"]">{PAGE}</a><br>
 [/wiki]
 [/else]
 [/if]
 [/elsif]
 [else]
+<p>
 <a href="[area href=wiki form=action=create]">Create page</a>
-
+</p>
+<p>
 [wiki name="__NAME__" function="display" page="__PAGE__"/]
-
+</p>
+<p>
 <a href="[area href="wiki/__PAGE__" form=action=edit]">Edit page</a>
+</p>
+<p>
+[wiki name="__NAME__" function="list"]
+<a href="[area href="wiki/{PAGE}"]">{PAGE}</a><br>
+[/wiki]
+</p>
 [/else]
 [/if]
-
-LIST: [wiki name="__NAME__" function="list"]
-<a href="[area href="wiki/{PAGE}"]">{PAGE}</a><br>
-[/wiki]
\ No newline at end of file


hooks/post-receive
-- 
Interchange wellwell catalog



More information about the wellwell-devel mailing list