[prev in list] [next in list] [prev in thread] [next in thread]
List: bricolage-commits
Subject: [6102] adding this contrib script which prints a tree
From: slanning () bricolage ! cc
Date: 2004-12-17 10:23:39
Message-ID: 20041217102339.22070.qmail () x1 ! develooper ! com
[Download RAW message or body]
Revision: 6102
Author: slanning
Date: 2004-12-17 02:23:37 -0800 (Fri, 17 Dec 2004)
ViewCVS: http://viewsvn.bricolage.cc/?rev=6102&view=rev
Log Message:
-----------
adding this contrib script which prints a tree
of elements and their subelements and fields
Added Files:
-----------
bricolage/branches/rev_1_8/contrib/show_element_tree/
bricolage/branches/rev_1_8/contrib/show_element_tree/README
bricolage/branches/rev_1_8/contrib/show_element_tree/element_tree.pl
["r6102-slanning.diff" (r6102-slanning.diff)]
Added: bricolage/branches/rev_1_8/contrib/show_element_tree/README
===================================================================
--- bricolage/branches/rev_1_8/contrib/show_element_tree/README 2004-12-16 19:11:11 \
UTC (rev 6101)
+++ bricolage/branches/rev_1_8/contrib/show_element_tree/README 2004-12-17 10:23:37 \
UTC (rev 6102) @@ -0,0 +1,16 @@
+Description:
+ Prints out elements and their subelements and custom fields
+ using the output from `bric_soap element export`.
+
+Usage:
+ $ bric_soap element list_ids | bric_soap element export - > elements.xml
+ $ ./element-tree.pl elements.xml
+ See also the comments in the script.
+
+Todo:
+ Show output channels for top-level elements.
+ Maybe show the description.
+ Maybe not show isolated non-top-level elements, like utility templates.
+
+Author:
+ o Scott Lanning, 2004-12-17
Added: bricolage/branches/rev_1_8/contrib/show_element_tree/element_tree.pl
===================================================================
--- bricolage/branches/rev_1_8/contrib/show_element_tree/element_tree.pl 2004-12-16 \
19:11:11 UTC (rev 6101)
+++ bricolage/branches/rev_1_8/contrib/show_element_tree/element_tree.pl 2004-12-17 \
10:23:37 UTC (rev 6102) @@ -0,0 +1,114 @@
+#!/usr/bin/perl
+# print a tree of elements and their subelements,
+# using a bric_soap export of elements
+# $ bric_soap element list_ids | bric_soap element export - > elements.xml
+# $ ./element-tree.pl elements.xml
+# Handles 1.6 or 1.8 version of bric_soap. Has the option to
+# not display the fields (see $WITHFIELDS).
+
+use strict;
+use warnings;
+use XML::Twig;
+
+my $CHILDMARKER = '. '; # what's in front of subelements
+my $WITHFIELDS = 1; # whether to display fields
+my %ELEMENT;
+
+main();
+
+sub main {
+ $|++;
+ parse_xml_elements();
+ get_parent_info();
+ print_parents();
+}
+
+# get all elements with their subelements, and fields;
+# put this in %ELEMENT
+sub parse_xml_elements {
+ my $xmlfile = shift(@ARGV) || 'elements.xml';
+ XML::Twig->new(
+ twig_roots => {'assets/element' => \&get_element_info}
+ )->parsefile($xmlfile);
+}
+
+# twig handler
+sub get_element_info {
+ my ($t, $node) = @_;
+
+ my $name = $node->first_child_text('key_name');
+ # (before 1.8 we didn't have key_name)
+ $name = $node->first_child_text('name') unless $name;
+ die "wtf version of bricolage are you running?" unless $name;
+
+ # subelements
+ my @children = sort $node->first_child('subelements')->children_text;
+ $ELEMENT{$name}{children} = [@children];
+
+ # fields
+ my @fields = $node->first_child('fields')->children('field');
+ my @fieldnames = ();
+ foreach my $field (@fields) {
+ my $fieldname = $field->first_child_text('key_name');
+ # (before 1.8 we had name instead of key_name)
+ $fieldname = $field->first_child_text('name') unless $fieldname;
+ push @fieldnames, $fieldname;
+ }
+ $ELEMENT{$name}{fields} = [sort @fieldnames];
+}
+
+# determine each element's parent (if it has one)
+sub get_parent_info {
+ foreach my $element (keys %ELEMENT) {
+ foreach my $child (@{ $ELEMENT{$element}{children} }) {
+ if (exists $ELEMENT{$child}) {
+ $ELEMENT{$child}{parent} = $element;
+ } else {
+ # should never happen
+ die "element=$element, child=$child\n";
+ }
+ }
+ }
+}
+
+# recursively print subelements
+sub print_children {
+ my ($element, $parents) = @_;
+
+ CHILD: foreach my $child (@{ $ELEMENT{$element}{children} }) {
+ print $CHILDMARKER x @$parents, $child;
+ print_fields($child);
+
+ # (prevent infinite recursion)
+ foreach my $parent (@$parents) {
+ if ($parent eq $child) {
+ print " ...\n";
+ next CHILD;
+ }
+ }
+ print $/;
+
+ push @$parents, $child;
+ print_children($child, $parents);
+ pop @$parents;
+ }
+}
+
+sub print_fields {
+ my $element = shift;
+ print ' (', join(', ', @{ $ELEMENT{$element}{fields} }), ')'
+ if $WITHFIELDS;
+}
+
+# display parent-less elements and recursively their subelements
+sub print_parents {
+ my @parents = grep {!exists $ELEMENT{$_}{parent}}
+ sort {lc($a) cmp lc($b)} keys %ELEMENT;
+ foreach my $element (@parents) {
+ print "\n$element";
+ print_fields($element);
+ print $/;
+ my @parentstack = ($element);
+ print_children($element, \@parentstack);
+ }
+}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic