summaryrefslogtreecommitdiffstats
path: root/quanta/scripts/TemplateMagic.pl
diff options
context:
space:
mode:
Diffstat (limited to 'quanta/scripts/TemplateMagic.pl')
-rw-r--r--quanta/scripts/TemplateMagic.pl380
1 files changed, 380 insertions, 0 deletions
diff --git a/quanta/scripts/TemplateMagic.pl b/quanta/scripts/TemplateMagic.pl
new file mode 100644
index 00000000..40b3b2d1
--- /dev/null
+++ b/quanta/scripts/TemplateMagic.pl
@@ -0,0 +1,380 @@
+#!/usr/bin/perl
+#
+# Template Magic for Quanta:
+# This script is intended to be used as a sample of some of the possibilities of integrating
+# Kommander and Quanta. It's hoped that this can serve as a basic example of how Kommander works
+# and how it can speed you're web development.
+#
+# This script exists in the public domain and may be freely copied and redistributed. Please just
+# let me know that you used my script and what you're doing (I like new ideas).
+#
+# As usual, if this script by some means manages to do any harm to you, your computer, your animal,
+# your relatives or your animal relatives, feel free to vent to me in email and I'll try to fix the
+# script. You'll have to take care of the livestock.
+#
+# Template variables are of the form [ varname:vartype ] where vartype can be either
+# 'file', 'filename' or 'text'. Filename and file are two slight variations on the same theme
+# as both allow you to select a file from your filesystem, file will insert the contents of that
+# file whereas filename will simply insert the filename (with the path). Text is simply a rich
+# text field that can take a good little bit of text (the limitation if any will exist in
+# Kommander or your computers memory).
+#
+# Cheers,
+# --Robert Nickel <robert@artnickel.com>
+# Quanta Development Team Groupie
+#'
+
+use strict;
+# disable buffereing - otherwise everything waits till we quit
+$| = 1;
+
+my $tmversion = "2.0";
+
+#my $template=`kmdr-executor /tmp/TM.kmdr`;
+
+# adapt - passed parameter is template
+
+my $template = @ARGV[0];
+
+open(IFH, "< $template") || die("Couldn't read $template\n");
+
+my ($tmp,@ar,@OrderedVars,%Vars,%Vals,$i,$k,$v,$l,$r,$ns,@filechars,$fname,@VarData,@VD,$j);
+
+my $max_ui_height=800; #Maximum screen height of ui dialog
+my $calcHeight=0; #Height of ui dialog, up to a max of $max_ui_height
+parseTemplateVars();
+
+close(IFH);
+
+srand (time ^ $$ ^ unpack "%L*", `ps axww | gzip`);
+for (48..57,65..90,97..122) { push @filechars, chr(); } #Chars for tmp filename
+$fname="/tmp/";
+for (0..10) { $fname.=$filechars[rand 62]; }
+$fname.=".quanta.template";
+
+#uncomment this line if you're having grief with the generated kmdr file.'
+#and comment out the rm -f a little farther down.
+#$fname="/tmp/quanta_template.kmdr";
+
+open(OFH, "> $fname") || die("Couldn't create temp file $fname\n");
+&createUI();
+close(OFH);
+
+@VarData=`kmdr-executor $fname`; #We now have var:value one per line.
+
+#Ok. Let's get that pesky template loaded and output it to something useful.'
+#print "Data from kommander:\n";
+$j=0;
+for $i (@VarData) {
+ chomp($i);
+ if($i=~/^\+\+\+\+\z/) { #end of record marker
+ $j++;
+ } else { #add the contents to the end of the string
+ if(length($VD[$j])>0) { $VD[$j].=" "; }
+ $VD[$j].=$i;
+ }
+}
+
+for $i (@VD) {
+ chomp($i);
+ if($i ne "") {
+ ($k,$v)=split(/:/,$i,2); #This should give us key:value pair separated.
+# print "$k: '$v'\n";
+ if(exists($Vars{$k})) {
+ $Vals{$k}=$v;
+ } else { die("Inconsistent variable: $k.\nBailing....\n"); }
+ }
+}
+
+open(IFH, "< $template") || die("Couldn't read $template\n"); #reopen file to reset file pointer
+
+&insertTemplateValues();
+
+close(IFH);
+
+#cleanup temp file
+`rm -f $fname`;
+exit(0);
+
+sub usage() {
+ my $msg=shift();
+ print "$msg\n\nUsage: $0 <path-to-template>\n";
+ exit(1);
+}
+
+sub parseTemplateVars() {
+ $calcHeight=40; #base height for button.
+ @OrderedVars=(); #initialize this! Who knows?
+ while($tmp=<IFH>) {
+ chomp($tmp);
+ if($tmp=~/\[\s*\S+\s*\]/) { #Only parse on matches - Changed delimieters from |<- ->| to [ ]
+ $tmp=~s/^[^\[]*(\[\s*\S+\s*\])[^\[]*/$1/g;
+ $l=index($tmp,"[");
+ while($l>=0) {
+ $r=index($tmp,"]");
+ $ns=substr($tmp,$l+1,$r-1);
+ $ns=~s/\[\s*(\S+)\s*\]/$1/;
+ $ns=~s/\s//g; #no spaces!
+ ($k,$v)=split(/:/,$ns,2);
+ if(exists($Vars{$k}) && $v ne $Vars{$k}) {
+ die("Multiple definitions for variable $k - '$v' != '$Vars{$k}'.\n");
+ }
+ if(! exists($Vars{$k})) { push @OrderedVars, ["$k","$v"]; }
+ $Vars{$k}=$v;
+ $calcHeight+=$v eq "text" ? 35 : 25;
+ $tmp=substr($tmp,$r+1);
+ $l=index($tmp,"[");
+ }
+ }
+ }
+
+=pod
+ print "="x80 . "\n";
+ print "Variables found:\n";
+ for $i (keys %Vars) {
+ print "$i - $Vars{$i}\n";
+ }
+=cut
+}
+
+sub insertTemplateValues() {
+ my ($subcntr, $pre, $post);
+
+ while($tmp=<IFH>) {
+ $subcntr=0; #sanity. Make sure we don't run away with substitutions.'
+ while($tmp=~/\[\s*\S+\s*\]/ && $subcntr<100) { #Only do substitutions on matches.
+ for $k (keys %Vars) {
+ $tmp=~s/\[\s*$k:$Vars{$k}\s*]/$Vals{$k}/;
+ }
+ $subcntr++;
+ }
+ print $tmp;
+ }
+}
+
+sub header() {
+ #----------- Header -----------
+ if($calcHeight>$max_ui_height) { $calcHeight=$max_ui_height; } #Max!
+ print OFH <<E
+ <!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+ <class>TemplateVarList</class>
+ <widget class="Dialog">
+ <property name="name">
+ <cstring>TemplateVarList</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>$calcHeight</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Template Magic (for Quanta 3.1.9) version $tmversion</string>
+ </property>
+E
+;
+}
+
+sub footer() {
+ #----------- Footer -----------
+ my $theSpot=$calcHeight-30;
+ print OFH <<E
+ <widget class="CloseButton">
+ <property name="name">
+ <cstring>CloseButton2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>300</x>
+ <y>$theSpot</y>
+ <width>121</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Create Document</string>
+ </property>
+ <property name="associations" stdset="0">
+ <stringlist>
+ <string>
+E
+;
+
+ $i=0;
+ for $k (keys %Vars) {
+ if($i>0) { print OFH "\n"; }
+ $i++;
+ print OFH "echo -e '$k:\@$k\\n++++'";
+ }
+print OFH <<E
+ </string>
+ </stringlist>
+ </property>
+ <property name="writeStdout">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </widget>
+ <layoutdefaults spacing="6" margin="11"/>
+ </UI>
+
+E
+;
+}
+
+sub createUI() {
+=pod
+Structure for label widget: height is 20
+
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel2_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>40</y>
+ <width>130</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Variable2-FileInput</string>
+ </property>
+ </widget>
+
+Structure for a file widget: height is 20
+
+ <widget class="FileSelector">
+ <property name="name">
+ <cstring>FileSelector2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>140</x>
+ <y>50</y>
+ <width>441</width>
+ <height>20</height>
+ </rect>
+ </property>
+ </widget>
+
+Structure for a text widget: height is 30
+
+ <widget class="TextEdit">
+ <property name="name">
+ <cstring>TextEdit1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>140</x>
+ <y>10</y>
+ <width>440</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="vScrollBarMode">
+ <enum>AlwaysOff</enum>
+ </property>
+ <property name="hScrollBarMode">
+ <enum>AlwaysOff</enum>
+ </property>
+ </widget>
+.
+=cut
+
+ header();
+
+ my %Layouts;
+ my ($y_loc)=0;
+ for $k (0..$#OrderedVars) {
+ $Layouts{$OrderedVars[$k][0]}{y}=$y_loc;
+ print OFH <<E
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>LBL_$OrderedVars[$k][0]</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>$y_loc</y>
+ <width>130</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>$OrderedVars[$k][0]:</string>
+ </property>
+ </widget>
+E
+;
+ SWITCH: for ($OrderedVars[$k][1]) {
+ /file|filename/ && do { $y_loc+=25; last SWITCH; };
+ /text/ && do { $y_loc+=35; last SWITCH; };
+ }
+ }
+
+ for $k (0..$#OrderedVars) {
+
+ SWITCH: for ($OrderedVars[$k][1]) {
+ /file|filename/ && do {
+ print OFH <<E
+ <widget class="FileSelector">
+ <property name="name">
+ <cstring>$OrderedVars[$k][0]</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>140</x>
+ <y>$Layouts{$OrderedVars[$k][0]}{y}</y>
+ <width>440</width>
+ <height>20</height>
+ </rect>
+ </property>
+        <property name="associations" stdset="0">
+            <stringlist>
+                <string>\@widgetText</string>
+            </stringlist>
+        </property>
+ </widget>
+E
+;
+ last SWITCH;
+ };
+ /text/ && do {
+ print OFH <<E
+ <widget class="TextEdit">
+ <property name="name">
+ <cstring>$OrderedVars[$k][0]</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>140</x>
+ <y>$Layouts{$OrderedVars[$k][0]}{y}</y>
+ <width>440</width>
+ <height>30</height>
+ </rect>
+ </property>
+        <property name="associations" stdset="0">
+            <stringlist>
+                <string>\@widgetText</string>
+            </stringlist>
+        </property>
+ <property name="vScrollBarMode">
+ <enum>AlwaysOff</enum>
+ </property>
+ <property name="hScrollBarMode">
+ <enum>AlwaysOff</enum>
+ </property>
+ </widget>
+E
+;
+ last SWITCH;
+ };
+ }
+ }
+
+ footer();
+}