File Coverage

blib/lib/Text/UberText.pm
Criterion Covered Total %
statement 25 64 39.0
branch 1 4 25.0
condition n/a
subroutine 7 16 43.7
pod 4 7 57.1
total 37 91 40.6


line stmt bran cond sub pod time code
1             #
2             # Package Definition
3             #
4              
5             package Text::UberText;
6              
7             #
8             # Compiler Directives
9             #
10              
11 1     1   41631 use strict;
  1         3  
  1         187  
12 1     1   8 use warnings;
  1         1  
  1         36  
13              
14             #
15             # Includes
16             #
17              
18 1     1   805 use Text::UberText::Parser;
  1         2  
  1         22  
19 1     1   594 use Text::UberText::Dispatch;
  1         13  
  1         38  
20 1     1   630 use Text::UberText::Log;
  1         3  
  1         51  
21              
22             #
23             # Global Variables
24             #
25              
26 1     1   6 use vars qw/$VERSION $ImportMap @ImportList /;
  1         2  
  1         675  
27              
28             $VERSION=0.95;
29              
30             $ImportMap={
31             "none" => [ ],
32             "minimal" => [ "Text::UberText::Modules::Info"
33             ],
34             "standard" => [ "Text::UberText::Modules::Info",
35             "Text::UberText::Modules::Variables",
36             "Text::UberText::Modules::Loop",
37             ],
38             };
39              
40             #
41             # Methods
42             #
43              
44             sub new
45             {
46 0     0 1 0 my ($class)=shift;
47 0         0 my ($object);
48 0         0 $object={};
49 0         0 bless ($object,$class);
50 0         0 $object->_init(@_);
51 0         0 return $object;
52             }
53              
54             sub read
55             {
56 0     0 1 0 my ($self)=shift;
57 0         0 my ($file)=shift;
58 0         0 my ($l,$par,@input);
59 0 0       0 open (F, $file) || return undef;
60 0         0 (@input)=;
61 0         0 close(F);
62 0         0 $self->{parser}->log($self->{log});
63 0         0 $self->{parser}->dispatch($self->{dispatch});
64 0         0 $self->{parser}->input(@input);
65 0         0 return;
66             }
67              
68             sub parse
69             {
70 0     0 1 0 my ($self)=shift;
71 0         0 return $self->{parser}->parse();
72             }
73              
74             sub extend
75             {
76 0     0 1 0 my ($self)=shift;
77 0         0 $self->{dispatch}->extend(@_);
78 0         0 return;
79             }
80              
81             sub log
82             {
83 0     0 0 0 my ($self)=shift;
84 0         0 return $self->{log};
85             }
86              
87             sub parser
88             {
89 0     0 0 0 my ($self)=shift;
90 0         0 return $self->{parser};
91             }
92              
93             sub dispatch
94             {
95 0     0 0 0 my ($self)=shift;
96 0         0 return $self->{dispatch};
97             }
98              
99             #
100             # Import method
101             sub import
102             {
103 1     1   10 shift;
104 1         2 my ($modules)=shift;
105 1 50       4 if ($modules)
106             {
107 0         0 $modules=lc($modules);
108             } else {
109 1         3 $modules="standard";
110             }
111 1         1 (@ImportList)=@{$ImportMap->{$modules}};
  1         4  
112 1         11 return;
113             }
114              
115             #
116             # Hidden Methods
117             #
118              
119             sub _init
120             {
121 0     0     my ($self)=shift;
122 0           $self->{log}=Text::UberText::Log->new(-main => $self);
123 0           $self->{parser}=Text::UberText::Parser->new(-main => $self);
124 0           $self->{dispatch}=Text::UberText::Dispatch->new( -main => $self);
125             # Import requested UberText tag namespaces
126 0           $self->_loadModules();
127             #$self->{dispatch}->extend("Text::UberText::Modules::Variables");
128 0           return;
129             }
130              
131             sub _loadModules
132             {
133 0     0     my ($self)=shift;
134 0           my ($m);
135 0           foreach $m (@ImportList)
136             {
137 0           $self->{dispatch}->extend($m);
138             }
139 0           return;
140             }
141              
142             #
143             # Exit Block
144             #
145             1;
146              
147             #
148             # POD Documentation
149             #
150              
151             =head1 NAME
152              
153             Text::UberText - Customizable Template Engine
154              
155             =head1 SYNOPSIS
156              
157             use Text::UberText qw(standard);
158              
159             $ub=Text::UberText->new();
160             $ub->read(@array);
161             $ub->extend($acme_invoice);
162             $doctree=$ub->parse();
163             if ($doctree)
164             {
165             $doctree->run();
166             print($doctree->output());
167             }
168              
169             =head1 DESCRIPTION
170              
171             Text::UberText is an expandable template system designed to let programmers
172             write their own commands and tie those commands to program code. UberText
173             reads command tags in documents, and then calls perl modules based on
174             the tag.
175              
176             =head1 SAMPLE DOCUMENT
177              
178             The following is an example of a document that uses the UberText template
179             system.
180              
181             Invoice#: [uber.print string:([acme.invoice number]) fmt:(%010d)]
182             Date: [uber.date date fmt:(MM/DD/YYYY)]
183              
184             Ship To: [acme.invoice address:(shipping) ]
185              
186             Tracking number: [acme.invoice tracking-number vendor:(ups)]
187              
188             [acme.invoice itemlist -> ]
189             Item: [acme.invoice itemnumber] [acme.invoice description]
190             [<- acme.invoice itemlist ]
191              
192             [acme.invoice terms]
193              
194             The template is designed by a programmer that has designated the "acme.invoice"
195             namespace is to be used for his code. He then writes Perl modules that
196             interface with Text::UberText when the document is parsed.
197              
198             =head1 UBERTEXT FORMAT
199              
200             UberText documents are plain text mixed with command tags. A very simple
201             command tag contains a namespace and a command.
202              
203             [uber.info version]
204              
205             In this case, the namespace is C and the command is C.
206              
207             Commands can have values passed to them.
208              
209             [uber.info version:"full"]
210              
211             Commands can also have additional options, and those options can have
212             values.
213              
214             [uber.var name:(variable) value:"This is the value of the variable"]
215              
216             Values for commands or options are specified by following the command
217             or options with a colon, and then enclosing the value in
218             paranthesis or double quotes.
219              
220             An UberText command can also be wrapped around portions of text or other
221             UberText commands. These are considered block commands.
222              
223             [uber.transform indent class:(quote) ->]
224             "You can reach be anytime at my work number [per.info phonenum:(work)]"
225             [<- uber.transform ]
226              
227             Command options can be placed in either the tag that starts the block,
228             or the tag that ends the block. This example....
229              
230             [uber.loop count:(20) -> ]
231             This text will repeat 10 times
232             [<- uber.loop start:(11) ]
233              
234             Is identical to.....
235             [uber.loop count:(20) start:(11) -> ]
236             This text will repeat 10 times
237             [<- uber.loop ]
238              
239             You can also insert UberText commands in the values of options or
240             commands.
241              
242             [uber.var name:(version) value:([uber.info version])]
243              
244             [uber.print string:(The fruit is [uber.rand words:(orange,apple,banana)]) ]
245              
246             But you cannot use block commands inside the values to options or
247             commands.
248              
249             UberText command tags can span multiple lines.
250              
251             [
252             uber.var name:(customer)
253             value : "John Q. Public"
254             ]
255              
256             Leading and trailing whitespace within an UberText command is eliminated.
257             Some whitespace is needed to seperate the namespace, the command and
258             options, but that's it. Whitespace within values to commands and
259             options is kept intact. Also, whitespace after the command tag (including
260             carriage returns) is kept intact as well.
261              
262             =head1 LOADING
263              
264             UberText comes with a set of modules handling a small set of basic
265             functions. All of the modules are in the Text::UberText::Modules
266             Perl namespace. You can specify which of those modules are loaded
267             on the use line.
268              
269             use Text::UberText qw(minimal);
270              
271             The modules are not actually loaded until an UberText object is initiated.
272              
273             The following is a list of module sets.
274              
275             =over 4
276              
277             =item none
278              
279             None of the included UberText modules are loaded.
280              
281             =item minimal
282              
283             Only the Text::UberText::Modules::Info module is loaded
284              
285             =item standard
286              
287             The modules Text::UberText::Modules::(Info,Version) are loaded.
288              
289             =back
290              
291             =head1 METHODS
292              
293             =over 4
294              
295             =item $ubt=Text::UberText->new();
296              
297             Creates a new UberText object. The parser, the dispatch table, and the log
298             are all initialized.
299              
300             =item $ubt->read(@input);
301              
302             Reads in the passed array and passes it to the parser.
303              
304             =item $tree=$ubt->parse();
305              
306             Runs the parser against the input. At this time, the commands and the document
307             text are sorted out and placed in a Text::UberText::Tree object, which keeps
308             track of the document. The tree object is then returned from the method call.
309              
310             =item $ubt->extend($object);
311              
312             Sends an object to the Text::UberText::Dispatch object, which controls all
313             methods that interface with the command nodes. $object is either a
314             Perl object, or just the name of a class. In either case, the Dispatch
315             object searches for a method called C and runs it. It then takes
316             data returned from the call and uses it to expand its internal dispatch table.
317              
318             =back
319              
320             =head1 BUGS/CAVEATS
321              
322             UberText is pretty complex. There's probably bugs floating around because I
323             haven't even conceived of all of the possible input errors or third party
324             module errors that it needs to deal with.
325              
326             =head1 AUTHOR
327              
328             Chris Josephes Ecpj1@cpj1.comE
329              
330             =head1 SEE ALSO
331              
332             For documentation on the code, read
333             L,
334             L,
335             L
336              
337             For general documentation, read
338             L, and
339             L.
340              
341             =head1 COPYRIGHT
342              
343             Copyright 2002, Chris Josephes. All rights reserved.
344             This module is free software. It may be used, redistributed,
345             and/or modified under the same terms as Perl itself.